Merge pull request #20697 from Oblarg/fix-negative-const-generic-literals
fix negative const generic integer literals
This commit is contained in:
commit
6ec196a748
3 changed files with 47 additions and 1 deletions
|
|
@ -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),
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4738,7 +4738,7 @@ fn main() {
|
|||
*value*
|
||||
|
||||
```rust
|
||||
let value: Const<_>
|
||||
let value: Const<-1>
|
||||
```
|
||||
|
||||
---
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue