From: Philip Herron <[email protected]>

When we were processing generic const param types on arrays the size type
was overriding the const param decl because of a hirid reference mismatch

Fixes Rust-GCC#3879

gcc/rust/ChangeLog:

        * typecheck/rust-hir-type-check-type.cc (TypeCheckType::visit): fix 
mappings

gcc/testsuite/ChangeLog:

        * rust/compile/const_generics_18.rs: New test.
        * rust/compile/const_generics_19.rs: New test.
        * rust/execute/torture/const-generics-3.rs: New test.
        * rust/execute/torture/const-generics-4.rs: New test.

Signed-off-by: Philip Herron <[email protected]>
---
 .../typecheck/rust-hir-type-check-type.cc     |  3 +-
 .../rust/compile/const_generics_18.rs         | 10 +++++
 .../rust/compile/const_generics_19.rs         | 10 +++++
 .../rust/execute/torture/const-generics-3.rs  | 13 ++++++
 .../rust/execute/torture/const-generics-4.rs  | 43 +++++++++++++++++++
 5 files changed, 77 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/rust/compile/const_generics_18.rs
 create mode 100644 gcc/testsuite/rust/compile/const_generics_19.rs
 create mode 100644 gcc/testsuite/rust/execute/torture/const-generics-3.rs
 create mode 100644 gcc/testsuite/rust/execute/torture/const-generics-4.rs

diff --git a/gcc/rust/typecheck/rust-hir-type-check-type.cc 
b/gcc/rust/typecheck/rust-hir-type-check-type.cc
index 799efc809d5..ca7ef472578 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-type.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-type.cc
@@ -704,7 +704,6 @@ TypeCheckType::visit (HIR::ArrayType &type)
   TyTy::BaseType *expected_ty = nullptr;
   bool ok = context->lookup_builtin ("usize", &expected_ty);
   rust_assert (ok);
-  context->insert_type (type.get_size_expr ().get_mappings (), expected_ty);
 
   TyTy::BaseConstType *const_type = nullptr;
   if (capacity_type->get_kind () == TyTy::TypeKind::CONST)
@@ -745,7 +744,7 @@ TypeCheckType::visit (HIR::ArrayType &type)
   translated
     = new TyTy::ArrayType (type.get_mappings ().get_hirid (), type.get_locus 
(),
                           TyTy::TyVar (
-                            const_type->as_base_type ()->get_ty_ref ()),
+                            const_type->as_base_type ()->get_ref ()),
                           TyTy::TyVar (element_type->get_ref ()));
 }
 
diff --git a/gcc/testsuite/rust/compile/const_generics_18.rs 
b/gcc/testsuite/rust/compile/const_generics_18.rs
new file mode 100644
index 00000000000..8bcc26158b4
--- /dev/null
+++ b/gcc/testsuite/rust/compile/const_generics_18.rs
@@ -0,0 +1,10 @@
+#[lang = "sized"]
+trait Sized {}
+
+struct Foo<const N: usize>;
+type Alias = Foo<4>;
+
+fn main() -> i32 {
+    let _x: Alias = Foo::<4> {};
+    0
+}
diff --git a/gcc/testsuite/rust/compile/const_generics_19.rs 
b/gcc/testsuite/rust/compile/const_generics_19.rs
new file mode 100644
index 00000000000..b0932ae6027
--- /dev/null
+++ b/gcc/testsuite/rust/compile/const_generics_19.rs
@@ -0,0 +1,10 @@
+#[lang = "sized"]
+trait Sized {}
+
+struct Foo<const N: usize>;
+struct Wrapper<T>(T);
+
+fn main() -> i32 {
+    let _: Wrapper<Foo<3>> = Wrapper(Foo::<3> {});
+    0
+}
diff --git a/gcc/testsuite/rust/execute/torture/const-generics-3.rs 
b/gcc/testsuite/rust/execute/torture/const-generics-3.rs
new file mode 100644
index 00000000000..53698bb2dd6
--- /dev/null
+++ b/gcc/testsuite/rust/execute/torture/const-generics-3.rs
@@ -0,0 +1,13 @@
+#[lang = "sized"]
+pub trait Sized {}
+
+fn simd_shuffle<const N: usize>(idx: [u32; N]) -> [u32; N] {
+    idx
+}
+
+fn main() -> i32 {
+    let a = [1u32, 2, 3, 4];
+    let out = simd_shuffle(a);
+    let _check: [u32; 4] = out;
+    0
+}
diff --git a/gcc/testsuite/rust/execute/torture/const-generics-4.rs 
b/gcc/testsuite/rust/execute/torture/const-generics-4.rs
new file mode 100644
index 00000000000..bf64f13e654
--- /dev/null
+++ b/gcc/testsuite/rust/execute/torture/const-generics-4.rs
@@ -0,0 +1,43 @@
+#[lang = "sized"]
+trait Sized {}
+
+#[allow(unused)]
+macro_rules! simd_shuffle {
+    ($x:expr, $y:expr, $idx:expr $(,)?) => {{
+        simd_shuffle(
+            $x,
+            $y,
+            const {
+                let v: [u32; _] = $idx;
+                v
+            },
+        )
+    }};
+}
+
+const fn simd_shuffle(_a: [u32; 4], _b: [u32; 4], idx: [u32; 4]) -> [u32; 4] {
+    idx
+}
+
+fn main() -> i32 {
+    let a = [1, 2, 3, 4];
+    let b = [5, 6, 7, 8];
+    let indices = [3, 2, 1, 0];
+
+    let result: [u32; 4] = simd_shuffle!(a, b, indices);
+
+    if result[0] != 3 {
+        return 1;
+    }
+    if result[1] != 2 {
+        return 2;
+    }
+    if result[2] != 1 {
+        return 3;
+    }
+    if result[3] != 0 {
+        return 4;
+    }
+
+    0
+}
-- 
2.50.1

Reply via email to