Auto merge of #87244 - jackh726:issue-71883, r=estebank
Better diagnostics with mismatched types due to implicit static lifetime Fixes #78113 I think this is my first diagnostics PR...definitely happy to hear thoughts on the direction/implementation here. I was originally just trying to solve the error above, where the lifetime on a GAT was causing a cryptic "mismatched types" error. But as I was writing this, I realized that this (unintentionally) also applied to a different case: `wf-in-foreign-fn-decls-issue-80468.rs`. I'm not sure if this diagnostic should get a new error code, or even reuse an existing one. And, there might be some ways to make this even more generalized. Also, the error is a bit more lengthy and verbose than probably needed. So thoughts there are welcome too. This PR essentially ended up adding a new nice region error pass that triggers if a type doesn't match the self type of an impl which is selected because of a predicate because of an implicit static bound on that self type. r? `@estebank`
This commit is contained in:
commit
da7d405357
16 changed files with 299 additions and 38 deletions
|
|
@ -13,5 +13,5 @@ pub struct Ref<'a>(&'a u8);
|
|||
impl Trait for Ref {} //~ ERROR: implicit elided lifetime not allowed here
|
||||
|
||||
extern "C" {
|
||||
pub fn repro(_: Wrapper<Ref>); //~ ERROR: mismatched types
|
||||
pub fn repro(_: Wrapper<Ref>); //~ ERROR: incompatible lifetime on type
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,22 +3,30 @@ error[E0726]: implicit elided lifetime not allowed here
|
|||
|
|
||||
LL | impl Trait for Ref {}
|
||||
| ^^^- help: indicate the anonymous lifetime: `<'_>`
|
||||
|
|
||||
= note: assuming a `'static` lifetime...
|
||||
|
||||
error[E0308]: mismatched types
|
||||
error: incompatible lifetime on type
|
||||
--> $DIR/wf-in-foreign-fn-decls-issue-80468.rs:16:21
|
||||
|
|
||||
LL | pub fn repro(_: Wrapper<Ref>);
|
||||
| ^^^^^^^^^^^^ lifetime mismatch
|
||||
| ^^^^^^^^^^^^
|
||||
|
|
||||
= note: expected trait `Trait`
|
||||
found trait `Trait`
|
||||
note: because this has an unmet lifetime requirement
|
||||
--> $DIR/wf-in-foreign-fn-decls-issue-80468.rs:8:23
|
||||
|
|
||||
LL | pub struct Wrapper<T: Trait>(T);
|
||||
| ^^^^^ introduces a `'static` lifetime requirement
|
||||
note: the anonymous lifetime #1 defined on the method body at 16:5...
|
||||
--> $DIR/wf-in-foreign-fn-decls-issue-80468.rs:16:5
|
||||
|
|
||||
LL | pub fn repro(_: Wrapper<Ref>);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: ...does not necessarily outlive the static lifetime
|
||||
note: ...does not necessarily outlive the static lifetime introduced by the compatible `impl`
|
||||
--> $DIR/wf-in-foreign-fn-decls-issue-80468.rs:13:1
|
||||
|
|
||||
LL | impl Trait for Ref {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue