From 774445d9b3b528b76b0ab476987aa6a48b802ec4 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Mon, 11 Nov 2019 18:24:20 +0100 Subject: [PATCH 1/3] Allow constants to refer statics --- src/librustc_mir/error_codes.rs | 21 ---------------- .../transform/check_consts/ops.rs | 25 ------------------- .../transform/check_consts/validation.rs | 2 -- src/librustc_mir/transform/qualify_consts.rs | 17 ------------- .../ui/consts/const-fn-not-safe-for-const.rs | 2 -- .../consts/const-fn-not-safe-for-const.stderr | 17 ++----------- .../consts/const-prop-read-static-in-const.rs | 12 --------- .../const-prop-read-static-in-const.stderr | 6 ----- .../ui/issues/issue-17718-const-bad-values.rs | 3 +-- .../issue-17718-const-bad-values.stderr | 11 ++------ src/test/ui/issues/issue-17718-references.rs | 7 +++--- .../ui/issues/issue-17718-references.stderr | 21 ---------------- src/test/ui/issues/issue-18118-2.rs | 7 ------ src/test/ui/issues/issue-18118-2.stderr | 9 ------- src/test/ui/issues/issue-52060.rs | 5 +++- src/test/ui/issues/issue-52060.stderr | 9 ------- 16 files changed, 13 insertions(+), 161 deletions(-) delete mode 100644 src/test/ui/consts/const-prop-read-static-in-const.rs delete mode 100644 src/test/ui/consts/const-prop-read-static-in-const.stderr delete mode 100644 src/test/ui/issues/issue-17718-references.stderr delete mode 100644 src/test/ui/issues/issue-18118-2.rs delete mode 100644 src/test/ui/issues/issue-18118-2.stderr delete mode 100644 src/test/ui/issues/issue-52060.stderr diff --git a/src/librustc_mir/error_codes.rs b/src/librustc_mir/error_codes.rs index c119ca536fb52..b169d75fc8ad7 100644 --- a/src/librustc_mir/error_codes.rs +++ b/src/librustc_mir/error_codes.rs @@ -228,27 +228,6 @@ const CON : Box = box 0; ``` "##, -E0013: r##" -Static and const variables can refer to other const variables. But a const -variable cannot refer to a static variable. - -Erroneous code example: - -```compile_fail,E0013 -static X: i32 = 42; -const Y: i32 = X; -``` - -In this example, `Y` cannot refer to `X` here. To fix this, the value can be -extracted as a const and then used: - -``` -const A: i32 = 42; -static X: i32 = A; -const Y: i32 = A; -``` -"##, - // FIXME(#57563) Change the language here when const fn stabilizes E0015: r##" The only functions that can be called in static or constant expressions are diff --git a/src/librustc_mir/transform/check_consts/ops.rs b/src/librustc_mir/transform/check_consts/ops.rs index 4b374cff80930..7942c0e626ebf 100644 --- a/src/librustc_mir/transform/check_consts/ops.rs +++ b/src/librustc_mir/transform/check_consts/ops.rs @@ -262,31 +262,6 @@ impl NonConstOp for RawPtrToIntCast { } } -/// An access to a (non-thread-local) `static`. -#[derive(Debug)] -pub struct StaticAccess; -impl NonConstOp for StaticAccess { - fn is_allowed_in_item(&self, item: &Item<'_, '_>) -> bool { - item.const_kind().is_static() - } - - fn emit_error(&self, item: &Item<'_, '_>, span: Span) { - let mut err = struct_span_err!(item.tcx.sess, span, E0013, - "{}s cannot refer to statics, use \ - a constant instead", item.const_kind()); - if item.tcx.sess.teach(&err.get_code().unwrap()) { - err.note( - "Static and const variables can refer to other const variables. \ - But a const variable cannot refer to a static variable." - ); - err.help( - "To fix this, the value can be extracted as a const and then used." - ); - } - err.emit(); - } -} - /// An access to a thread-local `static`. #[derive(Debug)] pub struct ThreadLocalAccess; diff --git a/src/librustc_mir/transform/check_consts/validation.rs b/src/librustc_mir/transform/check_consts/validation.rs index 244d434a51eab..c64c1a5133d1c 100644 --- a/src/librustc_mir/transform/check_consts/validation.rs +++ b/src/librustc_mir/transform/check_consts/validation.rs @@ -336,8 +336,6 @@ impl Visitor<'tcx> for Validator<'_, 'mir, 'tcx> { self.span, "cannot mutate statics in the initializer of another static", ); - } else { - self.check_op(ops::StaticAccess); } } } diff --git a/src/librustc_mir/transform/qualify_consts.rs b/src/librustc_mir/transform/qualify_consts.rs index 5ad5363768d34..bac871f04d921 100644 --- a/src/librustc_mir/transform/qualify_consts.rs +++ b/src/librustc_mir/transform/qualify_consts.rs @@ -798,23 +798,6 @@ impl<'a, 'tcx> Visitor<'tcx> for Checker<'a, 'tcx> { return; } unleash_miri!(self); - - if self.mode.requires_const_checking() && !self.suppress_errors { - self.record_error(ops::StaticAccess); - let mut err = struct_span_err!(self.tcx.sess, self.span, E0013, - "{}s cannot refer to statics, use \ - a constant instead", self.mode); - if self.tcx.sess.teach(&err.get_code().unwrap()) { - err.note( - "Static and const variables can refer to other const variables. \ - But a const variable cannot refer to a static variable." - ); - err.help( - "To fix this, the value can be extracted as a const and then used." - ); - } - err.emit() - } } } } diff --git a/src/test/ui/consts/const-fn-not-safe-for-const.rs b/src/test/ui/consts/const-fn-not-safe-for-const.rs index 085ff5c58e60c..7e3014a0d93f8 100644 --- a/src/test/ui/consts/const-fn-not-safe-for-const.rs +++ b/src/test/ui/consts/const-fn-not-safe-for-const.rs @@ -18,12 +18,10 @@ static Y: u32 = 0; const fn get_Y() -> u32 { Y - //~^ ERROR E0013 } const fn get_Y_addr() -> &'static u32 { &Y - //~^ ERROR E0013 } const fn get() -> u32 { diff --git a/src/test/ui/consts/const-fn-not-safe-for-const.stderr b/src/test/ui/consts/const-fn-not-safe-for-const.stderr index ba5d58a51d2dd..fdfc911e4a75a 100644 --- a/src/test/ui/consts/const-fn-not-safe-for-const.stderr +++ b/src/test/ui/consts/const-fn-not-safe-for-const.stderr @@ -4,19 +4,6 @@ error[E0015]: calls in constant functions are limited to constant functions, tup LL | random() | ^^^^^^^^ -error[E0013]: constant functions cannot refer to statics, use a constant instead - --> $DIR/const-fn-not-safe-for-const.rs:20:5 - | -LL | Y - | ^ - -error[E0013]: constant functions cannot refer to statics, use a constant instead - --> $DIR/const-fn-not-safe-for-const.rs:25:5 - | -LL | &Y - | ^^ - -error: aborting due to 3 previous errors +error: aborting due to previous error -Some errors have detailed explanations: E0013, E0015. -For more information about an error, try `rustc --explain E0013`. +For more information about this error, try `rustc --explain E0015`. diff --git a/src/test/ui/consts/const-prop-read-static-in-const.rs b/src/test/ui/consts/const-prop-read-static-in-const.rs deleted file mode 100644 index 7504fd525955a..0000000000000 --- a/src/test/ui/consts/const-prop-read-static-in-const.rs +++ /dev/null @@ -1,12 +0,0 @@ -// compile-flags: -Zunleash-the-miri-inside-of-you -// run-pass - -#![allow(dead_code)] - -const TEST: u8 = MY_STATIC; -//~^ skipping const checks - -static MY_STATIC: u8 = 4; - -fn main() { -} diff --git a/src/test/ui/consts/const-prop-read-static-in-const.stderr b/src/test/ui/consts/const-prop-read-static-in-const.stderr deleted file mode 100644 index bbd5b12ed7dfc..0000000000000 --- a/src/test/ui/consts/const-prop-read-static-in-const.stderr +++ /dev/null @@ -1,6 +0,0 @@ -warning: skipping const checks - --> $DIR/const-prop-read-static-in-const.rs:6:18 - | -LL | const TEST: u8 = MY_STATIC; - | ^^^^^^^^^ - diff --git a/src/test/ui/issues/issue-17718-const-bad-values.rs b/src/test/ui/issues/issue-17718-const-bad-values.rs index 97657f8848155..09162e6e69f0a 100644 --- a/src/test/ui/issues/issue-17718-const-bad-values.rs +++ b/src/test/ui/issues/issue-17718-const-bad-values.rs @@ -3,7 +3,6 @@ const C1: &'static mut [usize] = &mut []; static mut S: usize = 3; const C2: &'static mut usize = unsafe { &mut S }; -//~^ ERROR: constants cannot refer to statics -//~| ERROR: references in constants may only refer to immutable values +//~^ ERROR: references in constants may only refer to immutable values fn main() {} diff --git a/src/test/ui/issues/issue-17718-const-bad-values.stderr b/src/test/ui/issues/issue-17718-const-bad-values.stderr index 7a49e89a1af70..adcda485dd4f4 100644 --- a/src/test/ui/issues/issue-17718-const-bad-values.stderr +++ b/src/test/ui/issues/issue-17718-const-bad-values.stderr @@ -10,13 +10,6 @@ error[E0017]: references in constants may only refer to immutable values LL | const C2: &'static mut usize = unsafe { &mut S }; | ^^^^^^ constants require immutable values -error[E0013]: constants cannot refer to statics, use a constant instead - --> $DIR/issue-17718-const-bad-values.rs:5:41 - | -LL | const C2: &'static mut usize = unsafe { &mut S }; - | ^^^^^^ - -error: aborting due to 3 previous errors +error: aborting due to 2 previous errors -Some errors have detailed explanations: E0013, E0017. -For more information about an error, try `rustc --explain E0013`. +For more information about this error, try `rustc --explain E0017`. diff --git a/src/test/ui/issues/issue-17718-references.rs b/src/test/ui/issues/issue-17718-references.rs index 03d5f8bb3f1c9..1c63cd7cd43f7 100644 --- a/src/test/ui/issues/issue-17718-references.rs +++ b/src/test/ui/issues/issue-17718-references.rs @@ -1,3 +1,5 @@ +// build-pass + #![allow(warnings)] struct Struct { a: usize } @@ -6,18 +8,17 @@ const C: usize = 1; static S: usize = 1; const T1: &'static usize = &C; -const T2: &'static usize = &S; //~ ERROR: constants cannot refer to statics +const T2: &'static usize = &S; static T3: &'static usize = &C; static T4: &'static usize = &S; const T5: usize = C; -const T6: usize = S; //~ ERROR: constants cannot refer to statics +const T6: usize = S; static T7: usize = C; static T8: usize = S; const T9: Struct = Struct { a: C }; const T10: Struct = Struct { a: S }; -//~^ ERROR: constants cannot refer to statics static T11: Struct = Struct { a: C }; static T12: Struct = Struct { a: S }; diff --git a/src/test/ui/issues/issue-17718-references.stderr b/src/test/ui/issues/issue-17718-references.stderr deleted file mode 100644 index 15c3e67f7a1a6..0000000000000 --- a/src/test/ui/issues/issue-17718-references.stderr +++ /dev/null @@ -1,21 +0,0 @@ -error[E0013]: constants cannot refer to statics, use a constant instead - --> $DIR/issue-17718-references.rs:9:28 - | -LL | const T2: &'static usize = &S; - | ^^ - -error[E0013]: constants cannot refer to statics, use a constant instead - --> $DIR/issue-17718-references.rs:14:19 - | -LL | const T6: usize = S; - | ^ - -error[E0013]: constants cannot refer to statics, use a constant instead - --> $DIR/issue-17718-references.rs:19:33 - | -LL | const T10: Struct = Struct { a: S }; - | ^ - -error: aborting due to 3 previous errors - -For more information about this error, try `rustc --explain E0013`. diff --git a/src/test/ui/issues/issue-18118-2.rs b/src/test/ui/issues/issue-18118-2.rs deleted file mode 100644 index 6d52156b3d2de..0000000000000 --- a/src/test/ui/issues/issue-18118-2.rs +++ /dev/null @@ -1,7 +0,0 @@ -pub fn main() { - const z: &'static isize = { - static p: isize = 3; - &p - //~^ ERROR constants cannot refer to statics, use a constant instead - }; -} diff --git a/src/test/ui/issues/issue-18118-2.stderr b/src/test/ui/issues/issue-18118-2.stderr deleted file mode 100644 index 4e848c261be33..0000000000000 --- a/src/test/ui/issues/issue-18118-2.stderr +++ /dev/null @@ -1,9 +0,0 @@ -error[E0013]: constants cannot refer to statics, use a constant instead - --> $DIR/issue-18118-2.rs:4:9 - | -LL | &p - | ^^ - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0013`. diff --git a/src/test/ui/issues/issue-52060.rs b/src/test/ui/issues/issue-52060.rs index 13b914c0331d1..dbff3ed180e86 100644 --- a/src/test/ui/issues/issue-52060.rs +++ b/src/test/ui/issues/issue-52060.rs @@ -1,7 +1,10 @@ +// build-pass + +#![allow(dead_code)] + // Regression test for https://github.com/rust-lang/rust/issues/52060 // The compiler shouldn't ICE in this case static A: &'static [u32] = &[1]; static B: [u32; 1] = [0; A.len()]; -//~^ ERROR [E0013] fn main() {} diff --git a/src/test/ui/issues/issue-52060.stderr b/src/test/ui/issues/issue-52060.stderr deleted file mode 100644 index 2f90f7f9e035b..0000000000000 --- a/src/test/ui/issues/issue-52060.stderr +++ /dev/null @@ -1,9 +0,0 @@ -error[E0013]: constants cannot refer to statics, use a constant instead - --> $DIR/issue-52060.rs:4:26 - | -LL | static B: [u32; 1] = [0; A.len()]; - | ^ - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0013`. From 37cbe732bbf512b1eea4640fe950ea8277317437 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Tue, 12 Nov 2019 13:25:13 +0100 Subject: [PATCH 2/3] Add a test to be sure that you can't read an extern static from a const --- .../ui/consts/const-read-extern-static-from-const.rs | 10 ++++++++++ .../const-read-extern-static-from-const.stderr | 12 ++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 src/test/ui/consts/const-read-extern-static-from-const.rs create mode 100644 src/test/ui/consts/const-read-extern-static-from-const.stderr diff --git a/src/test/ui/consts/const-read-extern-static-from-const.rs b/src/test/ui/consts/const-read-extern-static-from-const.rs new file mode 100644 index 0000000000000..269be437c5b4f --- /dev/null +++ b/src/test/ui/consts/const-read-extern-static-from-const.rs @@ -0,0 +1,10 @@ +#![allow(dead_code)] + +extern { + static FOO: u8; +} + +const X: u8 = unsafe { FOO }; +//~^ any use of this value will cause an error [const_err] + +fn main() {} diff --git a/src/test/ui/consts/const-read-extern-static-from-const.stderr b/src/test/ui/consts/const-read-extern-static-from-const.stderr new file mode 100644 index 0000000000000..b66fc6c2789fe --- /dev/null +++ b/src/test/ui/consts/const-read-extern-static-from-const.stderr @@ -0,0 +1,12 @@ +error: any use of this value will cause an error + --> $DIR/const-read-extern-static-from-const.rs:7:24 + | +LL | const X: u8 = unsafe { FOO }; + | -----------------------^^^--- + | | + | tried to read from foreign (extern) static + | + = note: `#[deny(const_err)]` on by default + +error: aborting due to previous error + From 5cd73aa64aa3eb3f82367120ce29f0a41f234f33 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Tue, 12 Nov 2019 14:34:53 +0100 Subject: [PATCH 3/3] Add test to prove that consts can refer to sync types --- src/test/ui/consts/const-can-refer-to-sync-types.rs | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/test/ui/consts/const-can-refer-to-sync-types.rs diff --git a/src/test/ui/consts/const-can-refer-to-sync-types.rs b/src/test/ui/consts/const-can-refer-to-sync-types.rs new file mode 100644 index 0000000000000..9e674573e138b --- /dev/null +++ b/src/test/ui/consts/const-can-refer-to-sync-types.rs @@ -0,0 +1,9 @@ +// build-pass + +use std::sync::atomic::AtomicUsize; + +static FOO: AtomicUsize = AtomicUsize::new(0); + +const X: &AtomicUsize = &FOO; + +fn main() {}