This commit is contained in:
Michael Goulet 2024-04-15 20:13:31 -04:00
parent b2fea557f3
commit 870ed4bfa2
5 changed files with 51 additions and 5 deletions

View File

@ -1,5 +0,0 @@
//@ known-bug: #123461
fn main() {
let _: [_; unsafe { std::mem::transmute(|o_b: Option<_>| {}) }];
}

View File

@ -0,0 +1,11 @@
// Minimized test for <https://github.com/rust-lang/rust/issues/123461>.
struct Unconstrained<T>(T);
fn main() {
unsafe { std::mem::transmute::<_, ()>(|o_b: Unconstrained<_>| {}) };
//~^ ERROR type annotations needed
// We unfortunately don't check `Wf(Unconstrained<_>)`, so we won't
// hit an ambiguity error before checking the transmute. That means
// we still may have inference variables in our transmute src.
}

View File

@ -0,0 +1,9 @@
error[E0282]: type annotations needed
--> $DIR/ambiguity-in-closure-arg.rs:6:44
|
LL | unsafe { std::mem::transmute::<_, ()>(|o_b: Unconstrained<_>| {}) };
| ^^^^^^^^^^^^^^^^^^^^^ cannot infer type
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0282`.

11
tests/ui/wf/closure-wf.rs Normal file
View File

@ -0,0 +1,11 @@
trait Bound {}
struct NeedsBound<T: Bound>(T);
// Checks that we enforce that closure args are WF.
fn constrain_inner<T, F: for<'a> FnOnce(&'a (), NeedsBound<T>)>(_: T, _: F) {}
fn main() {
constrain_inner(1u32, |&(), _| ());
//~^ ERROR the trait bound `u32: Bound` is not satisfied
}

View File

@ -0,0 +1,20 @@
error[E0277]: the trait bound `u32: Bound` is not satisfied
--> $DIR/closure-wf.rs:9:33
|
LL | constrain_inner(1u32, |&(), _| ());
| ^ the trait `Bound` is not implemented for `u32`
|
help: this trait has no implementations, consider adding one
--> $DIR/closure-wf.rs:1:1
|
LL | trait Bound {}
| ^^^^^^^^^^^
note: required by a bound in `NeedsBound`
--> $DIR/closure-wf.rs:2:22
|
LL | struct NeedsBound<T: Bound>(T);
| ^^^^^ required by this bound in `NeedsBound`
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0277`.