about summary refs log tree commit diff
diff options
context:
space:
mode:
authorriverbl <94326797+riverbl@users.noreply.github.com>2024-08-31 10:13:08 +0100
committerriverbl <94326797+riverbl@users.noreply.github.com>2024-08-31 10:17:37 +0100
commitd6573f9b08283a1eb732923f4ddc0899c7376e79 (patch)
treed849faac4c23b8defa95759b1d019b6c514e2562
parent5392d56c93cf5584e4d18cfb86cc314138db1c94 (diff)
downloadrust-d6573f9b08283a1eb732923f4ddc0899c7376e79.tar.gz
rust-d6573f9b08283a1eb732923f4ddc0899c7376e79.zip
Rename function and remove flag argument
Use less confusing name for function, duplicate logic rather than taking flag as argument.
-rw-r--r--src/tools/rust-analyzer/crates/hir-ty/src/consteval.rs30
1 files changed, 21 insertions, 9 deletions
diff --git a/src/tools/rust-analyzer/crates/hir-ty/src/consteval.rs b/src/tools/rust-analyzer/crates/hir-ty/src/consteval.rs
index 3f60834e02d..e5c493ac56e 100644
--- a/src/tools/rust-analyzer/crates/hir-ty/src/consteval.rs
+++ b/src/tools/rust-analyzer/crates/hir-ty/src/consteval.rs
@@ -169,23 +169,31 @@ pub fn usize_const(db: &dyn HirDatabase, value: Option<u128>, krate: CrateId) ->
 }
 
 pub fn try_const_usize(db: &dyn HirDatabase, c: &Const) -> Option<u128> {
-    try_const_usize_sign_extend(db, c, false)
+    match &c.data(Interner).value {
+        chalk_ir::ConstValue::BoundVar(_) => None,
+        chalk_ir::ConstValue::InferenceVar(_) => None,
+        chalk_ir::ConstValue::Placeholder(_) => None,
+        chalk_ir::ConstValue::Concrete(c) => match &c.interned {
+            ConstScalar::Bytes(it, _) => Some(u128::from_le_bytes(pad16(it, false))),
+            ConstScalar::UnevaluatedConst(c, subst) => {
+                let ec = db.const_eval(*c, subst.clone(), None).ok()?;
+                try_const_usize(db, &ec)
+            }
+            _ => None,
+        },
+    }
 }
 
-pub fn try_const_usize_sign_extend(
-    db: &dyn HirDatabase,
-    c: &Const,
-    is_signed: bool,
-) -> Option<u128> {
+pub fn try_const_isize(db: &dyn HirDatabase, c: &Const) -> Option<i128> {
     match &c.data(Interner).value {
         chalk_ir::ConstValue::BoundVar(_) => None,
         chalk_ir::ConstValue::InferenceVar(_) => None,
         chalk_ir::ConstValue::Placeholder(_) => None,
         chalk_ir::ConstValue::Concrete(c) => match &c.interned {
-            ConstScalar::Bytes(it, _) => Some(u128::from_le_bytes(pad16(it, is_signed))),
+            ConstScalar::Bytes(it, _) => Some(i128::from_le_bytes(pad16(it, true))),
             ConstScalar::UnevaluatedConst(c, subst) => {
                 let ec = db.const_eval(*c, subst.clone(), None).ok()?;
-                try_const_usize_sign_extend(db, &ec, is_signed)
+                try_const_isize(db, &ec)
             }
             _ => None,
         },
@@ -287,7 +295,11 @@ pub(crate) fn const_eval_discriminant_variant(
         db.trait_environment_for_body(def),
     )?;
     let c = interpret_mir(db, mir_body, false, None).0?;
-    let c = try_const_usize_sign_extend(db, &c, is_signed).unwrap() as i128;
+    let c = if is_signed {
+        try_const_isize(db, &c).unwrap()
+    } else {
+        try_const_usize(db, &c).unwrap() as i128
+    };
     Ok(c)
 }