mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-28 02:57:37 +00:00
Fix fp in borrow_interior_mutable_const
Fix false positive when referencing a field behind a pointer.
This commit is contained in:
parent
27ae4d303c
commit
91b200c62b
@ -211,8 +211,21 @@ impl<'tcx> LateLintPass<'tcx> for NonCopyConst {
|
|||||||
needs_check_adjustment = false;
|
needs_check_adjustment = false;
|
||||||
},
|
},
|
||||||
ExprKind::Field(..) => {
|
ExprKind::Field(..) => {
|
||||||
dereferenced_expr = parent_expr;
|
|
||||||
needs_check_adjustment = true;
|
needs_check_adjustment = true;
|
||||||
|
|
||||||
|
// Check whether implicit dereferences happened;
|
||||||
|
// if so, no need to go further up
|
||||||
|
// because of the same reason as the `ExprKind::Unary` case.
|
||||||
|
if cx
|
||||||
|
.typeck_results()
|
||||||
|
.expr_adjustments(dereferenced_expr)
|
||||||
|
.iter()
|
||||||
|
.any(|adj| matches!(adj.kind, Adjust::Deref(_)))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
dereferenced_expr = parent_expr;
|
||||||
},
|
},
|
||||||
ExprKind::Index(e, _) if ptr::eq(&**e, cur_expr) => {
|
ExprKind::Index(e, _) if ptr::eq(&**e, cur_expr) => {
|
||||||
// `e[i]` => desugared to `*Index::index(&e, i)`,
|
// `e[i]` => desugared to `*Index::index(&e, i)`,
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#![allow(clippy::declare_interior_mutable_const, clippy::ref_in_deref)]
|
#![allow(clippy::declare_interior_mutable_const, clippy::ref_in_deref)]
|
||||||
|
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
use std::cell::Cell;
|
use std::cell::{Cell, UnsafeCell};
|
||||||
use std::fmt::Display;
|
use std::fmt::Display;
|
||||||
use std::sync::atomic::{AtomicUsize, Ordering};
|
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||||
use std::sync::Once;
|
use std::sync::Once;
|
||||||
@ -30,6 +30,37 @@ impl Trait<u32> for u64 {
|
|||||||
const ATOMIC: AtomicUsize = AtomicUsize::new(9);
|
const ATOMIC: AtomicUsize = AtomicUsize::new(9);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This is just a pointer that can be safely dereferended,
|
||||||
|
// it's semantically the same as `&'static T`;
|
||||||
|
// but it isn't allowed make a static reference from an arbitrary integer value at the moment.
|
||||||
|
// For more information, please see the issue #5918.
|
||||||
|
pub struct StaticRef<T> {
|
||||||
|
ptr: *const T,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> StaticRef<T> {
|
||||||
|
/// Create a new `StaticRef` from a raw pointer
|
||||||
|
///
|
||||||
|
/// ## Safety
|
||||||
|
///
|
||||||
|
/// Callers must pass in a reference to statically allocated memory which
|
||||||
|
/// does not overlap with other values.
|
||||||
|
pub const unsafe fn new(ptr: *const T) -> StaticRef<T> {
|
||||||
|
StaticRef { ptr }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> std::ops::Deref for StaticRef<T> {
|
||||||
|
type Target = T;
|
||||||
|
|
||||||
|
fn deref(&self) -> &'static T {
|
||||||
|
unsafe { &*self.ptr }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// use a tuple to make sure referencing a field behind a pointer isn't linted.
|
||||||
|
const CELL_REF: StaticRef<(UnsafeCell<u32>,)> = unsafe { StaticRef::new(std::ptr::null()) };
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
ATOMIC.store(1, Ordering::SeqCst); //~ ERROR interior mutability
|
ATOMIC.store(1, Ordering::SeqCst); //~ ERROR interior mutability
|
||||||
assert_eq!(ATOMIC.load(Ordering::SeqCst), 5); //~ ERROR interior mutability
|
assert_eq!(ATOMIC.load(Ordering::SeqCst), 5); //~ ERROR interior mutability
|
||||||
@ -82,4 +113,6 @@ fn main() {
|
|||||||
assert_eq!(u64::ATOMIC.load(Ordering::SeqCst), 9); //~ ERROR interior mutability
|
assert_eq!(u64::ATOMIC.load(Ordering::SeqCst), 9); //~ ERROR interior mutability
|
||||||
|
|
||||||
assert_eq!(NO_ANN.to_string(), "70"); // should never lint this.
|
assert_eq!(NO_ANN.to_string(), "70"); // should never lint this.
|
||||||
|
|
||||||
|
let _ = &CELL_REF.0;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error: a `const` item with interior mutability should not be borrowed
|
error: a `const` item with interior mutability should not be borrowed
|
||||||
--> $DIR/borrow_interior_mutable_const.rs:34:5
|
--> $DIR/borrow_interior_mutable_const.rs:65:5
|
||||||
|
|
|
|
||||||
LL | ATOMIC.store(1, Ordering::SeqCst); //~ ERROR interior mutability
|
LL | ATOMIC.store(1, Ordering::SeqCst); //~ ERROR interior mutability
|
||||||
| ^^^^^^
|
| ^^^^^^
|
||||||
@ -8,7 +8,7 @@ LL | ATOMIC.store(1, Ordering::SeqCst); //~ ERROR interior mutability
|
|||||||
= help: assign this const to a local or static variable, and use the variable here
|
= help: assign this const to a local or static variable, and use the variable here
|
||||||
|
|
||||||
error: a `const` item with interior mutability should not be borrowed
|
error: a `const` item with interior mutability should not be borrowed
|
||||||
--> $DIR/borrow_interior_mutable_const.rs:35:16
|
--> $DIR/borrow_interior_mutable_const.rs:66:16
|
||||||
|
|
|
|
||||||
LL | assert_eq!(ATOMIC.load(Ordering::SeqCst), 5); //~ ERROR interior mutability
|
LL | assert_eq!(ATOMIC.load(Ordering::SeqCst), 5); //~ ERROR interior mutability
|
||||||
| ^^^^^^
|
| ^^^^^^
|
||||||
@ -16,7 +16,7 @@ LL | assert_eq!(ATOMIC.load(Ordering::SeqCst), 5); //~ ERROR interior mutabi
|
|||||||
= help: assign this const to a local or static variable, and use the variable here
|
= help: assign this const to a local or static variable, and use the variable here
|
||||||
|
|
||||||
error: a `const` item with interior mutability should not be borrowed
|
error: a `const` item with interior mutability should not be borrowed
|
||||||
--> $DIR/borrow_interior_mutable_const.rs:38:22
|
--> $DIR/borrow_interior_mutable_const.rs:69:22
|
||||||
|
|
|
|
||||||
LL | let _once_ref = &ONCE_INIT; //~ ERROR interior mutability
|
LL | let _once_ref = &ONCE_INIT; //~ ERROR interior mutability
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
@ -24,7 +24,7 @@ LL | let _once_ref = &ONCE_INIT; //~ ERROR interior mutability
|
|||||||
= help: assign this const to a local or static variable, and use the variable here
|
= help: assign this const to a local or static variable, and use the variable here
|
||||||
|
|
||||||
error: a `const` item with interior mutability should not be borrowed
|
error: a `const` item with interior mutability should not be borrowed
|
||||||
--> $DIR/borrow_interior_mutable_const.rs:39:25
|
--> $DIR/borrow_interior_mutable_const.rs:70:25
|
||||||
|
|
|
|
||||||
LL | let _once_ref_2 = &&ONCE_INIT; //~ ERROR interior mutability
|
LL | let _once_ref_2 = &&ONCE_INIT; //~ ERROR interior mutability
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
@ -32,7 +32,7 @@ LL | let _once_ref_2 = &&ONCE_INIT; //~ ERROR interior mutability
|
|||||||
= help: assign this const to a local or static variable, and use the variable here
|
= help: assign this const to a local or static variable, and use the variable here
|
||||||
|
|
||||||
error: a `const` item with interior mutability should not be borrowed
|
error: a `const` item with interior mutability should not be borrowed
|
||||||
--> $DIR/borrow_interior_mutable_const.rs:40:27
|
--> $DIR/borrow_interior_mutable_const.rs:71:27
|
||||||
|
|
|
|
||||||
LL | let _once_ref_4 = &&&&ONCE_INIT; //~ ERROR interior mutability
|
LL | let _once_ref_4 = &&&&ONCE_INIT; //~ ERROR interior mutability
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
@ -40,7 +40,7 @@ LL | let _once_ref_4 = &&&&ONCE_INIT; //~ ERROR interior mutability
|
|||||||
= help: assign this const to a local or static variable, and use the variable here
|
= help: assign this const to a local or static variable, and use the variable here
|
||||||
|
|
||||||
error: a `const` item with interior mutability should not be borrowed
|
error: a `const` item with interior mutability should not be borrowed
|
||||||
--> $DIR/borrow_interior_mutable_const.rs:41:26
|
--> $DIR/borrow_interior_mutable_const.rs:72:26
|
||||||
|
|
|
|
||||||
LL | let _once_mut = &mut ONCE_INIT; //~ ERROR interior mutability
|
LL | let _once_mut = &mut ONCE_INIT; //~ ERROR interior mutability
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
@ -48,7 +48,7 @@ LL | let _once_mut = &mut ONCE_INIT; //~ ERROR interior mutability
|
|||||||
= help: assign this const to a local or static variable, and use the variable here
|
= help: assign this const to a local or static variable, and use the variable here
|
||||||
|
|
||||||
error: a `const` item with interior mutability should not be borrowed
|
error: a `const` item with interior mutability should not be borrowed
|
||||||
--> $DIR/borrow_interior_mutable_const.rs:52:14
|
--> $DIR/borrow_interior_mutable_const.rs:83:14
|
||||||
|
|
|
|
||||||
LL | let _ = &ATOMIC_TUPLE; //~ ERROR interior mutability
|
LL | let _ = &ATOMIC_TUPLE; //~ ERROR interior mutability
|
||||||
| ^^^^^^^^^^^^
|
| ^^^^^^^^^^^^
|
||||||
@ -56,7 +56,7 @@ LL | let _ = &ATOMIC_TUPLE; //~ ERROR interior mutability
|
|||||||
= help: assign this const to a local or static variable, and use the variable here
|
= help: assign this const to a local or static variable, and use the variable here
|
||||||
|
|
||||||
error: a `const` item with interior mutability should not be borrowed
|
error: a `const` item with interior mutability should not be borrowed
|
||||||
--> $DIR/borrow_interior_mutable_const.rs:53:14
|
--> $DIR/borrow_interior_mutable_const.rs:84:14
|
||||||
|
|
|
|
||||||
LL | let _ = &ATOMIC_TUPLE.0; //~ ERROR interior mutability
|
LL | let _ = &ATOMIC_TUPLE.0; //~ ERROR interior mutability
|
||||||
| ^^^^^^^^^^^^
|
| ^^^^^^^^^^^^
|
||||||
@ -64,7 +64,7 @@ LL | let _ = &ATOMIC_TUPLE.0; //~ ERROR interior mutability
|
|||||||
= help: assign this const to a local or static variable, and use the variable here
|
= help: assign this const to a local or static variable, and use the variable here
|
||||||
|
|
||||||
error: a `const` item with interior mutability should not be borrowed
|
error: a `const` item with interior mutability should not be borrowed
|
||||||
--> $DIR/borrow_interior_mutable_const.rs:54:19
|
--> $DIR/borrow_interior_mutable_const.rs:85:19
|
||||||
|
|
|
|
||||||
LL | let _ = &(&&&&ATOMIC_TUPLE).0; //~ ERROR interior mutability
|
LL | let _ = &(&&&&ATOMIC_TUPLE).0; //~ ERROR interior mutability
|
||||||
| ^^^^^^^^^^^^
|
| ^^^^^^^^^^^^
|
||||||
@ -72,7 +72,7 @@ LL | let _ = &(&&&&ATOMIC_TUPLE).0; //~ ERROR interior mutability
|
|||||||
= help: assign this const to a local or static variable, and use the variable here
|
= help: assign this const to a local or static variable, and use the variable here
|
||||||
|
|
||||||
error: a `const` item with interior mutability should not be borrowed
|
error: a `const` item with interior mutability should not be borrowed
|
||||||
--> $DIR/borrow_interior_mutable_const.rs:55:14
|
--> $DIR/borrow_interior_mutable_const.rs:86:14
|
||||||
|
|
|
|
||||||
LL | let _ = &ATOMIC_TUPLE.0[0]; //~ ERROR interior mutability
|
LL | let _ = &ATOMIC_TUPLE.0[0]; //~ ERROR interior mutability
|
||||||
| ^^^^^^^^^^^^
|
| ^^^^^^^^^^^^
|
||||||
@ -80,7 +80,7 @@ LL | let _ = &ATOMIC_TUPLE.0[0]; //~ ERROR interior mutability
|
|||||||
= help: assign this const to a local or static variable, and use the variable here
|
= help: assign this const to a local or static variable, and use the variable here
|
||||||
|
|
||||||
error: a `const` item with interior mutability should not be borrowed
|
error: a `const` item with interior mutability should not be borrowed
|
||||||
--> $DIR/borrow_interior_mutable_const.rs:56:13
|
--> $DIR/borrow_interior_mutable_const.rs:87:13
|
||||||
|
|
|
|
||||||
LL | let _ = ATOMIC_TUPLE.0[0].load(Ordering::SeqCst); //~ ERROR interior mutability
|
LL | let _ = ATOMIC_TUPLE.0[0].load(Ordering::SeqCst); //~ ERROR interior mutability
|
||||||
| ^^^^^^^^^^^^
|
| ^^^^^^^^^^^^
|
||||||
@ -88,7 +88,7 @@ LL | let _ = ATOMIC_TUPLE.0[0].load(Ordering::SeqCst); //~ ERROR interior mu
|
|||||||
= help: assign this const to a local or static variable, and use the variable here
|
= help: assign this const to a local or static variable, and use the variable here
|
||||||
|
|
||||||
error: a `const` item with interior mutability should not be borrowed
|
error: a `const` item with interior mutability should not be borrowed
|
||||||
--> $DIR/borrow_interior_mutable_const.rs:62:13
|
--> $DIR/borrow_interior_mutable_const.rs:93:13
|
||||||
|
|
|
|
||||||
LL | let _ = ATOMIC_TUPLE.0[0]; //~ ERROR interior mutability
|
LL | let _ = ATOMIC_TUPLE.0[0]; //~ ERROR interior mutability
|
||||||
| ^^^^^^^^^^^^
|
| ^^^^^^^^^^^^
|
||||||
@ -96,7 +96,7 @@ LL | let _ = ATOMIC_TUPLE.0[0]; //~ ERROR interior mutability
|
|||||||
= help: assign this const to a local or static variable, and use the variable here
|
= help: assign this const to a local or static variable, and use the variable here
|
||||||
|
|
||||||
error: a `const` item with interior mutability should not be borrowed
|
error: a `const` item with interior mutability should not be borrowed
|
||||||
--> $DIR/borrow_interior_mutable_const.rs:67:5
|
--> $DIR/borrow_interior_mutable_const.rs:98:5
|
||||||
|
|
|
|
||||||
LL | CELL.set(2); //~ ERROR interior mutability
|
LL | CELL.set(2); //~ ERROR interior mutability
|
||||||
| ^^^^
|
| ^^^^
|
||||||
@ -104,7 +104,7 @@ LL | CELL.set(2); //~ ERROR interior mutability
|
|||||||
= help: assign this const to a local or static variable, and use the variable here
|
= help: assign this const to a local or static variable, and use the variable here
|
||||||
|
|
||||||
error: a `const` item with interior mutability should not be borrowed
|
error: a `const` item with interior mutability should not be borrowed
|
||||||
--> $DIR/borrow_interior_mutable_const.rs:68:16
|
--> $DIR/borrow_interior_mutable_const.rs:99:16
|
||||||
|
|
|
|
||||||
LL | assert_eq!(CELL.get(), 6); //~ ERROR interior mutability
|
LL | assert_eq!(CELL.get(), 6); //~ ERROR interior mutability
|
||||||
| ^^^^
|
| ^^^^
|
||||||
@ -112,7 +112,7 @@ LL | assert_eq!(CELL.get(), 6); //~ ERROR interior mutability
|
|||||||
= help: assign this const to a local or static variable, and use the variable here
|
= help: assign this const to a local or static variable, and use the variable here
|
||||||
|
|
||||||
error: a `const` item with interior mutability should not be borrowed
|
error: a `const` item with interior mutability should not be borrowed
|
||||||
--> $DIR/borrow_interior_mutable_const.rs:81:5
|
--> $DIR/borrow_interior_mutable_const.rs:112:5
|
||||||
|
|
|
|
||||||
LL | u64::ATOMIC.store(5, Ordering::SeqCst); //~ ERROR interior mutability
|
LL | u64::ATOMIC.store(5, Ordering::SeqCst); //~ ERROR interior mutability
|
||||||
| ^^^^^^^^^^^
|
| ^^^^^^^^^^^
|
||||||
@ -120,7 +120,7 @@ LL | u64::ATOMIC.store(5, Ordering::SeqCst); //~ ERROR interior mutability
|
|||||||
= help: assign this const to a local or static variable, and use the variable here
|
= help: assign this const to a local or static variable, and use the variable here
|
||||||
|
|
||||||
error: a `const` item with interior mutability should not be borrowed
|
error: a `const` item with interior mutability should not be borrowed
|
||||||
--> $DIR/borrow_interior_mutable_const.rs:82:16
|
--> $DIR/borrow_interior_mutable_const.rs:113:16
|
||||||
|
|
|
|
||||||
LL | assert_eq!(u64::ATOMIC.load(Ordering::SeqCst), 9); //~ ERROR interior mutability
|
LL | assert_eq!(u64::ATOMIC.load(Ordering::SeqCst), 9); //~ ERROR interior mutability
|
||||||
| ^^^^^^^^^^^
|
| ^^^^^^^^^^^
|
||||||
|
Loading…
Reference in New Issue
Block a user