about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlexander Regueiro <alexreg@me.com>2018-06-25 00:08:36 +0100
committerAlexander Regueiro <alexreg@me.com>2018-06-30 23:53:52 +0100
commit13b82ecf80031cd0d50fa400ca87e044b292298d (patch)
treece1b0138b819fee7020310e74af1a9a800c72634
parent9f751a9c5a03bfa3d04cc34f4ba46ff0c3699547 (diff)
downloadrust-13b82ecf80031cd0d50fa400ca87e044b292298d.tar.gz
rust-13b82ecf80031cd0d50fa400ca87e044b292298d.zip
Minor refactoring.
-rw-r--r--src/librustc/mir/interpret/error.rs2
-rw-r--r--src/librustc_mir/transform/qualify_consts.rs45
-rw-r--r--src/test/compile-fail/issue-28324.rs2
3 files changed, 23 insertions, 26 deletions
diff --git a/src/librustc/mir/interpret/error.rs b/src/librustc/mir/interpret/error.rs
index 2363e2870ec..7e2c144e0a7 100644
--- a/src/librustc/mir/interpret/error.rs
+++ b/src/librustc/mir/interpret/error.rs
@@ -306,7 +306,7 @@ impl<'tcx, O> EvalErrorKind<'tcx, O> {
             ReadBytesAsPointer =>
                 "a memory access tried to interpret some bytes as a pointer",
             ReadForeignStatic =>
-                "tried to read foreign (extern) static",
+                "tried to read from foreign (extern) static",
             InvalidPointerMath =>
                 "attempted to do invalid arithmetic on pointers that would leak base addresses, e.g. comparing pointers into different allocations",
             ReadUndefBytes =>
diff --git a/src/librustc_mir/transform/qualify_consts.rs b/src/librustc_mir/transform/qualify_consts.rs
index 66106c7eca1..986957d5a82 100644
--- a/src/librustc_mir/transform/qualify_consts.rs
+++ b/src/librustc_mir/transform/qualify_consts.rs
@@ -450,25 +450,26 @@ impl<'a, 'tcx> Visitor<'tcx> for Qualifier<'a, 'tcx, 'tcx> {
         match *place {
             Place::Local(ref local) => self.visit_local(local, context, location),
             Place::Static(ref global) => {
-                // Only allow statics (not consts) to refer to other statics.
-                if !(self.mode == Mode::Static || self.mode == Mode::StaticMut) {
+                if self.tcx
+                       .get_attrs(global.def_id)
+                       .iter()
+                       .any(|attr| attr.check_name("thread_local")) {
+                    if self.mode != Mode::Fn {
+                        span_err!(self.tcx.sess, self.span, E0625,
+                                  "thread-local statics cannot be \
+                                   accessed at compile-time");
+                    }
                     self.add(Qualif::NOT_CONST);
+                    return;
                 }
 
-                if self.mode != Mode::Fn {
-                    if self.tcx
-                           .get_attrs(global.def_id)
-                           .iter()
-                           .any(|attr| attr.check_name("thread_local")) {
-                        span_err!(self.tcx.sess, self.span, E0625,
-                                    "thread-local statics cannot be \
-                                    accessed at compile-time");
-                        self.add(Qualif::NOT_CONST);
-                        return;
-                    }
+                // Only allow statics (not consts) to refer to other statics.
+                if self.mode == Mode::Static || self.mode == Mode::StaticMut {
+                    return;
                 }
+                self.add(Qualif::NOT_CONST);
 
-                if self.mode == Mode::Const || self.mode == Mode::ConstFn {
+                if self.mode != Mode::Fn {
                     let mut err = struct_span_err!(self.tcx.sess, self.span, E0013,
                                                    "{}s cannot refer to statics, use \
                                                     a constant instead", self.mode);
@@ -544,13 +545,11 @@ impl<'a, 'tcx> Visitor<'tcx> for Qualifier<'a, 'tcx, 'tcx> {
     }
 
     fn visit_operand(&mut self, operand: &Operand<'tcx>, location: Location) {
+        self.super_operand(operand, location);
+
         match *operand {
             Operand::Copy(_) |
             Operand::Move(_) => {
-                self.nest(|this| {
-                    this.super_operand(operand, location);
-                });
-
                 // Mark the consumed locals to indicate later drops are noops.
                 if let Operand::Move(Place::Local(local)) = *operand {
                     self.local_qualif[local] = self.local_qualif[local].map(|q|
@@ -595,12 +594,10 @@ impl<'a, 'tcx> Visitor<'tcx> for Qualifier<'a, 'tcx, 'tcx> {
             }
 
             if is_reborrow {
-                self.nest(|this| {
-                    this.super_place(place, PlaceContext::Borrow {
-                        region,
-                        kind
-                    }, location);
-                });
+                self.super_place(place, PlaceContext::Borrow {
+                    region,
+                    kind
+                }, location);
             } else {
                 self.super_rvalue(rvalue, location);
             }
diff --git a/src/test/compile-fail/issue-28324.rs b/src/test/compile-fail/issue-28324.rs
index 369f919471c..0f9fe3fe246 100644
--- a/src/test/compile-fail/issue-28324.rs
+++ b/src/test/compile-fail/issue-28324.rs
@@ -16,6 +16,6 @@ extern {
 
 pub static BAZ: u32 = *&error_message_count;
 //~^ ERROR constant evaluation error
-//~| tried to read foreign (extern) static
+//~| tried to read from foreign (extern) static
 
 fn main() {}