Skip to content

Commit

Permalink
Auto merge of #54715 - oli-obk:nll_deref_promotion, r=RalfJung
Browse files Browse the repository at this point in the history
Fix #54224 (const promotion regression)

r? @eddyb
  • Loading branch information
bors committed Oct 12, 2018
2 parents 849a0e9 + 76f8a90 commit e9e27e6
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 14 deletions.
36 changes: 22 additions & 14 deletions src/librustc_mir/transform/qualify_consts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -495,20 +495,22 @@ impl<'a, 'tcx> Visitor<'tcx> for Qualifier<'a, 'tcx, 'tcx> {
this.super_place(place, context, location);
match proj.elem {
ProjectionElem::Deref => {
if let Mode::Fn = this.mode {
this.add(Qualif::NOT_CONST);
} else {
let base_ty = proj.base.ty(this.mir, this.tcx).to_ty(this.tcx);
if let ty::RawPtr(_) = base_ty.sty {
if !this.tcx.sess.features_untracked().const_raw_ptr_deref {
emit_feature_err(
&this.tcx.sess.parse_sess, "const_raw_ptr_deref",
this.span, GateIssue::Language,
&format!(
"dereferencing raw pointers in {}s is unstable",
this.mode,
),
);
this.add(Qualif::NOT_CONST);
let base_ty = proj.base.ty(this.mir, this.tcx).to_ty(this.tcx);
match this.mode {
Mode::Fn => {},
_ => {
if let ty::RawPtr(_) = base_ty.sty {
if !this.tcx.sess.features_untracked().const_raw_ptr_deref {
emit_feature_err(
&this.tcx.sess.parse_sess, "const_raw_ptr_deref",
this.span, GateIssue::Language,
&format!(
"dereferencing raw pointers in {}s is unstable",
this.mode,
),
);
}
}
}
}
Expand Down Expand Up @@ -732,8 +734,11 @@ impl<'a, 'tcx> Visitor<'tcx> for Qualifier<'a, 'tcx, 'tcx> {
(CastTy::Ptr(_), CastTy::Int(_)) |
(CastTy::FnPtr, CastTy::Int(_)) => {
if let Mode::Fn = self.mode {
// in normal functions, mark such casts as not promotable
self.add(Qualif::NOT_CONST);
} else if !self.tcx.sess.features_untracked().const_raw_ptr_to_usize_cast {
// in const fn and constants require the feature gate
// FIXME: make it unsafe inside const fn and constants
emit_feature_err(
&self.tcx.sess.parse_sess, "const_raw_ptr_to_usize_cast",
self.span, GateIssue::Language,
Expand All @@ -756,8 +761,11 @@ impl<'a, 'tcx> Visitor<'tcx> for Qualifier<'a, 'tcx, 'tcx> {
op == BinOp::Offset);

if let Mode::Fn = self.mode {
// raw pointer operations are not allowed inside promoteds
self.add(Qualif::NOT_CONST);
} else if !self.tcx.sess.features_untracked().const_compare_raw_pointers {
// require the feature gate inside constants and const fn
// FIXME: make it unsafe to use these operations
emit_feature_err(
&self.tcx.sess.parse_sess,
"const_compare_raw_pointers",
Expand Down
14 changes: 14 additions & 0 deletions src/test/ui/consts/issue-54224.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#![feature(nll)]

const FOO: Option<&[[u8; 3]]> = Some(&[*b"foo"]); //~ ERROR temporary value dropped while borrowed

use std::borrow::Cow;

pub const X: [u8; 3] = *b"ABC";
pub const Y: Cow<'static, [ [u8; 3] ]> = Cow::Borrowed(&[X]);


pub const Z: Cow<'static, [ [u8; 3] ]> = Cow::Borrowed(&[*b"ABC"]);
//~^ ERROR temporary value dropped while borrowed

fn main() {}
23 changes: 23 additions & 0 deletions src/test/ui/consts/issue-54224.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
error[E0716]: temporary value dropped while borrowed
--> $DIR/issue-54224.rs:3:39
|
LL | const FOO: Option<&[[u8; 3]]> = Some(&[*b"foo"]); //~ ERROR temporary value dropped while borrowed
| ^^^^^^^^^- temporary value is freed at the end of this statement
| |
| creates a temporary which is freed while still in use
|
= note: borrowed value must be valid for the static lifetime...

error[E0716]: temporary value dropped while borrowed
--> $DIR/issue-54224.rs:11:57
|
LL | pub const Z: Cow<'static, [ [u8; 3] ]> = Cow::Borrowed(&[*b"ABC"]);
| ^^^^^^^^^- temporary value is freed at the end of this statement
| |
| creates a temporary which is freed while still in use
|
= note: borrowed value must be valid for the static lifetime...

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0716`.

0 comments on commit e9e27e6

Please sign in to comment.