Skip to content

Commit e8fa74a

Browse files
Check that impl types actually satisfy RPITIT bounds
1 parent a4d1807 commit e8fa74a

File tree

1 file changed

+24
-0
lines changed

1 file changed

+24
-0
lines changed

compiler/rustc_typeck/src/check/compare_method.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,30 @@ fn compare_predicate_entailment<'tcx>(
391391
return Err(diag.emit());
392392
}
393393

394+
// Check that an impl's fn return satisfies the bounds of the
395+
// FIXME(RPITIT): Generalize this to nested impl traits
396+
if let ty::Projection(proj) = tcx.fn_sig(trait_m.def_id).skip_binder().output().kind()
397+
&& tcx.def_kind(proj.item_def_id) == DefKind::ImplTraitPlaceholder
398+
{
399+
let return_span = tcx.hir().fn_decl_by_hir_id(impl_m_hir_id).unwrap().output.span();
400+
401+
for (predicate, span) in tcx
402+
.bound_explicit_item_bounds(proj.item_def_id)
403+
.transpose_iter()
404+
.map(|pred| pred.map_bound(|pred| *pred).subst(tcx, trait_to_placeholder_substs))
405+
{
406+
ocx.register_obligation(traits::Obligation::new(
407+
traits::ObligationCause::new(
408+
return_span,
409+
impl_m_hir_id,
410+
ObligationCauseCode::BindingObligation(proj.item_def_id, span),
411+
),
412+
param_env,
413+
predicate,
414+
));
415+
}
416+
}
417+
394418
// Check that all obligations are satisfied by the implementation's
395419
// version.
396420
let errors = ocx.select_all_or_error();

0 commit comments

Comments
 (0)