}
#[test]
-fn gat_crash() {
+fn gat_crash_1() {
cov_mark::check!(ignore_gats);
check_no_mismatches(
r#"
);
}
+#[test]
+fn gat_crash_2() {
+ check_no_mismatches(
+ r#"
+pub struct InlineStorage {}
+
+pub struct InlineStorageHandle<T: ?Sized> {}
+
+pub unsafe trait Storage {
+ type Handle<T: ?Sized>;
+ fn create<T: ?Sized>() -> Self::Handle<T>;
+}
+
+unsafe impl Storage for InlineStorage {
+ type Handle<T: ?Sized> = InlineStorageHandle<T>;
+}
+"#,
+ );
+}
+
#[test]
fn cfgd_out_self_param() {
cov_mark::check!(cfgd_out_self_param);
pub(crate) fn generics(db: &dyn DefDatabase, def: GenericDefId) -> Generics {
let parent_generics = parent_generic_def(db, def).map(|def| Box::new(generics(db, def)));
if parent_generics.is_some() && matches!(def, GenericDefId::TypeAliasId(_)) {
- // XXX: treat generic associated types as not existing to avoid crashes (#)
- //
- // Chalk expects the inner associated type's parameters to come
- // *before*, not after the trait's generics as we've always done it.
- // Adapting to this requires a larger refactoring
- cov_mark::hit!(ignore_gats);
- return Generics { def, params: Interned::new(Default::default()), parent_generics };
+ let params = db.generic_params(def);
+ if params
+ .type_or_consts
+ .iter()
+ .any(|(_, x)| matches!(x, TypeOrConstParamData::ConstParamData(_)))
+ {
+ // XXX: treat const generic associated types as not existing to avoid crashes (#11769)
+ //
+ // Chalk expects the inner associated type's parameters to come
+ // *before*, not after the trait's generics as we've always done it.
+ // Adapting to this requires a larger refactoring
+ cov_mark::hit!(ignore_gats);
+ return Generics { def, params: Interned::new(Default::default()), parent_generics };
+ } else {
+ return Generics { def, params, parent_generics };
+ }
}
Generics { def, params: db.generic_params(def), parent_generics }
}