Don't ICE in opaque_hidden_inferred_bound lint for RPITIT in trait with no default method body

This commit is contained in:
Michael Goulet 2024-09-16 12:35:42 -04:00
parent 13b5a4e43b
commit 6e982f59ab
2 changed files with 28 additions and 0 deletions

View File

@ -72,6 +72,18 @@ impl<'tcx> LateLintPass<'tcx> for OpaqueHiddenInferredBound {
let hir::ItemKind::OpaqueTy(opaque) = &item.kind else {
return;
};
// If this is an RPITIT from a trait method with no body, then skip.
// That's because although we may have an opaque type on the function,
// it won't have a hidden type, so proving predicates about it is
// not really meaningful.
if let hir::OpaqueTyOrigin::FnReturn(method_def_id) = opaque.origin
&& let hir::Node::TraitItem(trait_item) = cx.tcx.hir_node_by_def_id(method_def_id)
&& !trait_item.defaultness.has_value()
{
return;
}
let def_id = item.owner_id.def_id.to_def_id();
let infcx = &cx.tcx.infer_ctxt().build();
// For every projection predicate in the opaque type's explicit bounds,

View File

@ -0,0 +1,16 @@
//@ check-pass
// Make sure that the `opaque_hidden_inferred_bound` lint doesn't fire on
// RPITITs with no hidden type.
trait T0 {}
trait T1 {
type A: Send;
}
trait T2 {
fn foo() -> impl T1<A = ((), impl T0)>;
}
fn main() {}