[committed 52/88] gccrs: Add missing Sized, Copy and Clone lang item mappings

arthur.cohen@embecosm.com arthur.cohen@embecosm.com
Wed Apr 5 14:03:36 GMT 2023


From: Philip Herron <herron.philip@googlemail.com>

We need these lang items to be defined and later down the line the mappings
will be used to implement proper copy and clone logic.

Fixes #1786

Signed-off-by: Philip Herron <herron.philip@googlemail.com>

gcc/rust/ChangeLog:

	* util/rust-lang-item.h:

gcc/testsuite/ChangeLog:

	* rust/compile/issue-1786.rs: New test.
---
 gcc/rust/util/rust-lang-item.h           | 24 ++++++++++++++++++++++++
 gcc/testsuite/rust/compile/issue-1786.rs | 23 +++++++++++++++++++++++
 2 files changed, 47 insertions(+)
 create mode 100644 gcc/testsuite/rust/compile/issue-1786.rs

diff --git a/gcc/rust/util/rust-lang-item.h b/gcc/rust/util/rust-lang-item.h
index 29c364bad61..c5ef6200fb4 100644
--- a/gcc/rust/util/rust-lang-item.h
+++ b/gcc/rust/util/rust-lang-item.h
@@ -80,6 +80,12 @@ public:
     FN_ONCE,
     FN_ONCE_OUTPUT,
 
+    // markers
+    COPY,
+    CLONE,
+    SIZED,
+
+    // delimiter
     UNKNOWN,
   };
 
@@ -237,6 +243,18 @@ public:
       {
 	return ItemType::FN_ONCE_OUTPUT;
       }
+    else if (item.compare ("copy") == 0)
+      {
+	return ItemType::COPY;
+      }
+    else if (item.compare ("clone") == 0)
+      {
+	return ItemType::CLONE;
+      }
+    else if (item.compare ("sized") == 0)
+      {
+	return ItemType::SIZED;
+      }
 
     return ItemType::UNKNOWN;
   }
@@ -321,6 +339,12 @@ public:
 	return "fn_once";
       case FN_ONCE_OUTPUT:
 	return "fn_once_output";
+      case COPY:
+	return "copy";
+      case CLONE:
+	return "clone";
+      case SIZED:
+	return "sized";
 
       case UNKNOWN:
 	return "<UNKNOWN>";
diff --git a/gcc/testsuite/rust/compile/issue-1786.rs b/gcc/testsuite/rust/compile/issue-1786.rs
new file mode 100644
index 00000000000..f73b63d0cb6
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-1786.rs
@@ -0,0 +1,23 @@
+#[lang = "clone"]
+trait Clone {
+    fn clone(&self) -> Self;
+
+    fn clone_from(&mut self, source: &Self) {
+        *self = source.clone()
+    }
+}
+
+#[lang = "copy"]
+pub trait Copy: Clone {
+    // Empty.
+}
+
+mod impls {
+    use super::Clone;
+
+    impl Clone for char {
+        fn clone(&self) -> Self {
+            *self
+        }
+    }
+}
-- 
2.40.0



More information about the Gcc-rust mailing list