diff options
| author | Alexander Regueiro <alexreg@me.com> | 2018-06-25 00:08:36 +0100 |
|---|---|---|
| committer | Alexander Regueiro <alexreg@me.com> | 2018-06-30 23:53:52 +0100 |
| commit | 13b82ecf80031cd0d50fa400ca87e044b292298d (patch) | |
| tree | ce1b0138b819fee7020310e74af1a9a800c72634 | |
| parent | 9f751a9c5a03bfa3d04cc34f4ba46ff0c3699547 (diff) | |
| download | rust-13b82ecf80031cd0d50fa400ca87e044b292298d.tar.gz rust-13b82ecf80031cd0d50fa400ca87e044b292298d.zip | |
Minor refactoring.
| -rw-r--r-- | src/librustc/mir/interpret/error.rs | 2 | ||||
| -rw-r--r-- | src/librustc_mir/transform/qualify_consts.rs | 45 | ||||
| -rw-r--r-- | src/test/compile-fail/issue-28324.rs | 2 |
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() {} |
