From 12ac49afc9e1c33fe94f01dfca9efda4d7fed0b2 Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Sun, 17 Nov 2019 18:43:26 -0500 Subject: [PATCH 01/15] Add feature gate for &mut in const fns --- src/librustc_feature/active.rs | 3 +++ src/libsyntax_pos/symbol.rs | 1 + 2 files changed, 4 insertions(+) diff --git a/src/librustc_feature/active.rs b/src/librustc_feature/active.rs index 16d8ada9f24c0..706e102436517 100644 --- a/src/librustc_feature/active.rs +++ b/src/librustc_feature/active.rs @@ -527,6 +527,9 @@ declare_features! ( /// Allows the use of `#[cfg(sanitize = "option")]`; set when -Zsanitizer is used. (active, cfg_sanitize, "1.41.0", Some(39699), None), + /// Allows using `&mut` in constant functions. + (active, const_fn_mut_refs, "1.41.0", None, None), + // ------------------------------------------------------------------------- // feature-group-end: actual feature gates // ------------------------------------------------------------------------- diff --git a/src/libsyntax_pos/symbol.rs b/src/libsyntax_pos/symbol.rs index 3059b05969106..c98063275dd34 100644 --- a/src/libsyntax_pos/symbol.rs +++ b/src/libsyntax_pos/symbol.rs @@ -203,6 +203,7 @@ symbols! { const_constructor, const_extern_fn, const_fn, + const_fn_mut_refs, const_fn_union, const_generics, const_if_match, From bb2a4238946563ef87eed6fe7e833ca731fa4c79 Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Sun, 17 Nov 2019 21:11:46 -0500 Subject: [PATCH 02/15] Allow &mut in const fns when feature gate is enabled --- src/librustc_mir/transform/qualify_min_const_fn.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/librustc_mir/transform/qualify_min_const_fn.rs b/src/librustc_mir/transform/qualify_min_const_fn.rs index e40d6a5952edb..28240f6beca71 100644 --- a/src/librustc_mir/transform/qualify_min_const_fn.rs +++ b/src/librustc_mir/transform/qualify_min_const_fn.rs @@ -80,10 +80,14 @@ pub fn is_min_const_fn(tcx: TyCtxt<'tcx>, def_id: DefId, body: &'a Body<'tcx>) - fn check_ty(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>, span: Span, fn_def_id: DefId) -> McfResult { for ty in ty.walk() { match ty.kind { - ty::Ref(_, _, hir::Mutability::Mutable) => return Err(( - span, - "mutable references in const fn are unstable".into(), - )), + ty::Ref(_, _, hir::Mutability::Mutable) => { + if !tcx.features().const_fn_mut_refs { + return Err(( + span, + "mutable references in const fn are unstable".into(), + )) + } + } ty::Opaque(..) => return Err((span, "`impl Trait` in const fn is unstable".into())), ty::FnPtr(..) => { if !tcx.const_fn_is_allowed_fn_ptr(fn_def_id) { From 8b0f5acfcbc178680f3cbec737b13bf0da6c05bd Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Thu, 21 Nov 2019 08:45:34 -0500 Subject: [PATCH 03/15] Add tests for mutable borrows in const fns --- .../const-eval/feature-gate-const_fn_mut_refs.rs | 7 +++++++ .../feature-gate-const_fn_mut_refs.stderr | 12 ++++++++++++ src/test/ui/consts/const_fn_mut_refs.rs | 15 +++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 src/test/ui/consts/const-eval/feature-gate-const_fn_mut_refs.rs create mode 100644 src/test/ui/consts/const-eval/feature-gate-const_fn_mut_refs.stderr create mode 100644 src/test/ui/consts/const_fn_mut_refs.rs diff --git a/src/test/ui/consts/const-eval/feature-gate-const_fn_mut_refs.rs b/src/test/ui/consts/const-eval/feature-gate-const_fn_mut_refs.rs new file mode 100644 index 0000000000000..2207599815ee8 --- /dev/null +++ b/src/test/ui/consts/const-eval/feature-gate-const_fn_mut_refs.rs @@ -0,0 +1,7 @@ +fn main() { + foo(&mut 5); +} + +const fn foo(x: &mut i32) -> i32 { //~ ERROR mutable references in const fn are unstable + *x + 1 +} diff --git a/src/test/ui/consts/const-eval/feature-gate-const_fn_mut_refs.stderr b/src/test/ui/consts/const-eval/feature-gate-const_fn_mut_refs.stderr new file mode 100644 index 0000000000000..26a61d38f8c3c --- /dev/null +++ b/src/test/ui/consts/const-eval/feature-gate-const_fn_mut_refs.stderr @@ -0,0 +1,12 @@ +error[E0723]: mutable references in const fn are unstable + --> $DIR/feature-gate-const_fn_mut_refs.rs:5:14 + | +LL | const fn foo(x: &mut i32) -> i32 { + | ^ + | + = note: for more information, see issue https://github.com/rust-lang/rust/issues/57563 + = help: add `#![feature(const_fn)]` to the crate attributes to enable + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0723`. diff --git a/src/test/ui/consts/const_fn_mut_refs.rs b/src/test/ui/consts/const_fn_mut_refs.rs new file mode 100644 index 0000000000000..764c45b386b06 --- /dev/null +++ b/src/test/ui/consts/const_fn_mut_refs.rs @@ -0,0 +1,15 @@ +// run-pass + +#![feature(const_fn_mut_refs)] + +struct Foo { + x: i32 +} + +const fn bar(foo: &mut Foo) -> i32 { + foo.x + 1 +} + +fn main() { + assert_eq!(bar(&mut Foo{x: 0}), 1); +} From d24ae2577fad83d581d090816303b0f1842f1514 Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Thu, 21 Nov 2019 12:38:14 -0500 Subject: [PATCH 04/15] Rename feature gate --- src/librustc_feature/active.rs | 2 +- src/librustc_mir/transform/qualify_min_const_fn.rs | 2 +- src/libsyntax_pos/symbol.rs | 2 +- src/test/ui/consts/const_fn_mut_refs.rs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/librustc_feature/active.rs b/src/librustc_feature/active.rs index 706e102436517..8e3ef4f3d9dca 100644 --- a/src/librustc_feature/active.rs +++ b/src/librustc_feature/active.rs @@ -528,7 +528,7 @@ declare_features! ( (active, cfg_sanitize, "1.41.0", Some(39699), None), /// Allows using `&mut` in constant functions. - (active, const_fn_mut_refs, "1.41.0", None, None), + (active, const_mut_refs, "1.41.0", Some(57349), None), // ------------------------------------------------------------------------- // feature-group-end: actual feature gates diff --git a/src/librustc_mir/transform/qualify_min_const_fn.rs b/src/librustc_mir/transform/qualify_min_const_fn.rs index 28240f6beca71..20bccb59a5cfb 100644 --- a/src/librustc_mir/transform/qualify_min_const_fn.rs +++ b/src/librustc_mir/transform/qualify_min_const_fn.rs @@ -81,7 +81,7 @@ fn check_ty(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>, span: Span, fn_def_id: DefId) -> Mc for ty in ty.walk() { match ty.kind { ty::Ref(_, _, hir::Mutability::Mutable) => { - if !tcx.features().const_fn_mut_refs { + if !tcx.features().const_mut_refs { return Err(( span, "mutable references in const fn are unstable".into(), diff --git a/src/libsyntax_pos/symbol.rs b/src/libsyntax_pos/symbol.rs index c98063275dd34..d700f779e1773 100644 --- a/src/libsyntax_pos/symbol.rs +++ b/src/libsyntax_pos/symbol.rs @@ -203,13 +203,13 @@ symbols! { const_constructor, const_extern_fn, const_fn, - const_fn_mut_refs, const_fn_union, const_generics, const_if_match, const_indexing, const_in_array_repeat_expressions, const_let, + const_mut_refs, const_panic, const_raw_ptr_deref, const_raw_ptr_to_usize_cast, diff --git a/src/test/ui/consts/const_fn_mut_refs.rs b/src/test/ui/consts/const_fn_mut_refs.rs index 764c45b386b06..2263a130284a5 100644 --- a/src/test/ui/consts/const_fn_mut_refs.rs +++ b/src/test/ui/consts/const_fn_mut_refs.rs @@ -1,6 +1,6 @@ // run-pass -#![feature(const_fn_mut_refs)] +#![feature(const_mut_refs)] struct Foo { x: i32 From 1f420b9891c962656eac16831c772cbd56afff24 Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Thu, 21 Nov 2019 14:33:39 -0500 Subject: [PATCH 05/15] Allow mutable borrows in constant bodies --- src/librustc_mir/transform/check_consts/ops.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/librustc_mir/transform/check_consts/ops.rs b/src/librustc_mir/transform/check_consts/ops.rs index a4f12a4e54fa7..117d628af257f 100644 --- a/src/librustc_mir/transform/check_consts/ops.rs +++ b/src/librustc_mir/transform/check_consts/ops.rs @@ -183,6 +183,10 @@ impl NonConstOp for Loop { #[derive(Debug)] pub struct MutBorrow(pub BorrowKind); impl NonConstOp for MutBorrow { + fn feature_gate(tcx: TyCtxt<'_>) -> Option { + Some(tcx.features().const_mut_refs) + } + fn emit_error(&self, item: &Item<'_, '_>, span: Span) { let kind = self.0; if let BorrowKind::Mut { .. } = kind { From de60f721c4983b1d43a305f0603a7ba6207b888d Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Thu, 21 Nov 2019 14:35:19 -0500 Subject: [PATCH 06/15] Move and rewrite tests to use &mut in constants --- .../ui/consts/const-mut-refs/const_mut_refs.rs | 15 +++++++++++++++ .../feature-gate-const_mut_refs.rs} | 0 .../feature-gate-const_mut_refs.stderr} | 2 +- src/test/ui/consts/const_fn_mut_refs.rs | 15 --------------- 4 files changed, 16 insertions(+), 16 deletions(-) create mode 100644 src/test/ui/consts/const-mut-refs/const_mut_refs.rs rename src/test/ui/consts/{const-eval/feature-gate-const_fn_mut_refs.rs => const-mut-refs/feature-gate-const_mut_refs.rs} (100%) rename src/test/ui/consts/{const-eval/feature-gate-const_fn_mut_refs.stderr => const-mut-refs/feature-gate-const_mut_refs.stderr} (88%) delete mode 100644 src/test/ui/consts/const_fn_mut_refs.rs diff --git a/src/test/ui/consts/const-mut-refs/const_mut_refs.rs b/src/test/ui/consts/const-mut-refs/const_mut_refs.rs new file mode 100644 index 0000000000000..60a69cb9f3f67 --- /dev/null +++ b/src/test/ui/consts/const-mut-refs/const_mut_refs.rs @@ -0,0 +1,15 @@ +// run-pass + +#![feature(const_mut_refs)] + +struct Foo { + x: usize +} + +const fn bar(foo: &mut Foo) -> usize { + foo.x + 1 +} + +fn main() { + let _: [(); bar(&mut Foo { x: 0 })] = [(); 1]; +} diff --git a/src/test/ui/consts/const-eval/feature-gate-const_fn_mut_refs.rs b/src/test/ui/consts/const-mut-refs/feature-gate-const_mut_refs.rs similarity index 100% rename from src/test/ui/consts/const-eval/feature-gate-const_fn_mut_refs.rs rename to src/test/ui/consts/const-mut-refs/feature-gate-const_mut_refs.rs diff --git a/src/test/ui/consts/const-eval/feature-gate-const_fn_mut_refs.stderr b/src/test/ui/consts/const-mut-refs/feature-gate-const_mut_refs.stderr similarity index 88% rename from src/test/ui/consts/const-eval/feature-gate-const_fn_mut_refs.stderr rename to src/test/ui/consts/const-mut-refs/feature-gate-const_mut_refs.stderr index 26a61d38f8c3c..4fae119f02604 100644 --- a/src/test/ui/consts/const-eval/feature-gate-const_fn_mut_refs.stderr +++ b/src/test/ui/consts/const-mut-refs/feature-gate-const_mut_refs.stderr @@ -1,5 +1,5 @@ error[E0723]: mutable references in const fn are unstable - --> $DIR/feature-gate-const_fn_mut_refs.rs:5:14 + --> $DIR/feature-gate-const_mut_refs.rs:5:14 | LL | const fn foo(x: &mut i32) -> i32 { | ^ diff --git a/src/test/ui/consts/const_fn_mut_refs.rs b/src/test/ui/consts/const_fn_mut_refs.rs deleted file mode 100644 index 2263a130284a5..0000000000000 --- a/src/test/ui/consts/const_fn_mut_refs.rs +++ /dev/null @@ -1,15 +0,0 @@ -// run-pass - -#![feature(const_mut_refs)] - -struct Foo { - x: i32 -} - -const fn bar(foo: &mut Foo) -> i32 { - foo.x + 1 -} - -fn main() { - assert_eq!(bar(&mut Foo{x: 0}), 1); -} From d92e9b7374bb2087e0eb4803bfabb030c1397bcd Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Fri, 22 Nov 2019 19:59:34 -0500 Subject: [PATCH 07/15] Allow mutable derefs with feature gate --- src/librustc_mir/transform/check_consts/ops.rs | 6 +++++- src/test/ui/consts/const-mut-refs/const_mut_refs.rs | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/librustc_mir/transform/check_consts/ops.rs b/src/librustc_mir/transform/check_consts/ops.rs index 117d628af257f..be5845eaa365f 100644 --- a/src/librustc_mir/transform/check_consts/ops.rs +++ b/src/librustc_mir/transform/check_consts/ops.rs @@ -216,7 +216,11 @@ impl NonConstOp for MutBorrow { #[derive(Debug)] pub struct MutDeref; -impl NonConstOp for MutDeref {} +impl NonConstOp for MutDeref { + fn feature_gate(tcx: TyCtxt<'_>) -> Option { + Some(tcx.features().const_mut_refs) + } +} #[derive(Debug)] pub struct Panic; diff --git a/src/test/ui/consts/const-mut-refs/const_mut_refs.rs b/src/test/ui/consts/const-mut-refs/const_mut_refs.rs index 60a69cb9f3f67..36174b2843d31 100644 --- a/src/test/ui/consts/const-mut-refs/const_mut_refs.rs +++ b/src/test/ui/consts/const-mut-refs/const_mut_refs.rs @@ -7,7 +7,9 @@ struct Foo { } const fn bar(foo: &mut Foo) -> usize { - foo.x + 1 + let x = &mut foo.x; + *x = 1; + *x } fn main() { From e31a1368fda9c5b4b4bc39e69754b19d36dff8c2 Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Sat, 23 Nov 2019 15:00:14 -0500 Subject: [PATCH 08/15] Extend test for const_mut_refs feature --- .../consts/const-mut-refs/const_mut_refs.rs | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/test/ui/consts/const-mut-refs/const_mut_refs.rs b/src/test/ui/consts/const-mut-refs/const_mut_refs.rs index 36174b2843d31..99006a20b1bcb 100644 --- a/src/test/ui/consts/const-mut-refs/const_mut_refs.rs +++ b/src/test/ui/consts/const-mut-refs/const_mut_refs.rs @@ -6,12 +6,31 @@ struct Foo { x: usize } -const fn bar(foo: &mut Foo) -> usize { +const fn foo() -> Foo { + Foo { x: 0 } +} + +impl Foo { + const fn bar(&mut self) -> usize { + self.x = 1; + self.x + } + +} + +const fn baz(foo: &mut Foo) -> usize { let x = &mut foo.x; - *x = 1; + *x = 2; *x } +const fn bazz(foo: &mut Foo) -> usize { + foo.x = 3; + foo.x +} + fn main() { - let _: [(); bar(&mut Foo { x: 0 })] = [(); 1]; + let _: [(); foo().bar()] = [(); 1]; + let _: [(); baz(&mut foo())] = [(); 2]; + let _: [(); bazz(&mut foo())] = [(); 3]; } From 683f5c9c23a07fc6434b3e15207aa12144c90420 Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Tue, 26 Nov 2019 10:00:41 -0500 Subject: [PATCH 09/15] Disallow cell borrowing --- .../transform/check_consts/ops.rs | 50 ++++++++++--------- .../transform/check_consts/validation.rs | 13 +++-- 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/src/librustc_mir/transform/check_consts/ops.rs b/src/librustc_mir/transform/check_consts/ops.rs index be5845eaa365f..1d23b6e27f31c 100644 --- a/src/librustc_mir/transform/check_consts/ops.rs +++ b/src/librustc_mir/transform/check_consts/ops.rs @@ -1,7 +1,6 @@ //! Concrete error types for all operations which may be invalid in a certain const context. use rustc::hir::def_id::DefId; -use rustc::mir::BorrowKind; use rustc::session::config::nightly_options; use rustc::ty::TyCtxt; use syntax::feature_gate::feature_err; @@ -181,36 +180,39 @@ impl NonConstOp for Loop { } #[derive(Debug)] -pub struct MutBorrow(pub BorrowKind); +pub struct CellBorrow; +impl NonConstOp for CellBorrow { + fn emit_error(&self, item: &Item<'_, '_>, span: Span) { + span_err!(item.tcx.sess, span, E0492, + "cannot borrow a constant which may contain \ + interior mutability, create a static instead"); + } +} + +#[derive(Debug)] +pub struct MutBorrow; impl NonConstOp for MutBorrow { fn feature_gate(tcx: TyCtxt<'_>) -> Option { Some(tcx.features().const_mut_refs) } fn emit_error(&self, item: &Item<'_, '_>, span: Span) { - let kind = self.0; - if let BorrowKind::Mut { .. } = kind { - let mut err = struct_span_err!(item.tcx.sess, span, E0017, - "references in {}s may only refer \ - to immutable values", item.const_kind()); - err.span_label(span, format!("{}s require immutable values", - item.const_kind())); - if item.tcx.sess.teach(&err.get_code().unwrap()) { - err.note("References in statics and constants may only refer \ - to immutable values.\n\n\ - Statics are shared everywhere, and if they refer to \ - mutable data one might violate memory safety since \ - holding multiple mutable references to shared data \ - is not allowed.\n\n\ - If you really want global mutable state, try using \ - static mut or a global UnsafeCell."); - } - err.emit(); - } else { - span_err!(item.tcx.sess, span, E0492, - "cannot borrow a constant which may contain \ - interior mutability, create a static instead"); + let mut err = struct_span_err!(item.tcx.sess, span, E0017, + "references in {}s may only refer \ + to immutable values", item.const_kind()); + err.span_label(span, format!("{}s require immutable values", + item.const_kind())); + if item.tcx.sess.teach(&err.get_code().unwrap()) { + err.note("References in statics and constants may only refer \ + to immutable values.\n\n\ + Statics are shared everywhere, and if they refer to \ + mutable data one might violate memory safety since \ + holding multiple mutable references to shared data \ + is not allowed.\n\n\ + If you really want global mutable state, try using \ + static mut or a global UnsafeCell."); } + err.emit(); } } diff --git a/src/librustc_mir/transform/check_consts/validation.rs b/src/librustc_mir/transform/check_consts/validation.rs index 783c64ece7371..4a55bce767d81 100644 --- a/src/librustc_mir/transform/check_consts/validation.rs +++ b/src/librustc_mir/transform/check_consts/validation.rs @@ -360,7 +360,11 @@ impl Visitor<'tcx> for Validator<'_, 'mir, 'tcx> { }; if !is_allowed { - self.check_op(ops::MutBorrow(kind)); + if let BorrowKind::Mut{ .. } = kind { + self.check_op(ops::MutBorrow); + } else { + self.check_op(ops::CellBorrow); + } } } @@ -385,7 +389,11 @@ impl Visitor<'tcx> for Validator<'_, 'mir, 'tcx> { ); if borrowed_place_has_mut_interior { - self.check_op(ops::MutBorrow(kind)); + if let BorrowKind::Mut{ .. } = kind { + self.check_op(ops::MutBorrow); + } else { + self.check_op(ops::CellBorrow); + } } } @@ -452,7 +460,6 @@ impl Visitor<'tcx> for Validator<'_, 'mir, 'tcx> { } } } - fn visit_projection_elem( &mut self, place_base: &PlaceBase<'tcx>, From 681690db4e41505401a0ebbf3d1e4bec69ead702 Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Tue, 26 Nov 2019 11:00:30 -0500 Subject: [PATCH 10/15] Update miri_unleashed tests --- .../ui/consts/miri_unleashed/mutable_const.rs | 4 +-- .../miri_unleashed/mutable_const.stderr | 22 ++------------- .../miri_unleashed/mutable_references.rs | 5 +--- .../miri_unleashed/mutable_references.stderr | 28 ++----------------- 4 files changed, 6 insertions(+), 53 deletions(-) diff --git a/src/test/ui/consts/miri_unleashed/mutable_const.rs b/src/test/ui/consts/miri_unleashed/mutable_const.rs index 44b408494679c..cf5e6d6002581 100644 --- a/src/test/ui/consts/miri_unleashed/mutable_const.rs +++ b/src/test/ui/consts/miri_unleashed/mutable_const.rs @@ -12,9 +12,7 @@ const MUTABLE_BEHIND_RAW: *mut i32 = &UnsafeCell::new(42) as *const _ as *mut _; const MUTATING_BEHIND_RAW: () = { // Test that `MUTABLE_BEHIND_RAW` is actually immutable, by doing this at const time. unsafe { - *MUTABLE_BEHIND_RAW = 99 //~ WARN skipping const checks - //~^ ERROR any use of this value will cause an error - //~^^ tried to modify constant memory + *MUTABLE_BEHIND_RAW = 99 //~ ERROR constant contains unimplemented expression type } }; diff --git a/src/test/ui/consts/miri_unleashed/mutable_const.stderr b/src/test/ui/consts/miri_unleashed/mutable_const.stderr index 757f0ffb59ff7..1a18063625be3 100644 --- a/src/test/ui/consts/miri_unleashed/mutable_const.stderr +++ b/src/test/ui/consts/miri_unleashed/mutable_const.stderr @@ -4,30 +4,12 @@ warning: skipping const checks LL | const MUTABLE_BEHIND_RAW: *mut i32 = &UnsafeCell::new(42) as *const _ as *mut _; | ^^^^^^^^^^^^^^^^^^^^ -warning: skipping const checks +error[E0019]: constant contains unimplemented expression type --> $DIR/mutable_const.rs:15:9 | LL | *MUTABLE_BEHIND_RAW = 99 | ^^^^^^^^^^^^^^^^^^^^^^^^ -error: any use of this value will cause an error - --> $DIR/mutable_const.rs:15:9 - | -LL | / const MUTATING_BEHIND_RAW: () = { -LL | | // Test that `MUTABLE_BEHIND_RAW` is actually immutable, by doing this at const time. -LL | | unsafe { -LL | | *MUTABLE_BEHIND_RAW = 99 - | | ^^^^^^^^^^^^^^^^^^^^^^^^ tried to modify constant memory -... | -LL | | } -LL | | }; - | |__- - | -note: lint level defined here - --> $DIR/mutable_const.rs:4:9 - | -LL | #![deny(const_err)] - | ^^^^^^^^^ - error: aborting due to previous error +For more information about this error, try `rustc --explain E0019`. diff --git a/src/test/ui/consts/miri_unleashed/mutable_references.rs b/src/test/ui/consts/miri_unleashed/mutable_references.rs index 59dafcbf4d50c..d95833e3071df 100644 --- a/src/test/ui/consts/miri_unleashed/mutable_references.rs +++ b/src/test/ui/consts/miri_unleashed/mutable_references.rs @@ -1,4 +1,5 @@ // compile-flags: -Zunleash-the-miri-inside-of-you +#![feature(const_mut_refs)] #![allow(const_err)] use std::cell::UnsafeCell; @@ -6,15 +7,12 @@ use std::cell::UnsafeCell; // a test demonstrating what things we could allow with a smarter const qualification static FOO: &&mut u32 = &&mut 42; -//~^ WARN: skipping const checks static BAR: &mut () = &mut (); -//~^ WARN: skipping const checks struct Foo(T); static BOO: &mut Foo<()> = &mut Foo(()); -//~^ WARN: skipping const checks struct Meh { x: &'static UnsafeCell, @@ -28,7 +26,6 @@ static MEH: Meh = Meh { }; static OH_YES: &mut i32 = &mut 42; -//~^ WARN: skipping const checks fn main() { unsafe { diff --git a/src/test/ui/consts/miri_unleashed/mutable_references.stderr b/src/test/ui/consts/miri_unleashed/mutable_references.stderr index b9c0af33c39cd..ce1f5f38dd99a 100644 --- a/src/test/ui/consts/miri_unleashed/mutable_references.stderr +++ b/src/test/ui/consts/miri_unleashed/mutable_references.stderr @@ -1,35 +1,11 @@ warning: skipping const checks - --> $DIR/mutable_references.rs:8:26 - | -LL | static FOO: &&mut u32 = &&mut 42; - | ^^^^^^^ - -warning: skipping const checks - --> $DIR/mutable_references.rs:11:23 - | -LL | static BAR: &mut () = &mut (); - | ^^^^^^^ - -warning: skipping const checks - --> $DIR/mutable_references.rs:16:28 - | -LL | static BOO: &mut Foo<()> = &mut Foo(()); - | ^^^^^^^^^^^^ - -warning: skipping const checks - --> $DIR/mutable_references.rs:26:8 + --> $DIR/mutable_references.rs:24:8 | LL | x: &UnsafeCell::new(42), | ^^^^^^^^^^^^^^^^^^^^ -warning: skipping const checks - --> $DIR/mutable_references.rs:30:27 - | -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:37:5 + --> $DIR/mutable_references.rs:34:5 | LL | *OH_YES = 99; | ^^^^^^^^^^^^ cannot assign From 5e61e4cadc72141f9e4c80ca8615509f2eaeb51f Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Tue, 26 Nov 2019 22:43:40 -0500 Subject: [PATCH 11/15] Suggest feature for const_mut_refs errors --- src/librustc_mir/transform/check_consts/ops.rs | 10 +++++++--- src/test/ui/consts/const-eval/issue-65394.stderr | 9 ++++++--- src/test/ui/consts/const-multi-ref.stderr | 9 ++++++--- src/test/ui/consts/const_let_assign3.stderr | 14 ++++++++++---- src/test/ui/consts/projection_qualif.stderr | 9 ++++++--- .../consts/static_mut_containing_mut_ref2.stderr | 9 ++++++--- 6 files changed, 41 insertions(+), 19 deletions(-) diff --git a/src/librustc_mir/transform/check_consts/ops.rs b/src/librustc_mir/transform/check_consts/ops.rs index 1d23b6e27f31c..182ba4625667a 100644 --- a/src/librustc_mir/transform/check_consts/ops.rs +++ b/src/librustc_mir/transform/check_consts/ops.rs @@ -197,9 +197,13 @@ impl NonConstOp for MutBorrow { } fn emit_error(&self, item: &Item<'_, '_>, span: Span) { - let mut err = struct_span_err!(item.tcx.sess, span, E0017, - "references in {}s may only refer \ - to immutable values", item.const_kind()); + let mut err = feature_err( + &item.tcx.sess.parse_sess, + sym::const_mut_refs, + span, + &format!("references in {}s may only refer \ + to immutable values", item.const_kind()) + ); err.span_label(span, format!("{}s require immutable values", item.const_kind())); if item.tcx.sess.teach(&err.get_code().unwrap()) { diff --git a/src/test/ui/consts/const-eval/issue-65394.stderr b/src/test/ui/consts/const-eval/issue-65394.stderr index acf5cbaede665..54b35073340fd 100644 --- a/src/test/ui/consts/const-eval/issue-65394.stderr +++ b/src/test/ui/consts/const-eval/issue-65394.stderr @@ -1,8 +1,11 @@ -error[E0017]: references in constants may only refer to immutable values +error[E0658]: references in constants may only refer to immutable values --> $DIR/issue-65394.rs:8:13 | LL | let r = &mut x; | ^^^^^^ constants require immutable values + | + = note: for more information, see https://github.com/rust-lang/rust/issues/57349 + = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable error[E0493]: destructors cannot be evaluated at compile-time --> $DIR/issue-65394.rs:7:9 @@ -12,5 +15,5 @@ LL | let mut x = Vec::::new(); error: aborting due to 2 previous errors -Some errors have detailed explanations: E0017, E0493. -For more information about an error, try `rustc --explain E0017`. +Some errors have detailed explanations: E0493, E0658. +For more information about an error, try `rustc --explain E0493`. diff --git a/src/test/ui/consts/const-multi-ref.stderr b/src/test/ui/consts/const-multi-ref.stderr index ed3837e9c9ee5..0809c77c1b604 100644 --- a/src/test/ui/consts/const-multi-ref.stderr +++ b/src/test/ui/consts/const-multi-ref.stderr @@ -1,8 +1,11 @@ -error[E0017]: references in constants may only refer to immutable values +error[E0658]: references in constants may only refer to immutable values --> $DIR/const-multi-ref.rs:6:13 | LL | let p = &mut a; | ^^^^^^ constants require immutable values + | + = note: for more information, see https://github.com/rust-lang/rust/issues/57349 + = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable error[E0492]: cannot borrow a constant which may contain interior mutability, create a static instead --> $DIR/const-multi-ref.rs:16:13 @@ -12,5 +15,5 @@ LL | let p = &a; error: aborting due to 2 previous errors -Some errors have detailed explanations: E0017, E0492. -For more information about an error, try `rustc --explain E0017`. +Some errors have detailed explanations: E0492, E0658. +For more information about an error, try `rustc --explain E0492`. diff --git a/src/test/ui/consts/const_let_assign3.stderr b/src/test/ui/consts/const_let_assign3.stderr index 53b960b4ec0e0..7852874944b22 100644 --- a/src/test/ui/consts/const_let_assign3.stderr +++ b/src/test/ui/consts/const_let_assign3.stderr @@ -4,17 +4,23 @@ error[E0019]: constant function contains unimplemented expression type LL | self.state = x; | ^^^^^^^^^^^^^^ -error[E0017]: references in constants may only refer to immutable values +error[E0658]: references in constants may only refer to immutable values --> $DIR/const_let_assign3.rs:16:5 | LL | s.foo(3); | ^ constants require immutable values + | + = note: for more information, see https://github.com/rust-lang/rust/issues/57349 + = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable -error[E0017]: references in constants may only refer to immutable values +error[E0658]: references in constants may only refer to immutable values --> $DIR/const_let_assign3.rs:22:13 | LL | let y = &mut x; | ^^^^^^ constants require immutable values + | + = note: for more information, see https://github.com/rust-lang/rust/issues/57349 + = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable error[E0019]: constant contains unimplemented expression type --> $DIR/const_let_assign3.rs:24:5 @@ -24,5 +30,5 @@ LL | *y = 42; error: aborting due to 4 previous errors -Some errors have detailed explanations: E0017, E0019. -For more information about an error, try `rustc --explain E0017`. +Some errors have detailed explanations: E0019, E0658. +For more information about an error, try `rustc --explain E0019`. diff --git a/src/test/ui/consts/projection_qualif.stderr b/src/test/ui/consts/projection_qualif.stderr index 0efb6bfd10a17..41c7b62812c08 100644 --- a/src/test/ui/consts/projection_qualif.stderr +++ b/src/test/ui/consts/projection_qualif.stderr @@ -1,8 +1,11 @@ -error[E0017]: references in constants may only refer to immutable values +error[E0658]: references in constants may only refer to immutable values --> $DIR/projection_qualif.rs:6:27 | LL | let b: *mut u32 = &mut a; | ^^^^^^ constants require immutable values + | + = note: for more information, see https://github.com/rust-lang/rust/issues/57349 + = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable error[E0658]: dereferencing raw pointers in constants is unstable --> $DIR/projection_qualif.rs:7:18 @@ -21,5 +24,5 @@ LL | unsafe { *b = 5; } error: aborting due to 3 previous errors -Some errors have detailed explanations: E0017, E0019, E0658. -For more information about an error, try `rustc --explain E0017`. +Some errors have detailed explanations: E0019, E0658. +For more information about an error, try `rustc --explain E0019`. diff --git a/src/test/ui/consts/static_mut_containing_mut_ref2.stderr b/src/test/ui/consts/static_mut_containing_mut_ref2.stderr index ca691b07be063..e0074687874fe 100644 --- a/src/test/ui/consts/static_mut_containing_mut_ref2.stderr +++ b/src/test/ui/consts/static_mut_containing_mut_ref2.stderr @@ -1,8 +1,11 @@ -error[E0017]: references in statics may only refer to immutable values +error[E0658]: references in statics may only refer to immutable values --> $DIR/static_mut_containing_mut_ref2.rs:3:46 | LL | pub static mut STDERR_BUFFER: () = unsafe { *(&mut STDERR_BUFFER_SPACE) = 42; }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^ statics require immutable values + | + = note: for more information, see https://github.com/rust-lang/rust/issues/57349 + = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable error[E0019]: static contains unimplemented expression type --> $DIR/static_mut_containing_mut_ref2.rs:3:45 @@ -12,5 +15,5 @@ LL | pub static mut STDERR_BUFFER: () = unsafe { *(&mut STDERR_BUFFER_SPACE) = 4 error: aborting due to 2 previous errors -Some errors have detailed explanations: E0017, E0019. -For more information about an error, try `rustc --explain E0017`. +Some errors have detailed explanations: E0019, E0658. +For more information about an error, try `rustc --explain E0019`. From 19ddfb545bb6e70ba3281bdce4f40ae8e564a53a Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Thu, 28 Nov 2019 11:38:07 -0500 Subject: [PATCH 12/15] Update miri unleashed tests --- .../ui/consts/miri_unleashed/mutable_const.rs | 3 ++- .../miri_unleashed/mutable_const.stderr | 23 ++++++++++++++----- .../miri_unleashed/mutable_references.rs | 5 ++++ .../miri_unleashed/mutable_references.stderr | 4 ++-- .../consts/miri_unleashed/read_from_static.rs | 11 +++++++++ 5 files changed, 37 insertions(+), 9 deletions(-) create mode 100644 src/test/ui/consts/miri_unleashed/read_from_static.rs diff --git a/src/test/ui/consts/miri_unleashed/mutable_const.rs b/src/test/ui/consts/miri_unleashed/mutable_const.rs index cf5e6d6002581..972f59549ea74 100644 --- a/src/test/ui/consts/miri_unleashed/mutable_const.rs +++ b/src/test/ui/consts/miri_unleashed/mutable_const.rs @@ -1,6 +1,7 @@ // compile-flags: -Zunleash-the-miri-inside-of-you #![feature(const_raw_ptr_deref)] +#![feature(const_mut_refs)] #![deny(const_err)] use std::cell::UnsafeCell; @@ -12,7 +13,7 @@ const MUTABLE_BEHIND_RAW: *mut i32 = &UnsafeCell::new(42) as *const _ as *mut _; const MUTATING_BEHIND_RAW: () = { // Test that `MUTABLE_BEHIND_RAW` is actually immutable, by doing this at const time. unsafe { - *MUTABLE_BEHIND_RAW = 99 //~ ERROR constant contains unimplemented expression type + *MUTABLE_BEHIND_RAW = 99 //~ ERROR any use of this value will cause an error } }; diff --git a/src/test/ui/consts/miri_unleashed/mutable_const.stderr b/src/test/ui/consts/miri_unleashed/mutable_const.stderr index 1a18063625be3..9daca765c7cd0 100644 --- a/src/test/ui/consts/miri_unleashed/mutable_const.stderr +++ b/src/test/ui/consts/miri_unleashed/mutable_const.stderr @@ -1,15 +1,26 @@ warning: skipping const checks - --> $DIR/mutable_const.rs:9:38 + --> $DIR/mutable_const.rs:10:38 | LL | const MUTABLE_BEHIND_RAW: *mut i32 = &UnsafeCell::new(42) as *const _ as *mut _; | ^^^^^^^^^^^^^^^^^^^^ -error[E0019]: constant contains unimplemented expression type - --> $DIR/mutable_const.rs:15:9 +error: any use of this value will cause an error + --> $DIR/mutable_const.rs:16:9 | -LL | *MUTABLE_BEHIND_RAW = 99 - | ^^^^^^^^^^^^^^^^^^^^^^^^ +LL | / const MUTATING_BEHIND_RAW: () = { +LL | | // Test that `MUTABLE_BEHIND_RAW` is actually immutable, by doing this at const time. +LL | | unsafe { +LL | | *MUTABLE_BEHIND_RAW = 99 + | | ^^^^^^^^^^^^^^^^^^^^^^^^ tried to modify constant memory +LL | | } +LL | | }; + | |__- + | +note: lint level defined here + --> $DIR/mutable_const.rs:5:9 + | +LL | #![deny(const_err)] + | ^^^^^^^^^ error: aborting due to previous error -For more information about this error, try `rustc --explain E0019`. diff --git a/src/test/ui/consts/miri_unleashed/mutable_references.rs b/src/test/ui/consts/miri_unleashed/mutable_references.rs index d95833e3071df..fe3c4ee70f2a2 100644 --- a/src/test/ui/consts/miri_unleashed/mutable_references.rs +++ b/src/test/ui/consts/miri_unleashed/mutable_references.rs @@ -6,12 +6,16 @@ use std::cell::UnsafeCell; // a test demonstrating what things we could allow with a smarter const qualification +// this is fine because is not possible to mutate through an immutable reference. static FOO: &&mut u32 = &&mut 42; +// 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 (); struct Foo(T); +// this is fine for the same reason as `BAR`. static BOO: &mut Foo<()> = &mut Foo(()); struct Meh { @@ -25,6 +29,7 @@ static MEH: Meh = Meh { //~^ WARN: skipping const checks }; +// this is fine for the same reason as `BAR`. static OH_YES: &mut i32 = &mut 42; fn main() { diff --git a/src/test/ui/consts/miri_unleashed/mutable_references.stderr b/src/test/ui/consts/miri_unleashed/mutable_references.stderr index ce1f5f38dd99a..3e1300c63c17d 100644 --- a/src/test/ui/consts/miri_unleashed/mutable_references.stderr +++ b/src/test/ui/consts/miri_unleashed/mutable_references.stderr @@ -1,11 +1,11 @@ warning: skipping const checks - --> $DIR/mutable_references.rs:24:8 + --> $DIR/mutable_references.rs:28:8 | LL | x: &UnsafeCell::new(42), | ^^^^^^^^^^^^^^^^^^^^ error[E0594]: cannot assign to `*OH_YES`, as `OH_YES` is an immutable static item - --> $DIR/mutable_references.rs:34:5 + --> $DIR/mutable_references.rs:39:5 | LL | *OH_YES = 99; | ^^^^^^^^^^^^ cannot assign diff --git a/src/test/ui/consts/miri_unleashed/read_from_static.rs b/src/test/ui/consts/miri_unleashed/read_from_static.rs new file mode 100644 index 0000000000000..821c501c9fcc5 --- /dev/null +++ b/src/test/ui/consts/miri_unleashed/read_from_static.rs @@ -0,0 +1,11 @@ +// run-pass +// compile-flags: -Zunleash-the-miri-inside-of-you +#![feature(const_mut_refs)] +#![allow(const_err)] + +static OH_YES: &mut i32 = &mut 42; + +fn main() { + // Make sure `OH_YES` can be read. + assert_eq!(*OH_YES, 42); +} From dc0117a42c000428914ed3ca42ba1a287f622694 Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Thu, 28 Nov 2019 11:57:34 -0500 Subject: [PATCH 13/15] Add dual tests for const_mut_refs --- src/test/ui/consts/projection_qualif.mut_refs.stderr | 12 ++++++++++++ src/test/ui/consts/projection_qualif.rs | 8 ++++++-- ..._qualif.stderr => projection_qualif.stock.stderr} | 6 +++--- .../static_mut_containing_mut_ref2.mut_refs.stderr | 9 +++++++++ src/test/ui/consts/static_mut_containing_mut_ref2.rs | 9 +++++++-- ...r => static_mut_containing_mut_ref2.stock.stderr} | 4 ++-- 6 files changed, 39 insertions(+), 9 deletions(-) create mode 100644 src/test/ui/consts/projection_qualif.mut_refs.stderr rename src/test/ui/consts/{projection_qualif.stderr => projection_qualif.stock.stderr} (89%) create mode 100644 src/test/ui/consts/static_mut_containing_mut_ref2.mut_refs.stderr rename src/test/ui/consts/{static_mut_containing_mut_ref2.stderr => static_mut_containing_mut_ref2.stock.stderr} (89%) diff --git a/src/test/ui/consts/projection_qualif.mut_refs.stderr b/src/test/ui/consts/projection_qualif.mut_refs.stderr new file mode 100644 index 0000000000000..23538777c9df3 --- /dev/null +++ b/src/test/ui/consts/projection_qualif.mut_refs.stderr @@ -0,0 +1,12 @@ +error[E0658]: dereferencing raw pointers in constants is unstable + --> $DIR/projection_qualif.rs:11:18 + | +LL | unsafe { *b = 5; } + | ^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/51911 + = help: add `#![feature(const_raw_ptr_deref)]` to the crate attributes to enable + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/consts/projection_qualif.rs b/src/test/ui/consts/projection_qualif.rs index dedb7db592089..cfe8e7f03d5e4 100644 --- a/src/test/ui/consts/projection_qualif.rs +++ b/src/test/ui/consts/projection_qualif.rs @@ -1,11 +1,15 @@ +// revisions: stock mut_refs + +#![cfg_attr(mut_refs, feature(const_mut_refs))] + use std::cell::Cell; const FOO: &u32 = { let mut a = 42; { - let b: *mut u32 = &mut a; //~ ERROR may only refer to immutable values + let b: *mut u32 = &mut a; //[stock]~ ERROR may only refer to immutable values unsafe { *b = 5; } //~ ERROR dereferencing raw pointers in constants - //~^ contains unimplemented expression + //[stock]~^ contains unimplemented expression } &{a} }; diff --git a/src/test/ui/consts/projection_qualif.stderr b/src/test/ui/consts/projection_qualif.stock.stderr similarity index 89% rename from src/test/ui/consts/projection_qualif.stderr rename to src/test/ui/consts/projection_qualif.stock.stderr index 41c7b62812c08..472d2607453d0 100644 --- a/src/test/ui/consts/projection_qualif.stderr +++ b/src/test/ui/consts/projection_qualif.stock.stderr @@ -1,5 +1,5 @@ error[E0658]: references in constants may only refer to immutable values - --> $DIR/projection_qualif.rs:6:27 + --> $DIR/projection_qualif.rs:10:27 | LL | let b: *mut u32 = &mut a; | ^^^^^^ constants require immutable values @@ -8,7 +8,7 @@ LL | let b: *mut u32 = &mut a; = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable error[E0658]: dereferencing raw pointers in constants is unstable - --> $DIR/projection_qualif.rs:7:18 + --> $DIR/projection_qualif.rs:11:18 | LL | unsafe { *b = 5; } | ^^^^^^ @@ -17,7 +17,7 @@ LL | unsafe { *b = 5; } = help: add `#![feature(const_raw_ptr_deref)]` to the crate attributes to enable error[E0019]: constant contains unimplemented expression type - --> $DIR/projection_qualif.rs:7:18 + --> $DIR/projection_qualif.rs:11:18 | LL | unsafe { *b = 5; } | ^^^^^^ diff --git a/src/test/ui/consts/static_mut_containing_mut_ref2.mut_refs.stderr b/src/test/ui/consts/static_mut_containing_mut_ref2.mut_refs.stderr new file mode 100644 index 0000000000000..b43fbc86f99f2 --- /dev/null +++ b/src/test/ui/consts/static_mut_containing_mut_ref2.mut_refs.stderr @@ -0,0 +1,9 @@ +error[E0080]: could not evaluate static initializer + --> $DIR/static_mut_containing_mut_ref2.rs:7:45 + | +LL | pub static mut STDERR_BUFFER: () = unsafe { *(&mut STDERR_BUFFER_SPACE) = 42; }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tried to modify a static's initial value from another static's initializer + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0080`. diff --git a/src/test/ui/consts/static_mut_containing_mut_ref2.rs b/src/test/ui/consts/static_mut_containing_mut_ref2.rs index ef378fa84518e..74162fbd54b04 100644 --- a/src/test/ui/consts/static_mut_containing_mut_ref2.rs +++ b/src/test/ui/consts/static_mut_containing_mut_ref2.rs @@ -1,7 +1,12 @@ +// revisions: stock mut_refs + +#![cfg_attr(mut_refs, feature(const_mut_refs))] + static mut STDERR_BUFFER_SPACE: u8 = 0; pub static mut STDERR_BUFFER: () = unsafe { *(&mut STDERR_BUFFER_SPACE) = 42; }; -//~^ ERROR references in statics may only refer to immutable values -//~| ERROR static contains unimplemented expression type +//[mut_refs]~^ ERROR could not evaluate static initializer +//[stock]~^^ ERROR references in statics may only refer to immutable values +//[stock]~| ERROR static contains unimplemented expression type fn main() {} diff --git a/src/test/ui/consts/static_mut_containing_mut_ref2.stderr b/src/test/ui/consts/static_mut_containing_mut_ref2.stock.stderr similarity index 89% rename from src/test/ui/consts/static_mut_containing_mut_ref2.stderr rename to src/test/ui/consts/static_mut_containing_mut_ref2.stock.stderr index e0074687874fe..430cef94dc3cb 100644 --- a/src/test/ui/consts/static_mut_containing_mut_ref2.stderr +++ b/src/test/ui/consts/static_mut_containing_mut_ref2.stock.stderr @@ -1,5 +1,5 @@ error[E0658]: references in statics may only refer to immutable values - --> $DIR/static_mut_containing_mut_ref2.rs:3:46 + --> $DIR/static_mut_containing_mut_ref2.rs:7:46 | LL | pub static mut STDERR_BUFFER: () = unsafe { *(&mut STDERR_BUFFER_SPACE) = 42; }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^ statics require immutable values @@ -8,7 +8,7 @@ LL | pub static mut STDERR_BUFFER: () = unsafe { *(&mut STDERR_BUFFER_SPACE) = 4 = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable error[E0019]: static contains unimplemented expression type - --> $DIR/static_mut_containing_mut_ref2.rs:3:45 + --> $DIR/static_mut_containing_mut_ref2.rs:7:45 | LL | pub static mut STDERR_BUFFER: () = unsafe { *(&mut STDERR_BUFFER_SPACE) = 42; }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From 416b439ffbdf6840bb3c663fea0246d3ead9a5dc Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Thu, 28 Nov 2019 12:20:28 -0500 Subject: [PATCH 14/15] Correct other tests related to const_mut_refs --- .../compile-fail/consts/const-fn-error.rs | 2 +- .../check-static-immutable-mut-slices.stderr | 7 ++- src/test/ui/error-codes/E0017.rs | 8 ++-- src/test/ui/error-codes/E0017.stderr | 24 ++++++++--- src/test/ui/error-codes/E0388.rs | 10 +++++ src/test/ui/error-codes/E0388.stderr | 43 +++++++++++++++++++ .../issue-17718-const-bad-values.stderr | 12 ++++-- src/test/ui/issues/issue-46604.rs | 2 +- src/test/ui/issues/issue-46604.stderr | 9 ++-- 9 files changed, 97 insertions(+), 20 deletions(-) create mode 100644 src/test/ui/error-codes/E0388.rs create mode 100644 src/test/ui/error-codes/E0388.stderr diff --git a/src/test/compile-fail/consts/const-fn-error.rs b/src/test/compile-fail/consts/const-fn-error.rs index 1a4fc72e81786..5d26059644d17 100644 --- a/src/test/compile-fail/consts/const-fn-error.rs +++ b/src/test/compile-fail/consts/const-fn-error.rs @@ -6,7 +6,7 @@ const fn f(x: usize) -> usize { let mut sum = 0; for i in 0..x { //~^ ERROR E0015 - //~| ERROR E0017 + //~| ERROR E0658 //~| ERROR E0080 //~| ERROR E0744 //~| ERROR E0019 diff --git a/src/test/ui/check-static-immutable-mut-slices.stderr b/src/test/ui/check-static-immutable-mut-slices.stderr index 4f4bf16a0ff69..39da824ede57c 100644 --- a/src/test/ui/check-static-immutable-mut-slices.stderr +++ b/src/test/ui/check-static-immutable-mut-slices.stderr @@ -1,9 +1,12 @@ -error[E0017]: references in statics may only refer to immutable values +error[E0658]: references in statics may only refer to immutable values --> $DIR/check-static-immutable-mut-slices.rs:3:37 | LL | static TEST: &'static mut [isize] = &mut []; | ^^^^^^^ statics require immutable values + | + = note: for more information, see https://github.com/rust-lang/rust/issues/57349 + = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable error: aborting due to previous error -For more information about this error, try `rustc --explain E0017`. +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/error-codes/E0017.rs b/src/test/ui/error-codes/E0017.rs index 3bc518c2c2b71..64be41170d0c8 100644 --- a/src/test/ui/error-codes/E0017.rs +++ b/src/test/ui/error-codes/E0017.rs @@ -2,10 +2,10 @@ static X: i32 = 1; const C: i32 = 2; static mut M: i32 = 3; -const CR: &'static mut i32 = &mut C; //~ ERROR E0017 -static STATIC_REF: &'static mut i32 = &mut X; //~ ERROR E0017 +const CR: &'static mut i32 = &mut C; //~ ERROR E0658 +static STATIC_REF: &'static mut i32 = &mut X; //~ ERROR E0658 //~| ERROR E0019 //~| ERROR cannot borrow -static CONST_REF: &'static mut i32 = &mut C; //~ ERROR E0017 -static STATIC_MUT_REF: &'static mut i32 = unsafe { &mut M }; //~ ERROR E0017 +static CONST_REF: &'static mut i32 = &mut C; //~ ERROR E0658 +static STATIC_MUT_REF: &'static mut i32 = unsafe { &mut M }; //~ ERROR E0658 fn main() {} diff --git a/src/test/ui/error-codes/E0017.stderr b/src/test/ui/error-codes/E0017.stderr index 8c8660adceb7a..9a87195a9d05e 100644 --- a/src/test/ui/error-codes/E0017.stderr +++ b/src/test/ui/error-codes/E0017.stderr @@ -1,8 +1,11 @@ -error[E0017]: references in constants may only refer to immutable values +error[E0658]: references in constants may only refer to immutable values --> $DIR/E0017.rs:5:30 | LL | const CR: &'static mut i32 = &mut C; | ^^^^^^ constants require immutable values + | + = note: for more information, see https://github.com/rust-lang/rust/issues/57349 + = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable error[E0019]: static contains unimplemented expression type --> $DIR/E0017.rs:6:39 @@ -10,11 +13,14 @@ error[E0019]: static contains unimplemented expression type LL | static STATIC_REF: &'static mut i32 = &mut X; | ^^^^^^ -error[E0017]: references in statics may only refer to immutable values +error[E0658]: references in statics may only refer to immutable values --> $DIR/E0017.rs:6:39 | LL | static STATIC_REF: &'static mut i32 = &mut X; | ^^^^^^ statics require immutable values + | + = note: for more information, see https://github.com/rust-lang/rust/issues/57349 + = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable error[E0596]: cannot borrow immutable static item `X` as mutable --> $DIR/E0017.rs:6:39 @@ -22,19 +28,25 @@ error[E0596]: cannot borrow immutable static item `X` as mutable LL | static STATIC_REF: &'static mut i32 = &mut X; | ^^^^^^ cannot borrow as mutable -error[E0017]: references in statics may only refer to immutable values +error[E0658]: references in statics may only refer to immutable values --> $DIR/E0017.rs:9:38 | LL | static CONST_REF: &'static mut i32 = &mut C; | ^^^^^^ statics require immutable values + | + = note: for more information, see https://github.com/rust-lang/rust/issues/57349 + = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable -error[E0017]: references in statics may only refer to immutable values +error[E0658]: references in statics may only refer to immutable values --> $DIR/E0017.rs:10:52 | LL | static STATIC_MUT_REF: &'static mut i32 = unsafe { &mut M }; | ^^^^^^ statics require immutable values + | + = note: for more information, see https://github.com/rust-lang/rust/issues/57349 + = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable error: aborting due to 6 previous errors -Some errors have detailed explanations: E0017, E0019, E0596. -For more information about an error, try `rustc --explain E0017`. +Some errors have detailed explanations: E0019, E0596, E0658. +For more information about an error, try `rustc --explain E0019`. diff --git a/src/test/ui/error-codes/E0388.rs b/src/test/ui/error-codes/E0388.rs new file mode 100644 index 0000000000000..5954e3490b06c --- /dev/null +++ b/src/test/ui/error-codes/E0388.rs @@ -0,0 +1,10 @@ +static X: i32 = 1; +const C: i32 = 2; + +const CR: &'static mut i32 = &mut C; //~ ERROR E0658 +static STATIC_REF: &'static mut i32 = &mut X; //~ ERROR E0658 + //~| ERROR cannot borrow + //~| ERROR E0019 +static CONST_REF: &'static mut i32 = &mut C; //~ ERROR E0658 + +fn main() {} diff --git a/src/test/ui/error-codes/E0388.stderr b/src/test/ui/error-codes/E0388.stderr new file mode 100644 index 0000000000000..986307d3f123f --- /dev/null +++ b/src/test/ui/error-codes/E0388.stderr @@ -0,0 +1,43 @@ +error[E0658]: references in constants may only refer to immutable values + --> $DIR/E0388.rs:4:30 + | +LL | const CR: &'static mut i32 = &mut C; + | ^^^^^^ constants require immutable values + | + = note: for more information, see https://github.com/rust-lang/rust/issues/57349 + = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable + +error[E0019]: static contains unimplemented expression type + --> $DIR/E0388.rs:5:39 + | +LL | static STATIC_REF: &'static mut i32 = &mut X; + | ^^^^^^ + +error[E0658]: references in statics may only refer to immutable values + --> $DIR/E0388.rs:5:39 + | +LL | static STATIC_REF: &'static mut i32 = &mut X; + | ^^^^^^ statics require immutable values + | + = note: for more information, see https://github.com/rust-lang/rust/issues/57349 + = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable + +error[E0596]: cannot borrow immutable static item `X` as mutable + --> $DIR/E0388.rs:5:39 + | +LL | static STATIC_REF: &'static mut i32 = &mut X; + | ^^^^^^ cannot borrow as mutable + +error[E0658]: references in statics may only refer to immutable values + --> $DIR/E0388.rs:8:38 + | +LL | static CONST_REF: &'static mut i32 = &mut C; + | ^^^^^^ statics require immutable values + | + = note: for more information, see https://github.com/rust-lang/rust/issues/57349 + = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable + +error: aborting due to 5 previous errors + +Some errors have detailed explanations: E0019, E0596, E0658. +For more information about an error, try `rustc --explain E0019`. 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 8d875d37d85f9..7e4a62ac96957 100644 --- a/src/test/ui/issues/issue-17718-const-bad-values.stderr +++ b/src/test/ui/issues/issue-17718-const-bad-values.stderr @@ -1,8 +1,11 @@ -error[E0017]: references in constants may only refer to immutable values +error[E0658]: references in constants may only refer to immutable values --> $DIR/issue-17718-const-bad-values.rs:1:34 | LL | const C1: &'static mut [usize] = &mut []; | ^^^^^^^ constants require immutable values + | + = note: for more information, see https://github.com/rust-lang/rust/issues/57349 + = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable error[E0013]: constants cannot refer to statics, use a constant instead --> $DIR/issue-17718-const-bad-values.rs:5:46 @@ -10,13 +13,16 @@ error[E0013]: constants cannot refer to statics, use a constant instead LL | const C2: &'static mut usize = unsafe { &mut S }; | ^ -error[E0017]: references in constants may only refer to immutable values +error[E0658]: references in constants may only refer to immutable values --> $DIR/issue-17718-const-bad-values.rs:5:41 | LL | const C2: &'static mut usize = unsafe { &mut S }; | ^^^^^^ constants require immutable values + | + = note: for more information, see https://github.com/rust-lang/rust/issues/57349 + = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable error: aborting due to 3 previous errors -Some errors have detailed explanations: E0013, E0017. +Some errors have detailed explanations: E0013, E0658. For more information about an error, try `rustc --explain E0013`. diff --git a/src/test/ui/issues/issue-46604.rs b/src/test/ui/issues/issue-46604.rs index 4f1ad38dbdd94..e1967eb765542 100644 --- a/src/test/ui/issues/issue-46604.rs +++ b/src/test/ui/issues/issue-46604.rs @@ -1,4 +1,4 @@ -static buf: &mut [u8] = &mut [1u8,2,3,4,5,7]; //~ ERROR E0017 +static buf: &mut [u8] = &mut [1u8,2,3,4,5,7]; //~ ERROR E0658 fn write>(buffer: T) { } fn main() { diff --git a/src/test/ui/issues/issue-46604.stderr b/src/test/ui/issues/issue-46604.stderr index c72f580f24391..32c7ecbf72e95 100644 --- a/src/test/ui/issues/issue-46604.stderr +++ b/src/test/ui/issues/issue-46604.stderr @@ -1,8 +1,11 @@ -error[E0017]: references in statics may only refer to immutable values +error[E0658]: references in statics may only refer to immutable values --> $DIR/issue-46604.rs:1:25 | LL | static buf: &mut [u8] = &mut [1u8,2,3,4,5,7]; | ^^^^^^^^^^^^^^^^^^^^ statics require immutable values + | + = note: for more information, see https://github.com/rust-lang/rust/issues/57349 + = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable error[E0594]: cannot assign to `buf[_]`, as `buf` is an immutable static item --> $DIR/issue-46604.rs:6:5 @@ -12,5 +15,5 @@ LL | buf[0]=2; error: aborting due to 2 previous errors -Some errors have detailed explanations: E0017, E0594. -For more information about an error, try `rustc --explain E0017`. +Some errors have detailed explanations: E0594, E0658. +For more information about an error, try `rustc --explain E0594`. From e01ad6a01abce35f59543bf38a280a05eb7f6929 Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Fri, 29 Nov 2019 21:54:27 -0500 Subject: [PATCH 15/15] Remove E0017 from error codes index --- src/librustc_error_codes/error_codes.rs | 1 - src/librustc_error_codes/error_codes/E0017.md | 20 ------------------- 2 files changed, 21 deletions(-) delete mode 100644 src/librustc_error_codes/error_codes/E0017.md diff --git a/src/librustc_error_codes/error_codes.rs b/src/librustc_error_codes/error_codes.rs index 7f111b42403b5..259fd51c4362e 100644 --- a/src/librustc_error_codes/error_codes.rs +++ b/src/librustc_error_codes/error_codes.rs @@ -18,7 +18,6 @@ E0010: include_str!("./error_codes/E0010.md"), E0013: include_str!("./error_codes/E0013.md"), E0014: include_str!("./error_codes/E0014.md"), E0015: include_str!("./error_codes/E0015.md"), -E0017: include_str!("./error_codes/E0017.md"), E0019: include_str!("./error_codes/E0019.md"), E0023: include_str!("./error_codes/E0023.md"), E0025: include_str!("./error_codes/E0025.md"), diff --git a/src/librustc_error_codes/error_codes/E0017.md b/src/librustc_error_codes/error_codes/E0017.md deleted file mode 100644 index d5e6857b4d6f8..0000000000000 --- a/src/librustc_error_codes/error_codes/E0017.md +++ /dev/null @@ -1,20 +0,0 @@ -References in statics and constants may only refer to immutable values. - -Erroneous code example: - -```compile_fail,E0017 -static X: i32 = 1; -const C: i32 = 2; - -// these three are not allowed: -const CR: &mut i32 = &mut C; -static STATIC_REF: &'static mut i32 = &mut X; -static CONST_REF: &'static mut i32 = &mut C; -``` - -Statics are shared everywhere, and if they refer to mutable data one might -violate memory safety since holding multiple mutable references to shared data -is not allowed. - -If you really want global mutable state, try using `static mut` or a global -`UnsafeCell`.