3 #![warn(clippy::borrow_interior_mutable_const)]
4 #![allow(clippy::declare_interior_mutable_const)]
6 // this file (mostly) replicates its `declare` counterpart. Please see it for more discussions.
11 use std::sync::atomic::AtomicUsize;
18 const UNFROZEN_VARIANT: OptionalCell = OptionalCell::Unfrozen(Cell::new(true));
19 const FROZEN_VARIANT: OptionalCell = OptionalCell::Frozen;
21 fn borrow_optional_cell() {
22 let _ = &UNFROZEN_VARIANT; //~ ERROR interior mutability
23 let _ = &FROZEN_VARIANT;
27 const TO_BE_UNFROZEN_VARIANT: OptionalCell;
28 const TO_BE_FROZEN_VARIANT: OptionalCell;
30 const DEFAULTED_ON_UNFROZEN_VARIANT: OptionalCell = OptionalCell::Unfrozen(Cell::new(false));
31 const DEFAULTED_ON_FROZEN_VARIANT: OptionalCell = OptionalCell::Frozen;
34 // This is the "suboptimal behavior" mentioned in `is_value_unfrozen`
35 // caused by a similar reason to unfrozen types without any default values
36 // get linted even if it has frozen variants'.
37 let _ = &Self::TO_BE_FROZEN_VARIANT; //~ ERROR interior mutable
39 // The lint ignores default values because an impl of this trait can set
40 // an unfrozen variant to `DEFAULTED_ON_FROZEN_VARIANT` and use the default impl for `function`.
41 let _ = &Self::DEFAULTED_ON_FROZEN_VARIANT; //~ ERROR interior mutable
45 impl AssocConsts for u64 {
46 const TO_BE_UNFROZEN_VARIANT: OptionalCell = OptionalCell::Unfrozen(Cell::new(false));
47 const TO_BE_FROZEN_VARIANT: OptionalCell = OptionalCell::Frozen;
50 let _ = &<Self as AssocConsts>::TO_BE_UNFROZEN_VARIANT; //~ ERROR interior mutable
51 let _ = &<Self as AssocConsts>::TO_BE_FROZEN_VARIANT;
52 let _ = &Self::DEFAULTED_ON_UNFROZEN_VARIANT; //~ ERROR interior mutable
53 let _ = &Self::DEFAULTED_ON_FROZEN_VARIANT;
60 const TO_BE_UNFROZEN_VARIANT: Option<Self::ToBeUnfrozen>;
61 const TO_BE_FROZEN_VARIANT: Option<Self::ToBeUnfrozen>;
63 // there's no need to test here because it's the exactly same as `trait::AssocTypes`
67 impl AssocTypes for u64 {
68 type ToBeUnfrozen = AtomicUsize;
70 const TO_BE_UNFROZEN_VARIANT: Option<Self::ToBeUnfrozen> = Some(Self::ToBeUnfrozen::new(4)); //~ ERROR interior mutable
71 const TO_BE_FROZEN_VARIANT: Option<Self::ToBeUnfrozen> = None;
74 let _ = &<Self as AssocTypes>::TO_BE_UNFROZEN_VARIANT; //~ ERROR interior mutable
75 let _ = &<Self as AssocTypes>::TO_BE_FROZEN_VARIANT;
79 enum BothOfCellAndGeneric<T> {
80 Unfrozen(Cell<*const T>),
85 impl<T> BothOfCellAndGeneric<T> {
86 const UNFROZEN_VARIANT: BothOfCellAndGeneric<T> = BothOfCellAndGeneric::Unfrozen(Cell::new(std::ptr::null())); //~ ERROR interior mutable
87 const GENERIC_VARIANT: BothOfCellAndGeneric<T> = BothOfCellAndGeneric::Generic(std::ptr::null()); //~ ERROR interior mutable
88 const FROZEN_VARIANT: BothOfCellAndGeneric<T> = BothOfCellAndGeneric::Frozen(5);
91 let _ = &Self::UNFROZEN_VARIANT; //~ ERROR interior mutability
92 let _ = &Self::GENERIC_VARIANT; //~ ERROR interior mutability
93 let _ = &Self::FROZEN_VARIANT;
98 // constants defined in foreign crates
99 let _ = &helper::WRAPPED_PRIVATE_UNFROZEN_VARIANT; //~ ERROR interior mutability
100 let _ = &helper::WRAPPED_PRIVATE_FROZEN_VARIANT;