https://gcc.gnu.org/g:1e03e93a7163d9c6571114d50b8c8ad83478600a

commit r17-3128-g1e03e93a7163d9c6571114d50b8c8ad83478600a
Author: Pierre-Emmanuel Patry <[email protected]>
Date:   Wed Jul 8 16:23:50 2026 +0200

    gccrs: Use canonical path for Clone trait within derive
    
    Using the local path for the Clone trait cannot be used with the core
    library. This broke most test that "emulate core" with a Clone trait
    placed outside a "clone" module.
    
    gcc/rust/ChangeLog:
    
            * expand/rust-derive-clone.cc (DeriveClone::clone_call): Use the
            canonical path to Clone.
    
    gcc/testsuite/ChangeLog:
    
            * rust/compile/derive_clone_enum2.rs: Fix test with a clone module
            to mimic the core library.
            * rust/compile/derive_clone_enum3.rs: Likewise.
            * rust/compile/issue-3139-1.rs: Likewise.
            * rust/compile/issue-3144.rs: Likewise.
            * rust/execute/torture/derive_clone_enum1.rs: Likewise.
            * rust/execute/torture/derive_macro3.rs: Likewise.
            * rust/execute/torture/derive_macro4.rs: Likewise.
    
    Signed-off-by: Pierre-Emmanuel Patry <[email protected]>

Diff:
---
 gcc/rust/expand/rust-derive-clone.cc               |  9 ++---
 gcc/testsuite/rust/compile/derive_clone_enum2.rs   | 19 ++++-----
 gcc/testsuite/rust/compile/derive_clone_enum3.rs   | 19 ++++-----
 gcc/testsuite/rust/compile/issue-3139-1.rs         | 47 +++++++++++++---------
 gcc/testsuite/rust/compile/issue-3144.rs           | 17 ++++----
 .../rust/execute/torture/derive_clone_enum1.rs     | 23 ++++++-----
 .../rust/execute/torture/derive_macro3.rs          | 17 ++++----
 .../rust/execute/torture/derive_macro4.rs          | 24 ++++++-----
 8 files changed, 96 insertions(+), 79 deletions(-)

diff --git a/gcc/rust/expand/rust-derive-clone.cc 
b/gcc/rust/expand/rust-derive-clone.cc
index 4fb2a8222ed1..e21fe298ff22 100644
--- a/gcc/rust/expand/rust-derive-clone.cc
+++ b/gcc/rust/expand/rust-derive-clone.cc
@@ -30,10 +30,6 @@ namespace AST {
 std::unique_ptr<Expr>
 DeriveClone::clone_call (std::unique_ptr<Expr> &&to_clone)
 {
-  // $crate::core::clone::Clone::clone for the fully qualified path - we don't
-  // link with `core` yet so that might be an issue. Use `Clone::clone` for 
now?
-  // TODO: Factor this function inside the DeriveAccumulator
-
   // Interestingly, later versions of Rust have a `clone_fn` lang item which
   // corresponds to this. But because we are first targeting 1.49, we cannot 
use
   // it yet. Once we target a new, more recent version of the language, we'll
@@ -45,7 +41,10 @@ DeriveClone::clone_call (std::unique_ptr<Expr> &&to_clone)
   auto args = std::vector<std::unique_ptr<Expr>> ();
   args.emplace_back (std::move (to_clone));
 
-  return builder.qualified_call ({"Clone", "clone"}, std::move (args));
+  // FIXME: Misses :: prefix to avoid collision with potential core module
+  return builder.qualified_call ({builder.get_path_start (), "clone", "Clone",
+                                 "clone"},
+                                std::move (args));
 }
 
 /**
diff --git a/gcc/testsuite/rust/compile/derive_clone_enum2.rs 
b/gcc/testsuite/rust/compile/derive_clone_enum2.rs
index d48dd56ce1d7..09e0404fb4c7 100644
--- a/gcc/testsuite/rust/compile/derive_clone_enum2.rs
+++ b/gcc/testsuite/rust/compile/derive_clone_enum2.rs
@@ -1,21 +1,22 @@
 #![feature(no_core)]
 #![no_core]
-
 #![feature(lang_items)]
 
-#[lang = "clone"]
-trait Clone {
-    pub fn clone(&self) -> Self;
-}
+mod clone {
+    #[lang = "clone"]
+    trait Clone {
+        pub fn clone(&self) -> Self;
+    }
 
-impl Clone for i32 {
-    fn clone(&self) -> Self {
-        *self
+    impl Clone for i32 {
+        fn clone(&self) -> Self {
+            *self
+        }
     }
 }
 
 #[derive(Clone)]
 enum TupleEnum {
     A(i32),
-    B(i32, i32, i32)
+    B(i32, i32, i32),
 }
diff --git a/gcc/testsuite/rust/compile/derive_clone_enum3.rs 
b/gcc/testsuite/rust/compile/derive_clone_enum3.rs
index 8e44062122c7..a82bffbe1c05 100644
--- a/gcc/testsuite/rust/compile/derive_clone_enum3.rs
+++ b/gcc/testsuite/rust/compile/derive_clone_enum3.rs
@@ -1,21 +1,22 @@
 #![feature(no_core)]
 #![no_core]
-
 #![feature(lang_items)]
 
-#[lang = "clone"]
-trait Clone {
-    pub fn clone(&self) -> Self;
-}
+mod clone {
+    #[lang = "clone"]
+    trait Clone {
+        pub fn clone(&self) -> Self;
+    }
 
-impl Clone for i32 {
-    fn clone(&self) -> Self {
-        *self
+    impl Clone for i32 {
+        fn clone(&self) -> Self {
+            *self
+        }
     }
 }
 
 #[derive(Clone)]
 enum StructEnum {
     A { i0: i32 },
-    B { i0: i32, i1: i32, i2: i32 }
+    B { i0: i32, i1: i32, i2: i32 },
 }
diff --git a/gcc/testsuite/rust/compile/issue-3139-1.rs 
b/gcc/testsuite/rust/compile/issue-3139-1.rs
index 25140b589478..a39b00f3cd8b 100644
--- a/gcc/testsuite/rust/compile/issue-3139-1.rs
+++ b/gcc/testsuite/rust/compile/issue-3139-1.rs
@@ -1,11 +1,24 @@
 #![feature(no_core)]
 #![no_core]
-
 #![feature(lang_items)]
 
-#[lang = "clone"]
-trait Clone {
-    fn clone(&self) -> Self;
+mod clone {
+    #[lang = "clone"]
+    trait Clone {
+        fn clone(&self) -> Self;
+    }
+
+    impl Clone for u32 {
+        fn clone(&self) -> Self {
+            *self
+        }
+    }
+
+    impl Clone for usize {
+        fn clone(&self) -> Self {
+            *self
+        }
+    }
 }
 
 #[lang = "sized"]
@@ -19,30 +32,24 @@ struct Abound {
 }
 
 #[derive(Clone)]
-struct Be<T:Clone> {
+struct Be<T: clone::Clone> {
     a: T,
     b: Abound,
 }
 
-impl Clone for u32 {
-    fn clone(&self) -> Self {
-        *self
-    }
-}
-
-impl Clone for usize {
-    fn clone(&self) -> Self {
-        *self
-    }
-}
-
-impl Clone for Abound {
+impl clone::Clone for Abound {
     fn clone(&self) -> Self {
-        return Abound { a: self.a.clone(), b: self.b.clone() };
+        return Abound {
+            a: self.a.clone(),
+            b: self.b.clone(),
+        };
     }
 }
 
 fn main() {
-    let b: Be<usize> = Be {a:1,b:Abound { a:0,b:1 }};
+    let b: Be<usize> = Be {
+        a: 1,
+        b: Abound { a: 0, b: 1 },
+    };
     let _: Be<usize> = b.clone();
 }
diff --git a/gcc/testsuite/rust/compile/issue-3144.rs 
b/gcc/testsuite/rust/compile/issue-3144.rs
index 6ab17882c993..d564b2c7e67b 100644
--- a/gcc/testsuite/rust/compile/issue-3144.rs
+++ b/gcc/testsuite/rust/compile/issue-3144.rs
@@ -1,6 +1,5 @@
 #![feature(no_core)]
 #![no_core]
-
 #![feature(lang_items)]
 #[lang = "sized"]
 pub trait Sized {}
@@ -8,14 +7,16 @@ pub trait Sized {}
 #[lang = "copy"]
 trait Copy {}
 
-#[lang = "clone"]
-pub trait Clone {
-    fn clone(&self) -> Self;
-}
+mod clone {
+    #[lang = "clone"]
+    pub trait Clone {
+        fn clone(&self) -> Self;
+    }
 
-impl Clone for i32 {
-    fn clone(&self) -> i32 {
-        *self
+    impl Clone for i32 {
+        fn clone(&self) -> i32 {
+            *self
+        }
     }
 }
 
diff --git a/gcc/testsuite/rust/execute/torture/derive_clone_enum1.rs 
b/gcc/testsuite/rust/execute/torture/derive_clone_enum1.rs
index b29d819132b2..fa2b7d799a41 100644
--- a/gcc/testsuite/rust/execute/torture/derive_clone_enum1.rs
+++ b/gcc/testsuite/rust/execute/torture/derive_clone_enum1.rs
@@ -1,16 +1,17 @@
 #![feature(no_core)]
 #![no_core]
-
 #![feature(lang_items)]
 
-#[lang = "clone"]
-trait Clone {
-    pub fn clone(&self) -> Self;
-}
+mod clone {
+    #[lang = "clone"]
+    trait Clone {
+        pub fn clone(&self) -> Self;
+    }
 
-impl Clone for i32 {
-    fn clone(&self) -> Self {
-        *self
+    impl Clone for i32 {
+        fn clone(&self) -> Self {
+            *self
+        }
     }
 }
 
@@ -18,7 +19,7 @@ impl Clone for i32 {
 enum MixAndMatch {
     A,
     B(i32),
-    C { inner: i32 }
+    C { inner: i32 },
 }
 
 fn main() -> i32 {
@@ -36,7 +37,7 @@ fn main() -> i32 {
     let a_copy = a.clone();
 
     match a_copy {
-        MixAndMatch::B(15) => {},
+        MixAndMatch::B(15) => {}
         _ => res += 1,
     };
 
@@ -48,7 +49,7 @@ fn main() -> i32 {
             if inner != 15 {
                 res += 1;
             }
-        },
+        }
         _ => res += 1,
     };
 
diff --git a/gcc/testsuite/rust/execute/torture/derive_macro3.rs 
b/gcc/testsuite/rust/execute/torture/derive_macro3.rs
index ffdf2219a392..d68f9983a9d5 100644
--- a/gcc/testsuite/rust/execute/torture/derive_macro3.rs
+++ b/gcc/testsuite/rust/execute/torture/derive_macro3.rs
@@ -1,18 +1,19 @@
 #![feature(no_core)]
 #![no_core]
-
 #![feature(lang_items)]
 #[lang = "sized"]
 pub trait Sized {}
 
-#[lang = "clone"]
-pub trait Clone {
-    fn clone(&self) -> Self;
-}
+mod clone {
+    #[lang = "clone"]
+    pub trait Clone {
+        fn clone(&self) -> Self;
+    }
 
-impl Clone for i32 {
-    fn clone(&self) -> i32 {
-        *self
+    impl Clone for i32 {
+        fn clone(&self) -> i32 {
+            *self
+        }
     }
 }
 
diff --git a/gcc/testsuite/rust/execute/torture/derive_macro4.rs 
b/gcc/testsuite/rust/execute/torture/derive_macro4.rs
index 12f714741854..f1ec202a2dab 100644
--- a/gcc/testsuite/rust/execute/torture/derive_macro4.rs
+++ b/gcc/testsuite/rust/execute/torture/derive_macro4.rs
@@ -1,13 +1,20 @@
 #![feature(no_core)]
 #![no_core]
-
 #![feature(lang_items)]
 #[lang = "sized"]
 pub trait Sized {}
 
-#[lang = "clone"]
-pub trait Clone {
-    fn clone(&self) -> Self;
+mod clone {
+    #[lang = "clone"]
+    pub trait Clone {
+        fn clone(&self) -> Self;
+    }
+
+    impl Clone for i32 {
+        fn clone(&self) -> Self {
+            *self
+        }
+    }
 }
 
 #[derive(Clone)]
@@ -21,12 +28,11 @@ struct S {
     b: Foo,
 }
 
-impl Clone for i32 {
-    fn clone(&self) -> Self { *self }
-}
-
 fn main() -> i32 {
-    let s1 = S { a: 15, b: Foo { a: 14 }};
+    let s1 = S {
+        a: 15,
+        b: Foo { a: 14 },
+    };
     let s2 = s1.clone();
 
     let l = s1.a - s2.a;

Reply via email to