summaryrefslogtreecommitdiffstats
path: root/tests/ui/issues/issue-67039-unsound-pin-partialeq.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/issues/issue-67039-unsound-pin-partialeq.rs')
-rw-r--r--tests/ui/issues/issue-67039-unsound-pin-partialeq.rs27
1 files changed, 27 insertions, 0 deletions
diff --git a/tests/ui/issues/issue-67039-unsound-pin-partialeq.rs b/tests/ui/issues/issue-67039-unsound-pin-partialeq.rs
new file mode 100644
index 000000000..a496e58a7
--- /dev/null
+++ b/tests/ui/issues/issue-67039-unsound-pin-partialeq.rs
@@ -0,0 +1,27 @@
+// Pin's PartialEq implementation allowed to access the pointer allowing for
+// unsoundness by using Rc::get_mut to move value within Rc.
+// See https://internals.rust-lang.org/t/unsoundness-in-pin/11311/73 for more details.
+
+use std::ops::Deref;
+use std::pin::Pin;
+use std::rc::Rc;
+
+struct Apple;
+
+impl Deref for Apple {
+ type Target = Apple;
+ fn deref(&self) -> &Apple {
+ &Apple
+ }
+}
+
+impl PartialEq<Rc<Apple>> for Apple {
+ fn eq(&self, _rc: &Rc<Apple>) -> bool {
+ unreachable!()
+ }
+}
+
+fn main() {
+ let _ = Pin::new(Apple) == Rc::pin(Apple);
+ //~^ ERROR type mismatch resolving
+}