Resolve projections during internal mutability analysis
This commit is contained in:
parent
d79f86255d
commit
58d4834097
4 changed files with 96 additions and 0 deletions
42
tests/ui/borrow_interior_mutable_const/projections.rs
Normal file
42
tests/ui/borrow_interior_mutable_const/projections.rs
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
#![deny(clippy::borrow_interior_mutable_const)]
|
||||
#![deny(clippy::declare_interior_mutable_const)]
|
||||
|
||||
// Inspired by https://github.com/rust-lang/rust/pull/130543#issuecomment-2364828139
|
||||
|
||||
use std::cell::UnsafeCell;
|
||||
|
||||
trait Trait {
|
||||
type Assoc;
|
||||
}
|
||||
|
||||
type Assoc<T> = <T as Trait>::Assoc;
|
||||
|
||||
impl Trait for u8 {
|
||||
type Assoc = UnsafeCell<u8>;
|
||||
}
|
||||
|
||||
impl Trait for () {
|
||||
type Assoc = ();
|
||||
}
|
||||
|
||||
enum MaybeMutable {
|
||||
Mutable(Assoc<u8>),
|
||||
Immutable(Assoc<()>),
|
||||
}
|
||||
|
||||
const CELL: Assoc<u8> = UnsafeCell::new(0); //~ ERROR: interior mutable
|
||||
const UNIT: Assoc<()> = ();
|
||||
const MUTABLE: MaybeMutable = MaybeMutable::Mutable(CELL); //~ ERROR: interior mutable
|
||||
const IMMUTABLE: MaybeMutable = MaybeMutable::Immutable(UNIT);
|
||||
|
||||
fn print_ref<T>(t: &T) {
|
||||
let p: *const T = t;
|
||||
println!("{p:p}")
|
||||
}
|
||||
|
||||
fn main() {
|
||||
print_ref(&CELL); //~ ERROR: interior mutability
|
||||
print_ref(&UNIT);
|
||||
print_ref(&MUTABLE); //~ ERROR: interior mutability
|
||||
print_ref(&IMMUTABLE);
|
||||
}
|
||||
44
tests/ui/borrow_interior_mutable_const/projections.stderr
Normal file
44
tests/ui/borrow_interior_mutable_const/projections.stderr
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
error: a `const` item should not be interior mutable
|
||||
--> tests/ui/borrow_interior_mutable_const/projections.rs:27:1
|
||||
|
|
||||
LL | const CELL: Assoc<u8> = UnsafeCell::new(0);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider making this `Sync` so that it can go in a static item or using a `thread_local`
|
||||
note: the lint level is defined here
|
||||
--> tests/ui/borrow_interior_mutable_const/projections.rs:2:9
|
||||
|
|
||||
LL | #![deny(clippy::declare_interior_mutable_const)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: a `const` item should not be interior mutable
|
||||
--> tests/ui/borrow_interior_mutable_const/projections.rs:29:1
|
||||
|
|
||||
LL | const MUTABLE: MaybeMutable = MaybeMutable::Mutable(CELL);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider making this `Sync` so that it can go in a static item or using a `thread_local`
|
||||
|
||||
error: a `const` item with interior mutability should not be borrowed
|
||||
--> tests/ui/borrow_interior_mutable_const/projections.rs:38:16
|
||||
|
|
||||
LL | print_ref(&CELL);
|
||||
| ^^^^
|
||||
|
|
||||
= help: assign this const to a local or static variable, and use the variable here
|
||||
note: the lint level is defined here
|
||||
--> tests/ui/borrow_interior_mutable_const/projections.rs:1:9
|
||||
|
|
||||
LL | #![deny(clippy::borrow_interior_mutable_const)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: a `const` item with interior mutability should not be borrowed
|
||||
--> tests/ui/borrow_interior_mutable_const/projections.rs:40:16
|
||||
|
|
||||
LL | print_ref(&MUTABLE);
|
||||
| ^^^^^^^
|
||||
|
|
||||
= help: assign this const to a local or static variable, and use the variable here
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue