ProjectionElem::Field(..) |
ProjectionElem::Index(_) => {
- if this.mode != Mode::Fn &&
- this.qualif.intersects(Qualif::STATIC) {
+ if this.mode == Mode::Fn {
+ let base_ty = proj.base.ty(this.mir, this.tcx).to_ty(this.tcx);
+ if let Some(def) = base_ty.ty_adt_def() {
+ if def.is_union() {
+ this.not_const();
+ }
+ }
+ } else if this.qualif.intersects(Qualif::STATIC) {
span_err!(this.tcx.sess, this.span, E0494,
"cannot refer to the interior of another \
static, use a constant instead");
}
}
+ hir::ExprField(ref expr, _) => {
+ if let Some(def) = v.tables.expr_ty(expr).ty_adt_def() {
+ if def.is_union() {
+ v.promotable = false
+ }
+ }
+ }
+
hir::ExprBlock(..) |
hir::ExprIndex(..) |
- hir::ExprField(..) |
hir::ExprArray(_) |
hir::ExprType(..) |
hir::ExprTup(..) => {}
--- /dev/null
+// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![allow(const_err)]
+
+union Foo {
+ a: &'static u32,
+ b: usize,
+}
+
+fn main() {
+ let x: &'static bool = &unsafe { //~ borrowed value does not live long enough
+ Foo { a: &1 }.b == Foo { a: &2 }.b
+ };
+}
--- /dev/null
+error[E0597]: borrowed value does not live long enough
+ --> $DIR/union_promotion.rs:19:29
+ |
+LL | let x: &'static bool = &unsafe { //~ borrowed value does not live long enough
+ | _____________________________^
+LL | | Foo { a: &1 }.b == Foo { a: &2 }.b
+LL | | };
+ | |_____^ temporary value does not live long enough
+LL | }
+ | - temporary value only lives until here
+ |
+ = note: borrowed value must be valid for the static lifetime...
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0597`.