File tree Expand file tree Collapse file tree 2 files changed +40
-0
lines changed Expand file tree Collapse file tree 2 files changed +40
-0
lines changed Original file line number Diff line number Diff line change
1
+ // Pin's PartialEq implementation allowed to access the pointer allowing for
2
+ // unsoundness by using Rc::get_mut to move value within Rc.
3
+ // See https://internals.rust-lang.org/t/unsoundness-in-pin/11311/73 for more details.
4
+
5
+ use std:: ops:: Deref ;
6
+ use std:: pin:: Pin ;
7
+ use std:: rc:: Rc ;
8
+
9
+ struct Apple ;
10
+
11
+ impl Deref for Apple {
12
+ type Target = Apple ;
13
+ fn deref ( & self ) -> & Apple {
14
+ & Apple
15
+ }
16
+ }
17
+
18
+ impl PartialEq < Rc < Apple > > for Apple {
19
+ fn eq ( & self , _rc : & Rc < Apple > ) -> bool {
20
+ unreachable ! ( )
21
+ }
22
+ }
23
+
24
+ fn main ( ) {
25
+ let _ = Pin :: new ( Apple ) == Rc :: pin ( Apple ) ;
26
+ //~^ ERROR type mismatch resolving
27
+ }
Original file line number Diff line number Diff line change
1
+ error[E0271]: type mismatch resolving `<std::rc::Rc<Apple> as std::ops::Deref>::Target == std::rc::Rc<Apple>`
2
+ --> $DIR/issue-67039-unsound-pin-partialeq.rs:25:29
3
+ |
4
+ LL | let _ = Pin::new(Apple) == Rc::pin(Apple);
5
+ | ^^ expected struct `Apple`, found struct `std::rc::Rc`
6
+ |
7
+ = note: expected type `Apple`
8
+ found struct `std::rc::Rc<Apple>`
9
+ = note: required because of the requirements on the impl of `std::cmp::PartialEq<std::pin::Pin<std::rc::Rc<Apple>>>` for `std::pin::Pin<Apple>`
10
+
11
+ error: aborting due to previous error
12
+
13
+ For more information about this error, try `rustc --explain E0271`.
You can’t perform that action at this time.
0 commit comments