[gccrs COMMIT 2/2] lang: Add pin and unpin

[email protected]
Newsgroups gmane.comp.gcc.patches,gmane.comp.gcc.rust
Message-ID <[email protected]>
From: Enes Cevik <[email protected]>

This patch adds pin/unpin lang items to the compiler but not fully tested
due to issues Rust-GCC/gccrs#4709 and Rust-GCC/gccrs#4678 so we tested
auto trait and negative impls behaviors.

gcc/rust/ChangeLog:

	* util/rust-lang-item.cc (Rust::LangItem::lang_items): Add pin
	and unpin lang items to the BiMap.
	* util/rust-lang-item.h (class LangItem): Add PIN and UNPIN to
	the Kind enum.

gcc/testsuite/ChangeLog:

	* rust/compile/lang-pin-unpin.rs: New test.

Signed-off-by: Enes Cevik <[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/fa1a84b6b8225b6ca8c59c80ef4d9a7eb52017a1

The commit has been mentioned in the following issue(s):
 - Rust-GCC/gccrs#4678: https://github.com/Rust-GCC/gccrs/issues/4678
 - Rust-GCC/gccrs#4709: https://github.com/Rust-GCC/gccrs/issues/4709

The commit has been mentioned in the following pull-request(s):
 - https://github.com/Rust-GCC/gccrs/pull/4720

 gcc/rust/util/rust-lang-item.cc              |  2 ++
 gcc/rust/util/rust-lang-item.h               |  2 ++
 gcc/testsuite/rust/compile/lang-pin-unpin.rs | 38 ++++++++++++++++++++
 3 files changed, 42 insertions(+)
 create mode 100644 gcc/testsuite/rust/compile/lang-pin-unpin.rs

diff --git a/gcc/rust/util/rust-lang-item.cc b/gcc/rust/util/rust-lang-item.cc
index b00ce9903..5a3e939f9 100644
--- a/gcc/rust/util/rust-lang-item.cc
+++ b/gcc/rust/util/rust-lang-item.cc
@@ -144,6 +144,8 @@ const BiMap<std::string, LangItem::Kind> Rust::LangItem::lang_items = {{
   {"generator_state", Kind::GENERATOR_STATE},
 
   {"va_list", Kind::VA_LIST},
+  {"pin", Kind::PIN},
+  {"unpin", Kind::UNPIN},
 }};
 
 tl::optional<LangItem::Kind>
diff --git a/gcc/rust/util/rust-lang-item.h b/gcc/rust/util/rust-lang-item.h
index 133313826..766b47c79 100644
--- a/gcc/rust/util/rust-lang-item.h
+++ b/gcc/rust/util/rust-lang-item.h
@@ -180,6 +180,8 @@ public:
     GENERATOR_STATE,
 
     VA_LIST,
+    PIN,
+    UNPIN,
   };
 
   static const BiMap<std::string, Kind> lang_items;
diff --git a/gcc/testsuite/rust/compile/lang-pin-unpin.rs b/gcc/testsuite/rust/compile/lang-pin-unpin.rs
new file mode 100644
index 000000000..dac96fe6c
--- /dev/null
+++ b/gcc/testsuite/rust/compile/lang-pin-unpin.rs
@@ -0,0 +1,38 @@
+#![feature(no_core, lang_items, optin_builtin_traits, negative_impls)]
+#![no_core]
+
+#[lang = "sized"]
+pub trait Sized {}
+
+#[lang = "unpin"]
+pub auto trait Unpin {}
+
+#[lang = "pin"]
+pub struct Pin<P> {
+    pointer: P,
+}
+
+impl<P> Pin<P> {
+    pub fn new(pointer: P) -> Pin<P>
+    where
+        P: Unpin,
+    {
+        Pin { pointer }
+    }
+}
+
+struct PhantomPinned;
+impl !Unpin for PhantomPinned {}
+
+struct PinnedStruct {
+    _marker: PhantomPinned, 
+}
+
+struct NormalStruct;
+
+fn main() {
+    let _ = Pin::new(NormalStruct); 
+
+    let pinned = PinnedStruct { _marker: PhantomPinned };
+    let _ = Pin::new(pinned); // { dg-error "bounds not satisfied for PinnedStruct .Unpin. is not satisfied .E0277." }
+}
-- 
2.54.0
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.