Skip to content

Commit e03258c

Browse files
committed
implement safety check for negative impls
1 parent 72062fc commit e03258c

File tree

1 file changed

+8
-2
lines changed

1 file changed

+8
-2
lines changed

crates/formality-check/src/impls.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,18 +52,24 @@ impl super::Check<'_> {
5252
Ok(())
5353
}
5454

55-
pub(super) fn check_neg_trait_impl(&self, i: &NegTraitImpl) -> Fallible<()> {
55+
#[context("check_neg_trait_impl({trait_impl:?})")]
56+
pub(super) fn check_neg_trait_impl(&self, trait_impl: &NegTraitImpl) -> Fallible<()> {
5657
let mut env = Env::default();
5758

5859
let NegTraitImplBoundData {
5960
trait_id,
6061
self_ty,
6162
trait_parameters,
6263
where_clauses,
63-
} = env.instantiate_universally(&i.binder);
64+
} = env.instantiate_universally(&trait_impl.binder);
6465

6566
let trait_ref = trait_id.with(self_ty, trait_parameters);
6667

68+
// Negative impls are always safe (rustc E0198) regardless of the trait's safety.
69+
if trait_impl.safety == Safety::Unsafe {
70+
bail!("negative impls cannot be unsafe");
71+
}
72+
6773
self.prove_where_clauses_well_formed(&env, &where_clauses, &where_clauses)?;
6874

6975
self.prove_goal(&env, &where_clauses, trait_ref.not_implemented())?;

0 commit comments

Comments
 (0)