4

Improve opaque type higher-ranked region error message under NLL by Aaron1011 ·...

 2 years ago
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.
neoserver,ios ssh client

Copy link

Member

Aaron1011 commented on Dec 27, 2021

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
    implements TypeOp. This is used to invoke instantiate_opaque_types
    during MIR type checking.
  • TypeOp is refactored to pass around a MirBorrowckCtxt, which is
    needed to report opaque type region errors.
  • We no longer assume that all TypeOps correspond to canonicalized
    queries. This allows us to properly handle opaque type instantiation
    (which does not occur in a query) as a TypeOp.
    A new ErrorInfo 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 function try_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 fresh InferCtxt) and opaque type handling (which needs to take
    region constraints from the pre-existing InferCtxt that we use
    throughout MIR borrow checking).

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK