From: Philip Herron <herron.phi...@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.phi...@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

Reply via email to