mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-04 01:08:47 +00:00
fix panic on GAT
Signed-off-by: Alex Chi <iskyzh@gmail.com>
This commit is contained in:
parent
24cf957627
commit
51d66714ac
2 changed files with 37 additions and 8 deletions
|
@ -1471,7 +1471,7 @@ fn regression_11688_3() {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn gat_crash() {
|
fn gat_crash_1() {
|
||||||
cov_mark::check!(ignore_gats);
|
cov_mark::check!(ignore_gats);
|
||||||
check_no_mismatches(
|
check_no_mismatches(
|
||||||
r#"
|
r#"
|
||||||
|
@ -1489,6 +1489,26 @@ fn test<T: Crash>() {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[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]
|
#[test]
|
||||||
fn cfgd_out_self_param() {
|
fn cfgd_out_self_param() {
|
||||||
cov_mark::check!(cfgd_out_self_param);
|
cov_mark::check!(cfgd_out_self_param);
|
||||||
|
|
|
@ -176,13 +176,22 @@ pub(super) fn associated_type_by_name_including_super_traits(
|
||||||
pub(crate) fn generics(db: &dyn DefDatabase, def: GenericDefId) -> Generics {
|
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)));
|
let parent_generics = parent_generic_def(db, def).map(|def| Box::new(generics(db, def)));
|
||||||
if parent_generics.is_some() && matches!(def, GenericDefId::TypeAliasId(_)) {
|
if parent_generics.is_some() && matches!(def, GenericDefId::TypeAliasId(_)) {
|
||||||
// XXX: treat generic associated types as not existing to avoid crashes (#)
|
let params = db.generic_params(def);
|
||||||
//
|
if params
|
||||||
// Chalk expects the inner associated type's parameters to come
|
.type_or_consts
|
||||||
// *before*, not after the trait's generics as we've always done it.
|
.iter()
|
||||||
// Adapting to this requires a larger refactoring
|
.any(|(_, x)| matches!(x, TypeOrConstParamData::ConstParamData(_)))
|
||||||
cov_mark::hit!(ignore_gats);
|
{
|
||||||
return Generics { def, params: Interned::new(Default::default()), parent_generics };
|
// 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 }
|
Generics { def, params: db.generic_params(def), parent_generics }
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue