Skip to content

Commit

Permalink
Rollup merge of rust-lang#122881 - Bryanskiy:delegation-fixes-2, r=pe…
Browse files Browse the repository at this point in the history
…trochenkov

Delegation: fix ICE on `bound_vars` divergence

Fixes rust-lang#122550.

Bug was caused by divergence  between lowered type and corresponding `bound_vars` in `late_bound_vars_map`. In this patch `bound_vars` calculation for delegation item is moved from `lower_fn_ty` to `resolve_bound_vars` query.

r? `@petrochenkov`
  • Loading branch information
matthiaskrgr authored Mar 25, 2024
2 parents ded16b3 + d1ba632 commit ccc5310
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 8 deletions.
10 changes: 9 additions & 1 deletion compiler/rustc_hir_analysis/src/collect/resolve_bound_vars.rs
Original file line number Diff line number Diff line change
Expand Up @@ -793,12 +793,20 @@ impl<'a, 'tcx> Visitor<'tcx> for BoundVarContext<'a, 'tcx> {
fd: &'tcx hir::FnDecl<'tcx>,
body_id: hir::BodyId,
_: Span,
_: LocalDefId,
def_id: LocalDefId,
) {
let output = match fd.output {
hir::FnRetTy::DefaultReturn(_) => None,
hir::FnRetTy::Return(ty) => Some(ty),
};
if let Some(ty) = output
&& let hir::TyKind::InferDelegation(sig_id, _) = ty.kind
{
let bound_vars: Vec<_> =
self.tcx.fn_sig(sig_id).skip_binder().bound_vars().iter().collect();
let hir_id = self.tcx.local_def_id_to_hir_id(def_id);
self.map.late_bound_vars.insert(hir_id, bound_vars);
}
self.visit_fn_like_elision(fd.inputs, output, matches!(fk, intravisit::FnKind::Closure));
intravisit::walk_fn_kind(self, fk);
self.visit_nested_body(body_id)
Expand Down
8 changes: 1 addition & 7 deletions compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2492,13 +2492,7 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
hir_ty: Option<&hir::Ty<'_>>,
) -> ty::PolyFnSig<'tcx> {
let tcx = self.tcx();
let bound_vars = if let hir::FnRetTy::Return(ret_ty) = decl.output
&& let hir::TyKind::InferDelegation(sig_id, _) = ret_ty.kind
{
tcx.fn_sig(sig_id).skip_binder().bound_vars()
} else {
tcx.late_bound_vars(hir_id)
};
let bound_vars = tcx.late_bound_vars(hir_id);
debug!(?bound_vars);

// We proactively collect all the inferred type params to emit a single error per fn def.
Expand Down
18 changes: 18 additions & 0 deletions tests/ui/delegation/ice-issue-122550.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#![feature(fn_delegation)]
#![allow(incomplete_features)]

trait Trait {
fn description(&self) -> &str {}
//~^ ERROR mismatched types
}

struct F;
struct S(F);

impl S {
reuse <S as Trait>::description { &self.0 }
//~^ ERROR mismatched types
//~| ERROR the trait bound `S: Trait` is not satisfied
}

fn main() {}
31 changes: 31 additions & 0 deletions tests/ui/delegation/ice-issue-122550.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
error[E0308]: mismatched types
--> $DIR/ice-issue-122550.rs:5:35
|
LL | fn description(&self) -> &str {}
| ^^ expected `&str`, found `()`

error[E0308]: mismatched types
--> $DIR/ice-issue-122550.rs:13:39
|
LL | reuse <S as Trait>::description { &self.0 }
| ^^^^^^^ expected `&S`, found `&F`
|
= note: expected reference `&S`
found reference `&F`

error[E0277]: the trait bound `S: Trait` is not satisfied
--> $DIR/ice-issue-122550.rs:13:12
|
LL | reuse <S as Trait>::description { &self.0 }
| ^ the trait `Trait` is not implemented for `S`
|
help: this trait has no implementations, consider adding one
--> $DIR/ice-issue-122550.rs:4:1
|
LL | trait Trait {
| ^^^^^^^^^^^

error: aborting due to 3 previous errors

Some errors have detailed explanations: E0277, E0308.
For more information about an error, try `rustc --explain E0277`.

0 comments on commit ccc5310

Please sign in to comment.