Skip to content

Commit b384cfc

Browse files
committed
Handle cycles in generic_defaults more gracefully
1 parent 184a0d7 commit b384cfc

File tree

2 files changed

+22
-0
lines changed

2 files changed

+22
-0
lines changed

crates/hir_ty/src/db.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> {
7070
fn trait_environment(&self, def: GenericDefId) -> Arc<crate::TraitEnvironment>;
7171

7272
#[salsa::invoke(crate::lower::generic_defaults_query)]
73+
#[salsa::cycle(crate::lower::generic_defaults_recover)]
7374
fn generic_defaults(&self, def: GenericDefId) -> Arc<[Binders<Ty>]>;
7475

7576
#[salsa::invoke(InherentImpls::inherent_impls_in_crate_query)]

crates/hir_ty/src/lower.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1089,6 +1089,27 @@ pub(crate) fn generic_defaults_query(
10891089
defaults
10901090
}
10911091

1092+
pub(crate) fn generic_defaults_recover(
1093+
db: &dyn HirDatabase,
1094+
_cycle: &[String],
1095+
def: &GenericDefId,
1096+
) -> Arc<[Binders<Ty>]> {
1097+
let generic_params = generics(db.upcast(), *def);
1098+
1099+
// we still need one default per parameter
1100+
let defaults = generic_params
1101+
.iter()
1102+
.enumerate()
1103+
.map(|(idx, _)| {
1104+
let ty = TyKind::Error.intern(&Interner);
1105+
1106+
crate::make_only_type_binders(idx, ty)
1107+
})
1108+
.collect();
1109+
1110+
defaults
1111+
}
1112+
10921113
fn fn_sig_for_fn(db: &dyn HirDatabase, def: FunctionId) -> PolyFnSig {
10931114
let data = db.function_data(def);
10941115
let resolver = def.resolver(db.upcast());

0 commit comments

Comments
 (0)