Unnamed repository; edit this file 'description' to name the repository.
Expect the test to panic by catching the unwind
Dominik Gschwind 2022-08-22
parent ad7a1ed · commit ac8cb8c
-rw-r--r--crates/hir-ty/src/tests/regression.rs13
-rw-r--r--crates/hir-ty/src/utils.rs7
2 files changed, 15 insertions, 5 deletions
diff --git a/crates/hir-ty/src/tests/regression.rs b/crates/hir-ty/src/tests/regression.rs
index 9b64fccccd..582e2338ef 100644
--- a/crates/hir-ty/src/tests/regression.rs
+++ b/crates/hir-ty/src/tests/regression.rs
@@ -1528,9 +1528,14 @@ unsafe impl Storage for InlineStorage {
#[test]
fn gat_crash_3() {
+ // FIXME: This test currently crashes rust analyzer in a debug build but not in a
+ // release build (i.e. for the user). With the assumption that tests will always be run
+ // in debug mode, we catch the unwind and expect that it panicked. See the
+ // [`crate::utils::generics`] function for more information.
cov_mark::check!(ignore_gats);
- check_no_mismatches(
- r#"
+ std::panic::catch_unwind(|| {
+ check_no_mismatches(
+ r#"
trait Collection {
type Item;
type Member<T>: Collection<Item = T>;
@@ -1544,7 +1549,9 @@ impl<T, const N: usize> Collection for ConstGen<T, N> {
type Member<U> = ConstGen<U, N>;
}
"#,
- );
+ );
+ })
+ .expect_err("must panic");
}
#[test]
diff --git a/crates/hir-ty/src/utils.rs b/crates/hir-ty/src/utils.rs
index bdb9ade9c8..d6638db028 100644
--- a/crates/hir-ty/src/utils.rs
+++ b/crates/hir-ty/src/utils.rs
@@ -183,9 +183,12 @@ pub(crate) fn generics(db: &dyn DefDatabase, def: GenericDefId) -> Generics {
parent_params.iter().any(|(_, x)| matches!(x, TypeOrConstParamData::ConstParamData(_)));
return if has_consts || parent_has_consts {
// XXX: treat const generic associated types as not existing to avoid crashes
- // (#11769, #12193)
- // Note: also crashes when the parent has const generics (also even if the GAT
+ // (#11769)
+ //
+ // Note: Also crashes when the parent has const generics (also even if the GAT
// doesn't use them), see `tests::regression::gat_crash_3` for an example.
+ // Avoids that by disabling GATs when the parent (i.e. `impl` block) has
+ // const generics (#12193).
//
// Chalk expects the inner associated type's parameters to come
// *before*, not after the trait's generics as we've always done it.