diff options
Diffstat (limited to 'src/test/ui/variance/variance-issue-20533.rs')
-rw-r--r-- | src/test/ui/variance/variance-issue-20533.rs | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/test/ui/variance/variance-issue-20533.rs b/src/test/ui/variance/variance-issue-20533.rs new file mode 100644 index 000000000..a2459f873 --- /dev/null +++ b/src/test/ui/variance/variance-issue-20533.rs @@ -0,0 +1,43 @@ +// Regression test for issue #20533. At some point, only 1 out of the +// 3 errors below were being reported. + +use std::marker::PhantomData; + +fn foo<'a, T>(_x: &'a T) -> PhantomData<&'a ()> { + PhantomData +} + +struct Wrap<T>(T); + +fn bar<'a, T>(_x: &'a T) -> Wrap<PhantomData<&'a ()>> { + Wrap(PhantomData) +} + +struct Baked<'a>(PhantomData<&'a ()>); + +fn baz<'a, T>(_x: &'a T) -> Baked<'a> { + Baked(PhantomData) +} + +struct AffineU32(u32); + +fn main() { + { + let a = AffineU32(1); + let x = foo(&a); + drop(a); //~ ERROR cannot move out of `a` + drop(x); + } + { + let a = AffineU32(1); + let x = bar(&a); + drop(a); //~ ERROR cannot move out of `a` + drop(x); + } + { + let a = AffineU32(1); + let x = baz(&a); + drop(a); //~ ERROR cannot move out of `a` + drop(x); + } +} |