mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-18 18:04:13 +00:00
Allow let
bindings everywhere
This commit is contained in:
parent
7ec3c10d7e
commit
d62bcad38d
@ -149,6 +149,12 @@ pub struct Mir<'tcx> {
|
|||||||
/// This is used for the "rust-call" ABI.
|
/// This is used for the "rust-call" ABI.
|
||||||
pub spread_arg: Option<Local>,
|
pub spread_arg: Option<Local>,
|
||||||
|
|
||||||
|
/// Mark this MIR of a const context other than const functions as having converted a `&&` or
|
||||||
|
/// `||` expression into `&` or `|` respectively. This is problematic because if we ever stop
|
||||||
|
/// this conversion from happening and use short circuiting, we will cause the following code
|
||||||
|
/// to change the value of `x`: `let mut x = 42; false && { x = 55; true };`
|
||||||
|
pub const_can_have_let_mut_bindings: bool,
|
||||||
|
|
||||||
/// A span representing this MIR, for error reporting
|
/// A span representing this MIR, for error reporting
|
||||||
pub span: Span,
|
pub span: Span,
|
||||||
|
|
||||||
@ -167,6 +173,7 @@ impl<'tcx> Mir<'tcx> {
|
|||||||
arg_count: usize,
|
arg_count: usize,
|
||||||
upvar_decls: Vec<UpvarDecl>,
|
upvar_decls: Vec<UpvarDecl>,
|
||||||
span: Span,
|
span: Span,
|
||||||
|
const_can_have_let_mut_bindings: bool,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
// We need `arg_count` locals, and one for the return place
|
// We need `arg_count` locals, and one for the return place
|
||||||
assert!(
|
assert!(
|
||||||
@ -191,6 +198,7 @@ impl<'tcx> Mir<'tcx> {
|
|||||||
spread_arg: None,
|
spread_arg: None,
|
||||||
span,
|
span,
|
||||||
cache: cache::Cache::new(),
|
cache: cache::Cache::new(),
|
||||||
|
const_can_have_let_mut_bindings,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -421,6 +429,7 @@ impl_stable_hash_for!(struct Mir<'tcx> {
|
|||||||
arg_count,
|
arg_count,
|
||||||
upvar_decls,
|
upvar_decls,
|
||||||
spread_arg,
|
spread_arg,
|
||||||
|
const_can_have_let_mut_bindings,
|
||||||
span,
|
span,
|
||||||
cache
|
cache
|
||||||
});
|
});
|
||||||
@ -2974,6 +2983,7 @@ BraceStructTypeFoldableImpl! {
|
|||||||
arg_count,
|
arg_count,
|
||||||
upvar_decls,
|
upvar_decls,
|
||||||
spread_arg,
|
spread_arg,
|
||||||
|
const_can_have_let_mut_bindings,
|
||||||
span,
|
span,
|
||||||
cache,
|
cache,
|
||||||
}
|
}
|
||||||
|
@ -854,15 +854,17 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Mir::new(self.cfg.basic_blocks,
|
Mir::new(
|
||||||
self.source_scopes,
|
self.cfg.basic_blocks,
|
||||||
ClearCrossCrate::Set(self.source_scope_local_data),
|
self.source_scopes,
|
||||||
IndexVec::new(),
|
ClearCrossCrate::Set(self.source_scope_local_data),
|
||||||
yield_ty,
|
IndexVec::new(),
|
||||||
self.local_decls,
|
yield_ty,
|
||||||
self.arg_count,
|
self.local_decls,
|
||||||
self.upvar_decls,
|
self.arg_count,
|
||||||
self.fn_span
|
self.upvar_decls,
|
||||||
|
self.fn_span,
|
||||||
|
self.hir.const_can_have_let_mut_bindings(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -372,6 +372,7 @@ fn make_mirror_unadjusted<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>,
|
|||||||
// FIXME(eddyb) use logical ops in constants when
|
// FIXME(eddyb) use logical ops in constants when
|
||||||
// they can handle that kind of control-flow.
|
// they can handle that kind of control-flow.
|
||||||
(hir::BinOpKind::And, hir::Constness::Const) => {
|
(hir::BinOpKind::And, hir::Constness::Const) => {
|
||||||
|
cx.const_can_have_let_mut_bindings = false;
|
||||||
ExprKind::Binary {
|
ExprKind::Binary {
|
||||||
op: BinOp::BitAnd,
|
op: BinOp::BitAnd,
|
||||||
lhs: lhs.to_ref(),
|
lhs: lhs.to_ref(),
|
||||||
@ -379,6 +380,7 @@ fn make_mirror_unadjusted<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
(hir::BinOpKind::Or, hir::Constness::Const) => {
|
(hir::BinOpKind::Or, hir::Constness::Const) => {
|
||||||
|
cx.const_can_have_let_mut_bindings = false;
|
||||||
ExprKind::Binary {
|
ExprKind::Binary {
|
||||||
op: BinOp::BitOr,
|
op: BinOp::BitOr,
|
||||||
lhs: lhs.to_ref(),
|
lhs: lhs.to_ref(),
|
||||||
|
@ -56,6 +56,9 @@ pub struct Cx<'a, 'gcx: 'a + 'tcx, 'tcx: 'a> {
|
|||||||
|
|
||||||
/// True if this constant/function needs overflow checks.
|
/// True if this constant/function needs overflow checks.
|
||||||
check_overflow: bool,
|
check_overflow: bool,
|
||||||
|
|
||||||
|
/// See field with the same name on `Mir`
|
||||||
|
const_can_have_let_mut_bindings: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'gcx, 'tcx> Cx<'a, 'gcx, 'tcx> {
|
impl<'a, 'gcx, 'tcx> Cx<'a, 'gcx, 'tcx> {
|
||||||
@ -96,9 +99,13 @@ impl<'a, 'gcx, 'tcx> Cx<'a, 'gcx, 'tcx> {
|
|||||||
constness,
|
constness,
|
||||||
body_owner_kind,
|
body_owner_kind,
|
||||||
check_overflow,
|
check_overflow,
|
||||||
|
const_can_have_let_mut_bindings: true,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn const_can_have_let_mut_bindings(&self) -> bool {
|
||||||
|
self.const_can_have_let_mut_bindings
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'gcx, 'tcx> Cx<'a, 'gcx, 'tcx> {
|
impl<'a, 'gcx, 'tcx> Cx<'a, 'gcx, 'tcx> {
|
||||||
|
@ -219,7 +219,8 @@ fn build_drop_shim<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
|||||||
local_decls_for_sig(&sig, span),
|
local_decls_for_sig(&sig, span),
|
||||||
sig.inputs().len(),
|
sig.inputs().len(),
|
||||||
vec![],
|
vec![],
|
||||||
span
|
span,
|
||||||
|
true,
|
||||||
);
|
);
|
||||||
|
|
||||||
if let Some(..) = ty {
|
if let Some(..) = ty {
|
||||||
@ -387,7 +388,8 @@ impl<'a, 'tcx> CloneShimBuilder<'a, 'tcx> {
|
|||||||
self.local_decls,
|
self.local_decls,
|
||||||
self.sig.inputs().len(),
|
self.sig.inputs().len(),
|
||||||
vec![],
|
vec![],
|
||||||
self.span
|
self.span,
|
||||||
|
true,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -835,7 +837,8 @@ fn build_call_shim<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
|||||||
local_decls,
|
local_decls,
|
||||||
sig.inputs().len(),
|
sig.inputs().len(),
|
||||||
vec![],
|
vec![],
|
||||||
span
|
span,
|
||||||
|
true,
|
||||||
);
|
);
|
||||||
if let Abi::RustCall = sig.abi {
|
if let Abi::RustCall = sig.abi {
|
||||||
mir.spread_arg = Some(Local::new(sig.inputs().len()));
|
mir.spread_arg = Some(Local::new(sig.inputs().len()));
|
||||||
@ -912,6 +915,7 @@ pub fn build_adt_ctor<'a, 'gcx, 'tcx>(infcx: &infer::InferCtxt<'a, 'gcx, 'tcx>,
|
|||||||
local_decls,
|
local_decls,
|
||||||
sig.inputs().len(),
|
sig.inputs().len(),
|
||||||
vec![],
|
vec![],
|
||||||
span
|
span,
|
||||||
|
true,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -412,7 +412,8 @@ pub fn promote_candidates<'a, 'tcx>(mir: &mut Mir<'tcx>,
|
|||||||
initial_locals,
|
initial_locals,
|
||||||
0,
|
0,
|
||||||
vec![],
|
vec![],
|
||||||
mir.span
|
mir.span,
|
||||||
|
false,
|
||||||
),
|
),
|
||||||
tcx,
|
tcx,
|
||||||
source: mir,
|
source: mir,
|
||||||
|
@ -30,7 +30,7 @@ use rustc::mir::visit::{PlaceContext, Visitor, MutatingUseContext, NonMutatingUs
|
|||||||
use rustc::middle::lang_items;
|
use rustc::middle::lang_items;
|
||||||
use rustc_target::spec::abi::Abi;
|
use rustc_target::spec::abi::Abi;
|
||||||
use syntax::ast::LitKind;
|
use syntax::ast::LitKind;
|
||||||
use syntax::feature_gate::{UnstableFeatures, feature_err, emit_feature_err, GateIssue};
|
use syntax::feature_gate::{UnstableFeatures, emit_feature_err, GateIssue};
|
||||||
use syntax_pos::{Span, DUMMY_SP};
|
use syntax_pos::{Span, DUMMY_SP};
|
||||||
|
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
@ -114,7 +114,6 @@ struct Qualifier<'a, 'gcx: 'a+'tcx, 'tcx: 'a> {
|
|||||||
param_env: ty::ParamEnv<'tcx>,
|
param_env: ty::ParamEnv<'tcx>,
|
||||||
local_qualif: IndexVec<Local, Option<Qualif>>,
|
local_qualif: IndexVec<Local, Option<Qualif>>,
|
||||||
qualif: Qualif,
|
qualif: Qualif,
|
||||||
const_fn_arg_vars: BitSet<Local>,
|
|
||||||
temp_promotion_state: IndexVec<Local, TempState>,
|
temp_promotion_state: IndexVec<Local, TempState>,
|
||||||
promotion_candidates: Vec<Candidate>
|
promotion_candidates: Vec<Candidate>
|
||||||
}
|
}
|
||||||
@ -149,7 +148,6 @@ impl<'a, 'tcx> Qualifier<'a, 'tcx, 'tcx> {
|
|||||||
param_env,
|
param_env,
|
||||||
local_qualif,
|
local_qualif,
|
||||||
qualif: Qualif::empty(),
|
qualif: Qualif::empty(),
|
||||||
const_fn_arg_vars: BitSet::new_empty(mir.local_decls.len()),
|
|
||||||
temp_promotion_state: temps,
|
temp_promotion_state: temps,
|
||||||
promotion_candidates: vec![]
|
promotion_candidates: vec![]
|
||||||
}
|
}
|
||||||
@ -178,26 +176,6 @@ impl<'a, 'tcx> Qualifier<'a, 'tcx, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Error about extra statements in a constant.
|
|
||||||
fn statement_like(&mut self) {
|
|
||||||
self.add(Qualif::NOT_CONST);
|
|
||||||
if self.mode != Mode::Fn {
|
|
||||||
let mut err = feature_err(
|
|
||||||
&self.tcx.sess.parse_sess,
|
|
||||||
"const_let",
|
|
||||||
self.span,
|
|
||||||
GateIssue::Language,
|
|
||||||
&format!("statements in {}s are unstable", self.mode),
|
|
||||||
);
|
|
||||||
if self.tcx.sess.teach(&err.get_code().unwrap()) {
|
|
||||||
err.note("Blocks in constants may only contain items (such as constant, function \
|
|
||||||
definition, etc...) and a tail expression.");
|
|
||||||
err.help("To avoid it, you have to replace the non-item object.");
|
|
||||||
}
|
|
||||||
err.emit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Add the given qualification to self.qualif.
|
/// Add the given qualification to self.qualif.
|
||||||
fn add(&mut self, qualif: Qualif) {
|
fn add(&mut self, qualif: Qualif) {
|
||||||
self.qualif = self.qualif | qualif;
|
self.qualif = self.qualif | qualif;
|
||||||
@ -243,85 +221,46 @@ impl<'a, 'tcx> Qualifier<'a, 'tcx, 'tcx> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.const_let_allowed() {
|
let mut dest = dest;
|
||||||
let mut dest = dest;
|
let index = loop {
|
||||||
let index = loop {
|
match dest {
|
||||||
match dest {
|
Place::Local(index) => break *index,
|
||||||
// with `const_let` active, we treat all locals equal
|
// projections are transparent for assignments
|
||||||
Place::Local(index) => break *index,
|
// we qualify the entire destination at once, even if just a field would have
|
||||||
// projections are transparent for assignments
|
// stricter qualification
|
||||||
// we qualify the entire destination at once, even if just a field would have
|
Place::Projection(proj) => {
|
||||||
// stricter qualification
|
// Catch more errors in the destination. `visit_place` also checks various
|
||||||
Place::Projection(proj) => {
|
// projection rules like union field access and raw pointer deref
|
||||||
// Catch more errors in the destination. `visit_place` also checks various
|
self.visit_place(
|
||||||
// projection rules like union field access and raw pointer deref
|
dest,
|
||||||
self.visit_place(
|
PlaceContext::MutatingUse(MutatingUseContext::Store),
|
||||||
dest,
|
location
|
||||||
PlaceContext::MutatingUse(MutatingUseContext::Store),
|
);
|
||||||
location
|
dest = &proj.base;
|
||||||
);
|
},
|
||||||
dest = &proj.base;
|
Place::Promoted(..) => bug!("promoteds don't exist yet during promotion"),
|
||||||
},
|
Place::Static(..) => {
|
||||||
Place::Promoted(..) => bug!("promoteds don't exist yet during promotion"),
|
// Catch more errors in the destination. `visit_place` also checks that we
|
||||||
Place::Static(..) => {
|
// do not try to access statics from constants or try to mutate statics
|
||||||
// Catch more errors in the destination. `visit_place` also checks that we
|
self.visit_place(
|
||||||
// do not try to access statics from constants or try to mutate statics
|
dest,
|
||||||
self.visit_place(
|
PlaceContext::MutatingUse(MutatingUseContext::Store),
|
||||||
dest,
|
location
|
||||||
PlaceContext::MutatingUse(MutatingUseContext::Store),
|
);
|
||||||
location
|
return;
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
|
||||||
debug!("store to var {:?}", index);
|
|
||||||
match &mut self.local_qualif[index] {
|
|
||||||
// this is overly restrictive, because even full assignments do not clear the qualif
|
|
||||||
// While we could special case full assignments, this would be inconsistent with
|
|
||||||
// aggregates where we overwrite all fields via assignments, which would not get
|
|
||||||
// that feature.
|
|
||||||
Some(ref mut qualif) => *qualif = *qualif | self.qualif,
|
|
||||||
// insert new qualification
|
|
||||||
qualif @ None => *qualif = Some(self.qualif),
|
|
||||||
}
|
}
|
||||||
return;
|
};
|
||||||
|
debug!("store to var {:?}", index);
|
||||||
|
match &mut self.local_qualif[index] {
|
||||||
|
// this is overly restrictive, because even full assignments do not clear the qualif
|
||||||
|
// While we could special case full assignments, this would be inconsistent with
|
||||||
|
// aggregates where we overwrite all fields via assignments, which would not get
|
||||||
|
// that feature.
|
||||||
|
Some(ref mut qualif) => *qualif = *qualif | self.qualif,
|
||||||
|
// insert new qualification
|
||||||
|
qualif @ None => *qualif = Some(self.qualif),
|
||||||
}
|
}
|
||||||
|
|
||||||
match *dest {
|
|
||||||
Place::Local(index) if self.mir.local_kind(index) == LocalKind::Temp ||
|
|
||||||
self.mir.local_kind(index) == LocalKind::ReturnPointer => {
|
|
||||||
debug!("store to {:?} (temp or return pointer)", index);
|
|
||||||
store(&mut self.local_qualif[index])
|
|
||||||
}
|
|
||||||
|
|
||||||
Place::Projection(box Projection {
|
|
||||||
base: Place::Local(index),
|
|
||||||
elem: ProjectionElem::Deref
|
|
||||||
}) if self.mir.local_kind(index) == LocalKind::Temp
|
|
||||||
&& self.mir.local_decls[index].ty.is_box()
|
|
||||||
&& self.local_qualif[index].map_or(false, |qualif| {
|
|
||||||
qualif.contains(Qualif::NOT_CONST)
|
|
||||||
}) => {
|
|
||||||
// Part of `box expr`, we should've errored
|
|
||||||
// already for the Box allocation Rvalue.
|
|
||||||
}
|
|
||||||
|
|
||||||
// This must be an explicit assignment.
|
|
||||||
_ => {
|
|
||||||
// Catch more errors in the destination.
|
|
||||||
self.visit_place(
|
|
||||||
dest,
|
|
||||||
PlaceContext::MutatingUse(MutatingUseContext::Store),
|
|
||||||
location
|
|
||||||
);
|
|
||||||
self.statement_like();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn const_let_allowed(&self) -> bool {
|
|
||||||
self.tcx.features().const_let || self.mode == Mode::ConstFn
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Qualify a whole const, static initializer or const fn.
|
/// Qualify a whole const, static initializer or const fn.
|
||||||
@ -360,48 +299,7 @@ impl<'a, 'tcx> Qualifier<'a, 'tcx, 'tcx> {
|
|||||||
TerminatorKind::FalseEdges { .. } |
|
TerminatorKind::FalseEdges { .. } |
|
||||||
TerminatorKind::FalseUnwind { .. } => None,
|
TerminatorKind::FalseUnwind { .. } => None,
|
||||||
|
|
||||||
TerminatorKind::Return => {
|
TerminatorKind::Return => break,
|
||||||
if !self.const_let_allowed() {
|
|
||||||
// Check for unused values. This usually means
|
|
||||||
// there are extra statements in the AST.
|
|
||||||
for temp in mir.temps_iter() {
|
|
||||||
if self.local_qualif[temp].is_none() {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
let state = self.temp_promotion_state[temp];
|
|
||||||
if let TempState::Defined { location, uses: 0 } = state {
|
|
||||||
let data = &mir[location.block];
|
|
||||||
let stmt_idx = location.statement_index;
|
|
||||||
|
|
||||||
// Get the span for the initialization.
|
|
||||||
let source_info = if stmt_idx < data.statements.len() {
|
|
||||||
data.statements[stmt_idx].source_info
|
|
||||||
} else {
|
|
||||||
data.terminator().source_info
|
|
||||||
};
|
|
||||||
self.span = source_info.span;
|
|
||||||
|
|
||||||
// Treat this as a statement in the AST.
|
|
||||||
self.statement_like();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make sure there are no extra unassigned variables.
|
|
||||||
self.qualif = Qualif::NOT_CONST;
|
|
||||||
for index in mir.vars_iter() {
|
|
||||||
if !self.const_fn_arg_vars.contains(index) {
|
|
||||||
debug!("unassigned variable {:?}", index);
|
|
||||||
self.assign(&Place::Local(index), Location {
|
|
||||||
block: bb,
|
|
||||||
statement_index: usize::MAX,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
match target {
|
match target {
|
||||||
@ -468,14 +366,6 @@ impl<'a, 'tcx> Visitor<'tcx> for Qualifier<'a, 'tcx, 'tcx> {
|
|||||||
LocalKind::ReturnPointer => {
|
LocalKind::ReturnPointer => {
|
||||||
self.not_const();
|
self.not_const();
|
||||||
}
|
}
|
||||||
LocalKind::Var if !self.const_let_allowed() => {
|
|
||||||
if self.mode != Mode::Fn {
|
|
||||||
emit_feature_err(&self.tcx.sess.parse_sess, "const_let",
|
|
||||||
self.span, GateIssue::Language,
|
|
||||||
&format!("let bindings in {}s are unstable",self.mode));
|
|
||||||
}
|
|
||||||
self.add(Qualif::NOT_CONST);
|
|
||||||
}
|
|
||||||
LocalKind::Var |
|
LocalKind::Var |
|
||||||
LocalKind::Arg |
|
LocalKind::Arg |
|
||||||
LocalKind::Temp => {
|
LocalKind::Temp => {
|
||||||
@ -556,7 +446,9 @@ impl<'a, 'tcx> Visitor<'tcx> for Qualifier<'a, 'tcx, 'tcx> {
|
|||||||
this.super_place(place, context, location);
|
this.super_place(place, context, location);
|
||||||
match proj.elem {
|
match proj.elem {
|
||||||
ProjectionElem::Deref => {
|
ProjectionElem::Deref => {
|
||||||
this.add(Qualif::NOT_CONST);
|
if context.is_mutating_use() {
|
||||||
|
this.not_const()
|
||||||
|
}
|
||||||
let base_ty = proj.base.ty(this.mir, this.tcx).to_ty(this.tcx);
|
let base_ty = proj.base.ty(this.mir, this.tcx).to_ty(this.tcx);
|
||||||
match this.mode {
|
match this.mode {
|
||||||
Mode::Fn => {},
|
Mode::Fn => {},
|
||||||
@ -1291,6 +1183,19 @@ impl MirPass for QualifyAndPromoteConstants {
|
|||||||
// Do the actual promotion, now that we know what's viable.
|
// Do the actual promotion, now that we know what's viable.
|
||||||
promote_consts::promote_candidates(mir, tcx, temps, candidates);
|
promote_consts::promote_candidates(mir, tcx, temps, candidates);
|
||||||
} else {
|
} else {
|
||||||
|
if !mir.const_can_have_let_mut_bindings {
|
||||||
|
for local in mir.mut_vars_iter() {
|
||||||
|
let span = mir.local_decls[local].source_info.span;
|
||||||
|
tcx.sess.span_err(
|
||||||
|
span,
|
||||||
|
&format!(
|
||||||
|
"Cannot have both mutable bindings and \
|
||||||
|
short circuiting operators in {}",
|
||||||
|
mode,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
let promoted_temps = if mode == Mode::Const {
|
let promoted_temps = if mode == Mode::Const {
|
||||||
// Already computed by `mir_const_qualif`.
|
// Already computed by `mir_const_qualif`.
|
||||||
const_promoted_temps.unwrap()
|
const_promoted_temps.unwrap()
|
||||||
|
@ -209,9 +209,6 @@ declare_features! (
|
|||||||
// Allows the definition of `const fn` functions with some advanced features.
|
// Allows the definition of `const fn` functions with some advanced features.
|
||||||
(active, const_fn, "1.2.0", Some(24111), None),
|
(active, const_fn, "1.2.0", Some(24111), None),
|
||||||
|
|
||||||
// Allows let bindings and destructuring in `const fn` functions and constants.
|
|
||||||
(active, const_let, "1.22.1", Some(48821), None),
|
|
||||||
|
|
||||||
// Allows accessing fields of unions inside const fn.
|
// Allows accessing fields of unions inside const fn.
|
||||||
(active, const_fn_union, "1.27.0", Some(51909), None),
|
(active, const_fn_union, "1.27.0", Some(51909), None),
|
||||||
|
|
||||||
|
@ -11,8 +11,6 @@
|
|||||||
// run-pass
|
// run-pass
|
||||||
#![allow(dead_code)]
|
#![allow(dead_code)]
|
||||||
|
|
||||||
#![feature(const_let)]
|
|
||||||
|
|
||||||
type Array = [u32; { let x = 2; 5 }];
|
type Array = [u32; { let x = 2; 5 }];
|
||||||
|
|
||||||
pub fn main() {}
|
pub fn main() {}
|
||||||
|
@ -11,8 +11,6 @@
|
|||||||
// run-pass
|
// run-pass
|
||||||
#![allow(dead_code)]
|
#![allow(dead_code)]
|
||||||
|
|
||||||
#![feature(const_let)]
|
|
||||||
|
|
||||||
enum Foo {
|
enum Foo {
|
||||||
Bar = { let x = 1; 3 }
|
Bar = { let x = 1; 3 }
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
// https://github.com/rust-lang/rust/issues/48821
|
// https://github.com/rust-lang/rust/issues/48821
|
||||||
|
|
||||||
#![feature(const_fn, const_let)]
|
#![feature(const_fn)]
|
||||||
|
|
||||||
const fn foo(i: usize) -> usize {
|
const fn foo(i: usize) -> usize {
|
||||||
let x = i;
|
let x = i;
|
||||||
|
@ -13,44 +13,80 @@ error[E0010]: allocations are not allowed in statics
|
|||||||
LL | static STATIC11: Box<MyOwned> = box MyOwned;
|
LL | static STATIC11: Box<MyOwned> = box MyOwned;
|
||||||
| ^^^^^^^^^^^ allocation not allowed in statics
|
| ^^^^^^^^^^^ allocation not allowed in statics
|
||||||
|
|
||||||
|
error[E0019]: static contains unimplemented expression type
|
||||||
|
--> $DIR/check-static-values-constraints.rs:89:37
|
||||||
|
|
|
||||||
|
LL | static STATIC11: Box<MyOwned> = box MyOwned;
|
||||||
|
| ^^^^^^^
|
||||||
|
|
||||||
error[E0015]: calls in statics are limited to constant functions, tuple structs and tuple variants
|
error[E0015]: calls in statics are limited to constant functions, tuple structs and tuple variants
|
||||||
--> $DIR/check-static-values-constraints.rs:99:32
|
--> $DIR/check-static-values-constraints.rs:100:32
|
||||||
|
|
|
|
||||||
LL | field2: SafeEnum::Variant4("str".to_string())
|
LL | field2: SafeEnum::Variant4("str".to_string())
|
||||||
| ^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error[E0010]: allocations are not allowed in statics
|
|
||||||
--> $DIR/check-static-values-constraints.rs:104:5
|
|
||||||
|
|
|
||||||
LL | box MyOwned, //~ ERROR allocations are not allowed in statics
|
|
||||||
| ^^^^^^^^^^^ allocation not allowed in statics
|
|
||||||
|
|
||||||
error[E0010]: allocations are not allowed in statics
|
error[E0010]: allocations are not allowed in statics
|
||||||
--> $DIR/check-static-values-constraints.rs:105:5
|
--> $DIR/check-static-values-constraints.rs:105:5
|
||||||
|
|
|
|
||||||
LL | box MyOwned, //~ ERROR allocations are not allowed in statics
|
LL | box MyOwned, //~ ERROR allocations are not allowed in statics
|
||||||
| ^^^^^^^^^^^ allocation not allowed in statics
|
| ^^^^^^^^^^^ allocation not allowed in statics
|
||||||
|
|
||||||
|
error[E0019]: static contains unimplemented expression type
|
||||||
|
--> $DIR/check-static-values-constraints.rs:105:9
|
||||||
|
|
|
||||||
|
LL | box MyOwned, //~ ERROR allocations are not allowed in statics
|
||||||
|
| ^^^^^^^
|
||||||
|
|
||||||
error[E0010]: allocations are not allowed in statics
|
error[E0010]: allocations are not allowed in statics
|
||||||
--> $DIR/check-static-values-constraints.rs:109:6
|
--> $DIR/check-static-values-constraints.rs:107:5
|
||||||
|
|
|
||||||
|
LL | box MyOwned, //~ ERROR allocations are not allowed in statics
|
||||||
|
| ^^^^^^^^^^^ allocation not allowed in statics
|
||||||
|
|
||||||
|
error[E0019]: static contains unimplemented expression type
|
||||||
|
--> $DIR/check-static-values-constraints.rs:107:9
|
||||||
|
|
|
||||||
|
LL | box MyOwned, //~ ERROR allocations are not allowed in statics
|
||||||
|
| ^^^^^^^
|
||||||
|
|
||||||
|
error[E0010]: allocations are not allowed in statics
|
||||||
|
--> $DIR/check-static-values-constraints.rs:112:6
|
||||||
|
|
|
|
||||||
LL | &box MyOwned, //~ ERROR allocations are not allowed in statics
|
LL | &box MyOwned, //~ ERROR allocations are not allowed in statics
|
||||||
| ^^^^^^^^^^^ allocation not allowed in statics
|
| ^^^^^^^^^^^ allocation not allowed in statics
|
||||||
|
|
||||||
|
error[E0019]: static contains unimplemented expression type
|
||||||
|
--> $DIR/check-static-values-constraints.rs:112:10
|
||||||
|
|
|
||||||
|
LL | &box MyOwned, //~ ERROR allocations are not allowed in statics
|
||||||
|
| ^^^^^^^
|
||||||
|
|
||||||
error[E0010]: allocations are not allowed in statics
|
error[E0010]: allocations are not allowed in statics
|
||||||
--> $DIR/check-static-values-constraints.rs:110:6
|
--> $DIR/check-static-values-constraints.rs:114:6
|
||||||
|
|
|
|
||||||
LL | &box MyOwned, //~ ERROR allocations are not allowed in statics
|
LL | &box MyOwned, //~ ERROR allocations are not allowed in statics
|
||||||
| ^^^^^^^^^^^ allocation not allowed in statics
|
| ^^^^^^^^^^^ allocation not allowed in statics
|
||||||
|
|
||||||
|
error[E0019]: static contains unimplemented expression type
|
||||||
|
--> $DIR/check-static-values-constraints.rs:114:10
|
||||||
|
|
|
||||||
|
LL | &box MyOwned, //~ ERROR allocations are not allowed in statics
|
||||||
|
| ^^^^^^^
|
||||||
|
|
||||||
error[E0010]: allocations are not allowed in statics
|
error[E0010]: allocations are not allowed in statics
|
||||||
--> $DIR/check-static-values-constraints.rs:116:5
|
--> $DIR/check-static-values-constraints.rs:121:5
|
||||||
|
|
|
|
||||||
LL | box 3;
|
LL | box 3;
|
||||||
| ^^^^^ allocation not allowed in statics
|
| ^^^^^ allocation not allowed in statics
|
||||||
|
|
||||||
|
error[E0019]: static contains unimplemented expression type
|
||||||
|
--> $DIR/check-static-values-constraints.rs:121:9
|
||||||
|
|
|
||||||
|
LL | box 3;
|
||||||
|
| ^
|
||||||
|
|
||||||
error[E0507]: cannot move out of static item
|
error[E0507]: cannot move out of static item
|
||||||
--> $DIR/check-static-values-constraints.rs:120:45
|
--> $DIR/check-static-values-constraints.rs:126:45
|
||||||
|
|
|
|
||||||
LL | let y = { static x: Box<isize> = box 3; x };
|
LL | let y = { static x: Box<isize> = box 3; x };
|
||||||
| ^
|
| ^
|
||||||
@ -59,12 +95,18 @@ LL | let y = { static x: Box<isize> = box 3; x };
|
|||||||
| help: consider borrowing here: `&x`
|
| help: consider borrowing here: `&x`
|
||||||
|
|
||||||
error[E0010]: allocations are not allowed in statics
|
error[E0010]: allocations are not allowed in statics
|
||||||
--> $DIR/check-static-values-constraints.rs:120:38
|
--> $DIR/check-static-values-constraints.rs:126:38
|
||||||
|
|
|
|
||||||
LL | let y = { static x: Box<isize> = box 3; x };
|
LL | let y = { static x: Box<isize> = box 3; x };
|
||||||
| ^^^^^ allocation not allowed in statics
|
| ^^^^^ allocation not allowed in statics
|
||||||
|
|
||||||
error: aborting due to 10 previous errors
|
error[E0019]: static contains unimplemented expression type
|
||||||
|
--> $DIR/check-static-values-constraints.rs:126:42
|
||||||
|
|
|
||||||
|
LL | let y = { static x: Box<isize> = box 3; x };
|
||||||
|
| ^
|
||||||
|
|
||||||
Some errors occurred: E0010, E0015, E0493, E0507.
|
error: aborting due to 17 previous errors
|
||||||
|
|
||||||
|
Some errors occurred: E0010, E0015, E0019, E0493, E0507.
|
||||||
For more information about an error, try `rustc --explain E0010`.
|
For more information about an error, try `rustc --explain E0010`.
|
||||||
|
@ -88,6 +88,7 @@ struct MyOwned;
|
|||||||
|
|
||||||
static STATIC11: Box<MyOwned> = box MyOwned;
|
static STATIC11: Box<MyOwned> = box MyOwned;
|
||||||
//~^ ERROR allocations are not allowed in statics
|
//~^ ERROR allocations are not allowed in statics
|
||||||
|
//~| ERROR contains unimplemented expression type
|
||||||
|
|
||||||
static mut STATIC12: UnsafeStruct = UnsafeStruct;
|
static mut STATIC12: UnsafeStruct = UnsafeStruct;
|
||||||
|
|
||||||
@ -102,12 +103,16 @@ static mut STATIC14: SafeStruct = SafeStruct {
|
|||||||
|
|
||||||
static STATIC15: &'static [Box<MyOwned>] = &[
|
static STATIC15: &'static [Box<MyOwned>] = &[
|
||||||
box MyOwned, //~ ERROR allocations are not allowed in statics
|
box MyOwned, //~ ERROR allocations are not allowed in statics
|
||||||
|
//~^ ERROR contains unimplemented expression type
|
||||||
box MyOwned, //~ ERROR allocations are not allowed in statics
|
box MyOwned, //~ ERROR allocations are not allowed in statics
|
||||||
|
//~^ ERROR contains unimplemented expression type
|
||||||
];
|
];
|
||||||
|
|
||||||
static STATIC16: (&'static Box<MyOwned>, &'static Box<MyOwned>) = (
|
static STATIC16: (&'static Box<MyOwned>, &'static Box<MyOwned>) = (
|
||||||
&box MyOwned, //~ ERROR allocations are not allowed in statics
|
&box MyOwned, //~ ERROR allocations are not allowed in statics
|
||||||
|
//~^ ERROR contains unimplemented expression type
|
||||||
&box MyOwned, //~ ERROR allocations are not allowed in statics
|
&box MyOwned, //~ ERROR allocations are not allowed in statics
|
||||||
|
//~^ ERROR contains unimplemented expression type
|
||||||
);
|
);
|
||||||
|
|
||||||
static mut STATIC17: SafeEnum = SafeEnum::Variant1;
|
static mut STATIC17: SafeEnum = SafeEnum::Variant1;
|
||||||
@ -115,9 +120,11 @@ static mut STATIC17: SafeEnum = SafeEnum::Variant1;
|
|||||||
static STATIC19: Box<isize> =
|
static STATIC19: Box<isize> =
|
||||||
box 3;
|
box 3;
|
||||||
//~^ ERROR allocations are not allowed in statics
|
//~^ ERROR allocations are not allowed in statics
|
||||||
|
//~| ERROR contains unimplemented expression type
|
||||||
|
|
||||||
pub fn main() {
|
pub fn main() {
|
||||||
let y = { static x: Box<isize> = box 3; x };
|
let y = { static x: Box<isize> = box 3; x };
|
||||||
//~^ ERROR allocations are not allowed in statics
|
//~^ ERROR allocations are not allowed in statics
|
||||||
//~^^ ERROR cannot move out of static item
|
//~^^ ERROR cannot move out of static item
|
||||||
|
//~| ERROR contains unimplemented expression type
|
||||||
}
|
}
|
||||||
|
@ -13,55 +13,97 @@ error[E0010]: allocations are not allowed in statics
|
|||||||
LL | static STATIC11: Box<MyOwned> = box MyOwned;
|
LL | static STATIC11: Box<MyOwned> = box MyOwned;
|
||||||
| ^^^^^^^^^^^ allocation not allowed in statics
|
| ^^^^^^^^^^^ allocation not allowed in statics
|
||||||
|
|
||||||
|
error[E0019]: static contains unimplemented expression type
|
||||||
|
--> $DIR/check-static-values-constraints.rs:89:37
|
||||||
|
|
|
||||||
|
LL | static STATIC11: Box<MyOwned> = box MyOwned;
|
||||||
|
| ^^^^^^^
|
||||||
|
|
||||||
error[E0015]: calls in statics are limited to constant functions, tuple structs and tuple variants
|
error[E0015]: calls in statics are limited to constant functions, tuple structs and tuple variants
|
||||||
--> $DIR/check-static-values-constraints.rs:99:32
|
--> $DIR/check-static-values-constraints.rs:100:32
|
||||||
|
|
|
|
||||||
LL | field2: SafeEnum::Variant4("str".to_string())
|
LL | field2: SafeEnum::Variant4("str".to_string())
|
||||||
| ^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error[E0010]: allocations are not allowed in statics
|
|
||||||
--> $DIR/check-static-values-constraints.rs:104:5
|
|
||||||
|
|
|
||||||
LL | box MyOwned, //~ ERROR allocations are not allowed in statics
|
|
||||||
| ^^^^^^^^^^^ allocation not allowed in statics
|
|
||||||
|
|
||||||
error[E0010]: allocations are not allowed in statics
|
error[E0010]: allocations are not allowed in statics
|
||||||
--> $DIR/check-static-values-constraints.rs:105:5
|
--> $DIR/check-static-values-constraints.rs:105:5
|
||||||
|
|
|
|
||||||
LL | box MyOwned, //~ ERROR allocations are not allowed in statics
|
LL | box MyOwned, //~ ERROR allocations are not allowed in statics
|
||||||
| ^^^^^^^^^^^ allocation not allowed in statics
|
| ^^^^^^^^^^^ allocation not allowed in statics
|
||||||
|
|
||||||
|
error[E0019]: static contains unimplemented expression type
|
||||||
|
--> $DIR/check-static-values-constraints.rs:105:9
|
||||||
|
|
|
||||||
|
LL | box MyOwned, //~ ERROR allocations are not allowed in statics
|
||||||
|
| ^^^^^^^
|
||||||
|
|
||||||
error[E0010]: allocations are not allowed in statics
|
error[E0010]: allocations are not allowed in statics
|
||||||
--> $DIR/check-static-values-constraints.rs:109:6
|
--> $DIR/check-static-values-constraints.rs:107:5
|
||||||
|
|
|
||||||
|
LL | box MyOwned, //~ ERROR allocations are not allowed in statics
|
||||||
|
| ^^^^^^^^^^^ allocation not allowed in statics
|
||||||
|
|
||||||
|
error[E0019]: static contains unimplemented expression type
|
||||||
|
--> $DIR/check-static-values-constraints.rs:107:9
|
||||||
|
|
|
||||||
|
LL | box MyOwned, //~ ERROR allocations are not allowed in statics
|
||||||
|
| ^^^^^^^
|
||||||
|
|
||||||
|
error[E0010]: allocations are not allowed in statics
|
||||||
|
--> $DIR/check-static-values-constraints.rs:112:6
|
||||||
|
|
|
|
||||||
LL | &box MyOwned, //~ ERROR allocations are not allowed in statics
|
LL | &box MyOwned, //~ ERROR allocations are not allowed in statics
|
||||||
| ^^^^^^^^^^^ allocation not allowed in statics
|
| ^^^^^^^^^^^ allocation not allowed in statics
|
||||||
|
|
||||||
|
error[E0019]: static contains unimplemented expression type
|
||||||
|
--> $DIR/check-static-values-constraints.rs:112:10
|
||||||
|
|
|
||||||
|
LL | &box MyOwned, //~ ERROR allocations are not allowed in statics
|
||||||
|
| ^^^^^^^
|
||||||
|
|
||||||
error[E0010]: allocations are not allowed in statics
|
error[E0010]: allocations are not allowed in statics
|
||||||
--> $DIR/check-static-values-constraints.rs:110:6
|
--> $DIR/check-static-values-constraints.rs:114:6
|
||||||
|
|
|
|
||||||
LL | &box MyOwned, //~ ERROR allocations are not allowed in statics
|
LL | &box MyOwned, //~ ERROR allocations are not allowed in statics
|
||||||
| ^^^^^^^^^^^ allocation not allowed in statics
|
| ^^^^^^^^^^^ allocation not allowed in statics
|
||||||
|
|
||||||
|
error[E0019]: static contains unimplemented expression type
|
||||||
|
--> $DIR/check-static-values-constraints.rs:114:10
|
||||||
|
|
|
||||||
|
LL | &box MyOwned, //~ ERROR allocations are not allowed in statics
|
||||||
|
| ^^^^^^^
|
||||||
|
|
||||||
error[E0010]: allocations are not allowed in statics
|
error[E0010]: allocations are not allowed in statics
|
||||||
--> $DIR/check-static-values-constraints.rs:116:5
|
--> $DIR/check-static-values-constraints.rs:121:5
|
||||||
|
|
|
|
||||||
LL | box 3;
|
LL | box 3;
|
||||||
| ^^^^^ allocation not allowed in statics
|
| ^^^^^ allocation not allowed in statics
|
||||||
|
|
||||||
|
error[E0019]: static contains unimplemented expression type
|
||||||
|
--> $DIR/check-static-values-constraints.rs:121:9
|
||||||
|
|
|
||||||
|
LL | box 3;
|
||||||
|
| ^
|
||||||
|
|
||||||
error[E0507]: cannot move out of static item
|
error[E0507]: cannot move out of static item
|
||||||
--> $DIR/check-static-values-constraints.rs:120:45
|
--> $DIR/check-static-values-constraints.rs:126:45
|
||||||
|
|
|
|
||||||
LL | let y = { static x: Box<isize> = box 3; x };
|
LL | let y = { static x: Box<isize> = box 3; x };
|
||||||
| ^ cannot move out of static item
|
| ^ cannot move out of static item
|
||||||
|
|
||||||
error[E0010]: allocations are not allowed in statics
|
error[E0010]: allocations are not allowed in statics
|
||||||
--> $DIR/check-static-values-constraints.rs:120:38
|
--> $DIR/check-static-values-constraints.rs:126:38
|
||||||
|
|
|
|
||||||
LL | let y = { static x: Box<isize> = box 3; x };
|
LL | let y = { static x: Box<isize> = box 3; x };
|
||||||
| ^^^^^ allocation not allowed in statics
|
| ^^^^^ allocation not allowed in statics
|
||||||
|
|
||||||
error: aborting due to 10 previous errors
|
error[E0019]: static contains unimplemented expression type
|
||||||
|
--> $DIR/check-static-values-constraints.rs:126:42
|
||||||
|
|
|
||||||
|
LL | let y = { static x: Box<isize> = box 3; x };
|
||||||
|
| ^
|
||||||
|
|
||||||
Some errors occurred: E0010, E0015, E0493, E0507.
|
error: aborting due to 17 previous errors
|
||||||
|
|
||||||
|
Some errors occurred: E0010, E0015, E0019, E0493, E0507.
|
||||||
For more information about an error, try `rustc --explain E0010`.
|
For more information about an error, try `rustc --explain E0010`.
|
||||||
|
@ -8,21 +8,17 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
// compile-pass
|
||||||
|
|
||||||
const A: usize = { 1; 2 };
|
const A: usize = { 1; 2 };
|
||||||
//~^ ERROR statements in constants are unstable
|
|
||||||
|
|
||||||
const B: usize = { { } 2 };
|
const B: usize = { { } 2 };
|
||||||
//~^ ERROR statements in constants are unstable
|
|
||||||
|
|
||||||
macro_rules! foo {
|
macro_rules! foo {
|
||||||
() => (()) //~ ERROR statements in constants are unstable
|
() => (())
|
||||||
}
|
}
|
||||||
const C: usize = { foo!(); 2 };
|
const C: usize = { foo!(); 2 };
|
||||||
|
|
||||||
const D: usize = { let x = 4; 2 };
|
const D: usize = { let x = 4; 2 };
|
||||||
//~^ ERROR let bindings in constants are unstable
|
|
||||||
//~| ERROR statements in constants are unstable
|
|
||||||
//~| ERROR let bindings in constants are unstable
|
|
||||||
//~| ERROR statements in constants are unstable
|
|
||||||
|
|
||||||
pub fn main() {}
|
pub fn main() {}
|
||||||
|
@ -1,62 +0,0 @@
|
|||||||
error[E0658]: statements in constants are unstable (see issue #48821)
|
|
||||||
--> $DIR/const-block-non-item-statement-2.rs:11:20
|
|
||||||
|
|
|
||||||
LL | const A: usize = { 1; 2 };
|
|
||||||
| ^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0658]: statements in constants are unstable (see issue #48821)
|
|
||||||
--> $DIR/const-block-non-item-statement-2.rs:14:20
|
|
||||||
|
|
|
||||||
LL | const B: usize = { { } 2 };
|
|
||||||
| ^^^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0658]: statements in constants are unstable (see issue #48821)
|
|
||||||
--> $DIR/const-block-non-item-statement-2.rs:18:12
|
|
||||||
|
|
|
||||||
LL | () => (()) //~ ERROR statements in constants are unstable
|
|
||||||
| ^^
|
|
||||||
LL | }
|
|
||||||
LL | const C: usize = { foo!(); 2 };
|
|
||||||
| ------- in this macro invocation
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0658]: let bindings in constants are unstable (see issue #48821)
|
|
||||||
--> $DIR/const-block-non-item-statement-2.rs:22:28
|
|
||||||
|
|
|
||||||
LL | const D: usize = { let x = 4; 2 };
|
|
||||||
| ^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0658]: statements in constants are unstable (see issue #48821)
|
|
||||||
--> $DIR/const-block-non-item-statement-2.rs:22:28
|
|
||||||
|
|
|
||||||
LL | const D: usize = { let x = 4; 2 };
|
|
||||||
| ^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0658]: let bindings in constants are unstable (see issue #48821)
|
|
||||||
--> $DIR/const-block-non-item-statement-2.rs:22:1
|
|
||||||
|
|
|
||||||
LL | const D: usize = { let x = 4; 2 };
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0658]: statements in constants are unstable (see issue #48821)
|
|
||||||
--> $DIR/const-block-non-item-statement-2.rs:22:1
|
|
||||||
|
|
|
||||||
LL | const D: usize = { let x = 4; 2 };
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error: aborting due to 7 previous errors
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0658`.
|
|
@ -8,10 +8,8 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
// compile-pass
|
||||||
|
|
||||||
type Array = [u32; { let x = 2; 5 }];
|
type Array = [u32; { let x = 2; 5 }];
|
||||||
//~^ ERROR let bindings in constants are unstable
|
|
||||||
//~| ERROR statements in constants are unstable
|
|
||||||
//~| ERROR let bindings in constants are unstable
|
|
||||||
//~| ERROR statements in constants are unstable
|
|
||||||
|
|
||||||
pub fn main() {}
|
pub fn main() {}
|
||||||
|
@ -1,35 +0,0 @@
|
|||||||
error[E0658]: let bindings in constants are unstable (see issue #48821)
|
|
||||||
--> $DIR/const-block-non-item-statement-3.rs:11:31
|
|
||||||
|
|
|
||||||
LL | type Array = [u32; { let x = 2; 5 }];
|
|
||||||
| ^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0658]: statements in constants are unstable (see issue #48821)
|
|
||||||
--> $DIR/const-block-non-item-statement-3.rs:11:31
|
|
||||||
|
|
|
||||||
LL | type Array = [u32; { let x = 2; 5 }];
|
|
||||||
| ^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0658]: let bindings in constants are unstable (see issue #48821)
|
|
||||||
--> $DIR/const-block-non-item-statement-3.rs:11:20
|
|
||||||
|
|
|
||||||
LL | type Array = [u32; { let x = 2; 5 }];
|
|
||||||
| ^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0658]: statements in constants are unstable (see issue #48821)
|
|
||||||
--> $DIR/const-block-non-item-statement-3.rs:11:20
|
|
||||||
|
|
|
||||||
LL | type Array = [u32; { let x = 2; 5 }];
|
|
||||||
| ^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error: aborting due to 4 previous errors
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0658`.
|
|
@ -8,12 +8,10 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
// compile-pass
|
||||||
|
|
||||||
enum Foo {
|
enum Foo {
|
||||||
Bar = { let x = 1; 3 }
|
Bar = { let x = 1; 3 }
|
||||||
//~^ ERROR let bindings in constants are unstable
|
|
||||||
//~| ERROR statements in constants are unstable
|
|
||||||
//~| ERROR let bindings in constants are unstable
|
|
||||||
//~| ERROR statements in constants are unstable
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn main() {}
|
pub fn main() {}
|
||||||
|
@ -1,35 +0,0 @@
|
|||||||
error[E0658]: let bindings in constants are unstable (see issue #48821)
|
|
||||||
--> $DIR/const-block-non-item-statement.rs:12:21
|
|
||||||
|
|
|
||||||
LL | Bar = { let x = 1; 3 }
|
|
||||||
| ^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0658]: statements in constants are unstable (see issue #48821)
|
|
||||||
--> $DIR/const-block-non-item-statement.rs:12:21
|
|
||||||
|
|
|
||||||
LL | Bar = { let x = 1; 3 }
|
|
||||||
| ^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0658]: let bindings in constants are unstable (see issue #48821)
|
|
||||||
--> $DIR/const-block-non-item-statement.rs:12:11
|
|
||||||
|
|
|
||||||
LL | Bar = { let x = 1; 3 }
|
|
||||||
| ^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0658]: statements in constants are unstable (see issue #48821)
|
|
||||||
--> $DIR/const-block-non-item-statement.rs:12:11
|
|
||||||
|
|
|
||||||
LL | Bar = { let x = 1; 3 }
|
|
||||||
| ^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error: aborting due to 4 previous errors
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0658`.
|
|
@ -12,7 +12,6 @@
|
|||||||
// The test should never compile successfully
|
// The test should never compile successfully
|
||||||
|
|
||||||
#![feature(const_raw_ptr_deref)]
|
#![feature(const_raw_ptr_deref)]
|
||||||
#![feature(const_let)]
|
|
||||||
|
|
||||||
use std::cell::UnsafeCell;
|
use std::cell::UnsafeCell;
|
||||||
|
|
||||||
@ -24,7 +23,7 @@ unsafe impl Sync for Foo {}
|
|||||||
static FOO: Foo = Foo(UnsafeCell::new(42));
|
static FOO: Foo = Foo(UnsafeCell::new(42));
|
||||||
|
|
||||||
static BAR: () = unsafe {
|
static BAR: () = unsafe {
|
||||||
*FOO.0.get() = 5; //~ ERROR could not evaluate static initializer
|
*FOO.0.get() = 5; //~ ERROR static contains unimplemented expression type
|
||||||
};
|
};
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
error[E0080]: could not evaluate static initializer
|
error[E0019]: static contains unimplemented expression type
|
||||||
--> $DIR/assign-to-static-within-other-static-2.rs:27:5
|
--> $DIR/assign-to-static-within-other-static-2.rs:26:5
|
||||||
|
|
|
|
||||||
LL | *FOO.0.get() = 5; //~ ERROR could not evaluate static initializer
|
LL | *FOO.0.get() = 5; //~ ERROR static contains unimplemented expression type
|
||||||
| ^^^^^^^^^^^^^^^^ tried to modify a static's initial value from another static's initializer
|
| ^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0080`.
|
For more information about this error, try `rustc --explain E0019`.
|
||||||
|
@ -12,7 +12,6 @@
|
|||||||
// The test should never compile successfully
|
// The test should never compile successfully
|
||||||
|
|
||||||
#![feature(const_raw_ptr_deref)]
|
#![feature(const_raw_ptr_deref)]
|
||||||
#![feature(const_let)]
|
|
||||||
|
|
||||||
use std::cell::UnsafeCell;
|
use std::cell::UnsafeCell;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error: cannot mutate statics in the initializer of another static
|
error: cannot mutate statics in the initializer of another static
|
||||||
--> $DIR/assign-to-static-within-other-static.rs:21:5
|
--> $DIR/assign-to-static-within-other-static.rs:20:5
|
||||||
|
|
|
|
||||||
LL | FOO = 5; //~ ERROR cannot mutate statics in the initializer of another static
|
LL | FOO = 5; //~ ERROR cannot mutate statics in the initializer of another static
|
||||||
| ^^^^^^^
|
| ^^^^^^^
|
||||||
|
@ -8,8 +8,6 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
#![feature(const_let)]
|
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
struct FakeNeedsDrop;
|
struct FakeNeedsDrop;
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
error[E0019]: constant contains unimplemented expression type
|
error[E0019]: constant contains unimplemented expression type
|
||||||
--> $DIR/const_let.rs:25:55
|
--> $DIR/const_let.rs:23:55
|
||||||
|
|
|
|
||||||
LL | const Y: FakeNeedsDrop = { let mut x = FakeNeedsDrop; x = FakeNeedsDrop; x };
|
LL | const Y: FakeNeedsDrop = { let mut x = FakeNeedsDrop; x = FakeNeedsDrop; x };
|
||||||
| ^
|
| ^
|
||||||
|
|
||||||
error[E0019]: constant contains unimplemented expression type
|
error[E0019]: constant contains unimplemented expression type
|
||||||
--> $DIR/const_let.rs:29:35
|
--> $DIR/const_let.rs:27:35
|
||||||
|
|
|
|
||||||
LL | const Z: () = { let mut x = None; x = Some(FakeNeedsDrop); };
|
LL | const Z: () = { let mut x = None; x = Some(FakeNeedsDrop); };
|
||||||
| ^
|
| ^
|
||||||
|
@ -8,8 +8,6 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
#![feature(const_let)]
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
// Tests the Collatz conjecture with an incorrect base case (0 instead of 1).
|
// Tests the Collatz conjecture with an incorrect base case (0 instead of 1).
|
||||||
// The value of `n` will loop indefinitely (4 - 2 - 1 - 4).
|
// The value of `n` will loop indefinitely (4 - 2 - 1 - 4).
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error[E0019]: constant contains unimplemented expression type
|
error[E0019]: constant contains unimplemented expression type
|
||||||
--> $DIR/infinite_loop.rs:19:9
|
--> $DIR/infinite_loop.rs:17:9
|
||||||
|
|
|
|
||||||
LL | / while n != 0 { //~ ERROR constant contains unimplemented expression type
|
LL | / while n != 0 { //~ ERROR constant contains unimplemented expression type
|
||||||
LL | | n = if n % 2 == 0 { n/2 } else { 3*n + 1 };
|
LL | | n = if n % 2 == 0 { n/2 } else { 3*n + 1 };
|
||||||
@ -8,7 +8,7 @@ LL | | }
|
|||||||
| |_________^
|
| |_________^
|
||||||
|
|
||||||
warning: Constant evaluating a complex constant, this might take some time
|
warning: Constant evaluating a complex constant, this might take some time
|
||||||
--> $DIR/infinite_loop.rs:16:18
|
--> $DIR/infinite_loop.rs:14:18
|
||||||
|
|
|
|
||||||
LL | let _ = [(); {
|
LL | let _ = [(); {
|
||||||
| __________________^
|
| __________________^
|
||||||
@ -21,7 +21,7 @@ LL | | }];
|
|||||||
| |_____^
|
| |_____^
|
||||||
|
|
||||||
error[E0080]: evaluation of constant value failed
|
error[E0080]: evaluation of constant value failed
|
||||||
--> $DIR/infinite_loop.rs:20:20
|
--> $DIR/infinite_loop.rs:18:20
|
||||||
|
|
|
|
||||||
LL | n = if n % 2 == 0 { n/2 } else { 3*n + 1 };
|
LL | n = if n % 2 == 0 { n/2 } else { 3*n + 1 };
|
||||||
| ^^^^^^^^^^ duplicate interpreter state observed here, const evaluation will never terminate
|
| ^^^^^^^^^^ duplicate interpreter state observed here, const evaluation will never terminate
|
||||||
|
@ -8,8 +8,6 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
#![feature(const_let)]
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let _ = [(); {
|
let _ = [(); {
|
||||||
//~^ WARNING Constant evaluating a complex constant, this might take some time
|
//~^ WARNING Constant evaluating a complex constant, this might take some time
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error[E0019]: constant contains unimplemented expression type
|
error[E0019]: constant contains unimplemented expression type
|
||||||
--> $DIR/issue-52475.rs:18:9
|
--> $DIR/issue-52475.rs:16:9
|
||||||
|
|
|
|
||||||
LL | / while n < 5 { //~ ERROR constant contains unimplemented expression type
|
LL | / while n < 5 { //~ ERROR constant contains unimplemented expression type
|
||||||
LL | | n = (n + 1) % 5; //~ ERROR evaluation of constant value failed
|
LL | | n = (n + 1) % 5; //~ ERROR evaluation of constant value failed
|
||||||
@ -8,7 +8,7 @@ LL | | }
|
|||||||
| |_________^
|
| |_________^
|
||||||
|
|
||||||
warning: Constant evaluating a complex constant, this might take some time
|
warning: Constant evaluating a complex constant, this might take some time
|
||||||
--> $DIR/issue-52475.rs:14:18
|
--> $DIR/issue-52475.rs:12:18
|
||||||
|
|
|
|
||||||
LL | let _ = [(); {
|
LL | let _ = [(); {
|
||||||
| __________________^
|
| __________________^
|
||||||
@ -21,7 +21,7 @@ LL | | }];
|
|||||||
| |_____^
|
| |_____^
|
||||||
|
|
||||||
error[E0080]: evaluation of constant value failed
|
error[E0080]: evaluation of constant value failed
|
||||||
--> $DIR/issue-52475.rs:19:17
|
--> $DIR/issue-52475.rs:17:17
|
||||||
|
|
|
|
||||||
LL | n = (n + 1) % 5; //~ ERROR evaluation of constant value failed
|
LL | n = (n + 1) % 5; //~ ERROR evaluation of constant value failed
|
||||||
| ^^^^^^^^^^^ duplicate interpreter state observed here, const evaluation will never terminate
|
| ^^^^^^^^^^^ duplicate interpreter state observed here, const evaluation will never terminate
|
||||||
|
@ -12,7 +12,6 @@
|
|||||||
// The test should never compile successfully
|
// The test should never compile successfully
|
||||||
|
|
||||||
#![feature(const_raw_ptr_deref)]
|
#![feature(const_raw_ptr_deref)]
|
||||||
#![feature(const_let)]
|
|
||||||
|
|
||||||
use std::cell::UnsafeCell;
|
use std::cell::UnsafeCell;
|
||||||
|
|
||||||
@ -27,9 +26,7 @@ fn foo() {}
|
|||||||
|
|
||||||
static BAR: () = unsafe {
|
static BAR: () = unsafe {
|
||||||
*FOO.0.get() = 5;
|
*FOO.0.get() = 5;
|
||||||
// we do not error on the above access, because that is not detectable statically. Instead,
|
//~^ ERROR static contains unimplemented expression
|
||||||
// const evaluation will error when trying to evaluate it. Due to the error below, we never even
|
|
||||||
// attempt to const evaluate `BAR`, so we don't see the error
|
|
||||||
|
|
||||||
foo();
|
foo();
|
||||||
//~^ ERROR calls in statics are limited to constant functions, tuple structs and tuple variants
|
//~^ ERROR calls in statics are limited to constant functions, tuple structs and tuple variants
|
||||||
|
@ -1,9 +1,16 @@
|
|||||||
|
error[E0019]: static contains unimplemented expression type
|
||||||
|
--> $DIR/mod-static-with-const-fn.rs:28:5
|
||||||
|
|
|
||||||
|
LL | *FOO.0.get() = 5;
|
||||||
|
| ^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error[E0015]: calls in statics are limited to constant functions, tuple structs and tuple variants
|
error[E0015]: calls in statics are limited to constant functions, tuple structs and tuple variants
|
||||||
--> $DIR/mod-static-with-const-fn.rs:34:5
|
--> $DIR/mod-static-with-const-fn.rs:31:5
|
||||||
|
|
|
|
||||||
LL | foo();
|
LL | foo();
|
||||||
| ^^^^^
|
| ^^^^^
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0015`.
|
Some errors occurred: E0015, E0019.
|
||||||
|
For more information about an error, try `rustc --explain E0015`.
|
||||||
|
@ -20,17 +20,6 @@ LL | let y: &'static usize = &(&1 as *const i32 as usize + 1); //~ ERROR doe
|
|||||||
LL | }
|
LL | }
|
||||||
| - temporary value is freed at the end of this statement
|
| - temporary value is freed at the end of this statement
|
||||||
|
|
||||||
error[E0716]: temporary value dropped while borrowed
|
|
||||||
--> $DIR/promoted_raw_ptr_ops.rs:17:28
|
|
||||||
|
|
|
||||||
LL | let z: &'static i32 = &(unsafe { *(42 as *const i32) }); //~ ERROR does not live long enough
|
|
||||||
| ------------ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ creates a temporary which is freed while still in use
|
|
||||||
| |
|
|
||||||
| type annotation requires that borrow lasts for `'static`
|
|
||||||
LL | let a: &'static bool = &(main as fn() == main as fn()); //~ ERROR does not live long enough
|
|
||||||
LL | }
|
|
||||||
| - temporary value is freed at the end of this statement
|
|
||||||
|
|
||||||
error[E0716]: temporary value dropped while borrowed
|
error[E0716]: temporary value dropped while borrowed
|
||||||
--> $DIR/promoted_raw_ptr_ops.rs:18:29
|
--> $DIR/promoted_raw_ptr_ops.rs:18:29
|
||||||
|
|
|
|
||||||
@ -41,6 +30,6 @@ LL | let a: &'static bool = &(main as fn() == main as fn()); //~ ERROR does
|
|||||||
LL | }
|
LL | }
|
||||||
| - temporary value is freed at the end of this statement
|
| - temporary value is freed at the end of this statement
|
||||||
|
|
||||||
error: aborting due to 4 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0716`.
|
For more information about this error, try `rustc --explain E0716`.
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
#![feature(const_transmute,const_let)]
|
#![feature(const_transmute)]
|
||||||
#![allow(const_err)] // make sure we cannot allow away the errors tested here
|
#![allow(const_err)] // make sure we cannot allow away the errors tested here
|
||||||
|
|
||||||
use std::mem;
|
use std::mem;
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
// compile-pass
|
// compile-pass
|
||||||
|
|
||||||
#![feature(const_let)]
|
|
||||||
|
|
||||||
struct S(i32);
|
struct S(i32);
|
||||||
|
|
||||||
const A: () = {
|
const A: () = {
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
#![feature(const_let)]
|
|
||||||
#![feature(const_fn)]
|
#![feature(const_fn)]
|
||||||
|
|
||||||
struct S {
|
struct S {
|
||||||
@ -8,6 +7,7 @@ struct S {
|
|||||||
impl S {
|
impl S {
|
||||||
const fn foo(&mut self, x: u32) {
|
const fn foo(&mut self, x: u32) {
|
||||||
self.state = x;
|
self.state = x;
|
||||||
|
//~^ ERROR constant function contains unimplemented expression
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,9 +1,16 @@
|
|||||||
|
error[E0019]: constant function contains unimplemented expression type
|
||||||
|
--> $DIR/const_let_assign3.rs:9:9
|
||||||
|
|
|
||||||
|
LL | self.state = x;
|
||||||
|
| ^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error[E0017]: references in constants may only refer to immutable values
|
error[E0017]: references in constants may only refer to immutable values
|
||||||
--> $DIR/const_let_assign3.rs:16:5
|
--> $DIR/const_let_assign3.rs:16:5
|
||||||
|
|
|
|
||||||
LL | s.foo(3); //~ ERROR references in constants may only refer to immutable values
|
LL | s.foo(3); //~ ERROR references in constants may only refer to immutable values
|
||||||
| ^ constants require immutable values
|
| ^ constants require immutable values
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0017`.
|
Some errors occurred: E0017, E0019.
|
||||||
|
For more information about an error, try `rustc --explain E0017`.
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
// https://github.com/rust-lang/rust/issues/55223
|
// https://github.com/rust-lang/rust/issues/55223
|
||||||
|
|
||||||
#![feature(const_let)]
|
|
||||||
|
|
||||||
union Foo<'a> {
|
union Foo<'a> {
|
||||||
y: &'a (),
|
y: &'a (),
|
||||||
long_live_the_unit: &'static (),
|
long_live_the_unit: &'static (),
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error: any use of this value will cause an error
|
error: any use of this value will cause an error
|
||||||
--> $DIR/dangling-alloc-id-ice.rs:10:1
|
--> $DIR/dangling-alloc-id-ice.rs:8:1
|
||||||
|
|
|
|
||||||
LL | / const FOO: &() = { //~ ERROR any use of this value will cause an error
|
LL | / const FOO: &() = { //~ ERROR any use of this value will cause an error
|
||||||
LL | | let y = ();
|
LL | | let y = ();
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
#![feature(const_let)]
|
|
||||||
|
|
||||||
const FOO: *const u32 = { //~ ERROR any use of this value will cause an error
|
const FOO: *const u32 = { //~ ERROR any use of this value will cause an error
|
||||||
let x = 42;
|
let x = 42;
|
||||||
&x
|
&x
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error: any use of this value will cause an error
|
error: any use of this value will cause an error
|
||||||
--> $DIR/dangling_raw_ptr.rs:3:1
|
--> $DIR/dangling_raw_ptr.rs:1:1
|
||||||
|
|
|
|
||||||
LL | / const FOO: *const u32 = { //~ ERROR any use of this value will cause an error
|
LL | / const FOO: *const u32 = { //~ ERROR any use of this value will cause an error
|
||||||
LL | | let x = 42;
|
LL | | let x = 42;
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
|
// compile-pass
|
||||||
|
|
||||||
#![feature(nll)]
|
#![feature(nll)]
|
||||||
|
|
||||||
const FOO: Option<&[[u8; 3]]> = Some(&[*b"foo"]); //~ ERROR temporary value dropped while borrowed
|
const FOO: Option<&[[u8; 3]]> = Some(&[*b"foo"]);
|
||||||
|
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
|
|
||||||
@ -9,6 +11,5 @@ pub const Y: Cow<'static, [ [u8; 3] ]> = Cow::Borrowed(&[X]);
|
|||||||
|
|
||||||
|
|
||||||
pub const Z: Cow<'static, [ [u8; 3] ]> = Cow::Borrowed(&[*b"ABC"]);
|
pub const Z: Cow<'static, [ [u8; 3] ]> = Cow::Borrowed(&[*b"ABC"]);
|
||||||
//~^ ERROR temporary value dropped while borrowed
|
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -1,23 +0,0 @@
|
|||||||
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
|
|
||||||
| using this value as a constant requires that borrow lasts for `'static`
|
|
||||||
|
|
||||||
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
|
|
||||||
| using this value as a constant requires that borrow lasts for `'static`
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0716`.
|
|
51
src/test/ui/consts/min_const_fn/mutable_borrow.nll.stderr
Normal file
51
src/test/ui/consts/min_const_fn/mutable_borrow.nll.stderr
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
error: mutable references in const fn are unstable
|
||||||
|
--> $DIR/mutable_borrow.rs:3:9
|
||||||
|
|
|
||||||
|
LL | let b = &mut a; //~ ERROR mutable references in const fn are unstable
|
||||||
|
| ^
|
||||||
|
|
||||||
|
error: mutable references in const fn are unstable
|
||||||
|
--> $DIR/mutable_borrow.rs:12:13
|
||||||
|
|
|
||||||
|
LL | let b = &mut a; //~ ERROR mutable references in const fn are unstable
|
||||||
|
| ^
|
||||||
|
|
||||||
|
error[E0017]: references in statics may only refer to immutable values
|
||||||
|
--> $DIR/mutable_borrow.rs:19:13
|
||||||
|
|
|
||||||
|
LL | let b = &mut a; //~ references in statics may only refer to immutable
|
||||||
|
| ^^^^^^ statics require immutable values
|
||||||
|
|
||||||
|
error[E0017]: references in statics may only refer to immutable values
|
||||||
|
--> $DIR/mutable_borrow.rs:26:15
|
||||||
|
|
|
||||||
|
LL | { let b = &mut a; } //~ references in statics may only refer to immutable
|
||||||
|
| ^^^^^^ statics require immutable values
|
||||||
|
|
||||||
|
error[E0017]: references in statics may only refer to immutable values
|
||||||
|
--> $DIR/mutable_borrow.rs:37:17
|
||||||
|
|
|
||||||
|
LL | let mut a = &mut None; //~ references in statics may only refer to immutable values
|
||||||
|
| ^^^^^^^^^ statics require immutable values
|
||||||
|
|
||||||
|
error[E0019]: static contains unimplemented expression type
|
||||||
|
--> $DIR/mutable_borrow.rs:39:5
|
||||||
|
|
|
||||||
|
LL | *a = Some(Foo); //~ unimplemented expression type
|
||||||
|
| ^^
|
||||||
|
|
||||||
|
error[E0716]: temporary value dropped while borrowed
|
||||||
|
--> $DIR/mutable_borrow.rs:37:22
|
||||||
|
|
|
||||||
|
LL | let mut a = &mut None; //~ references in statics may only refer to immutable values
|
||||||
|
| ^^^^ creates a temporary which is freed while still in use
|
||||||
|
...
|
||||||
|
LL | a
|
||||||
|
| - using this value as a static requires that borrow lasts for `'static`
|
||||||
|
LL | };
|
||||||
|
| - temporary value is freed at the end of this statement
|
||||||
|
|
||||||
|
error: aborting due to 7 previous errors
|
||||||
|
|
||||||
|
Some errors occurred: E0017, E0019, E0716.
|
||||||
|
For more information about an error, try `rustc --explain E0017`.
|
@ -14,4 +14,30 @@ impl X {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static mut FOO: u32 = {
|
||||||
|
let mut a = 0;
|
||||||
|
let b = &mut a; //~ references in statics may only refer to immutable
|
||||||
|
*b
|
||||||
|
};
|
||||||
|
|
||||||
|
static mut BAR: Option<String> = {
|
||||||
|
let mut a = None;
|
||||||
|
// taking a mutable reference erases everything we know about `a`
|
||||||
|
{ let b = &mut a; } //~ references in statics may only refer to immutable
|
||||||
|
a
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Foo;
|
||||||
|
|
||||||
|
impl Drop for Foo {
|
||||||
|
fn drop(&mut self) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
static mut BAR2: &mut Option<Foo> = {
|
||||||
|
let mut a = &mut None; //~ references in statics may only refer to immutable values
|
||||||
|
//~^ does not live long enough
|
||||||
|
*a = Some(Foo); //~ unimplemented expression type
|
||||||
|
a
|
||||||
|
};
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -10,5 +10,42 @@ error: mutable references in const fn are unstable
|
|||||||
LL | let b = &mut a; //~ ERROR mutable references in const fn are unstable
|
LL | let b = &mut a; //~ ERROR mutable references in const fn are unstable
|
||||||
| ^
|
| ^
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error[E0017]: references in statics may only refer to immutable values
|
||||||
|
--> $DIR/mutable_borrow.rs:19:13
|
||||||
|
|
|
||||||
|
LL | let b = &mut a; //~ references in statics may only refer to immutable
|
||||||
|
| ^^^^^^ statics require immutable values
|
||||||
|
|
||||||
|
error[E0017]: references in statics may only refer to immutable values
|
||||||
|
--> $DIR/mutable_borrow.rs:26:15
|
||||||
|
|
|
||||||
|
LL | { let b = &mut a; } //~ references in statics may only refer to immutable
|
||||||
|
| ^^^^^^ statics require immutable values
|
||||||
|
|
||||||
|
error[E0017]: references in statics may only refer to immutable values
|
||||||
|
--> $DIR/mutable_borrow.rs:37:17
|
||||||
|
|
|
||||||
|
LL | let mut a = &mut None; //~ references in statics may only refer to immutable values
|
||||||
|
| ^^^^^^^^^ statics require immutable values
|
||||||
|
|
||||||
|
error[E0019]: static contains unimplemented expression type
|
||||||
|
--> $DIR/mutable_borrow.rs:39:5
|
||||||
|
|
|
||||||
|
LL | *a = Some(Foo); //~ unimplemented expression type
|
||||||
|
| ^^
|
||||||
|
|
||||||
|
error[E0597]: borrowed value does not live long enough
|
||||||
|
--> $DIR/mutable_borrow.rs:37:22
|
||||||
|
|
|
||||||
|
LL | let mut a = &mut None; //~ references in statics may only refer to immutable values
|
||||||
|
| ^^^^ 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 7 previous errors
|
||||||
|
|
||||||
|
Some errors occurred: E0017, E0019, E0597.
|
||||||
|
For more information about an error, try `rustc --explain E0017`.
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
#![feature(const_let)]
|
|
||||||
|
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
|
|
||||||
const FOO: &(Cell<usize>, bool) = {
|
const FOO: &(Cell<usize>, bool) = {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error[E0492]: cannot borrow a constant which may contain interior mutability, create a static instead
|
error[E0492]: cannot borrow a constant which may contain interior mutability, create a static instead
|
||||||
--> $DIR/partial_qualif.rs:8:5
|
--> $DIR/partial_qualif.rs:6:5
|
||||||
|
|
|
|
||||||
LL | &{a} //~ ERROR cannot borrow a constant which may contain interior mutability
|
LL | &{a} //~ ERROR cannot borrow a constant which may contain interior mutability
|
||||||
| ^^^^
|
| ^^^^
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
#![feature(const_let)]
|
|
||||||
|
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
|
|
||||||
const FOO: &u32 = {
|
const FOO: &u32 = {
|
||||||
@ -7,6 +5,7 @@ const FOO: &u32 = {
|
|||||||
{
|
{
|
||||||
let b: *mut u32 = &mut a; //~ ERROR may only refer to immutable values
|
let b: *mut u32 = &mut a; //~ ERROR may only refer to immutable values
|
||||||
unsafe { *b = 5; } //~ ERROR dereferencing raw pointers in constants
|
unsafe { *b = 5; } //~ ERROR dereferencing raw pointers in constants
|
||||||
|
//~^ ERROR constant contains unimplemented expression
|
||||||
}
|
}
|
||||||
&{a}
|
&{a}
|
||||||
};
|
};
|
||||||
|
@ -1,18 +1,24 @@
|
|||||||
error[E0017]: references in constants may only refer to immutable values
|
error[E0017]: references in constants may only refer to immutable values
|
||||||
--> $DIR/projection_qualif.rs:8:27
|
--> $DIR/projection_qualif.rs:6:27
|
||||||
|
|
|
|
||||||
LL | let b: *mut u32 = &mut a; //~ ERROR may only refer to immutable values
|
LL | let b: *mut u32 = &mut a; //~ ERROR may only refer to immutable values
|
||||||
| ^^^^^^ constants require immutable values
|
| ^^^^^^ constants require immutable values
|
||||||
|
|
||||||
|
error[E0019]: constant contains unimplemented expression type
|
||||||
|
--> $DIR/projection_qualif.rs:7:18
|
||||||
|
|
|
||||||
|
LL | unsafe { *b = 5; } //~ ERROR dereferencing raw pointers in constants
|
||||||
|
| ^^^^^^
|
||||||
|
|
||||||
error[E0658]: dereferencing raw pointers in constants is unstable (see issue #51911)
|
error[E0658]: dereferencing raw pointers in constants is unstable (see issue #51911)
|
||||||
--> $DIR/projection_qualif.rs:9:18
|
--> $DIR/projection_qualif.rs:7:18
|
||||||
|
|
|
|
||||||
LL | unsafe { *b = 5; } //~ ERROR dereferencing raw pointers in constants
|
LL | unsafe { *b = 5; } //~ ERROR dereferencing raw pointers in constants
|
||||||
| ^^^^^^
|
| ^^^^^^
|
||||||
|
|
|
|
||||||
= help: add #![feature(const_raw_ptr_deref)] to the crate attributes to enable
|
= help: add #![feature(const_raw_ptr_deref)] to the crate attributes to enable
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
Some errors occurred: E0017, E0658.
|
Some errors occurred: E0017, E0019, E0658.
|
||||||
For more information about an error, try `rustc --explain E0017`.
|
For more information about an error, try `rustc --explain E0017`.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error[E0597]: `y` does not live long enough
|
error[E0597]: `y` does not live long enough
|
||||||
--> $DIR/promote_const_let.rs:6:9
|
--> $DIR/promote_const_let.rs:4:9
|
||||||
|
|
|
|
||||||
LL | let x: &'static u32 = {
|
LL | let x: &'static u32 = {
|
||||||
| ------------ type annotation requires that `y` is borrowed for `'static`
|
| ------------ type annotation requires that `y` is borrowed for `'static`
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
#![feature(const_let)]
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let x: &'static u32 = {
|
let x: &'static u32 = {
|
||||||
let y = 42;
|
let y = 42;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error[E0597]: `y` does not live long enough
|
error[E0597]: `y` does not live long enough
|
||||||
--> $DIR/promote_const_let.rs:6:10
|
--> $DIR/promote_const_let.rs:4:10
|
||||||
|
|
|
|
||||||
LL | &y //~ ERROR does not live long enough
|
LL | &y //~ ERROR does not live long enough
|
||||||
| ^ borrowed value does not live long enough
|
| ^ borrowed value does not live long enough
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
#![feature(const_let)]
|
|
||||||
|
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
|
|
||||||
// this is overly conservative. The reset to `None` should clear `a` of all qualifications
|
// this is overly conservative. The reset to `None` should clear `a` of all qualifications
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error[E0492]: cannot borrow a constant which may contain interior mutability, create a static instead
|
error[E0492]: cannot borrow a constant which may contain interior mutability, create a static instead
|
||||||
--> $DIR/qualif_overwrite.rs:12:5
|
--> $DIR/qualif_overwrite.rs:10:5
|
||||||
|
|
|
|
||||||
LL | &{a} //~ ERROR cannot borrow a constant which may contain interior mutability
|
LL | &{a} //~ ERROR cannot borrow a constant which may contain interior mutability
|
||||||
| ^^^^
|
| ^^^^
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
#![feature(const_let)]
|
|
||||||
|
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
|
|
||||||
// const qualification is not smart enough to know about fields and always assumes that there might
|
// const qualification is not smart enough to know about fields and always assumes that there might
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error[E0492]: cannot borrow a constant which may contain interior mutability, create a static instead
|
error[E0492]: cannot borrow a constant which may contain interior mutability, create a static instead
|
||||||
--> $DIR/qualif_overwrite_2.rs:10:5
|
--> $DIR/qualif_overwrite_2.rs:8:5
|
||||||
|
|
|
|
||||||
LL | &{a.0} //~ ERROR cannot borrow a constant which may contain interior mutability
|
LL | &{a.0} //~ ERROR cannot borrow a constant which may contain interior mutability
|
||||||
| ^^^^^^
|
| ^^^^^^
|
||||||
|
@ -14,5 +14,6 @@
|
|||||||
#![allow(warnings)]
|
#![allow(warnings)]
|
||||||
|
|
||||||
const CON : Box<i32> = box 0; //~ ERROR E0010
|
const CON : Box<i32> = box 0; //~ ERROR E0010
|
||||||
|
//~^ ERROR contains unimplemented expression type
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -6,6 +6,16 @@ LL | const CON : Box<i32> = box 0; //~ ERROR E0010
|
|||||||
|
|
|
|
||||||
= note: The value of statics and constants must be known at compile time, and they live for the entire lifetime of a program. Creating a boxed value allocates memory on the heap at runtime, and therefore cannot be done at compile time.
|
= note: The value of statics and constants must be known at compile time, and they live for the entire lifetime of a program. Creating a boxed value allocates memory on the heap at runtime, and therefore cannot be done at compile time.
|
||||||
|
|
||||||
error: aborting due to previous error
|
error[E0019]: constant contains unimplemented expression type
|
||||||
|
--> $DIR/E0010-teach.rs:16:28
|
||||||
|
|
|
||||||
|
LL | const CON : Box<i32> = box 0; //~ ERROR E0010
|
||||||
|
| ^
|
||||||
|
|
|
||||||
|
= note: A function call isn't allowed in the const's initialization expression because the expression's value must be known at compile-time.
|
||||||
|
= note: Remember: you can't use a function call inside a const's initialization expression! However, you can use it anywhere else.
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0010`.
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
Some errors occurred: E0010, E0019.
|
||||||
|
For more information about an error, try `rustc --explain E0010`.
|
||||||
|
@ -12,5 +12,6 @@
|
|||||||
#![allow(warnings)]
|
#![allow(warnings)]
|
||||||
|
|
||||||
const CON : Box<i32> = box 0; //~ ERROR E0010
|
const CON : Box<i32> = box 0; //~ ERROR E0010
|
||||||
|
//~^ ERROR contains unimplemented expression type
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -4,6 +4,13 @@ error[E0010]: allocations are not allowed in constants
|
|||||||
LL | const CON : Box<i32> = box 0; //~ ERROR E0010
|
LL | const CON : Box<i32> = box 0; //~ ERROR E0010
|
||||||
| ^^^^^ allocation not allowed in constants
|
| ^^^^^ allocation not allowed in constants
|
||||||
|
|
||||||
error: aborting due to previous error
|
error[E0019]: constant contains unimplemented expression type
|
||||||
|
--> $DIR/E0010.rs:14:28
|
||||||
|
|
|
||||||
|
LL | const CON : Box<i32> = box 0; //~ ERROR E0010
|
||||||
|
| ^
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0010`.
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
Some errors occurred: E0010, E0019.
|
||||||
|
For more information about an error, try `rustc --explain E0010`.
|
||||||
|
@ -7,7 +7,6 @@
|
|||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
#![feature(const_let)]
|
|
||||||
|
|
||||||
trait Trt {}
|
trait Trt {}
|
||||||
struct Str {}
|
struct Str {}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error[E0658]: naming constants with `_` is unstable (see issue #54912)
|
error[E0658]: naming constants with `_` is unstable (see issue #54912)
|
||||||
--> $DIR/feature-gate-underscore_const_names.rs:17:1
|
--> $DIR/feature-gate-underscore_const_names.rs:16:1
|
||||||
|
|
|
|
||||||
LL | / const _ : () = {
|
LL | / const _ : () = {
|
||||||
LL | | use std::marker::PhantomData;
|
LL | | use std::marker::PhantomData;
|
||||||
|
@ -1,31 +0,0 @@
|
|||||||
// 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.
|
|
||||||
|
|
||||||
// Test use of const let without feature gate.
|
|
||||||
|
|
||||||
const FOO: usize = {
|
|
||||||
//~^ ERROR statements in constants are unstable
|
|
||||||
//~| ERROR: let bindings in constants are unstable
|
|
||||||
let x = 42;
|
|
||||||
//~^ ERROR statements in constants are unstable
|
|
||||||
//~| ERROR: let bindings in constants are unstable
|
|
||||||
42
|
|
||||||
};
|
|
||||||
|
|
||||||
static BAR: usize = {
|
|
||||||
//~^ ERROR statements in statics are unstable
|
|
||||||
//~| ERROR: let bindings in statics are unstable
|
|
||||||
let x = 42;
|
|
||||||
//~^ ERROR statements in statics are unstable
|
|
||||||
//~| ERROR: let bindings in statics are unstable
|
|
||||||
42
|
|
||||||
};
|
|
||||||
|
|
||||||
fn main() {}
|
|
@ -1,68 +1,14 @@
|
|||||||
error[E0658]: let bindings in constants are unstable (see issue #48821)
|
|
||||||
--> $DIR/issue-18118.rs:15:17
|
|
||||||
|
|
|
||||||
LL | let p = 3;
|
|
||||||
| ^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0658]: statements in constants are unstable (see issue #48821)
|
|
||||||
--> $DIR/issue-18118.rs:15:17
|
|
||||||
|
|
|
||||||
LL | let p = 3;
|
|
||||||
| ^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0658]: let bindings in constants are unstable (see issue #48821)
|
|
||||||
--> $DIR/issue-18118.rs:18:9
|
|
||||||
|
|
|
||||||
LL | &p //~ ERROR `p` does not live long enough
|
|
||||||
| ^^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0658]: let bindings in constants are unstable (see issue #48821)
|
|
||||||
--> $DIR/issue-18118.rs:12:5
|
|
||||||
|
|
|
||||||
LL | / const z: &'static isize = {
|
|
||||||
LL | | //~^ ERROR let bindings in constants are unstable
|
|
||||||
LL | | //~| ERROR statements in constants are unstable
|
|
||||||
LL | | let p = 3;
|
|
||||||
... |
|
|
||||||
LL | | //~^ ERROR let bindings in constants are unstable
|
|
||||||
LL | | };
|
|
||||||
| |______^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0658]: statements in constants are unstable (see issue #48821)
|
|
||||||
--> $DIR/issue-18118.rs:12:5
|
|
||||||
|
|
|
||||||
LL | / const z: &'static isize = {
|
|
||||||
LL | | //~^ ERROR let bindings in constants are unstable
|
|
||||||
LL | | //~| ERROR statements in constants are unstable
|
|
||||||
LL | | let p = 3;
|
|
||||||
... |
|
|
||||||
LL | | //~^ ERROR let bindings in constants are unstable
|
|
||||||
LL | | };
|
|
||||||
| |______^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0597]: `p` does not live long enough
|
error[E0597]: `p` does not live long enough
|
||||||
--> $DIR/issue-18118.rs:18:9
|
--> $DIR/issue-18118.rs:14:9
|
||||||
|
|
|
|
||||||
LL | &p //~ ERROR `p` does not live long enough
|
LL | &p //~ ERROR `p` does not live long enough
|
||||||
| ^^
|
| ^^
|
||||||
| |
|
| |
|
||||||
| borrowed value does not live long enough
|
| borrowed value does not live long enough
|
||||||
| using this value as a constant requires that `p` is borrowed for `'static`
|
| using this value as a constant requires that `p` is borrowed for `'static`
|
||||||
LL | //~^ ERROR let bindings in constants are unstable
|
|
||||||
LL | };
|
LL | };
|
||||||
| - `p` dropped here while still borrowed
|
| - `p` dropped here while still borrowed
|
||||||
|
|
||||||
error: aborting due to 6 previous errors
|
error: aborting due to previous error
|
||||||
|
|
||||||
Some errors occurred: E0597, E0658.
|
For more information about this error, try `rustc --explain E0597`.
|
||||||
For more information about an error, try `rustc --explain E0597`.
|
|
||||||
|
@ -10,12 +10,7 @@
|
|||||||
|
|
||||||
pub fn main() {
|
pub fn main() {
|
||||||
const z: &'static isize = {
|
const z: &'static isize = {
|
||||||
//~^ ERROR let bindings in constants are unstable
|
|
||||||
//~| ERROR statements in constants are unstable
|
|
||||||
let p = 3;
|
let p = 3;
|
||||||
//~^ ERROR let bindings in constants are unstable
|
|
||||||
//~| ERROR statements in constants are unstable
|
|
||||||
&p //~ ERROR `p` does not live long enough
|
&p //~ ERROR `p` does not live long enough
|
||||||
//~^ ERROR let bindings in constants are unstable
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -1,67 +1,13 @@
|
|||||||
error[E0658]: let bindings in constants are unstable (see issue #48821)
|
|
||||||
--> $DIR/issue-18118.rs:15:17
|
|
||||||
|
|
|
||||||
LL | let p = 3;
|
|
||||||
| ^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0658]: statements in constants are unstable (see issue #48821)
|
|
||||||
--> $DIR/issue-18118.rs:15:17
|
|
||||||
|
|
|
||||||
LL | let p = 3;
|
|
||||||
| ^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0658]: let bindings in constants are unstable (see issue #48821)
|
|
||||||
--> $DIR/issue-18118.rs:18:9
|
|
||||||
|
|
|
||||||
LL | &p //~ ERROR `p` does not live long enough
|
|
||||||
| ^^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0658]: let bindings in constants are unstable (see issue #48821)
|
|
||||||
--> $DIR/issue-18118.rs:12:5
|
|
||||||
|
|
|
||||||
LL | / const z: &'static isize = {
|
|
||||||
LL | | //~^ ERROR let bindings in constants are unstable
|
|
||||||
LL | | //~| ERROR statements in constants are unstable
|
|
||||||
LL | | let p = 3;
|
|
||||||
... |
|
|
||||||
LL | | //~^ ERROR let bindings in constants are unstable
|
|
||||||
LL | | };
|
|
||||||
| |______^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0658]: statements in constants are unstable (see issue #48821)
|
|
||||||
--> $DIR/issue-18118.rs:12:5
|
|
||||||
|
|
|
||||||
LL | / const z: &'static isize = {
|
|
||||||
LL | | //~^ ERROR let bindings in constants are unstable
|
|
||||||
LL | | //~| ERROR statements in constants are unstable
|
|
||||||
LL | | let p = 3;
|
|
||||||
... |
|
|
||||||
LL | | //~^ ERROR let bindings in constants are unstable
|
|
||||||
LL | | };
|
|
||||||
| |______^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0597]: `p` does not live long enough
|
error[E0597]: `p` does not live long enough
|
||||||
--> $DIR/issue-18118.rs:18:10
|
--> $DIR/issue-18118.rs:14:10
|
||||||
|
|
|
|
||||||
LL | &p //~ ERROR `p` does not live long enough
|
LL | &p //~ ERROR `p` does not live long enough
|
||||||
| ^ borrowed value does not live long enough
|
| ^ borrowed value does not live long enough
|
||||||
LL | //~^ ERROR let bindings in constants are unstable
|
|
||||||
LL | };
|
LL | };
|
||||||
| - borrowed value only lives until here
|
| - borrowed value only lives until here
|
||||||
|
|
|
|
||||||
= note: borrowed value must be valid for the static lifetime...
|
= note: borrowed value must be valid for the static lifetime...
|
||||||
|
|
||||||
error: aborting due to 6 previous errors
|
error: aborting due to previous error
|
||||||
|
|
||||||
Some errors occurred: E0597, E0658.
|
For more information about this error, try `rustc --explain E0597`.
|
||||||
For more information about an error, try `rustc --explain E0597`.
|
|
||||||
|
@ -15,7 +15,6 @@
|
|||||||
const bad : u32 = {
|
const bad : u32 = {
|
||||||
{
|
{
|
||||||
5;
|
5;
|
||||||
//~^ ERROR statements in constants are unstable
|
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -23,8 +22,7 @@ const bad : u32 = {
|
|||||||
const bad_two : u32 = {
|
const bad_two : u32 = {
|
||||||
{
|
{
|
||||||
invalid();
|
invalid();
|
||||||
//~^ ERROR statements in constants are unstable
|
//~^ ERROR: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
//~^^ ERROR: calls in constants are limited to constant functions, tuple structs and tuple variants
|
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -32,7 +30,6 @@ const bad_two : u32 = {
|
|||||||
const bad_three : u32 = {
|
const bad_three : u32 = {
|
||||||
{
|
{
|
||||||
valid();
|
valid();
|
||||||
//~^ ERROR statements in constants are unstable
|
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -40,7 +37,6 @@ const bad_three : u32 = {
|
|||||||
static bad_four : u32 = {
|
static bad_four : u32 = {
|
||||||
{
|
{
|
||||||
5;
|
5;
|
||||||
//~^ ERROR statements in statics are unstable
|
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -49,7 +45,6 @@ static bad_five : u32 = {
|
|||||||
{
|
{
|
||||||
invalid();
|
invalid();
|
||||||
//~^ ERROR: calls in statics are limited to constant functions, tuple structs and tuple variants
|
//~^ ERROR: calls in statics are limited to constant functions, tuple structs and tuple variants
|
||||||
//~| ERROR statements in statics are unstable
|
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -57,7 +52,6 @@ static bad_five : u32 = {
|
|||||||
static bad_six : u32 = {
|
static bad_six : u32 = {
|
||||||
{
|
{
|
||||||
valid();
|
valid();
|
||||||
//~^ ERROR statements in statics are unstable
|
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -65,7 +59,6 @@ static bad_six : u32 = {
|
|||||||
static mut bad_seven : u32 = {
|
static mut bad_seven : u32 = {
|
||||||
{
|
{
|
||||||
5;
|
5;
|
||||||
//~^ ERROR statements in statics are unstable
|
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -73,8 +66,7 @@ static mut bad_seven : u32 = {
|
|||||||
static mut bad_eight : u32 = {
|
static mut bad_eight : u32 = {
|
||||||
{
|
{
|
||||||
invalid();
|
invalid();
|
||||||
//~^ ERROR statements in statics are unstable
|
//~^ ERROR: calls in statics are limited to constant functions, tuple structs and tuple variants
|
||||||
//~| ERROR: calls in statics are limited to constant functions, tuple structs and tuple variants
|
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -82,7 +74,6 @@ static mut bad_eight : u32 = {
|
|||||||
static mut bad_nine : u32 = {
|
static mut bad_nine : u32 = {
|
||||||
{
|
{
|
||||||
valid();
|
valid();
|
||||||
//~^ ERROR statements in statics are unstable
|
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -1,94 +1,21 @@
|
|||||||
error[E0658]: statements in constants are unstable (see issue #48821)
|
|
||||||
--> $DIR/issue-32829-2.rs:17:9
|
|
||||||
|
|
|
||||||
LL | 5;
|
|
||||||
| ^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0015]: calls in constants are limited to constant functions, tuple structs and tuple variants
|
error[E0015]: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||||
--> $DIR/issue-32829-2.rs:25:9
|
--> $DIR/issue-32829-2.rs:24:9
|
||||||
|
|
|
|
||||||
LL | invalid();
|
LL | invalid();
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
|
|
||||||
error[E0658]: statements in constants are unstable (see issue #48821)
|
|
||||||
--> $DIR/issue-32829-2.rs:25:9
|
|
||||||
|
|
|
||||||
LL | invalid();
|
|
||||||
| ^^^^^^^^^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0658]: statements in constants are unstable (see issue #48821)
|
|
||||||
--> $DIR/issue-32829-2.rs:34:9
|
|
||||||
|
|
|
||||||
LL | valid();
|
|
||||||
| ^^^^^^^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0658]: statements in statics are unstable (see issue #48821)
|
|
||||||
--> $DIR/issue-32829-2.rs:42:9
|
|
||||||
|
|
|
||||||
LL | 5;
|
|
||||||
| ^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0015]: calls in statics are limited to constant functions, tuple structs and tuple variants
|
error[E0015]: calls in statics are limited to constant functions, tuple structs and tuple variants
|
||||||
--> $DIR/issue-32829-2.rs:50:9
|
--> $DIR/issue-32829-2.rs:46:9
|
||||||
|
|
|
|
||||||
LL | invalid();
|
LL | invalid();
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
|
|
||||||
error[E0658]: statements in statics are unstable (see issue #48821)
|
|
||||||
--> $DIR/issue-32829-2.rs:50:9
|
|
||||||
|
|
|
||||||
LL | invalid();
|
|
||||||
| ^^^^^^^^^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0658]: statements in statics are unstable (see issue #48821)
|
|
||||||
--> $DIR/issue-32829-2.rs:59:9
|
|
||||||
|
|
|
||||||
LL | valid();
|
|
||||||
| ^^^^^^^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0658]: statements in statics are unstable (see issue #48821)
|
|
||||||
--> $DIR/issue-32829-2.rs:67:9
|
|
||||||
|
|
|
||||||
LL | 5;
|
|
||||||
| ^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0015]: calls in statics are limited to constant functions, tuple structs and tuple variants
|
error[E0015]: calls in statics are limited to constant functions, tuple structs and tuple variants
|
||||||
--> $DIR/issue-32829-2.rs:75:9
|
--> $DIR/issue-32829-2.rs:68:9
|
||||||
|
|
|
|
||||||
LL | invalid();
|
LL | invalid();
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
|
|
||||||
error[E0658]: statements in statics are unstable (see issue #48821)
|
error: aborting due to 3 previous errors
|
||||||
--> $DIR/issue-32829-2.rs:75:9
|
|
||||||
|
|
|
||||||
LL | invalid();
|
|
||||||
| ^^^^^^^^^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error[E0658]: statements in statics are unstable (see issue #48821)
|
For more information about this error, try `rustc --explain E0015`.
|
||||||
--> $DIR/issue-32829-2.rs:84:9
|
|
||||||
|
|
|
||||||
LL | valid();
|
|
||||||
| ^^^^^^^
|
|
||||||
|
|
|
||||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
|
||||||
|
|
||||||
error: aborting due to 12 previous errors
|
|
||||||
|
|
||||||
Some errors occurred: E0015, E0658.
|
|
||||||
For more information about an error, try `rustc --explain E0015`.
|
|
||||||
|
@ -16,5 +16,6 @@ use std::cell::RefCell;
|
|||||||
static boxed: Box<RefCell<isize>> = box RefCell::new(0);
|
static boxed: Box<RefCell<isize>> = box RefCell::new(0);
|
||||||
//~^ ERROR allocations are not allowed in statics
|
//~^ ERROR allocations are not allowed in statics
|
||||||
//~| ERROR `std::cell::RefCell<isize>` cannot be shared between threads safely [E0277]
|
//~| ERROR `std::cell::RefCell<isize>` cannot be shared between threads safely [E0277]
|
||||||
|
//~| ERROR contains unimplemented expression type
|
||||||
|
|
||||||
fn main() { }
|
fn main() { }
|
||||||
|
@ -4,6 +4,12 @@ error[E0010]: allocations are not allowed in statics
|
|||||||
LL | static boxed: Box<RefCell<isize>> = box RefCell::new(0);
|
LL | static boxed: Box<RefCell<isize>> = box RefCell::new(0);
|
||||||
| ^^^^^^^^^^^^^^^^^^^ allocation not allowed in statics
|
| ^^^^^^^^^^^^^^^^^^^ allocation not allowed in statics
|
||||||
|
|
||||||
|
error[E0019]: static contains unimplemented expression type
|
||||||
|
--> $DIR/issue-7364.rs:16:41
|
||||||
|
|
|
||||||
|
LL | static boxed: Box<RefCell<isize>> = box RefCell::new(0);
|
||||||
|
| ^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error[E0277]: `std::cell::RefCell<isize>` cannot be shared between threads safely
|
error[E0277]: `std::cell::RefCell<isize>` cannot be shared between threads safely
|
||||||
--> $DIR/issue-7364.rs:16:1
|
--> $DIR/issue-7364.rs:16:1
|
||||||
|
|
|
|
||||||
@ -15,7 +21,7 @@ LL | static boxed: Box<RefCell<isize>> = box RefCell::new(0);
|
|||||||
= note: required because it appears within the type `std::boxed::Box<std::cell::RefCell<isize>>`
|
= note: required because it appears within the type `std::boxed::Box<std::cell::RefCell<isize>>`
|
||||||
= note: shared static variables must have a type that implements `Sync`
|
= note: shared static variables must have a type that implements `Sync`
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
Some errors occurred: E0010, E0277.
|
Some errors occurred: E0010, E0019, E0277.
|
||||||
For more information about an error, try `rustc --explain E0010`.
|
For more information about an error, try `rustc --explain E0010`.
|
||||||
|
@ -12,5 +12,6 @@
|
|||||||
|
|
||||||
static mut a: Box<isize> = box 3;
|
static mut a: Box<isize> = box 3;
|
||||||
//~^ ERROR allocations are not allowed in statics
|
//~^ ERROR allocations are not allowed in statics
|
||||||
|
//~| ERROR static contains unimplemented expression
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -4,6 +4,13 @@ error[E0010]: allocations are not allowed in statics
|
|||||||
LL | static mut a: Box<isize> = box 3;
|
LL | static mut a: Box<isize> = box 3;
|
||||||
| ^^^^^ allocation not allowed in statics
|
| ^^^^^ allocation not allowed in statics
|
||||||
|
|
||||||
error: aborting due to previous error
|
error[E0019]: static contains unimplemented expression type
|
||||||
|
--> $DIR/static-mut-not-constant.rs:13:32
|
||||||
|
|
|
||||||
|
LL | static mut a: Box<isize> = box 3;
|
||||||
|
| ^
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0010`.
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
Some errors occurred: E0010, E0019.
|
||||||
|
For more information about an error, try `rustc --explain E0010`.
|
||||||
|
@ -10,7 +10,6 @@
|
|||||||
|
|
||||||
// compile-pass
|
// compile-pass
|
||||||
|
|
||||||
#![feature(const_let)]
|
|
||||||
#![feature(underscore_const_names)]
|
#![feature(underscore_const_names)]
|
||||||
|
|
||||||
trait Trt {}
|
trait Trt {}
|
||||||
|
@ -8,8 +8,6 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
#![feature(const_let)]
|
|
||||||
|
|
||||||
pub static mut A: u32 = 0;
|
pub static mut A: u32 = 0;
|
||||||
pub static mut B: () = unsafe { A = 1; };
|
pub static mut B: () = unsafe { A = 1; };
|
||||||
//~^ ERROR cannot mutate statics in the initializer of another static
|
//~^ ERROR cannot mutate statics in the initializer of another static
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
error: cannot mutate statics in the initializer of another static
|
error: cannot mutate statics in the initializer of another static
|
||||||
--> $DIR/write-to-static-mut-in-static.rs:14:33
|
--> $DIR/write-to-static-mut-in-static.rs:12:33
|
||||||
|
|
|
|
||||||
LL | pub static mut B: () = unsafe { A = 1; };
|
LL | pub static mut B: () = unsafe { A = 1; };
|
||||||
| ^^^^^
|
| ^^^^^
|
||||||
|
|
||||||
error: cannot mutate statics in the initializer of another static
|
error: cannot mutate statics in the initializer of another static
|
||||||
--> $DIR/write-to-static-mut-in-static.rs:17:34
|
--> $DIR/write-to-static-mut-in-static.rs:15:34
|
||||||
|
|
|
|
||||||
LL | pub static mut C: u32 = unsafe { C = 1; 0 };
|
LL | pub static mut C: u32 = unsafe { C = 1; 0 };
|
||||||
| ^^^^^
|
| ^^^^^
|
||||||
|
Loading…
Reference in New Issue
Block a user