diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:11:28 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:11:28 +0000 |
commit | 94a0819fe3a0d679c3042a77bfe6a2afc505daea (patch) | |
tree | 2b827afe6a05f3538db3f7803a88c4587fe85648 /src/test/ui/closures/closure-return-type-must-be-sized.rs | |
parent | Adding upstream version 1.64.0+dfsg1. (diff) | |
download | rustc-94a0819fe3a0d679c3042a77bfe6a2afc505daea.tar.xz rustc-94a0819fe3a0d679c3042a77bfe6a2afc505daea.zip |
Adding upstream version 1.66.0+dfsg1.upstream/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 +} |