https://gcc.gnu.org/g:00f557f225b5ba25fcc7ff664a20594988638019

commit r17-3116-g00f557f225b5ba25fcc7ff664a20594988638019
Author: Owen Avery <[email protected]>
Date:   Mon Jul 20 23:05:55 2026 -0400

    gccrs: Fix deriving with generic const args
    
    This doesn't fix an issue with the typechecker, so the included test
    only compiles up to the typechecking phase.
    
    gcc/rust/ChangeLog:
    
            * expand/rust-derive.cc (DeriveVisitor::setup_impl_generics):
            Create a constant generic argument from a constant generic
            parameter.
    
    gcc/testsuite/ChangeLog:
    
            * rust/compile/derive_macro9.rs: New test.
    
    Signed-off-by: Owen Avery <[email protected]>

Diff:
---
 gcc/rust/expand/rust-derive.cc              | 14 +++++++------
 gcc/testsuite/rust/compile/derive_macro9.rs | 31 +++++++++++++++++++++++++++++
 2 files changed, 39 insertions(+), 6 deletions(-)

diff --git a/gcc/rust/expand/rust-derive.cc b/gcc/rust/expand/rust-derive.cc
index dbcdc8ad2d4e..0b73d241173f 100644
--- a/gcc/rust/expand/rust-derive.cc
+++ b/gcc/rust/expand/rust-derive.cc
@@ -143,12 +143,14 @@ DeriveVisitor::setup_impl_generics (
            ConstGenericParam &const_param
              = (ConstGenericParam &) *generic.get ();
 
-           std::unique_ptr<Type> associated_type
-             = builder.single_type_path (const_param.get_name ().as_string ());
-
-           GenericArg type_arg
-             = GenericArg::create_type (std::move (associated_type));
-           generic_args.push_back (std::move (type_arg));
+           auto associated_expr
+             = std::make_unique<IdentifierExpr> (const_param.get_name (),
+                                                 std::vector<Attribute> (),
+                                                 const_param.get_locus ());
+
+           GenericArg const_arg
+             = GenericArg::create_const (std::move (associated_expr));
+           generic_args.push_back (std::move (const_arg));
 
            auto impl_const_param = builder.new_const_param (const_param);
            impl_generics.push_back (std::move (impl_const_param));
diff --git a/gcc/testsuite/rust/compile/derive_macro9.rs 
b/gcc/testsuite/rust/compile/derive_macro9.rs
new file mode 100644
index 000000000000..bfec48a6d949
--- /dev/null
+++ b/gcc/testsuite/rust/compile/derive_macro9.rs
@@ -0,0 +1,31 @@
+// { dg-additional-options "-frust-compile-until=typecheck" }
+#![feature(no_core)]
+#![no_core]
+
+#![feature(lang_items)]
+#[lang = "sized"]
+pub trait Sized {}
+
+#[lang = "copy"]
+pub trait Copy {}
+
+#[lang = "clone"]
+pub trait Clone {
+    fn clone(&self) -> Self;
+}
+
+#[lang = "phantom_data"]
+pub struct PhantomData<T>;
+
+impl<T: ?Sized> Clone for PhantomData<T> {
+    fn clone(&self) -> Self {
+        *self
+    }
+}
+
+impl<T: ?Sized> Copy for PhantomData<T> {}
+
+#[derive(Copy, Clone)]
+struct S<const N: usize> {
+    x: PhantomData<[u8; N]>
+}

Reply via email to