diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:11:38 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:13:23 +0000 |
commit | 20431706a863f92cb37dc512fef6e48d192aaf2c (patch) | |
tree | 2867f13f5fd5437ba628c67d7f87309ccadcd286 /src/test/ui/closures/closure-return-type-must-be-sized.rs | |
parent | Releasing progress-linux version 1.65.0+dfsg1-2~progress7.99u1. (diff) | |
download | rustc-20431706a863f92cb37dc512fef6e48d192aaf2c.tar.xz rustc-20431706a863f92cb37dc512fef6e48d192aaf2c.zip |
Merging upstream version 1.66.0+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | src/test/ui/closures/closure-return-type-must-be-sized.rs | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/src/test/ui/closures/closure-return-type-must-be-sized.rs b/src/test/ui/closures/closure-return-type-must-be-sized.rs new file mode 100644 index 000000000..8cfa02912 --- /dev/null +++ b/src/test/ui/closures/closure-return-type-must-be-sized.rs @@ -0,0 +1,74 @@ +#![feature(unboxed_closures)] + +trait A { + fn a() where Self: Sized; +} + +mod a { + use crate::A; + + pub fn foo<F: FnOnce<()>>() where F::Output: A { + F::Output::a() + } + + pub fn bar<F: FnOnce() -> R, R: ?Sized>() {} + + pub fn baz<F: FnOnce<()>>() where F::Output: A, F::Output: Sized { + F::Output::a() + } +} + +mod b { + use crate::A; + + pub fn foo<F: Fn<()>>() where F::Output: A { + F::Output::a() + } + + pub fn bar<F: Fn() -> R, R: ?Sized>() {} + + pub fn baz<F: Fn<()>>() where F::Output: A, F::Output: Sized { + F::Output::a() + } +} + +mod c { + use crate::A; + + pub fn foo<F: FnMut<()>>() where F::Output: A { + F::Output::a() + } + + pub fn bar<F: FnMut() -> R, R: ?Sized>() {} + + pub fn baz<F: FnMut<()>>() where F::Output: A, F::Output: Sized { + F::Output::a() + } +} + +impl A for Box<dyn A> { + fn a() {} +} + +fn main() { + a::foo::<fn() -> dyn A>(); //~ ERROR E0277 + a::bar::<fn() -> dyn A, _>(); //~ ERROR E0277 + a::baz::<fn() -> dyn A>(); //~ ERROR E0277 + a::foo::<fn() -> Box<dyn A>>(); // ok + a::bar::<fn() -> Box<dyn A>, _>(); // ok + a::baz::<fn() -> Box<dyn A>>(); // ok + + b::foo::<fn() -> dyn A>(); //~ ERROR E0277 + b::bar::<fn() -> dyn A, _>(); //~ ERROR E0277 + b::baz::<fn() -> dyn A>(); //~ ERROR E0277 + b::foo::<fn() -> Box<dyn A>>(); // ok + b::bar::<fn() -> Box<dyn A>, _>(); // ok + b::baz::<fn() -> Box<dyn A>>(); // ok + + c::foo::<fn() -> dyn A>(); //~ ERROR E0277 + c::bar::<fn() -> dyn A, _>(); //~ ERROR E0277 + c::baz::<fn() -> dyn A>(); //~ ERROR E0277 + c::foo::<fn() -> Box<dyn A>>(); // ok + c::bar::<fn() -> Box<dyn A>, _>(); // ok + c::baz::<fn() -> Box<dyn A>>(); // ok +} |