Skip to content

Commit 572e703

Browse files
Ignore impl trait safety errors when the trait is unresolved
1 parent d733c07 commit 572e703

File tree

2 files changed

+18
-2
lines changed

2 files changed

+18
-2
lines changed

crates/hir/src/lib.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -753,7 +753,7 @@ impl Module {
753753
GenericDef::Impl(impl_def).diagnostics(db, acc);
754754

755755
let loc = impl_def.id.lookup(db);
756-
let source_map = db.impl_signature_with_source_map(impl_def.id).1;
756+
let (impl_signature, source_map) = db.impl_signature_with_source_map(impl_def.id);
757757
expr_store_diagnostics(db, acc, &source_map);
758758

759759
let file_id = loc.id.file_id;
@@ -782,10 +782,17 @@ impl Module {
782782
}
783783

784784
let trait_ = impl_def.trait_(db);
785-
let trait_is_unsafe = trait_.is_some_and(|t| t.is_unsafe(db));
785+
let mut trait_is_unsafe = trait_.is_some_and(|t| t.is_unsafe(db));
786786
let impl_is_negative = impl_def.is_negative(db);
787787
let impl_is_unsafe = impl_def.is_unsafe(db);
788788

789+
let trait_is_unresolved = trait_.is_none() && impl_signature.target_trait.is_some();
790+
if trait_is_unresolved {
791+
// Ignore trait safety errors when the trait is unresolved, as otherwise we'll treat it as safe,
792+
// which may not be correct.
793+
trait_is_unsafe = impl_is_unsafe;
794+
}
795+
789796
let drop_maybe_dangle = (|| {
790797
// FIXME: This can be simplified a lot by exposing hir-ty's utils.rs::Generics helper
791798
let trait_ = trait_?;

crates/ide-diagnostics/src/handlers/trait_impl_incorrect_safety.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,4 +127,13 @@ struct S;
127127
"#,
128128
);
129129
}
130+
131+
#[test]
132+
fn unsafe_unresolved_trait() {
133+
check_diagnostics(
134+
r#"
135+
unsafe impl TestTrait for u32 {}
136+
"#,
137+
);
138+
}
130139
}

0 commit comments

Comments
 (0)