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]>
---
This change was merged into the gccrs repository and is posted here for
upstream visibility and potential drive-by review, as requested by GCC
release managers.
Each commit email contains a link to its details on github from where you can
find the Pull-Request and associated discussions.
Commit on github:
https://github.com/Rust-GCC/gccrs/commit/a7cc9cf930c956a736e83bb236f0bcea3270d93a
The commit has NOT been mentioned in any issue.
The commit has been mentioned in the following pull-request(s):
- https://github.com/Rust-GCC/gccrs/pull/4694
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 4fb2a8222..e21fe298f 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 d48dd56ce..09e0404fb 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 8e4406212..a82bffbe1 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 25140b589..a39b00f3c 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 6ab17882c..d564b2c7e 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 b29d81913..fa2b7d799 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 ffdf2219a..d68f9983a 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 12f714741..f1ec202a2 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.54.0