Unnamed repository; edit this file 'description' to name the repository.
Merge pull request #20697 from Oblarg/fix-negative-const-generic-literals
fix negative const generic integer literals
Shoyu Vanilla (Flint) 7 months ago
parent adf6c0d · parent 30031b8 · commit 2c6f0fc
-rw-r--r--crates/hir-ty/src/lower.rs23
-rw-r--r--crates/hir-ty/src/lower_nextsolver.rs23
-rw-r--r--crates/ide/src/hover/tests.rs2
3 files changed, 47 insertions, 1 deletions
diff --git a/crates/hir-ty/src/lower.rs b/crates/hir-ty/src/lower.rs
index 79f78c545e..4d5172fd4f 100644
--- a/crates/hir-ty/src/lower.rs
+++ b/crates/hir-ty/src/lower.rs
@@ -299,6 +299,29 @@ impl<'a> TyLoweringContext<'a> {
const_type,
self.resolver.krate(),
),
+ hir_def::hir::Expr::UnaryOp { expr: inner_expr, op: hir_def::hir::UnaryOp::Neg } => {
+ if let hir_def::hir::Expr::Literal(literal) = &self.store[*inner_expr] {
+ // Only handle negation for signed integers and floats
+ match literal {
+ hir_def::hir::Literal::Int(_, _) | hir_def::hir::Literal::Float(_, _) => {
+ if let Some(negated_literal) = literal.clone().negate() {
+ intern_const_ref(
+ self.db,
+ &negated_literal.into(),
+ const_type,
+ self.resolver.krate(),
+ )
+ } else {
+ unknown_const(const_type)
+ }
+ }
+ // For unsigned integers, chars, bools, etc., negation is not meaningful
+ _ => unknown_const(const_type),
+ }
+ } else {
+ unknown_const(const_type)
+ }
+ }
_ => unknown_const(const_type),
}
}
diff --git a/crates/hir-ty/src/lower_nextsolver.rs b/crates/hir-ty/src/lower_nextsolver.rs
index b8e0599dba..0076446a95 100644
--- a/crates/hir-ty/src/lower_nextsolver.rs
+++ b/crates/hir-ty/src/lower_nextsolver.rs
@@ -285,6 +285,29 @@ impl<'db, 'a> TyLoweringContext<'db, 'a> {
const_type,
self.resolver.krate(),
),
+ hir_def::hir::Expr::UnaryOp { expr: inner_expr, op: hir_def::hir::UnaryOp::Neg } => {
+ if let hir_def::hir::Expr::Literal(literal) = &self.store[*inner_expr] {
+ // Only handle negation for signed integers and floats
+ match literal {
+ hir_def::hir::Literal::Int(_, _) | hir_def::hir::Literal::Float(_, _) => {
+ if let Some(negated_literal) = literal.clone().negate() {
+ intern_const_ref(
+ self.db,
+ &negated_literal.into(),
+ const_type,
+ self.resolver.krate(),
+ )
+ } else {
+ unknown_const(const_type)
+ }
+ }
+ // For unsigned integers, chars, bools, etc., negation is not meaningful
+ _ => unknown_const(const_type),
+ }
+ } else {
+ unknown_const(const_type)
+ }
+ }
_ => unknown_const(const_type),
}
}
diff --git a/crates/ide/src/hover/tests.rs b/crates/ide/src/hover/tests.rs
index 45aec38774..1ea11a215f 100644
--- a/crates/ide/src/hover/tests.rs
+++ b/crates/ide/src/hover/tests.rs
@@ -4738,7 +4738,7 @@ fn main() {
*value*
```rust
- let value: Const<_>
+ let value: Const<-1>
```
---