Improve opaque type higher-ranked region error message under NLL by Aaron1011 ·...
source link: https://github.com/rust-lang/rust/pull/92306
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Currently, any higher-ranked region errors involving opaque types
fall back to a generic "higher-ranked subtype error" message when
run under NLL. This PR adds better error message handling for this
case, giving us the same kinds of error messages that we currently
get without NLL:
error: implementation of `MyTrait` is not general enough
--> $DIR/opaque-hrtb.rs:12:13
|
LL | fn foo() -> impl for<'a> MyTrait<&'a str> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `MyTrait` is not general enough
|
= note: `impl MyTrait<&'2 str>` must implement `MyTrait<&'1 str>`, for any lifetime `'1`...
= note: ...but it actually implements `MyTrait<&'2 str>`, for some specific lifetime `'2`
error: aborting due to previous error
To accomplish this, several different refactoring needed to be made:
- We now have a dedicated
InstantiateOpaqueType
struct which
implementsTypeOp
. This is used to invokeinstantiate_opaque_types
during MIR type checking. TypeOp
is refactored to pass around aMirBorrowckCtxt
, which is
needed to report opaque type region errors.- We no longer assume that all
TypeOp
s correspond to canonicalized
queries. This allows us to properly handle opaque type instantiation
(which does not occur in a query) as aTypeOp
.
A newErrorInfo
associated type is used to determine what
additional information is used during higher-ranked region error
handling. - The body of
try_extract_error_from_fulfill_cx
has been moved out to a new functiontry_extract_error_from_region_constraints
.
This allows us to re-use the same error reporting code between
canonicalized queries (which can extract region constraints directly
from a freshInferCtxt
) and opaque type handling (which needs to take
region constraints from the pre-existingInferCtxt
that we use
throughout MIR borrow checking).
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK