Rollup merge of #133493 - lcnr:fulfill-fudge, r=compiler-errors
do not constrain infer vars in `find_best_leaf_obligation`
This ended up causing an ICE by making the following code path reachable by incorrectly constraining an inference variable while computing the best obligation for a preceding ambiguity. Closes #129444.
f2abf827c1/compiler/rustc_trait_selection/src/solve/fulfill.rs (L312-L314)
I have to be honest, I don't fully understand how that change removes all the additional diagnostics :3
r? `@compiler-errors`
This commit is contained in:
commit
762a661705
13 changed files with 114 additions and 138 deletions
|
@ -346,12 +346,21 @@ fn find_best_leaf_obligation<'tcx>(
|
||||||
consider_ambiguities: bool,
|
consider_ambiguities: bool,
|
||||||
) -> PredicateObligation<'tcx> {
|
) -> PredicateObligation<'tcx> {
|
||||||
let obligation = infcx.resolve_vars_if_possible(obligation.clone());
|
let obligation = infcx.resolve_vars_if_possible(obligation.clone());
|
||||||
|
// FIXME: we use a probe here as the `BestObligation` visitor does not
|
||||||
|
// check whether it uses candidates which get shadowed by where-bounds.
|
||||||
|
//
|
||||||
|
// We should probably fix the visitor to not do so instead, as this also
|
||||||
|
// means the leaf obligation may be incorrect.
|
||||||
|
infcx
|
||||||
|
.fudge_inference_if_ok(|| {
|
||||||
infcx
|
infcx
|
||||||
.visit_proof_tree(obligation.clone().into(), &mut BestObligation {
|
.visit_proof_tree(obligation.clone().into(), &mut BestObligation {
|
||||||
obligation: obligation.clone(),
|
obligation: obligation.clone(),
|
||||||
consider_ambiguities,
|
consider_ambiguities,
|
||||||
})
|
})
|
||||||
.break_value()
|
.break_value()
|
||||||
|
.ok_or(())
|
||||||
|
})
|
||||||
.unwrap_or(obligation)
|
.unwrap_or(obligation)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
//@ known-bug: rust-lang/rust#129444
|
|
||||||
|
|
||||||
//@ compile-flags: -Znext-solver=coherence
|
|
||||||
|
|
||||||
trait Trait {
|
|
||||||
type Assoc;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct W<T: Trait>(*mut T);
|
|
||||||
impl<T: ?Trait> Trait for W<W<W<T>>> {}
|
|
||||||
|
|
||||||
trait NoOverlap {}
|
|
||||||
impl<T: Trait<W<T>>> NoOverlap for T {}
|
|
||||||
|
|
||||||
impl<T: Trait<Assoc = u32>> NoOverlap for W<T> {}
|
|
20
tests/ui/coherence/fuzzing/best-obligation-ICE.rs
Normal file
20
tests/ui/coherence/fuzzing/best-obligation-ICE.rs
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
// A regression test for #129444. This previously ICE'd as
|
||||||
|
// computing the best obligation for one ambiguous obligation
|
||||||
|
// added spurious inference constraints which caused another
|
||||||
|
// candidate to pass.
|
||||||
|
trait Trait {
|
||||||
|
type Assoc;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct W<T: Trait>(*mut T);
|
||||||
|
impl<T> Trait for W<W<W<T>>> {}
|
||||||
|
//~^ ERROR the trait bound `W<W<T>>: Trait` is not satisfied
|
||||||
|
//~| ERROR the trait bound `W<T>: Trait` is not satisfied
|
||||||
|
//~| ERROR the trait bound `T: Trait` is not satisfied
|
||||||
|
//~| ERROR not all trait items implemented, missing: `Assoc`
|
||||||
|
|
||||||
|
trait NoOverlap {}
|
||||||
|
impl<T: Trait> NoOverlap for T {}
|
||||||
|
impl<T: Trait<Assoc = u32>> NoOverlap for W<T> {}
|
||||||
|
//~^ ERROR conflicting implementations of trait `NoOverlap` for type `W<W<W<W<_>>>>`
|
||||||
|
fn main() {}
|
69
tests/ui/coherence/fuzzing/best-obligation-ICE.stderr
Normal file
69
tests/ui/coherence/fuzzing/best-obligation-ICE.stderr
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
error[E0277]: the trait bound `W<W<T>>: Trait` is not satisfied
|
||||||
|
--> $DIR/best-obligation-ICE.rs:10:19
|
||||||
|
|
|
||||||
|
LL | impl<T> Trait for W<W<W<T>>> {}
|
||||||
|
| ^^^^^^^^^^ the trait `Trait` is not implemented for `W<W<T>>`
|
||||||
|
|
|
||||||
|
note: required by a bound in `W`
|
||||||
|
--> $DIR/best-obligation-ICE.rs:9:13
|
||||||
|
|
|
||||||
|
LL | struct W<T: Trait>(*mut T);
|
||||||
|
| ^^^^^ required by this bound in `W`
|
||||||
|
help: consider introducing a `where` clause, but there might be an alternative better way to express this requirement
|
||||||
|
|
|
||||||
|
LL | impl<T> Trait for W<W<W<T>>> where W<W<T>>: Trait {}
|
||||||
|
| ++++++++++++++++++++
|
||||||
|
|
||||||
|
error[E0277]: the trait bound `W<T>: Trait` is not satisfied
|
||||||
|
--> $DIR/best-obligation-ICE.rs:10:19
|
||||||
|
|
|
||||||
|
LL | impl<T> Trait for W<W<W<T>>> {}
|
||||||
|
| ^^^^^^^^^^ the trait `Trait` is not implemented for `W<T>`
|
||||||
|
|
|
||||||
|
note: required by a bound in `W`
|
||||||
|
--> $DIR/best-obligation-ICE.rs:9:13
|
||||||
|
|
|
||||||
|
LL | struct W<T: Trait>(*mut T);
|
||||||
|
| ^^^^^ required by this bound in `W`
|
||||||
|
help: consider introducing a `where` clause, but there might be an alternative better way to express this requirement
|
||||||
|
|
|
||||||
|
LL | impl<T> Trait for W<W<W<T>>> where W<T>: Trait {}
|
||||||
|
| +++++++++++++++++
|
||||||
|
|
||||||
|
error[E0277]: the trait bound `T: Trait` is not satisfied
|
||||||
|
--> $DIR/best-obligation-ICE.rs:10:19
|
||||||
|
|
|
||||||
|
LL | impl<T> Trait for W<W<W<T>>> {}
|
||||||
|
| ^^^^^^^^^^ the trait `Trait` is not implemented for `T`
|
||||||
|
|
|
||||||
|
note: required by a bound in `W`
|
||||||
|
--> $DIR/best-obligation-ICE.rs:9:13
|
||||||
|
|
|
||||||
|
LL | struct W<T: Trait>(*mut T);
|
||||||
|
| ^^^^^ required by this bound in `W`
|
||||||
|
help: consider restricting type parameter `T`
|
||||||
|
|
|
||||||
|
LL | impl<T: Trait> Trait for W<W<W<T>>> {}
|
||||||
|
| +++++++
|
||||||
|
|
||||||
|
error[E0046]: not all trait items implemented, missing: `Assoc`
|
||||||
|
--> $DIR/best-obligation-ICE.rs:10:1
|
||||||
|
|
|
||||||
|
LL | type Assoc;
|
||||||
|
| ---------- `Assoc` from trait
|
||||||
|
...
|
||||||
|
LL | impl<T> Trait for W<W<W<T>>> {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `Assoc` in implementation
|
||||||
|
|
||||||
|
error[E0119]: conflicting implementations of trait `NoOverlap` for type `W<W<W<W<_>>>>`
|
||||||
|
--> $DIR/best-obligation-ICE.rs:18:1
|
||||||
|
|
|
||||||
|
LL | impl<T: Trait> NoOverlap for T {}
|
||||||
|
| ------------------------------ first implementation here
|
||||||
|
LL | impl<T: Trait<Assoc = u32>> NoOverlap for W<T> {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `W<W<W<W<_>>>>`
|
||||||
|
|
||||||
|
error: aborting due to 5 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0046, E0119, E0277.
|
||||||
|
For more information about an error, try `rustc --explain E0046`.
|
|
@ -1,35 +1,11 @@
|
||||||
error[E0277]: the size for values of type `dyn Trait` cannot be known at compilation time
|
error[E0277]: the size for values of type `dyn Trait` cannot be known at compilation time
|
||||||
--> $DIR/unsized_coercion.rs:15:17
|
--> $DIR/unsized_coercion.rs:14:17
|
||||||
|
|
|
|
||||||
LL | let x = hello();
|
LL | let x = hello();
|
||||||
| ^^^^^^^ doesn't have a size known at compile-time
|
| ^^^^^^^ doesn't have a size known at compile-time
|
||||||
|
|
|
|
||||||
= help: the trait `Sized` is not implemented for `dyn Trait`
|
= help: the trait `Sized` is not implemented for `dyn Trait`
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error: aborting due to 1 previous error
|
||||||
--> $DIR/unsized_coercion.rs:19:5
|
|
||||||
|
|
|
||||||
LL | fn hello() -> Box<impl Trait> {
|
|
||||||
| ---------------
|
|
||||||
| | |
|
|
||||||
| | the expected opaque type
|
|
||||||
| expected `Box<impl Trait>` because of return type
|
|
||||||
...
|
|
||||||
LL | Box::new(1u32)
|
|
||||||
| ^^^^^^^^^^^^^^ types differ
|
|
||||||
|
|
|
||||||
= note: expected struct `Box<impl Trait>`
|
|
||||||
found struct `Box<u32>`
|
|
||||||
|
|
||||||
error[E0277]: the size for values of type `dyn Trait` cannot be known at compilation time
|
For more information about this error, try `rustc --explain E0277`.
|
||||||
--> $DIR/unsized_coercion.rs:12:1
|
|
||||||
|
|
|
||||||
LL | fn hello() -> Box<impl Trait> {
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
|
||||||
|
|
|
||||||
= help: the trait `Sized` is not implemented for `dyn Trait`
|
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
|
||||||
|
|
||||||
Some errors have detailed explanations: E0277, E0308.
|
|
||||||
For more information about an error, try `rustc --explain E0277`.
|
|
||||||
|
|
|
@ -10,13 +10,12 @@ trait Trait {}
|
||||||
impl Trait for u32 {}
|
impl Trait for u32 {}
|
||||||
|
|
||||||
fn hello() -> Box<impl Trait> {
|
fn hello() -> Box<impl Trait> {
|
||||||
//[next]~^ ERROR the size for values of type `dyn Trait` cannot be known at compilation time
|
|
||||||
if true {
|
if true {
|
||||||
let x = hello();
|
let x = hello();
|
||||||
//[next]~^ ERROR: the size for values of type `dyn Trait` cannot be known at compilation time
|
//[next]~^ ERROR: the size for values of type `dyn Trait` cannot be known at compilation time
|
||||||
let y: Box<dyn Trait> = x;
|
let y: Box<dyn Trait> = x;
|
||||||
}
|
}
|
||||||
Box::new(1u32) //[next]~ ERROR: mismatched types
|
Box::new(1u32)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -1,35 +1,11 @@
|
||||||
error[E0277]: the trait bound `dyn Send: Trait` is not satisfied
|
error[E0277]: the trait bound `dyn Send: Trait` is not satisfied
|
||||||
--> $DIR/unsized_coercion3.rs:14:17
|
--> $DIR/unsized_coercion3.rs:13:17
|
||||||
|
|
|
|
||||||
LL | let x = hello();
|
LL | let x = hello();
|
||||||
| ^^^^^^^ the trait `Trait` is not implemented for `dyn Send`
|
| ^^^^^^^ the trait `Trait` is not implemented for `dyn Send`
|
||||||
|
|
|
|
||||||
= help: the trait `Trait` is implemented for `u32`
|
= help: the trait `Trait` is implemented for `u32`
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error: aborting due to 1 previous error
|
||||||
--> $DIR/unsized_coercion3.rs:19:5
|
|
||||||
|
|
|
||||||
LL | fn hello() -> Box<impl Trait + ?Sized> {
|
|
||||||
| ------------------------
|
|
||||||
| | |
|
|
||||||
| | the expected opaque type
|
|
||||||
| expected `Box<impl Trait + ?Sized>` because of return type
|
|
||||||
...
|
|
||||||
LL | Box::new(1u32)
|
|
||||||
| ^^^^^^^^^^^^^^ types differ
|
|
||||||
|
|
|
||||||
= note: expected struct `Box<impl Trait + ?Sized>`
|
|
||||||
found struct `Box<u32>`
|
|
||||||
|
|
||||||
error[E0277]: the trait bound `dyn Send: Trait` is not satisfied
|
For more information about this error, try `rustc --explain E0277`.
|
||||||
--> $DIR/unsized_coercion3.rs:11:1
|
|
||||||
|
|
|
||||||
LL | fn hello() -> Box<impl Trait + ?Sized> {
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Trait` is not implemented for `dyn Send`
|
|
||||||
|
|
|
||||||
= help: the trait `Trait` is implemented for `u32`
|
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
|
||||||
|
|
||||||
Some errors have detailed explanations: E0277, E0308.
|
|
||||||
For more information about an error, try `rustc --explain E0277`.
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
error[E0277]: the size for values of type `impl Trait + ?Sized` cannot be known at compilation time
|
error[E0277]: the size for values of type `impl Trait + ?Sized` cannot be known at compilation time
|
||||||
--> $DIR/unsized_coercion3.rs:16:32
|
--> $DIR/unsized_coercion3.rs:15:32
|
||||||
|
|
|
|
||||||
LL | let y: Box<dyn Send> = x;
|
LL | let y: Box<dyn Send> = x;
|
||||||
| ^ doesn't have a size known at compile-time
|
| ^ doesn't have a size known at compile-time
|
||||||
|
|
|
@ -9,7 +9,6 @@ trait Trait {}
|
||||||
impl Trait for u32 {}
|
impl Trait for u32 {}
|
||||||
|
|
||||||
fn hello() -> Box<impl Trait + ?Sized> {
|
fn hello() -> Box<impl Trait + ?Sized> {
|
||||||
//[next]~^ ERROR: the trait bound `dyn Send: Trait` is not satisfied
|
|
||||||
if true {
|
if true {
|
||||||
let x = hello();
|
let x = hello();
|
||||||
//[next]~^ ERROR: the trait bound `dyn Send: Trait` is not satisfied
|
//[next]~^ ERROR: the trait bound `dyn Send: Trait` is not satisfied
|
||||||
|
@ -17,7 +16,6 @@ fn hello() -> Box<impl Trait + ?Sized> {
|
||||||
//[old]~^ ERROR: the size for values of type `impl Trait + ?Sized` cannot be know
|
//[old]~^ ERROR: the size for values of type `impl Trait + ?Sized` cannot be know
|
||||||
}
|
}
|
||||||
Box::new(1u32)
|
Box::new(1u32)
|
||||||
//[next]~^ ERROR: mismatched types
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -14,13 +14,7 @@ fn main() {
|
||||||
|
|
||||||
fn weird0() -> impl Sized + !Sized {}
|
fn weird0() -> impl Sized + !Sized {}
|
||||||
//~^ ERROR the trait bound `(): !Sized` is not satisfied
|
//~^ ERROR the trait bound `(): !Sized` is not satisfied
|
||||||
//~| ERROR the trait bound `(): !Sized` is not satisfied
|
|
||||||
//~| ERROR the trait bound `(): !Sized` is not satisfied
|
|
||||||
fn weird1() -> impl !Sized + Sized {}
|
fn weird1() -> impl !Sized + Sized {}
|
||||||
//~^ ERROR the trait bound `(): !Sized` is not satisfied
|
//~^ ERROR the trait bound `(): !Sized` is not satisfied
|
||||||
//~| ERROR the trait bound `(): !Sized` is not satisfied
|
|
||||||
//~| ERROR the trait bound `(): !Sized` is not satisfied
|
|
||||||
fn weird2() -> impl !Sized {}
|
fn weird2() -> impl !Sized {}
|
||||||
//~^ ERROR the trait bound `(): !Sized` is not satisfied
|
//~^ ERROR the trait bound `(): !Sized` is not satisfied
|
||||||
//~| ERROR the trait bound `(): !Sized` is not satisfied
|
|
||||||
//~| ERROR the trait bound `(): !Sized` is not satisfied
|
|
||||||
|
|
|
@ -5,53 +5,17 @@ LL | fn weird0() -> impl Sized + !Sized {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^ the trait bound `(): !Sized` is not satisfied
|
| ^^^^^^^^^^^^^^^^^^^ the trait bound `(): !Sized` is not satisfied
|
||||||
|
|
||||||
error[E0277]: the trait bound `(): !Sized` is not satisfied
|
error[E0277]: the trait bound `(): !Sized` is not satisfied
|
||||||
--> $DIR/opaque-type-unsatisfied-bound.rs:15:36
|
--> $DIR/opaque-type-unsatisfied-bound.rs:17:16
|
||||||
|
|
|
||||||
LL | fn weird0() -> impl Sized + !Sized {}
|
|
||||||
| ^^ the trait bound `(): !Sized` is not satisfied
|
|
||||||
|
|
||||||
error[E0277]: the trait bound `(): !Sized` is not satisfied
|
|
||||||
--> $DIR/opaque-type-unsatisfied-bound.rs:15:1
|
|
||||||
|
|
|
||||||
LL | fn weird0() -> impl Sized + !Sized {}
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait bound `(): !Sized` is not satisfied
|
|
||||||
|
|
||||||
error[E0277]: the trait bound `(): !Sized` is not satisfied
|
|
||||||
--> $DIR/opaque-type-unsatisfied-bound.rs:19:16
|
|
||||||
|
|
|
|
||||||
LL | fn weird1() -> impl !Sized + Sized {}
|
LL | fn weird1() -> impl !Sized + Sized {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^ the trait bound `(): !Sized` is not satisfied
|
| ^^^^^^^^^^^^^^^^^^^ the trait bound `(): !Sized` is not satisfied
|
||||||
|
|
||||||
error[E0277]: the trait bound `(): !Sized` is not satisfied
|
error[E0277]: the trait bound `(): !Sized` is not satisfied
|
||||||
--> $DIR/opaque-type-unsatisfied-bound.rs:19:36
|
--> $DIR/opaque-type-unsatisfied-bound.rs:19:16
|
||||||
|
|
|
||||||
LL | fn weird1() -> impl !Sized + Sized {}
|
|
||||||
| ^^ the trait bound `(): !Sized` is not satisfied
|
|
||||||
|
|
||||||
error[E0277]: the trait bound `(): !Sized` is not satisfied
|
|
||||||
--> $DIR/opaque-type-unsatisfied-bound.rs:19:1
|
|
||||||
|
|
|
||||||
LL | fn weird1() -> impl !Sized + Sized {}
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait bound `(): !Sized` is not satisfied
|
|
||||||
|
|
||||||
error[E0277]: the trait bound `(): !Sized` is not satisfied
|
|
||||||
--> $DIR/opaque-type-unsatisfied-bound.rs:23:16
|
|
||||||
|
|
|
|
||||||
LL | fn weird2() -> impl !Sized {}
|
LL | fn weird2() -> impl !Sized {}
|
||||||
| ^^^^^^^^^^^ the trait bound `(): !Sized` is not satisfied
|
| ^^^^^^^^^^^ the trait bound `(): !Sized` is not satisfied
|
||||||
|
|
||||||
error[E0277]: the trait bound `(): !Sized` is not satisfied
|
|
||||||
--> $DIR/opaque-type-unsatisfied-bound.rs:23:28
|
|
||||||
|
|
|
||||||
LL | fn weird2() -> impl !Sized {}
|
|
||||||
| ^^ the trait bound `(): !Sized` is not satisfied
|
|
||||||
|
|
||||||
error[E0277]: the trait bound `(): !Sized` is not satisfied
|
|
||||||
--> $DIR/opaque-type-unsatisfied-bound.rs:23:1
|
|
||||||
|
|
|
||||||
LL | fn weird2() -> impl !Sized {}
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait bound `(): !Sized` is not satisfied
|
|
||||||
|
|
||||||
error[E0277]: the trait bound `impl !Trait: Trait` is not satisfied
|
error[E0277]: the trait bound `impl !Trait: Trait` is not satisfied
|
||||||
--> $DIR/opaque-type-unsatisfied-bound.rs:12:13
|
--> $DIR/opaque-type-unsatisfied-bound.rs:12:13
|
||||||
|
|
|
|
||||||
|
@ -66,6 +30,6 @@ note: required by a bound in `consume`
|
||||||
LL | fn consume(_: impl Trait) {}
|
LL | fn consume(_: impl Trait) {}
|
||||||
| ^^^^^ required by this bound in `consume`
|
| ^^^^^ required by this bound in `consume`
|
||||||
|
|
||||||
error: aborting due to 10 previous errors
|
error: aborting due to 4 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0277`.
|
For more information about this error, try `rustc --explain E0277`.
|
||||||
|
|
|
@ -4,7 +4,5 @@
|
||||||
|
|
||||||
fn produce() -> impl !Fn<(u32,)> {}
|
fn produce() -> impl !Fn<(u32,)> {}
|
||||||
//~^ ERROR the trait bound `(): !Fn(u32)` is not satisfied
|
//~^ ERROR the trait bound `(): !Fn(u32)` is not satisfied
|
||||||
//~| ERROR the trait bound `(): !Fn(u32)` is not satisfied
|
|
||||||
//~| ERROR the trait bound `(): !Fn(u32)` is not satisfied
|
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -4,18 +4,6 @@ error[E0277]: the trait bound `(): !Fn(u32)` is not satisfied
|
||||||
LL | fn produce() -> impl !Fn<(u32,)> {}
|
LL | fn produce() -> impl !Fn<(u32,)> {}
|
||||||
| ^^^^^^^^^^^^^^^^ the trait bound `(): !Fn(u32)` is not satisfied
|
| ^^^^^^^^^^^^^^^^ the trait bound `(): !Fn(u32)` is not satisfied
|
||||||
|
|
||||||
error[E0277]: the trait bound `(): !Fn(u32)` is not satisfied
|
error: aborting due to 1 previous error
|
||||||
--> $DIR/opaque-type-unsatisfied-fn-bound.rs:5:34
|
|
||||||
|
|
|
||||||
LL | fn produce() -> impl !Fn<(u32,)> {}
|
|
||||||
| ^^ the trait bound `(): !Fn(u32)` is not satisfied
|
|
||||||
|
|
||||||
error[E0277]: the trait bound `(): !Fn(u32)` is not satisfied
|
|
||||||
--> $DIR/opaque-type-unsatisfied-fn-bound.rs:5:1
|
|
||||||
|
|
|
||||||
LL | fn produce() -> impl !Fn<(u32,)> {}
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait bound `(): !Fn(u32)` is not satisfied
|
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0277`.
|
For more information about this error, try `rustc --explain E0277`.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue