diff options
| author | csmoe <csmoe@msn.com> | 2021-06-01 22:05:04 +0800 | 
|---|---|---|
| committer | csmoe <csmoe@msn.com> | 2021-06-02 10:19:57 +0800 | 
| commit | 521d9ab59a211030c71cc55399fc61882adbb0d6 (patch) | |
| tree | 6c8c4cf85421967bbc121187feda8154fb2a972b | |
| parent | 92839563506163bc1bfb9d137782649c8b527bb1 (diff) | |
| download | rust-521d9ab59a211030c71cc55399fc61882adbb0d6.tar.gz rust-521d9ab59a211030c71cc55399fc61882adbb0d6.zip  | |
convert Rvalue::threadlocalref assertion to delay bug
| -rw-r--r-- | compiler/rustc_mir/src/transform/check_consts/validation.rs | 13 | ||||
| -rw-r--r-- | src/test/ui/thread-local-static.rs | 2 | ||||
| -rw-r--r-- | src/test/ui/thread-local-static.stderr | 13 | 
3 files changed, 11 insertions, 17 deletions
diff --git a/compiler/rustc_mir/src/transform/check_consts/validation.rs b/compiler/rustc_mir/src/transform/check_consts/validation.rs index 9538d2fdd4d..0ec022ccf82 100644 --- a/compiler/rustc_mir/src/transform/check_consts/validation.rs +++ b/compiler/rustc_mir/src/transform/check_consts/validation.rs @@ -356,10 +356,9 @@ impl Validator<'mir, 'tcx> { } fn check_static(&mut self, def_id: DefId, span: Span) { - assert!( - !self.tcx.is_thread_local_static(def_id), - "tls access is checked in `Rvalue::ThreadLocalRef" - ); + if self.tcx.is_thread_local_static(def_id) { + self.tcx.sess.delay_span_bug(span, "tls access is checked in `Rvalue::ThreadLocalRef"); + } self.check_op_spanned(ops::StaticAccess, span) } @@ -732,11 +731,7 @@ impl Visitor<'tcx> for Validator<'mir, 'tcx> { if proj_base.is_empty() { if let (local, []) = (place_local, proj_base) { let decl = &self.body.local_decls[local]; - if let Some(box LocalInfo::StaticRef { - def_id, - is_thread_local: false, - }) = decl.local_info - { + if let Some(box LocalInfo::StaticRef { def_id, .. }) = decl.local_info { let span = decl.source_info.span; self.check_static(def_id, span); return; diff --git a/src/test/ui/thread-local-static.rs b/src/test/ui/thread-local-static.rs index 7f4ead36cd0..c7fee9e6b4c 100644 --- a/src/test/ui/thread-local-static.rs +++ b/src/test/ui/thread-local-static.rs @@ -8,9 +8,9 @@ const fn g(x: &mut [u32; 8]) { //~^ ERROR mutable references are not allowed std::mem::swap(x, &mut STATIC_VAR_2) //~^ ERROR thread-local statics cannot be accessed - //~| ERROR dereferencing raw pointers in constant //~| ERROR mutable references are not allowed //~| ERROR use of mutable static is unsafe + //~| constant functions cannot refer to statics } fn main() {} diff --git a/src/test/ui/thread-local-static.stderr b/src/test/ui/thread-local-static.stderr index ed461fcb7e2..08bf593a5a7 100644 --- a/src/test/ui/thread-local-static.stderr +++ b/src/test/ui/thread-local-static.stderr @@ -13,14 +13,13 @@ error[E0625]: thread-local statics cannot be accessed at compile-time LL | std::mem::swap(x, &mut STATIC_VAR_2) | ^^^^^^^^^^^^ -error[E0658]: dereferencing raw pointers in constant functions is unstable - --> $DIR/thread-local-static.rs:9:23 +error[E0013]: constant functions cannot refer to statics + --> $DIR/thread-local-static.rs:9:28 | LL | std::mem::swap(x, &mut STATIC_VAR_2) - | ^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^ | - = note: see issue #51911 <https://github.com/rust-lang/rust/issues/51911> for more information - = help: add `#![feature(const_raw_ptr_deref)]` to the crate attributes to enable + = help: consider extracting the value of the `static` to a `const`, and referring to that error[E0658]: mutable references are not allowed in constant functions --> $DIR/thread-local-static.rs:9:23 @@ -41,5 +40,5 @@ LL | std::mem::swap(x, &mut STATIC_VAR_2) error: aborting due to 5 previous errors -Some errors have detailed explanations: E0133, E0658. -For more information about an error, try `rustc --explain E0133`. +Some errors have detailed explanations: E0013, E0133, E0658. +For more information about an error, try `rustc --explain E0013`.  | 
