[COMMITTED 69/77] gccrs: Use canonical path for Clone trait within derive

[email protected]
Newsgroups gmane.comp.gcc.rust,gmane.comp.gcc.patches
Message-ID <[email protected]>
From: Pierre-Emmanuel Patry <[email protected]>

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]>
---
 gcc/rust/expand/rust-derive-clone.cc          |  9 ++--
 .../rust/compile/derive_clone_enum2.rs        | 19 ++++----
 .../rust/compile/derive_clone_enum3.rs        | 19 ++++----
 gcc/testsuite/rust/compile/issue-3139-1.rs    | 47 +++++++++++--------
 gcc/testsuite/rust/compile/issue-3144.rs      | 17 +++----
 .../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 4fb2a8222ed..e21fe298ff2 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 d48dd56ce1d..09e0404fb4c 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 8e44062122c..a82bffbe1c0 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 25140b58947..a39b00f3cd8 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 6ab17882c99..d564b2c7e67 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 b29d819132b..fa2b7d799a4 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 ffdf2219a39..d68f9983a9d 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 12f71474185..f1ec202a2da 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;
-- 
2.50.1
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.