Skip to content

Commit

Permalink
Instantiate instead of erasing binder when probing param methods
Browse files Browse the repository at this point in the history
  • Loading branch information
compiler-errors committed Mar 7, 2023
1 parent f63ccaf commit b7a5f3a
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 9 deletions.
27 changes: 18 additions & 9 deletions compiler/rustc_hir_typeck/src/method/probe.rs
Original file line number Diff line number Diff line change
Expand Up @@ -792,6 +792,14 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
// a `&self` method will wind up with an argument type like `&dyn Trait`.
let trait_ref = principal.with_self_ty(self.tcx, self_ty);
self.elaborate_bounds(iter::once(trait_ref), |this, new_trait_ref, item| {
if new_trait_ref.has_non_region_late_bound() {
this.tcx.sess.delay_span_bug(
this.span,
"tried to select method from HRTB with non-lifetime bound vars",
);
return;
}

let new_trait_ref = this.erase_late_bound_regions(new_trait_ref);

let (xform_self_ty, xform_ret_ty) =
Expand Down Expand Up @@ -842,18 +850,15 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
});

self.elaborate_bounds(bounds, |this, poly_trait_ref, item| {
let trait_ref = this.erase_late_bound_regions(poly_trait_ref);
let trait_ref = this.instantiate_binder_with_fresh_vars(
this.span,
infer::LateBoundRegionConversionTime::FnCall,
poly_trait_ref,
);

let (xform_self_ty, xform_ret_ty) =
this.xform_self_ty(item, trait_ref.self_ty(), trait_ref.substs);

// Because this trait derives from a where-clause, it
// should not contain any inference variables or other
// artifacts. This means it is safe to put into the
// `WhereClauseCandidate` and (eventually) into the
// `WhereClausePick`.
assert!(!trait_ref.substs.needs_infer());

this.push_candidate(
Candidate {
xform_self_ty,
Expand Down Expand Up @@ -963,7 +968,11 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
bound_trait_ref.def_id(),
));
} else {
let new_trait_ref = self.erase_late_bound_regions(bound_trait_ref);
let new_trait_ref = self.instantiate_binder_with_fresh_vars(
self.span,
infer::LateBoundRegionConversionTime::FnCall,
bound_trait_ref,
);

let (xform_self_ty, xform_ret_ty) =
self.xform_self_ty(item, new_trait_ref.self_ty(), new_trait_ref.substs);
Expand Down
16 changes: 16 additions & 0 deletions tests/ui/traits/non_lifetime_binders/method-probe.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// check-pass

#![feature(non_lifetime_binders)]
//~^ WARN the feature `non_lifetime_binders` is incomplete

trait Foo: for<T> Bar<T> {}

trait Bar<T> {
fn method() -> T;
}

fn x<T: Foo>() {
let _: i32 = T::method();
}

fn main() {}
11 changes: 11 additions & 0 deletions tests/ui/traits/non_lifetime_binders/method-probe.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
warning: the feature `non_lifetime_binders` is incomplete and may not be safe to use and/or cause compiler crashes
--> $DIR/method-probe.rs:3:12
|
LL | #![feature(non_lifetime_binders)]
| ^^^^^^^^^^^^^^^^^^^^
|
= note: see issue #108185 <https://github.com/rust-lang/rust/issues/108185> for more information
= note: `#[warn(incomplete_features)]` on by default

warning: 1 warning emitted

0 comments on commit b7a5f3a

Please sign in to comment.