mirror of
https://github.com/rust-lang/rust.git
synced 2025-01-21 04:03:11 +00:00
warn about each skipped feature gate
This commit is contained in:
parent
89666ab6b4
commit
99debecd4d
@ -253,13 +253,7 @@ impl Validator<'mir, 'tcx> {
|
||||
let is_unleashable = O::IS_SUPPORTED_IN_MIRI;
|
||||
|
||||
if is_unleashable && self.tcx.sess.opts.debugging_opts.unleash_the_miri_inside_of_you {
|
||||
// Use `def_span` to deduplicate all warnings for the same const.
|
||||
self.tcx.sess.span_warn(self.tcx.def_span(self.def_id), "skipping const checks");
|
||||
if let Some(feature) = O::feature_gate() {
|
||||
// We'd like to use `delay_span_bug` here, but we cannot as that ICEs
|
||||
// before codegen has the chance to emit errors. So we use a custom system instead.
|
||||
self.tcx.sess.miri_unleashed_feature(feature);
|
||||
}
|
||||
self.tcx.sess.miri_unleashed_feature(span, O::feature_gate());
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -27,7 +27,6 @@ use rustc_target::spec::{PanicStrategy, RelocModel, RelroLevel, Target, TargetTr
|
||||
|
||||
use std::cell::{self, RefCell};
|
||||
use std::env;
|
||||
use std::fmt::Write as _;
|
||||
use std::io::Write;
|
||||
use std::num::NonZeroU32;
|
||||
use std::path::PathBuf;
|
||||
@ -144,9 +143,11 @@ pub struct Session {
|
||||
/// and immediately printing the backtrace to stderr.
|
||||
pub ctfe_backtrace: Lock<CtfeBacktrace>,
|
||||
|
||||
/// This tracks whether `-Zunleash-the-miri-inside-of-you` was used to get around a
|
||||
/// feature gate. If yes, this file must fail to compile.
|
||||
miri_unleashed_features: Lock<FxHashSet<Symbol>>,
|
||||
/// This tracks where `-Zunleash-the-miri-inside-of-you` was used to get around a
|
||||
/// const check, optionally with the relevant feature gate. We use this to
|
||||
/// warn about unleashing, but with a single diagnostic instead of dozens that
|
||||
/// drown everything else in noise.
|
||||
miri_unleashed_features: Lock<Vec<(Span, Option<Symbol>)>>,
|
||||
|
||||
/// Base directory containing the `src/` for the Rust standard library, and
|
||||
/// potentially `rustc` as well, if we can can find it. Right now it's always
|
||||
@ -195,29 +196,34 @@ impl From<&'static lint::Lint> for DiagnosticMessageId {
|
||||
}
|
||||
|
||||
impl Session {
|
||||
pub fn miri_unleashed_feature(&self, s: Symbol) {
|
||||
self.miri_unleashed_features.lock().insert(s);
|
||||
pub fn miri_unleashed_feature(&self, span: Span, feature_gate: Option<Symbol>) {
|
||||
self.miri_unleashed_features.lock().push((span, feature_gate));
|
||||
}
|
||||
|
||||
fn check_miri_unleashed_features(&self) {
|
||||
if !self.has_errors_or_delayed_span_bugs() {
|
||||
let unleashed_features = self.miri_unleashed_features.lock();
|
||||
if !unleashed_features.is_empty() {
|
||||
// Join the strings (itertools has it but libstd does not...)
|
||||
let mut list = String::new();
|
||||
for feature in unleashed_features.iter() {
|
||||
if !list.is_empty() {
|
||||
list.push_str(", ");
|
||||
}
|
||||
write!(&mut list, "{}", feature).unwrap();
|
||||
let unleashed_features = self.miri_unleashed_features.lock();
|
||||
if !unleashed_features.is_empty() {
|
||||
let mut must_err = false;
|
||||
// Create a diagnostic pointing at where things got unleashed.
|
||||
let mut diag = self.struct_warn("skipping const checks");
|
||||
for &(span, feature_gate) in unleashed_features.iter() {
|
||||
// FIXME: `span_label` doesn't do anything, so we use "help" as a hack.
|
||||
if let Some(feature_gate) = feature_gate {
|
||||
diag.span_help(span, &format!("skipping check for `{}` feature", feature_gate));
|
||||
// The unleash flag must *not* be used to just "hack around" feature gates.
|
||||
must_err = true;
|
||||
} else {
|
||||
diag.span_help(span, "skipping check that does not even have a feature gate");
|
||||
}
|
||||
}
|
||||
diag.emit();
|
||||
// If we should err, make sure we did.
|
||||
if must_err && !self.has_errors() {
|
||||
// We have skipped a feature gate, and not run into other errors... reject.
|
||||
self.err(&format!(
|
||||
self.err(
|
||||
"`-Zunleash-the-miri-inside-of-you` may not be used to circumvent feature \
|
||||
gates, except when testing error paths in the CTFE engine.\n\
|
||||
The following feature flags are missing from this crate: {}",
|
||||
list,
|
||||
));
|
||||
gates, except when testing error paths in the CTFE engine"
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -8,15 +8,15 @@ const fn double_const(x: usize) -> usize { x * 2 }
|
||||
const X: fn(usize) -> usize = double;
|
||||
const X_CONST: fn(usize) -> usize = double_const;
|
||||
|
||||
const fn bar(x: usize) -> usize { //~ WARNING skipping const checks
|
||||
const fn bar(x: usize) -> usize {
|
||||
X(x)
|
||||
}
|
||||
|
||||
const fn bar_const(x: usize) -> usize { //~ WARNING skipping const checks
|
||||
const fn bar_const(x: usize) -> usize {
|
||||
X_CONST(x)
|
||||
}
|
||||
|
||||
const fn foo(x: fn(usize) -> usize, y: usize) -> usize { //~ WARNING skipping const checks
|
||||
const fn foo(x: fn(usize) -> usize, y: usize) -> usize {
|
||||
x(y)
|
||||
}
|
||||
|
||||
|
@ -1,26 +1,20 @@
|
||||
warning: skipping const checks
|
||||
--> $DIR/const_fn_ptr.rs:11:1
|
||||
|
|
||||
LL | / const fn bar(x: usize) -> usize {
|
||||
LL | | X(x)
|
||||
LL | | }
|
||||
| |_^
|
||||
|
||||
warning: skipping const checks
|
||||
--> $DIR/const_fn_ptr.rs:15:1
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/const_fn_ptr.rs:12:5
|
||||
|
|
||||
LL | / const fn bar_const(x: usize) -> usize {
|
||||
LL | | X_CONST(x)
|
||||
LL | | }
|
||||
| |_^
|
||||
|
||||
warning: skipping const checks
|
||||
--> $DIR/const_fn_ptr.rs:19:1
|
||||
LL | X(x)
|
||||
| ^^^^
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/const_fn_ptr.rs:16:5
|
||||
|
|
||||
LL | / const fn foo(x: fn(usize) -> usize, y: usize) -> usize {
|
||||
LL | | x(y)
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | X_CONST(x)
|
||||
| ^^^^^^^^^^
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/const_fn_ptr.rs:20:5
|
||||
|
|
||||
LL | x(y)
|
||||
| ^^^^
|
||||
|
||||
warning: 3 warnings emitted
|
||||
warning: 1 warning emitted
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
fn double(x: usize) -> usize { x * 2 }
|
||||
const X: fn(usize) -> usize = double;
|
||||
|
||||
const fn bar(x: usize) -> usize { //~ WARNING skipping const checks
|
||||
const fn bar(x: usize) -> usize {
|
||||
X(x) // FIXME: this should error someday
|
||||
}
|
||||
|
||||
|
@ -1,10 +1,10 @@
|
||||
warning: skipping const checks
|
||||
--> $DIR/const_fn_ptr_fail.rs:9:1
|
||||
|
|
||||
LL | / const fn bar(x: usize) -> usize {
|
||||
LL | | X(x) // FIXME: this should error someday
|
||||
LL | | }
|
||||
| |_^
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/const_fn_ptr_fail.rs:10:5
|
||||
|
|
||||
LL | X(x) // FIXME: this should error someday
|
||||
| ^^^^
|
||||
|
||||
warning: 1 warning emitted
|
||||
|
||||
|
@ -9,7 +9,7 @@ fn double(x: usize) -> usize {
|
||||
}
|
||||
const X: fn(usize) -> usize = double;
|
||||
|
||||
const fn bar(x: fn(usize) -> usize, y: usize) -> usize { //~ WARN skipping const checks
|
||||
const fn bar(x: fn(usize) -> usize, y: usize) -> usize {
|
||||
x(y)
|
||||
}
|
||||
|
||||
|
@ -1,11 +1,3 @@
|
||||
warning: skipping const checks
|
||||
--> $DIR/const_fn_ptr_fail2.rs:12:1
|
||||
|
|
||||
LL | / const fn bar(x: fn(usize) -> usize, y: usize) -> usize {
|
||||
LL | | x(y)
|
||||
LL | | }
|
||||
| |_^
|
||||
|
||||
error[E0080]: evaluation of constant expression failed
|
||||
--> $DIR/const_fn_ptr_fail2.rs:20:5
|
||||
|
|
||||
@ -26,6 +18,14 @@ LL | assert_eq!(Z, 4);
|
||||
|
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
warning: skipping const checks
|
||||
|
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/const_fn_ptr_fail2.rs:13:5
|
||||
|
|
||||
LL | x(y)
|
||||
| ^^^^
|
||||
|
||||
error: aborting due to 2 previous errors; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0080`.
|
||||
|
@ -3,8 +3,9 @@
|
||||
#![allow(dead_code)]
|
||||
|
||||
const TEST: &u8 = &MY_STATIC;
|
||||
//~^ skipping const checks
|
||||
//~| it is undefined behavior to use this value
|
||||
//~^ ERROR it is undefined behavior to use this value
|
||||
//~| NOTE encountered a reference pointing to a static variable
|
||||
//~| NOTE
|
||||
|
||||
static MY_STATIC: u8 = 4;
|
||||
|
||||
|
@ -1,9 +1,3 @@
|
||||
warning: skipping const checks
|
||||
--> $DIR/const-points-to-static.rs:5:1
|
||||
|
|
||||
LL | const TEST: &u8 = &MY_STATIC;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0080]: it is undefined behavior to use this value
|
||||
--> $DIR/const-points-to-static.rs:5:1
|
||||
|
|
||||
@ -12,6 +6,14 @@ LL | const TEST: &u8 = &MY_STATIC;
|
||||
|
|
||||
= note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior.
|
||||
|
||||
warning: skipping const checks
|
||||
|
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/const-points-to-static.rs:5:20
|
||||
|
|
||||
LL | const TEST: &u8 = &MY_STATIC;
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0080`.
|
||||
|
@ -3,7 +3,6 @@
|
||||
#![allow(dead_code)]
|
||||
|
||||
const TEST: u8 = MY_STATIC; //~ ERROR any use of this value will cause an error
|
||||
//~^ skipping const checks
|
||||
|
||||
static MY_STATIC: u8 = 4;
|
||||
|
||||
|
@ -1,9 +1,3 @@
|
||||
warning: skipping const checks
|
||||
--> $DIR/const-prop-read-static-in-const.rs:5:1
|
||||
|
|
||||
LL | const TEST: u8 = MY_STATIC;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: any use of this value will cause an error
|
||||
--> $DIR/const-prop-read-static-in-const.rs:5:18
|
||||
|
|
||||
@ -14,5 +8,13 @@ LL | const TEST: u8 = MY_STATIC;
|
||||
|
|
||||
= note: `#[deny(const_err)]` on by default
|
||||
|
||||
warning: skipping const checks
|
||||
|
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/const-prop-read-static-in-const.rs:5:18
|
||||
|
|
||||
LL | const TEST: u8 = MY_STATIC;
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
|
||||
|
@ -7,7 +7,6 @@
|
||||
const extern "C" fn c_fn() {}
|
||||
|
||||
const fn call_rust_fn(my_fn: extern "Rust" fn()) {
|
||||
//~^ WARN skipping const checks
|
||||
my_fn();
|
||||
//~^ ERROR could not evaluate static initializer
|
||||
//~| NOTE calling a function with ABI C using caller ABI Rust
|
||||
@ -15,7 +14,6 @@ const fn call_rust_fn(my_fn: extern "Rust" fn()) {
|
||||
}
|
||||
|
||||
static VAL: () = call_rust_fn(unsafe { std::mem::transmute(c_fn as extern "C" fn()) });
|
||||
//~^ WARN skipping const checks
|
||||
//~| NOTE inside `VAL`
|
||||
//~^ NOTE inside `VAL`
|
||||
|
||||
fn main() {}
|
||||
|
@ -1,33 +1,28 @@
|
||||
warning: skipping const checks
|
||||
--> $DIR/abi-mismatch.rs:9:1
|
||||
|
|
||||
LL | / const fn call_rust_fn(my_fn: extern "Rust" fn()) {
|
||||
LL | |
|
||||
LL | | my_fn();
|
||||
LL | |
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | }
|
||||
| |_^
|
||||
|
||||
warning: skipping const checks
|
||||
--> $DIR/abi-mismatch.rs:17:1
|
||||
|
|
||||
LL | static VAL: () = call_rust_fn(unsafe { std::mem::transmute(c_fn as extern "C" fn()) });
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0080]: could not evaluate static initializer
|
||||
--> $DIR/abi-mismatch.rs:11:5
|
||||
--> $DIR/abi-mismatch.rs:10:5
|
||||
|
|
||||
LL | my_fn();
|
||||
| ^^^^^^^
|
||||
| |
|
||||
| calling a function with ABI C using caller ABI Rust
|
||||
| inside `call_rust_fn` at $DIR/abi-mismatch.rs:11:5
|
||||
| inside `call_rust_fn` at $DIR/abi-mismatch.rs:10:5
|
||||
...
|
||||
LL | static VAL: () = call_rust_fn(unsafe { std::mem::transmute(c_fn as extern "C" fn()) });
|
||||
| --------------------------------------------------------------------- inside `VAL` at $DIR/abi-mismatch.rs:17:18
|
||||
| --------------------------------------------------------------------- inside `VAL` at $DIR/abi-mismatch.rs:16:18
|
||||
|
||||
error: aborting due to previous error; 2 warnings emitted
|
||||
warning: skipping const checks
|
||||
|
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/abi-mismatch.rs:10:5
|
||||
|
|
||||
LL | my_fn();
|
||||
| ^^^^^^^
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/abi-mismatch.rs:16:40
|
||||
|
|
||||
LL | static VAL: () = call_rust_fn(unsafe { std::mem::transmute(c_fn as extern "C" fn()) });
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0080`.
|
||||
|
@ -11,7 +11,7 @@ trait Foo<T> {
|
||||
}
|
||||
|
||||
trait Bar<T, U: Foo<T>> {
|
||||
const F: u32 = (U::X, 42).1; //~ WARN skipping const checks
|
||||
const F: u32 = (U::X, 42).1;
|
||||
}
|
||||
|
||||
impl Foo<u32> for () {
|
||||
|
@ -1,15 +1,17 @@
|
||||
warning: skipping const checks
|
||||
--> $DIR/assoc_const.rs:14:5
|
||||
|
|
||||
LL | const F: u32 = (U::X, 42).1;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0080]: erroneous constant used
|
||||
--> $DIR/assoc_const.rs:31:13
|
||||
|
|
||||
LL | let y = <String as Bar<Vec<u32>, String>>::F;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ referenced constant has errors
|
||||
|
||||
warning: skipping const checks
|
||||
|
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/assoc_const.rs:14:20
|
||||
|
|
||||
LL | const F: u32 = (U::X, 42).1;
|
||||
| ^^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0080`.
|
||||
|
@ -6,7 +6,7 @@ use std::mem::ManuallyDrop;
|
||||
|
||||
fn main() {}
|
||||
|
||||
static TEST_BAD: &mut i32 = { //~ WARN skipping const checks
|
||||
static TEST_BAD: &mut i32 = {
|
||||
&mut *(box 0)
|
||||
//~^ ERROR could not evaluate static initializer
|
||||
//~| NOTE heap allocations
|
||||
|
@ -1,19 +1,32 @@
|
||||
warning: skipping const checks
|
||||
--> $DIR/box.rs:9:1
|
||||
|
|
||||
LL | / static TEST_BAD: &mut i32 = {
|
||||
LL | | &mut *(box 0)
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | };
|
||||
| |__^
|
||||
|
||||
error[E0080]: could not evaluate static initializer
|
||||
--> $DIR/box.rs:10:11
|
||||
|
|
||||
LL | &mut *(box 0)
|
||||
| ^^^^^^^ "heap allocations via `box` keyword" needs an rfc before being allowed inside constants
|
||||
|
||||
warning: skipping const checks
|
||||
|
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/box.rs:10:11
|
||||
|
|
||||
LL | &mut *(box 0)
|
||||
| ^^^^^^^
|
||||
help: skipping check for `const_mut_refs` feature
|
||||
--> $DIR/box.rs:10:16
|
||||
|
|
||||
LL | &mut *(box 0)
|
||||
| ^
|
||||
help: skipping check for `const_mut_refs` feature
|
||||
--> $DIR/box.rs:10:5
|
||||
|
|
||||
LL | &mut *(box 0)
|
||||
| ^^^^^^^^^^^^^
|
||||
help: skipping check for `const_mut_refs` feature
|
||||
--> $DIR/box.rs:10:5
|
||||
|
|
||||
LL | &mut *(box 0)
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0080`.
|
||||
|
@ -9,20 +9,17 @@ use std::sync::atomic::Ordering;
|
||||
// when *using* the const.
|
||||
|
||||
const MUTATE_INTERIOR_MUT: usize = {
|
||||
//~^ WARN skipping const checks
|
||||
static FOO: AtomicUsize = AtomicUsize::new(0);
|
||||
FOO.fetch_add(1, Ordering::Relaxed)
|
||||
};
|
||||
|
||||
const READ_INTERIOR_MUT: usize = {
|
||||
//~^ WARN skipping const checks
|
||||
static FOO: AtomicUsize = AtomicUsize::new(0);
|
||||
unsafe { *(&FOO as *const _ as *const usize) }
|
||||
};
|
||||
|
||||
static mut MUTABLE: u32 = 0;
|
||||
const READ_MUT: u32 = unsafe { MUTABLE };
|
||||
//~^ WARN skipping const checks
|
||||
|
||||
fn main() {
|
||||
MUTATE_INTERIOR_MUT;
|
||||
|
@ -1,47 +1,54 @@
|
||||
warning: skipping const checks
|
||||
--> $DIR/const_refers_to_static.rs:11:1
|
||||
|
|
||||
LL | / const MUTATE_INTERIOR_MUT: usize = {
|
||||
LL | |
|
||||
LL | | static FOO: AtomicUsize = AtomicUsize::new(0);
|
||||
LL | | FOO.fetch_add(1, Ordering::Relaxed)
|
||||
LL | | };
|
||||
| |__^
|
||||
|
||||
warning: skipping const checks
|
||||
--> $DIR/const_refers_to_static.rs:17:1
|
||||
|
|
||||
LL | / const READ_INTERIOR_MUT: usize = {
|
||||
LL | |
|
||||
LL | | static FOO: AtomicUsize = AtomicUsize::new(0);
|
||||
LL | | unsafe { *(&FOO as *const _ as *const usize) }
|
||||
LL | | };
|
||||
| |__^
|
||||
|
||||
warning: skipping const checks
|
||||
--> $DIR/const_refers_to_static.rs:24:1
|
||||
|
|
||||
LL | const READ_MUT: u32 = unsafe { MUTABLE };
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0080]: erroneous constant used
|
||||
--> $DIR/const_refers_to_static.rs:28:5
|
||||
--> $DIR/const_refers_to_static.rs:25:5
|
||||
|
|
||||
LL | MUTATE_INTERIOR_MUT;
|
||||
| ^^^^^^^^^^^^^^^^^^^ referenced constant has errors
|
||||
|
||||
error[E0080]: erroneous constant used
|
||||
--> $DIR/const_refers_to_static.rs:30:5
|
||||
--> $DIR/const_refers_to_static.rs:27:5
|
||||
|
|
||||
LL | READ_INTERIOR_MUT;
|
||||
| ^^^^^^^^^^^^^^^^^ referenced constant has errors
|
||||
|
||||
error[E0080]: erroneous constant used
|
||||
--> $DIR/const_refers_to_static.rs:32:5
|
||||
--> $DIR/const_refers_to_static.rs:29:5
|
||||
|
|
||||
LL | READ_MUT;
|
||||
| ^^^^^^^^ referenced constant has errors
|
||||
|
||||
error: aborting due to 3 previous errors; 3 warnings emitted
|
||||
warning: skipping const checks
|
||||
|
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/const_refers_to_static.rs:13:5
|
||||
|
|
||||
LL | FOO.fetch_add(1, Ordering::Relaxed)
|
||||
| ^^^
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/const_refers_to_static.rs:13:5
|
||||
|
|
||||
LL | FOO.fetch_add(1, Ordering::Relaxed)
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/const_refers_to_static.rs:18:17
|
||||
|
|
||||
LL | unsafe { *(&FOO as *const _ as *const usize) }
|
||||
| ^^^
|
||||
help: skipping check for `const_raw_ptr_deref` feature
|
||||
--> $DIR/const_refers_to_static.rs:18:14
|
||||
|
|
||||
LL | unsafe { *(&FOO as *const _ as *const usize) }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/const_refers_to_static.rs:22:32
|
||||
|
|
||||
LL | const READ_MUT: u32 = unsafe { MUTABLE };
|
||||
| ^^^^^^^
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/const_refers_to_static.rs:22:32
|
||||
|
|
||||
LL | const READ_MUT: u32 = unsafe { MUTABLE };
|
||||
| ^^^^^^^
|
||||
|
||||
error: aborting due to 3 previous errors; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0080`.
|
||||
|
@ -8,7 +8,6 @@ use std::sync::atomic::Ordering;
|
||||
// so they cause an immediate error when *defining* the const.
|
||||
|
||||
const REF_INTERIOR_MUT: &usize = { //~ ERROR undefined behavior to use this value
|
||||
//~^ WARN skipping const checks
|
||||
//~| NOTE encountered a reference pointing to a static variable
|
||||
//~| NOTE
|
||||
static FOO: AtomicUsize = AtomicUsize::new(0);
|
||||
@ -17,7 +16,6 @@ const REF_INTERIOR_MUT: &usize = { //~ ERROR undefined behavior to use this valu
|
||||
|
||||
// ok some day perhaps
|
||||
const READ_IMMUT: &usize = { //~ ERROR it is undefined behavior to use this value
|
||||
//~^ WARN skipping const checks
|
||||
//~| NOTE encountered a reference pointing to a static variable
|
||||
//~| NOTE
|
||||
static FOO: usize = 0;
|
||||
|
@ -1,34 +1,9 @@
|
||||
warning: skipping const checks
|
||||
--> $DIR/const_refers_to_static2.rs:10:1
|
||||
|
|
||||
LL | / const REF_INTERIOR_MUT: &usize = {
|
||||
LL | |
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | static FOO: AtomicUsize = AtomicUsize::new(0);
|
||||
LL | | unsafe { &*(&FOO as *const _ as *const usize) }
|
||||
LL | | };
|
||||
| |__^
|
||||
|
||||
warning: skipping const checks
|
||||
--> $DIR/const_refers_to_static2.rs:19:1
|
||||
|
|
||||
LL | / const READ_IMMUT: &usize = {
|
||||
LL | |
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | static FOO: usize = 0;
|
||||
LL | | &FOO
|
||||
LL | | };
|
||||
| |__^
|
||||
|
||||
error[E0080]: it is undefined behavior to use this value
|
||||
--> $DIR/const_refers_to_static2.rs:10:1
|
||||
|
|
||||
LL | / const REF_INTERIOR_MUT: &usize = {
|
||||
LL | |
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | static FOO: AtomicUsize = AtomicUsize::new(0);
|
||||
LL | | unsafe { &*(&FOO as *const _ as *const usize) }
|
||||
LL | | };
|
||||
@ -37,12 +12,11 @@ LL | | };
|
||||
= note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior.
|
||||
|
||||
error[E0080]: it is undefined behavior to use this value
|
||||
--> $DIR/const_refers_to_static2.rs:19:1
|
||||
--> $DIR/const_refers_to_static2.rs:18:1
|
||||
|
|
||||
LL | / const READ_IMMUT: &usize = {
|
||||
LL | |
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | static FOO: usize = 0;
|
||||
LL | | &FOO
|
||||
LL | | };
|
||||
@ -50,6 +24,24 @@ LL | | };
|
||||
|
|
||||
= note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior.
|
||||
|
||||
error: aborting due to 2 previous errors; 2 warnings emitted
|
||||
warning: skipping const checks
|
||||
|
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/const_refers_to_static2.rs:14:18
|
||||
|
|
||||
LL | unsafe { &*(&FOO as *const _ as *const usize) }
|
||||
| ^^^
|
||||
help: skipping check for `const_raw_ptr_deref` feature
|
||||
--> $DIR/const_refers_to_static2.rs:14:14
|
||||
|
|
||||
LL | unsafe { &*(&FOO as *const _ as *const usize) }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/const_refers_to_static2.rs:22:6
|
||||
|
|
||||
LL | &FOO
|
||||
| ^^^
|
||||
|
||||
error: aborting due to 2 previous errors; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0080`.
|
||||
|
@ -9,14 +9,12 @@ extern crate static_cross_crate;
|
||||
// Sneaky: reference to a mutable static.
|
||||
// Allowing this would be a disaster for pattern matching, we could violate exhaustiveness checking!
|
||||
const SLICE_MUT: &[u8; 1] = { //~ ERROR undefined behavior to use this value
|
||||
//~^ WARN skipping const checks
|
||||
//~| NOTE encountered a reference pointing to a static variable
|
||||
//~| NOTE
|
||||
unsafe { &static_cross_crate::ZERO }
|
||||
};
|
||||
|
||||
const U8_MUT: &u8 = { //~ ERROR undefined behavior to use this value
|
||||
//~^ WARN skipping const checks
|
||||
//~| NOTE encountered a reference pointing to a static variable
|
||||
//~| NOTE
|
||||
unsafe { &static_cross_crate::ZERO[0] }
|
||||
@ -25,14 +23,12 @@ const U8_MUT: &u8 = { //~ ERROR undefined behavior to use this value
|
||||
// Also test indirection that reads from other static. This causes a const_err.
|
||||
#[warn(const_err)] //~ NOTE
|
||||
const U8_MUT2: &u8 = { //~ NOTE
|
||||
//~^ WARN skipping const checks
|
||||
unsafe { &(*static_cross_crate::ZERO_REF)[0] }
|
||||
//~^ WARN [const_err]
|
||||
//~| NOTE constant accesses static
|
||||
};
|
||||
#[warn(const_err)] //~ NOTE
|
||||
const U8_MUT3: &u8 = { //~ NOTE
|
||||
//~^ WARN skipping const checks
|
||||
unsafe { match static_cross_crate::OPT_ZERO { Some(ref u) => u, None => panic!() } }
|
||||
//~^ WARN [const_err]
|
||||
//~| NOTE constant accesses static
|
||||
|
@ -1,21 +1,9 @@
|
||||
warning: skipping const checks
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:11:1
|
||||
|
|
||||
LL | / const SLICE_MUT: &[u8; 1] = {
|
||||
LL | |
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | unsafe { &static_cross_crate::ZERO }
|
||||
LL | | };
|
||||
| |__^
|
||||
|
||||
error[E0080]: it is undefined behavior to use this value
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:11:1
|
||||
|
|
||||
LL | / const SLICE_MUT: &[u8; 1] = {
|
||||
LL | |
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | unsafe { &static_cross_crate::ZERO }
|
||||
LL | | };
|
||||
| |__^ type validation failed: encountered a reference pointing to a static variable
|
||||
@ -23,29 +11,17 @@ LL | | };
|
||||
= note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior.
|
||||
|
||||
error: could not evaluate constant pattern
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:43:9
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:39:9
|
||||
|
|
||||
LL | SLICE_MUT => true,
|
||||
| ^^^^^^^^^
|
||||
|
||||
warning: skipping const checks
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:18:1
|
||||
|
|
||||
LL | / const U8_MUT: &u8 = {
|
||||
LL | |
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | unsafe { &static_cross_crate::ZERO[0] }
|
||||
LL | | };
|
||||
| |__^
|
||||
|
||||
error[E0080]: it is undefined behavior to use this value
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:18:1
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:17:1
|
||||
|
|
||||
LL | / const U8_MUT: &u8 = {
|
||||
LL | |
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | unsafe { &static_cross_crate::ZERO[0] }
|
||||
LL | | };
|
||||
| |__^ type validation failed: encountered a reference pointing to a static variable
|
||||
@ -53,27 +29,15 @@ LL | | };
|
||||
= note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior.
|
||||
|
||||
error: could not evaluate constant pattern
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:51:9
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:47:9
|
||||
|
|
||||
LL | U8_MUT => true,
|
||||
| ^^^^^^
|
||||
|
||||
warning: skipping const checks
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:27:1
|
||||
|
|
||||
LL | / const U8_MUT2: &u8 = {
|
||||
LL | |
|
||||
LL | | unsafe { &(*static_cross_crate::ZERO_REF)[0] }
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | };
|
||||
| |__^
|
||||
|
||||
warning: any use of this value will cause an error
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:29:14
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:26:14
|
||||
|
|
||||
LL | / const U8_MUT2: &u8 = {
|
||||
LL | |
|
||||
LL | | unsafe { &(*static_cross_crate::ZERO_REF)[0] }
|
||||
| | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ constant accesses static
|
||||
LL | |
|
||||
@ -82,33 +46,21 @@ LL | | };
|
||||
| |__-
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:26:8
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:24:8
|
||||
|
|
||||
LL | #[warn(const_err)]
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: could not evaluate constant pattern
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:61:9
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:57:9
|
||||
|
|
||||
LL | U8_MUT2 => true,
|
||||
| ^^^^^^^
|
||||
|
||||
warning: skipping const checks
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:34:1
|
||||
|
|
||||
LL | / const U8_MUT3: &u8 = {
|
||||
LL | |
|
||||
LL | | unsafe { match static_cross_crate::OPT_ZERO { Some(ref u) => u, None => panic!() } }
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | };
|
||||
| |__^
|
||||
|
||||
warning: any use of this value will cause an error
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:36:51
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:32:51
|
||||
|
|
||||
LL | / const U8_MUT3: &u8 = {
|
||||
LL | |
|
||||
LL | | unsafe { match static_cross_crate::OPT_ZERO { Some(ref u) => u, None => panic!() } }
|
||||
| | ^^^^^^^^^^^ constant accesses static
|
||||
LL | |
|
||||
@ -117,17 +69,76 @@ LL | | };
|
||||
| |__-
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:33:8
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:30:8
|
||||
|
|
||||
LL | #[warn(const_err)]
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: could not evaluate constant pattern
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:68:9
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:64:9
|
||||
|
|
||||
LL | U8_MUT3 => true,
|
||||
| ^^^^^^^
|
||||
|
||||
error: aborting due to 6 previous errors; 6 warnings emitted
|
||||
warning: skipping const checks
|
||||
|
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:14:15
|
||||
|
|
||||
LL | unsafe { &static_cross_crate::ZERO }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:14:15
|
||||
|
|
||||
LL | unsafe { &static_cross_crate::ZERO }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:20:15
|
||||
|
|
||||
LL | unsafe { &static_cross_crate::ZERO[0] }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:20:15
|
||||
|
|
||||
LL | unsafe { &static_cross_crate::ZERO[0] }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:20:15
|
||||
|
|
||||
LL | unsafe { &static_cross_crate::ZERO[0] }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:26:17
|
||||
|
|
||||
LL | unsafe { &(*static_cross_crate::ZERO_REF)[0] }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:32:20
|
||||
|
|
||||
LL | unsafe { match static_cross_crate::OPT_ZERO { Some(ref u) => u, None => panic!() } }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:32:20
|
||||
|
|
||||
LL | unsafe { match static_cross_crate::OPT_ZERO { Some(ref u) => u, None => panic!() } }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:32:20
|
||||
|
|
||||
LL | unsafe { match static_cross_crate::OPT_ZERO { Some(ref u) => u, None => panic!() } }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
help: skipping check for `const_panic` feature
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:32:77
|
||||
|
|
||||
LL | unsafe { match static_cross_crate::OPT_ZERO { Some(ref u) => u, None => panic!() } }
|
||||
| ^^^^^^^^
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:32:20
|
||||
|
|
||||
LL | unsafe { match static_cross_crate::OPT_ZERO { Some(ref u) => u, None => panic!() } }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: this warning originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: aborting due to 6 previous errors; 3 warnings emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0080`.
|
||||
|
@ -13,6 +13,6 @@ static TEST_OK: () = {
|
||||
|
||||
// Make sure we catch executing bad drop functions.
|
||||
// The actual error is tested by the error-pattern above.
|
||||
static TEST_BAD: () = { //~ WARN skipping const checks
|
||||
static TEST_BAD: () = {
|
||||
let _v: Vec<i32> = Vec::new();
|
||||
};
|
||||
|
@ -1,11 +1,3 @@
|
||||
warning: skipping const checks
|
||||
--> $DIR/drop.rs:16:1
|
||||
|
|
||||
LL | / static TEST_BAD: () = {
|
||||
LL | | let _v: Vec<i32> = Vec::new();
|
||||
LL | | };
|
||||
| |__^
|
||||
|
||||
error[E0080]: could not evaluate static initializer
|
||||
--> $SRC_DIR/libcore/ptr/mod.rs:LL:COL
|
||||
|
|
||||
@ -24,6 +16,14 @@ LL | | }
|
||||
LL | };
|
||||
| - inside `TEST_BAD` at $DIR/drop.rs:18:1
|
||||
|
||||
warning: skipping const checks
|
||||
|
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/drop.rs:17:9
|
||||
|
|
||||
LL | let _v: Vec<i32> = Vec::new();
|
||||
| ^^
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0080`.
|
||||
|
@ -6,9 +6,10 @@
|
||||
fn main() {}
|
||||
|
||||
// Make sure we catch executing inline assembly.
|
||||
static TEST_BAD: () = { //~ WARN skipping const checks
|
||||
static TEST_BAD: () = {
|
||||
unsafe { llvm_asm!("xor %eax, %eax" ::: "eax"); }
|
||||
//~^ ERROR could not evaluate static initializer
|
||||
//~| NOTE inline assembly is not supported
|
||||
//~| NOTE in this expansion of llvm_asm!
|
||||
//~| NOTE in this expansion of llvm_asm!
|
||||
};
|
||||
|
@ -1,14 +1,3 @@
|
||||
warning: skipping const checks
|
||||
--> $DIR/inline_asm.rs:9:1
|
||||
|
|
||||
LL | / static TEST_BAD: () = {
|
||||
LL | | unsafe { llvm_asm!("xor %eax, %eax" ::: "eax"); }
|
||||
LL | |
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | };
|
||||
| |__^
|
||||
|
||||
error[E0080]: could not evaluate static initializer
|
||||
--> $DIR/inline_asm.rs:10:14
|
||||
|
|
||||
@ -17,6 +6,15 @@ LL | unsafe { llvm_asm!("xor %eax, %eax" ::: "eax"); }
|
||||
|
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
warning: skipping const checks
|
||||
|
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/inline_asm.rs:10:14
|
||||
|
|
||||
LL | unsafe { llvm_asm!("xor %eax, %eax" ::: "eax"); }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: this warning originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0080`.
|
||||
|
@ -11,10 +11,8 @@ use std::cell::UnsafeCell;
|
||||
|
||||
// make sure we do not just intern this as mutable
|
||||
const MUTABLE_BEHIND_RAW: *mut i32 = &UnsafeCell::new(42) as *const _ as *mut _;
|
||||
//~^ WARN: skipping const checks
|
||||
|
||||
const MUTATING_BEHIND_RAW: () = { //~ NOTE
|
||||
//~^ WARN skipping const checks
|
||||
// Test that `MUTABLE_BEHIND_RAW` is actually immutable, by doing this at const time.
|
||||
unsafe {
|
||||
*MUTABLE_BEHIND_RAW = 99 //~ ERROR any use of this value will cause an error
|
||||
|
@ -1,26 +1,7 @@
|
||||
warning: skipping const checks
|
||||
--> $DIR/mutable_const.rs:13:1
|
||||
|
|
||||
LL | const MUTABLE_BEHIND_RAW: *mut i32 = &UnsafeCell::new(42) as *const _ as *mut _;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: skipping const checks
|
||||
--> $DIR/mutable_const.rs:16:1
|
||||
|
|
||||
LL | / const MUTATING_BEHIND_RAW: () = {
|
||||
LL | |
|
||||
LL | | // Test that `MUTABLE_BEHIND_RAW` is actually immutable, by doing this at const time.
|
||||
LL | | unsafe {
|
||||
... |
|
||||
LL | | }
|
||||
LL | | };
|
||||
| |__^
|
||||
|
||||
error: any use of this value will cause an error
|
||||
--> $DIR/mutable_const.rs:20:9
|
||||
--> $DIR/mutable_const.rs:18:9
|
||||
|
|
||||
LL | / const MUTATING_BEHIND_RAW: () = {
|
||||
LL | |
|
||||
LL | | // Test that `MUTABLE_BEHIND_RAW` is actually immutable, by doing this at const time.
|
||||
LL | | unsafe {
|
||||
LL | | *MUTABLE_BEHIND_RAW = 99
|
||||
@ -36,5 +17,23 @@ note: the lint level is defined here
|
||||
LL | #![deny(const_err)] // The `allow` variant is tested by `mutable_const2`.
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error; 2 warnings emitted
|
||||
warning: skipping const checks
|
||||
|
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/mutable_const.rs:13:38
|
||||
|
|
||||
LL | const MUTABLE_BEHIND_RAW: *mut i32 = &UnsafeCell::new(42) as *const _ as *mut _;
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
help: skipping check for `const_raw_ptr_deref` feature
|
||||
--> $DIR/mutable_const.rs:18:9
|
||||
|
|
||||
LL | *MUTABLE_BEHIND_RAW = 99
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
help: skipping check for `const_mut_refs` feature
|
||||
--> $DIR/mutable_const.rs:18:9
|
||||
|
|
||||
LL | *MUTABLE_BEHIND_RAW = 99
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
|
||||
|
@ -11,7 +11,6 @@ use std::cell::UnsafeCell;
|
||||
|
||||
// make sure we do not just intern this as mutable
|
||||
const MUTABLE_BEHIND_RAW: *mut i32 = &UnsafeCell::new(42) as *const _ as *mut _;
|
||||
//~^ WARN: skipping const checks
|
||||
//~| ERROR: mutable allocation in constant
|
||||
//~^ ERROR: mutable allocation in constant
|
||||
|
||||
fn main() {}
|
||||
|
@ -1,8 +1,10 @@
|
||||
warning: skipping const checks
|
||||
--> $DIR/mutable_const2.rs:13:1
|
||||
|
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/mutable_const2.rs:13:38
|
||||
|
|
||||
LL | const MUTABLE_BEHIND_RAW: *mut i32 = &UnsafeCell::new(42) as *const _ as *mut _;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: 1 warning emitted
|
||||
|
||||
|
@ -7,18 +7,15 @@ use std::cell::UnsafeCell;
|
||||
|
||||
// this is fine because is not possible to mutate through an immutable reference.
|
||||
static FOO: &&mut u32 = &&mut 42;
|
||||
//~^ WARN skipping const checks
|
||||
|
||||
// this is fine because accessing an immutable static `BAR` is equivalent to accessing `*&BAR`
|
||||
// which puts the mutable reference behind an immutable one.
|
||||
static BAR: &mut () = &mut ();
|
||||
//~^ WARN skipping const checks
|
||||
|
||||
struct Foo<T>(T);
|
||||
|
||||
// this is fine for the same reason as `BAR`.
|
||||
static BOO: &mut Foo<()> = &mut Foo(());
|
||||
//~^ WARN skipping const checks
|
||||
|
||||
struct Meh {
|
||||
x: &'static UnsafeCell<i32>,
|
||||
@ -26,13 +23,12 @@ struct Meh {
|
||||
|
||||
unsafe impl Sync for Meh {}
|
||||
|
||||
static MEH: Meh = Meh { //~ WARN skipping const checks
|
||||
static MEH: Meh = Meh {
|
||||
x: &UnsafeCell::new(42),
|
||||
};
|
||||
|
||||
// this is fine for the same reason as `BAR`.
|
||||
static OH_YES: &mut i32 = &mut 42;
|
||||
//~^ WARN skipping const checks
|
||||
|
||||
fn main() {
|
||||
unsafe {
|
||||
|
@ -1,41 +1,37 @@
|
||||
warning: skipping const checks
|
||||
--> $DIR/mutable_references.rs:9:1
|
||||
|
|
||||
LL | static FOO: &&mut u32 = &&mut 42;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: skipping const checks
|
||||
--> $DIR/mutable_references.rs:14:1
|
||||
|
|
||||
LL | static BAR: &mut () = &mut ();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: skipping const checks
|
||||
--> $DIR/mutable_references.rs:20:1
|
||||
|
|
||||
LL | static BOO: &mut Foo<()> = &mut Foo(());
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: skipping const checks
|
||||
--> $DIR/mutable_references.rs:29:1
|
||||
|
|
||||
LL | / static MEH: Meh = Meh {
|
||||
LL | | x: &UnsafeCell::new(42),
|
||||
LL | | };
|
||||
| |__^
|
||||
|
||||
warning: skipping const checks
|
||||
--> $DIR/mutable_references.rs:34:1
|
||||
|
|
||||
LL | static OH_YES: &mut i32 = &mut 42;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0594]: cannot assign to `*OH_YES`, as `OH_YES` is an immutable static item
|
||||
--> $DIR/mutable_references.rs:41:5
|
||||
--> $DIR/mutable_references.rs:37:5
|
||||
|
|
||||
LL | *OH_YES = 99;
|
||||
| ^^^^^^^^^^^^ cannot assign
|
||||
|
||||
error: aborting due to previous error; 5 warnings emitted
|
||||
warning: skipping const checks
|
||||
|
|
||||
help: skipping check for `const_mut_refs` feature
|
||||
--> $DIR/mutable_references.rs:9:26
|
||||
|
|
||||
LL | static FOO: &&mut u32 = &&mut 42;
|
||||
| ^^^^^^^
|
||||
help: skipping check for `const_mut_refs` feature
|
||||
--> $DIR/mutable_references.rs:13:23
|
||||
|
|
||||
LL | static BAR: &mut () = &mut ();
|
||||
| ^^^^^^^
|
||||
help: skipping check for `const_mut_refs` feature
|
||||
--> $DIR/mutable_references.rs:18:28
|
||||
|
|
||||
LL | static BOO: &mut Foo<()> = &mut Foo(());
|
||||
| ^^^^^^^^^^^^
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/mutable_references.rs:27:8
|
||||
|
|
||||
LL | x: &UnsafeCell::new(42),
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
help: skipping check for `const_mut_refs` feature
|
||||
--> $DIR/mutable_references.rs:31:27
|
||||
|
|
||||
LL | static OH_YES: &mut i32 = &mut 42;
|
||||
| ^^^^^^^
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0594`.
|
||||
|
@ -18,7 +18,7 @@ struct Meh {
|
||||
unsafe impl Sync for Meh {}
|
||||
|
||||
// the following will never be ok!
|
||||
const MUH: Meh = Meh { //~ WARN skipping const checks
|
||||
const MUH: Meh = Meh {
|
||||
x: &UnsafeCell::new(42),
|
||||
};
|
||||
|
||||
|
@ -1,11 +1,3 @@
|
||||
warning: skipping const checks
|
||||
--> $DIR/mutable_references_ice.rs:21:1
|
||||
|
|
||||
LL | / const MUH: Meh = Meh {
|
||||
LL | | x: &UnsafeCell::new(42),
|
||||
LL | | };
|
||||
| |__^
|
||||
|
||||
thread 'rustc' panicked at 'assertion failed: `(left != right)`
|
||||
left: `Const`,
|
||||
right: `Const`: UnsafeCells are not allowed behind references in constants. This should have been prevented statically by const qualification. If this were allowed one would be able to change a constant at one use site and other use sites could observe that mutation.', src/librustc_mir/interpret/intern.rs:LL:CC
|
||||
@ -21,5 +13,13 @@ note: rustc VERSION running on TARGET
|
||||
|
||||
note: compiler flags: FLAGS
|
||||
|
||||
warning: skipping const checks
|
||||
|
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/mutable_references_ice.rs:22:8
|
||||
|
|
||||
LL | x: &UnsafeCell::new(42),
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: 1 warning emitted
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
fn foo() {}
|
||||
|
||||
static C: () = foo(); //~ WARN: skipping const checks
|
||||
static C: () = foo();
|
||||
//~^ ERROR could not evaluate static initializer
|
||||
//~| NOTE calling non-const function `foo`
|
||||
|
||||
|
@ -1,15 +1,17 @@
|
||||
warning: skipping const checks
|
||||
--> $DIR/non_const_fn.rs:9:1
|
||||
|
|
||||
LL | static C: () = foo();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0080]: could not evaluate static initializer
|
||||
--> $DIR/non_const_fn.rs:9:16
|
||||
|
|
||||
LL | static C: () = foo();
|
||||
| ^^^^^ calling non-const function `foo`
|
||||
|
||||
warning: skipping const checks
|
||||
|
|
||||
help: skipping check that does not even have a feature gate
|
||||
--> $DIR/non_const_fn.rs:9:16
|
||||
|
|
||||
LL | static C: () = foo();
|
||||
| ^^^^^
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0080`.
|
||||
|
Loading…
Reference in New Issue
Block a user