gccrs: Add missing Sized, Copy and Clone lang item mappings
authorPhilip Herron <herron.philip@googlemail.com>
Tue, 31 Jan 2023 14:39:29 +0000 (14:39 +0000)
committerArthur Cohen <arthur.cohen@embecosm.com>
Thu, 6 Apr 2023 08:47:21 +0000 (10:47 +0200)
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
gcc/testsuite/rust/compile/issue-1786.rs [new file with mode: 0644]

index 29c364bad617f4db6b9850d66d5f3b5de301b04c..c5ef6200fb4fa5f560bbac8de522f09cb44c61ab 100644 (file)
@@ -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 (file)
index 0000000..f73b63d
--- /dev/null
@@ -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
+        }
+    }
+}