_ => bug!("leak_check: expected placeholder found {:?}", placeholder_region,),
};
- // Find all regions that are related to this placeholder
- // in some way. This means any region that either outlives
- // or is outlived by a placeholder.
- let mut taint_set = TaintSet::new(TaintDirections::both(), placeholder_region);
+ // Find all regions that this placeholder `!p` must outlive -- i.e.,
+ // any region `r` where `!p: r` must hold. It is an error if any
+ // such region `r` is another placeholder or in a universe that
+ // can't see the placeholder. (This is actually incorrect, because
+ // we don't take into account the possibility of bounds in
+ // environment that tell us that the placeholder may be related to
+ // other regions).
+ //
+ // Note that we *don't* look for cases like `r: !p`. This is
+ // because:
+ //
+ // * If `r` is some other placeholder `!p1`, then we'll find the
+ // error when we search the regions that `!p1` must outlive.
+ // * If `r` is a variable in some outer universe, then it can
+ // potentially be assigned to `'static`, so this relation could
+ // hold.
+ let mut taint_set = TaintSet::new(TaintDirections::outgoing(), placeholder_region);
taint_set.fixed_point(
tcx,
self.undo_log.region_constraints(),
// Here, we are given a function whose region is bound at closure level,
// but we expect one bound in the argument. Error results.
with_closure_expecting_fn_with_free_region(|x: fn(&u32), y| {});
- //~^ ERROR type mismatch
+ //~^ ERROR mismatched types
}
fn expect_bound_supply_free_from_fn<'x>(x: &'x u32) {
// Here, we are given a `fn(&u32)` but we expect a `fn(&'x
// u32)`. In principle, this could be ok, but we demand equality.
with_closure_expecting_fn_with_bound_region(|x: fn(&'x u32), y| {});
- //~^ ERROR type mismatch
+ //~^ ERROR mismatched types
}
fn expect_bound_supply_free_from_closure() {
// the argument level.
type Foo<'a> = fn(&'a u32);
with_closure_expecting_fn_with_bound_region(|x: Foo<'_>, y| {
- //~^ ERROR type mismatch
+ //~^ ERROR mismatched types
});
}
LL | with_closure_expecting_fn_with_free_region(|x: fn(&'x u32), y| {});
| ^^^^^^^^^^^^^^^^^^^^^^
-error[E0631]: type mismatch in closure arguments
- --> $DIR/expect-fn-supply-fn.rs:30:5
+error[E0308]: mismatched types
+ --> $DIR/expect-fn-supply-fn.rs:30:52
|
-LL | fn with_closure_expecting_fn_with_free_region<F>(_: F)
- | ------------------------------------------ required by a bound in this
-LL | where F: for<'a> FnOnce(fn(&'a u32), &i32)
- | ------------------------- required by this bound in `with_closure_expecting_fn_with_free_region`
-...
LL | with_closure_expecting_fn_with_free_region(|x: fn(&u32), y| {});
- | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ---------------- found signature of `fn(for<'r> fn(&'r u32), _) -> _`
- | |
- | expected signature of `fn(fn(&'a u32), &i32) -> _`
+ | ^^^^^^^^ one type is more general than the other
+ |
+ = note: expected fn pointer `fn(&u32)`
+ found fn pointer `for<'r> fn(&'r u32)`
-error[E0631]: type mismatch in closure arguments
- --> $DIR/expect-fn-supply-fn.rs:37:5
+error[E0308]: mismatched types
+ --> $DIR/expect-fn-supply-fn.rs:37:53
|
-LL | fn with_closure_expecting_fn_with_bound_region<F>(_: F)
- | ------------------------------------------- required by a bound in this
-LL | where F: FnOnce(fn(&u32), &i32)
- | ---------------------- required by this bound in `with_closure_expecting_fn_with_bound_region`
-...
LL | with_closure_expecting_fn_with_bound_region(|x: fn(&'x u32), y| {});
- | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ------------------- found signature of `fn(fn(&'x u32), _) -> _`
- | |
- | expected signature of `fn(for<'r> fn(&'r u32), &i32) -> _`
+ | ^^^^^^^^^^^ one type is more general than the other
+ |
+ = note: expected fn pointer `for<'r> fn(&'r u32)`
+ found fn pointer `fn(&'x u32)`
-error[E0631]: type mismatch in closure arguments
- --> $DIR/expect-fn-supply-fn.rs:46:5
+error[E0308]: mismatched types
+ --> $DIR/expect-fn-supply-fn.rs:46:53
|
-LL | fn with_closure_expecting_fn_with_bound_region<F>(_: F)
- | ------------------------------------------- required by a bound in this
-LL | where F: FnOnce(fn(&u32), &i32)
- | ---------------------- required by this bound in `with_closure_expecting_fn_with_bound_region`
-...
LL | with_closure_expecting_fn_with_bound_region(|x: Foo<'_>, y| {
- | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ --------------- found signature of `for<'r> fn(fn(&'r u32), _) -> _`
- | |
- | expected signature of `fn(for<'r> fn(&'r u32), &i32) -> _`
+ | ^^^^^^^ one type is more general than the other
+ |
+ = note: expected fn pointer `for<'r> fn(&'r u32)`
+ found fn pointer `fn(&u32)`
error: aborting due to 5 previous errors
-Some errors have detailed explanations: E0308, E0631.
-For more information about an error, try `rustc --explain E0308`.
+For more information about this error, try `rustc --explain E0308`.
-error[E0308]: mismatched types
- --> $DIR/hr-subtype.rs:39:26
+error: fatal error triggered by #[rustc_error]
+ --> $DIR/hr-subtype.rs:96:1
|
-LL | gimme::<$t1>(None::<$t2>);
- | ^^^^^^^^^^^ expected concrete lifetime, found bound lifetime parameter 'a
-...
-LL | / check! { bound_a_b_vs_bound_a: (for<'a,'b> fn(&'a u32, &'b u32),
-LL | | for<'a> fn(&'a u32, &'a u32)) }
- | |__________________________________________________________________- in this macro invocation
- |
- = note: expected enum `std::option::Option<for<'a, 'b> fn(&'a u32, &'b u32)>`
- found enum `std::option::Option<for<'a> fn(&'a u32, &'a u32)>`
- = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
+LL | / fn main() {
+LL | |
+LL | |
+LL | |
+... |
+LL | |
+LL | | }
+ | |_^
error: aborting due to previous error
-For more information about this error, try `rustc --explain E0308`.
error: fatal error triggered by #[rustc_error]
- --> $DIR/hr-subtype.rs:100:1
+ --> $DIR/hr-subtype.rs:96:1
|
LL | / fn main() {
LL | |
LL | |
LL | |
-LL | |
+... |
LL | |
LL | | }
| |_^
error: fatal error triggered by #[rustc_error]
- --> $DIR/hr-subtype.rs:100:1
+ --> $DIR/hr-subtype.rs:96:1
|
LL | / fn main() {
LL | |
LL | |
LL | |
-LL | |
+... |
LL | |
LL | | }
| |_^
--> $DIR/hr-subtype.rs:39:26
|
LL | gimme::<$t1>(None::<$t2>);
- | ^^^^^^^^^^^ expected concrete lifetime, found bound lifetime parameter 'a
+ | ^^^^^^^^^^^ one type is more general than the other
...
LL | / check! { bound_a_vs_free_x: (for<'a> fn(&'a u32),
LL | | fn(&'x u32)) }
-error[E0308]: mismatched types
- --> $DIR/hr-subtype.rs:39:26
+error: fatal error triggered by #[rustc_error]
+ --> $DIR/hr-subtype.rs:96:1
|
-LL | gimme::<$t1>(None::<$t2>);
- | ^^^^^^^^^^^ expected concrete lifetime, found bound lifetime parameter 'a
-...
-LL | / check! { bound_co_a_b_vs_bound_co_a: (for<'a,'b> fn(Co<'a>, Co<'b>),
-LL | | for<'a> fn(Co<'a>, Co<'a>)) }
- | |______________________________________________________________________- in this macro invocation
- |
- = note: expected enum `std::option::Option<for<'a, 'b> fn(Co<'a>, Co<'b>)>`
- found enum `std::option::Option<for<'a> fn(Co<'a>, Co<'a>)>`
- = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
+LL | / fn main() {
+LL | |
+LL | |
+LL | |
+... |
+LL | |
+LL | | }
+ | |_^
error: aborting due to previous error
-For more information about this error, try `rustc --explain E0308`.
-error[E0308]: mismatched types
- --> $DIR/hr-subtype.rs:39:26
+error: fatal error triggered by #[rustc_error]
+ --> $DIR/hr-subtype.rs:96:1
|
-LL | gimme::<$t1>(None::<$t2>);
- | ^^^^^^^^^^^ expected concrete lifetime, found bound lifetime parameter 'a
-...
-LL | / check! { bound_co_a_co_b_ret_contra_a: (for<'a,'b> fn(Co<'a>, Co<'b>) -> Contra<'a>,
-LL | | for<'a> fn(Co<'a>, Co<'a>) -> Contra<'a>) }
- | |______________________________________________________________________________________- in this macro invocation
- |
- = note: expected enum `std::option::Option<for<'a, 'b> fn(Co<'a>, Co<'b>) -> Contra<'a>>`
- found enum `std::option::Option<for<'a> fn(Co<'a>, Co<'a>) -> Contra<'a>>`
- = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
+LL | / fn main() {
+LL | |
+LL | |
+LL | |
+... |
+LL | |
+LL | | }
+ | |_^
error: aborting due to previous error
-For more information about this error, try `rustc --explain E0308`.
error: fatal error triggered by #[rustc_error]
- --> $DIR/hr-subtype.rs:100:1
+ --> $DIR/hr-subtype.rs:96:1
|
LL | / fn main() {
LL | |
LL | |
LL | |
-LL | |
+... |
LL | |
LL | | }
| |_^
-error[E0308]: mismatched types
- --> $DIR/hr-subtype.rs:39:26
+error: fatal error triggered by #[rustc_error]
+ --> $DIR/hr-subtype.rs:96:1
|
-LL | gimme::<$t1>(None::<$t2>);
- | ^^^^^^^^^^^ expected concrete lifetime, found bound lifetime parameter 'a
-...
-LL | / check! { bound_contra_a_contra_b_ret_co_a: (for<'a,'b> fn(Contra<'a>, Contra<'b>) -> Co<'a>,
-LL | | for<'a> fn(Contra<'a>, Contra<'a>) -> Co<'a>) }
- | |______________________________________________________________________________________________- in this macro invocation
- |
- = note: expected enum `std::option::Option<for<'a, 'b> fn(Contra<'a>, Contra<'b>) -> Co<'a>>`
- found enum `std::option::Option<for<'a> fn(Contra<'a>, Contra<'a>) -> Co<'a>>`
- = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
+LL | / fn main() {
+LL | |
+LL | |
+LL | |
+... |
+LL | |
+LL | | }
+ | |_^
error: aborting due to previous error
-For more information about this error, try `rustc --explain E0308`.
error: fatal error triggered by #[rustc_error]
- --> $DIR/hr-subtype.rs:100:1
+ --> $DIR/hr-subtype.rs:96:1
|
LL | / fn main() {
LL | |
LL | |
LL | |
-LL | |
+... |
LL | |
LL | | }
| |_^
error: fatal error triggered by #[rustc_error]
- --> $DIR/hr-subtype.rs:100:1
+ --> $DIR/hr-subtype.rs:96:1
|
LL | / fn main() {
LL | |
LL | |
LL | |
-LL | |
+... |
LL | |
LL | | }
| |_^
//[bound_inv_a_b_vs_bound_inv_a]~^^^ ERROR
//[bound_a_b_ret_a_vs_bound_a_ret_a]~^^^^ ERROR
//[free_inv_x_vs_free_inv_y]~^^^^^ ERROR
- //[bound_a_b_vs_bound_a]~^^^^^^ ERROR mismatched types
- //[bound_co_a_co_b_ret_contra_a]~^^^^^^^ ERROR
- //[bound_contra_a_contra_b_ret_co_a]~^^^^^^^^ ERROR
- //[bound_co_a_b_vs_bound_co_a]~^^^^^^^^^ ERROR
}
}
}
//[bound_inv_a_vs_bound_inv_b]~^^^ ERROR fatal error triggered by #[rustc_error]
//[bound_co_a_vs_bound_co_b]~^^^^ ERROR fatal error triggered by #[rustc_error]
//[free_x_vs_free_x]~^^^^^ ERROR fatal error triggered by #[rustc_error]
+//[bound_a_b_vs_bound_a]~^^^^^^ ERROR fatal error triggered by #[rustc_error]
+//[bound_co_a_b_vs_bound_co_a]~^^^^^^^ ERROR fatal error triggered by #[rustc_error]
+//[bound_co_a_co_b_ret_contra_a]~^^^^^^^^ ERROR fatal error triggered by #[rustc_error]
+//[bound_contra_a_contra_b_ret_co_a]~^^^^^^^^^ ERROR fatal error triggered by #[rustc_error]
}
--> $DIR/hrtb-exists-forall-fn.rs:17:34
|
LL | let _: for<'b> fn(&'b u32) = foo();
- | ------------------- ^^^^^ expected concrete lifetime, found bound lifetime parameter 'b
- | |
- | expected due to this
+ | ^^^^^ one type is more general than the other
|
= note: expected fn pointer `for<'b> fn(&'b u32)`
found fn pointer `fn(&u32)`
// NB. *However*, the reinstated leak-check gives an error here.
foo::<()>();
- //~^ ERROR not satisfied
+ //~^ ERROR implementation of `Trait` is not general enough
}
-error[E0277]: the trait bound `(): Trait<for<'b> fn(&'b u32)>` is not satisfied
- --> $DIR/hrtb-exists-forall-trait-contravariant.rs:34:11
+error: implementation of `Trait` is not general enough
+ --> $DIR/hrtb-exists-forall-trait-contravariant.rs:34:5
|
-LL | fn foo<T>()
- | --- required by a bound in this
-LL | where
-LL | T: Trait<for<'b> fn(&'b u32)>,
- | -------------------------- required by this bound in `foo`
+LL | trait Trait<T> {}
+ | ----------------- trait `Trait` defined here
...
LL | foo::<()>();
- | ^^ the trait `Trait<for<'b> fn(&'b u32)>` is not implemented for `()`
+ | ^^^^^^^^^ implementation of `Trait` is not general enough
|
- = help: the following implementations were found:
- <() as Trait<fn(&'a u32)>>
+ = note: `()` must implement `Trait<for<'b> fn(&'b u32)>`
+ = note: ...but `()` actually implements `Trait<fn(&'0 u32)>`, for some specific lifetime `'0`
error: aborting due to previous error
-For more information about this error, try `rustc --explain E0277`.
-error[E0277]: the trait bound `for<'ccx> B: Bar<'ccx>` is not satisfied
- --> $DIR/hrtb-higher-ranker-supertraits-transitive.rs:47:26
+error[E0308]: mismatched types
+ --> $DIR/hrtb-higher-ranker-supertraits-transitive.rs:47:5
|
-LL | fn want_bar_for_any_ccx<B>(b: &B)
- | -------------------- required by a bound in this
-LL | where B : for<'ccx> Bar<'ccx>
- | ------------------- required by this bound in `want_bar_for_any_ccx`
-...
LL | want_bar_for_any_ccx(b);
- | ^ the trait `for<'ccx> Bar<'ccx>` is not implemented for `B`
+ | ^^^^^^^^^^^^^^^^^^^^ one type is more general than the other
|
-help: consider further restricting this bound
- |
-LL | where B : Qux + for<'ccx> Bar<'ccx>
- | ^^^^^^^^^^^^^^^^^^^^^
+ = note: expected type `for<'ccx> Bar<'ccx>`
+ found type `Bar<'static>`
error: aborting due to previous error
-For more information about this error, try `rustc --explain E0277`.
+For more information about this error, try `rustc --explain E0308`.
-error[E0277]: the trait bound `for<'a> StaticInt: Foo<&'a isize>` is not satisfied
- --> $DIR/hrtb-just-for-static.rs:24:17
+error: implementation of `Foo` is not general enough
+ --> $DIR/hrtb-just-for-static.rs:24:5
|
-LL | fn want_hrtb<T>()
- | --------- required by a bound in this
-LL | where T : for<'a> Foo<&'a isize>
- | ---------------------- required by this bound in `want_hrtb`
+LL | / trait Foo<X> {
+LL | | fn foo(&self, x: X) { }
+LL | | }
+ | |_- trait `Foo` defined here
...
-LL | want_hrtb::<StaticInt>()
- | ^^^^^^^^^ the trait `for<'a> Foo<&'a isize>` is not implemented for `StaticInt`
+LL | want_hrtb::<StaticInt>()
+ | ^^^^^^^^^^^^^^^^^^^^^^ implementation of `Foo` is not general enough
|
- = help: the following implementations were found:
- <StaticInt as Foo<&'static isize>>
+ = note: `StaticInt` must implement `Foo<&'0 isize>`, for any lifetime `'0`...
+ = note: ...but `StaticInt` actually implements `Foo<&'1 isize>`, for some specific lifetime `'1`
error[E0277]: the trait bound `for<'a> &'a u32: Foo<&'a isize>` is not satisfied
--> $DIR/hrtb-just-for-static.rs:30:17
fn main() {
assert_foo::<fn(&i32)>();
- //~^ ERROR the trait bound `for<'r> fn(&'r i32): Foo` is not satisfied
+ //~^ ERROR implementation of `Foo` is not general enough
}
-error[E0277]: the trait bound `for<'r> fn(&'r i32): Foo` is not satisfied
- --> $DIR/issue-46989.rs:40:18
+error: implementation of `Foo` is not general enough
+ --> $DIR/issue-46989.rs:40:5
|
-LL | fn assert_foo<T: Foo>() {}
- | --- required by this bound in `assert_foo`
+LL | / trait Foo {
+LL | |
+LL | | }
+ | |_- trait `Foo` defined here
...
-LL | assert_foo::<fn(&i32)>();
- | ^^^^^^^^ the trait `Foo` is not implemented for `for<'r> fn(&'r i32)`
+LL | assert_foo::<fn(&i32)>();
+ | ^^^^^^^^^^^^^^^^^^^^^^ implementation of `Foo` is not general enough
|
- = help: the following implementations were found:
- <fn(A) as Foo>
+ = note: `Foo` would have to be implemented for the type `for<'r> fn(&'r i32)`
+ = note: ...but `Foo` is actually implemented for the type `fn(&'0 i32)`, for some specific lifetime `'0`
error: aborting due to previous error
-For more information about this error, try `rustc --explain E0277`.
fn f() {
let a: fn(_) = |_: &u8| {};
- a.f(); //~ ERROR no method named `f`
+ a.f(); //~ ERROR implementation of `Trait` is not general enough
}
fn main() {}
-error[E0599]: no method named `f` found for fn pointer `fn(&u8)` in the current scope
+error: implementation of `Trait` is not general enough
--> $DIR/issue-57362-1.rs:20:7
|
-LL | a.f();
- | ^ method not found in `fn(&u8)`
+LL | / trait Trait {
+LL | | fn f(self);
+LL | | }
+ | |_- trait `Trait` defined here
+...
+LL | a.f();
+ | ^ implementation of `Trait` is not general enough
|
- = note: `a` is a function, perhaps you wish to call it
- = help: items from traits can only be used if the trait is implemented and in scope
-note: `Trait` defines an item `f`, perhaps you need to implement it
- --> $DIR/issue-57362-1.rs:8:1
- |
-LL | trait Trait {
- | ^^^^^^^^^^^
+ = note: `Trait` would have to be implemented for the type `fn(&'0 u8)`, for some specific lifetime `'0`...
+ = note: ...but `Trait` is actually implemented for the type `for<'r> fn(&'r u8)`
error: aborting due to previous error
-For more information about this error, try `rustc --explain E0599`.
}
fn g() {
- let x = <fn (&())>::make_g(); //~ ERROR no function or associated item
+ let x = <fn (&())>::make_g();
+ //~^ ERROR implementation of `X` is not general enough
+ //~| ERROR implementation of `X` is not general enough
}
fn main() {}
-error[E0599]: no function or associated item named `make_g` found for fn pointer `for<'r> fn(&'r ())` in the current scope
- --> $DIR/issue-57362-2.rs:22:25
+error: implementation of `X` is not general enough
+ --> $DIR/issue-57362-2.rs:22:13
|
-LL | let x = <fn (&())>::make_g();
- | ^^^^^^ function or associated item not found in `for<'r> fn(&'r ())`
+LL | / trait X {
+LL | | type G;
+LL | | fn make_g() -> Self::G;
+LL | | }
+ | |_- trait `X` defined here
+...
+LL | let x = <fn (&())>::make_g();
+ | ^^^^^^^^^^^^^^^^^^ implementation of `X` is not general enough
|
- = help: items from traits can only be used if the trait is implemented and in scope
-note: `X` defines an item `make_g`, perhaps you need to implement it
- --> $DIR/issue-57362-2.rs:8:1
+ = note: `X` would have to be implemented for the type `for<'r> fn(&'r ())`
+ = note: ...but `X` is actually implemented for the type `fn(&'0 ())`, for some specific lifetime `'0`
+
+error: implementation of `X` is not general enough
+ --> $DIR/issue-57362-2.rs:22:13
+ |
+LL | / trait X {
+LL | | type G;
+LL | | fn make_g() -> Self::G;
+ | | ----------------------- due to a where-clause on `X::make_g`...
+LL | | }
+ | |_- trait `X` defined here
+...
+LL | let x = <fn (&())>::make_g();
+ | ^^^^^^^^^^^^^^^^^^ doesn't satisfy where-clause
|
-LL | trait X {
- | ^^^^^^^
+ = note: ...`X` would have to be implemented for the type `for<'r> fn(&'r ())`
+ = note: ...but `X` is actually implemented for the type `fn(&'0 ())`, for some specific lifetime `'0`
-error: aborting due to previous error
+error: aborting due to 2 previous errors
-For more information about this error, try `rustc --explain E0599`.
// error. However, now that we handle subtyping correctly, we no
// longer get an error, because we recognize these two types as
// equivalent!
-//
-// Whoops -- now that we reinstituted the leak-check, we get an error
-// again.
fn foo(
x: fn(&u8, &u8),
y: for<'a> fn(&'a u8, &'a u8),
) {
+ // The two types above are actually equivalent. With the older
+ // leak check, though, we didn't consider them as equivalent, and
+ // hence we gave errors. But now we've fixed that.
let z = match 22 {
0 => x,
- _ => y, //~ ERROR `match` arms have incompatible types
+ _ => y,
};
}
-fn bar(
+fn foo_cast(
x: fn(&u8, &u8),
y: for<'a> fn(&'a u8, &'a u8),
) {
};
}
+fn bar(
+ x: for<'a, 'b> fn(&'a u8, &'b u8)-> &'a u8,
+ y: for<'a> fn(&'a u8, &'a u8) -> &'a u8,
+) {
+ // The two types above are not equivalent. With the older LUB/GLB
+ // algorithm, this may have worked (I don't remember), but now it
+ // doesn't because we require equality.
+ let z = match 22 {
+ 0 => x,
+ _ => y, //~ ERROR `match` arms have incompatible types
+ };
+}
+
+fn bar_cast(
+ x: for<'a, 'b> fn(&'a u8, &'b u8)-> &'a u8,
+ y: for<'a> fn(&'a u8, &'a u8) -> &'a u8,
+) {
+ // But we can *upcast* explicitly the type of `x` and figure
+ // things out:
+ let z = match 22 {
+ 0 => x as for<'a> fn(&'a u8, &'a u8) -> &'a u8,
+ _ => y,
+ };
+}
+
fn main() {
}
error[E0308]: `match` arms have incompatible types
- --> $DIR/old-lub-glb-hr.rs:16:14
+ --> $DIR/old-lub-glb-hr.rs:40:14
|
LL | let z = match 22 {
| _____________-
LL | | 0 => x,
- | | - this is found to be of type `for<'r, 's> fn(&'r u8, &'s u8)`
+ | | - this is found to be of type `for<'a, 'b> fn(&'a u8, &'b u8) -> &'a u8`
LL | | _ => y,
- | | ^ expected bound lifetime parameter, found concrete lifetime
+ | | ^ expected bound lifetime parameter 'a, found concrete lifetime
LL | | };
| |_____- `match` arms have incompatible types
|
- = note: expected type `for<'r, 's> fn(&'r u8, &'s u8)`
- found fn pointer `for<'a> fn(&'a u8, &'a u8)`
+ = note: expected type `for<'a, 'b> fn(&'a u8, &'b u8) -> &'a u8`
+ found fn pointer `for<'a> fn(&'a u8, &'a u8) -> &'a u8`
error: aborting due to previous error
--> $DIR/regions-fn-subtyping-return-static-fail.rs:48:12
|
LL | want_G(baz);
- | ^^^ expected concrete lifetime, found bound lifetime parameter 'cx
+ | ^^^ one type is more general than the other
|
= note: expected fn pointer `for<'cx> fn(&'cx S) -> &'static S`
- found fn item `for<'r> fn(&'r S) -> &'r S {baz}`
+ found fn pointer `for<'r> fn(&'r S) -> &'r S`
error: aborting due to 2 previous errors
{}
fn main() {
- foo(&X); //~ ERROR trait bound
+ foo(&X); //~ ERROR implementation of `Bar` is not general enough
}
-error[E0277]: the trait bound `for<'a> &'a _: Bar` is not satisfied
+error: implementation of `Bar` is not general enough
--> $DIR/where-for-self-2.rs:21:5
|
-LL | fn foo<T>(x: &T)
- | --- required by a bound in this
-LL | where for<'a> &'a T: Bar
- | --- required by this bound in `foo`
+LL | / trait Bar {
+LL | | fn bar(&self);
+LL | | }
+ | |_- trait `Bar` defined here
...
-LL | foo(&X);
- | ^^^ the trait `for<'a> Bar` is not implemented for `&'a _`
+LL | foo(&X);
+ | ^^^ implementation of `Bar` is not general enough
|
- = help: the following implementations were found:
- <&'static u32 as Bar>
+ = note: `Bar` would have to be implemented for the type `&'0 u32`, for any lifetime `'0`...
+ = note: ...but `Bar` is actually implemented for the type `&'1 u32`, for some specific lifetime `'1`
error: aborting due to previous error
-For more information about this error, try `rustc --explain E0277`.