/// This is used for the "rust-call" ABI.
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
pub span: Span,
arg_count: usize,
upvar_decls: Vec<UpvarDecl>,
span: Span,
+ const_can_have_let_mut_bindings: bool,
) -> Self {
// We need `arg_count` locals, and one for the return place
assert!(
spread_arg: None,
span,
cache: cache::Cache::new(),
+ const_can_have_let_mut_bindings,
}
}
arg_count,
upvar_decls,
spread_arg,
+ const_can_have_let_mut_bindings,
span,
cache
});
arg_count,
upvar_decls,
spread_arg,
+ const_can_have_let_mut_bindings,
span,
cache,
}
}
}
- Mir::new(self.cfg.basic_blocks,
- self.source_scopes,
- ClearCrossCrate::Set(self.source_scope_local_data),
- IndexVec::new(),
- yield_ty,
- self.local_decls,
- self.arg_count,
- self.upvar_decls,
- self.fn_span
+ Mir::new(
+ self.cfg.basic_blocks,
+ self.source_scopes,
+ ClearCrossCrate::Set(self.source_scope_local_data),
+ IndexVec::new(),
+ yield_ty,
+ self.local_decls,
+ self.arg_count,
+ self.upvar_decls,
+ self.fn_span,
+ self.hir.const_can_have_let_mut_bindings(),
)
}
// FIXME(eddyb) use logical ops in constants when
// they can handle that kind of control-flow.
(hir::BinOpKind::And, hir::Constness::Const) => {
+ cx.const_can_have_let_mut_bindings = false;
ExprKind::Binary {
op: BinOp::BitAnd,
lhs: lhs.to_ref(),
}
}
(hir::BinOpKind::Or, hir::Constness::Const) => {
+ cx.const_can_have_let_mut_bindings = false;
ExprKind::Binary {
op: BinOp::BitOr,
lhs: lhs.to_ref(),
/// True if this constant/function needs overflow checks.
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> {
constness,
body_owner_kind,
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> {
local_decls_for_sig(&sig, span),
sig.inputs().len(),
vec![],
- span
+ span,
+ true,
);
if let Some(..) = ty {
self.local_decls,
self.sig.inputs().len(),
vec![],
- self.span
+ self.span,
+ true,
)
}
local_decls,
sig.inputs().len(),
vec![],
- span
+ span,
+ true,
);
if let Abi::RustCall = sig.abi {
mir.spread_arg = Some(Local::new(sig.inputs().len()));
local_decls,
sig.inputs().len(),
vec![],
- span
+ span,
+ true,
)
}
initial_locals,
0,
vec![],
- mir.span
+ mir.span,
+ false,
),
tcx,
source: mir,
use rustc::middle::lang_items;
use rustc_target::spec::abi::Abi;
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 std::fmt;
param_env: ty::ParamEnv<'tcx>,
local_qualif: IndexVec<Local, Option<Qualif>>,
qualif: Qualif,
- const_fn_arg_vars: BitSet<Local>,
temp_promotion_state: IndexVec<Local, TempState>,
promotion_candidates: Vec<Candidate>
}
param_env,
local_qualif,
qualif: Qualif::empty(),
- const_fn_arg_vars: BitSet::new_empty(mir.local_decls.len()),
temp_promotion_state: temps,
promotion_candidates: vec![]
}
}
}
- /// 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.
fn add(&mut self, qualif: Qualif) {
self.qualif = self.qualif | qualif;
return;
}
- if self.const_let_allowed() {
- let mut dest = dest;
- let index = loop {
- match dest {
- // with `const_let` active, we treat all locals equal
- Place::Local(index) => break *index,
- // projections are transparent for assignments
- // we qualify the entire destination at once, even if just a field would have
- // stricter qualification
- Place::Projection(proj) => {
- // Catch more errors in the destination. `visit_place` also checks various
- // projection rules like union field access and raw pointer deref
- self.visit_place(
- dest,
- PlaceContext::MutatingUse(MutatingUseContext::Store),
- location
- );
- dest = &proj.base;
- },
- Place::Promoted(..) => bug!("promoteds don't exist yet during promotion"),
- Place::Static(..) => {
- // Catch more errors in the destination. `visit_place` also checks that we
- // do not try to access statics from constants or try to mutate statics
- self.visit_place(
- dest,
- PlaceContext::MutatingUse(MutatingUseContext::Store),
- location
- );
- return;
- }
+ let mut dest = dest;
+ let index = loop {
+ match dest {
+ Place::Local(index) => break *index,
+ // projections are transparent for assignments
+ // we qualify the entire destination at once, even if just a field would have
+ // stricter qualification
+ Place::Projection(proj) => {
+ // Catch more errors in the destination. `visit_place` also checks various
+ // projection rules like union field access and raw pointer deref
+ self.visit_place(
+ dest,
+ PlaceContext::MutatingUse(MutatingUseContext::Store),
+ location
+ );
+ dest = &proj.base;
+ },
+ Place::Promoted(..) => bug!("promoteds don't exist yet during promotion"),
+ Place::Static(..) => {
+ // Catch more errors in the destination. `visit_place` also checks that we
+ // do not try to access statics from constants or try to mutate statics
+ self.visit_place(
+ dest,
+ PlaceContext::MutatingUse(MutatingUseContext::Store),
+ location
+ );
+ 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;
- }
-
- 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();
}
+ };
+ 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),
}
}
- fn const_let_allowed(&self) -> bool {
- self.tcx.features().const_let || self.mode == Mode::ConstFn
- }
-
/// Qualify a whole const, static initializer or const fn.
fn qualify_const(&mut self) -> (Qualif, Lrc<BitSet<Local>>) {
debug!("qualifying {} {:?}", self.mode, self.def_id);
TerminatorKind::FalseEdges { .. } |
TerminatorKind::FalseUnwind { .. } => None,
- TerminatorKind::Return => {
- 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;
- }
+ TerminatorKind::Return => break,
};
match target {
LocalKind::ReturnPointer => {
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::Arg |
LocalKind::Temp => {
this.super_place(place, context, location);
match proj.elem {
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);
match this.mode {
Mode::Fn => {},
// Do the actual promotion, now that we know what's viable.
promote_consts::promote_candidates(mir, tcx, temps, candidates);
} 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 {
// Already computed by `mir_const_qualif`.
const_promoted_temps.unwrap()
// Allows the definition of `const fn` functions with some advanced features.
(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.
(active, const_fn_union, "1.27.0", Some(51909), None),
// run-pass
#![allow(dead_code)]
-#![feature(const_let)]
-
type Array = [u32; { let x = 2; 5 }];
pub fn main() {}
// run-pass
#![allow(dead_code)]
-#![feature(const_let)]
-
enum Foo {
Bar = { let x = 1; 3 }
}
// https://github.com/rust-lang/rust/issues/48821
-#![feature(const_fn, const_let)]
+#![feature(const_fn)]
const fn foo(i: usize) -> usize {
let x = i;
LL | static STATIC11: Box<MyOwned> = box MyOwned;
| ^^^^^^^^^^^ 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
- --> $DIR/check-static-values-constraints.rs:99:32
+ --> $DIR/check-static-values-constraints.rs:100:32
|
LL | field2: SafeEnum::Variant4("str".to_string())
| ^^^^^^^^^^^^^^^^^
error[E0010]: allocations are not allowed in statics
- --> $DIR/check-static-values-constraints.rs:104:5
+ --> $DIR/check-static-values-constraints.rs:105: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:105: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:105:5
+ --> $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:109:6
+ --> $DIR/check-static-values-constraints.rs:112:6
|
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:112:10
+ |
+LL | &box MyOwned, //~ ERROR 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
| ^^^^^^^^^^^ 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
- --> $DIR/check-static-values-constraints.rs:116:5
+ --> $DIR/check-static-values-constraints.rs:121:5
|
LL | box 3;
| ^^^^^ 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
- --> $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 };
| ^
| help: consider borrowing here: `&x`
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 };
| ^^^^^ 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 };
+ | ^
+
+error: aborting due to 17 previous errors
-Some errors occurred: E0010, E0015, E0493, E0507.
+Some errors occurred: E0010, E0015, E0019, E0493, E0507.
For more information about an error, try `rustc --explain E0010`.
static STATIC11: Box<MyOwned> = box MyOwned;
//~^ ERROR allocations are not allowed in statics
+//~| ERROR contains unimplemented expression type
static mut STATIC12: UnsafeStruct = UnsafeStruct;
static STATIC15: &'static [Box<MyOwned>] = &[
box MyOwned, //~ ERROR allocations are not allowed in statics
+ //~^ ERROR contains unimplemented expression type
box MyOwned, //~ ERROR allocations are not allowed in statics
+ //~^ ERROR contains unimplemented expression type
];
static STATIC16: (&'static Box<MyOwned>, &'static Box<MyOwned>) = (
&box MyOwned, //~ ERROR allocations are not allowed in statics
+ //~^ ERROR contains unimplemented expression type
&box MyOwned, //~ ERROR allocations are not allowed in statics
+ //~^ ERROR contains unimplemented expression type
);
static mut STATIC17: SafeEnum = SafeEnum::Variant1;
static STATIC19: Box<isize> =
box 3;
//~^ ERROR allocations are not allowed in statics
+//~| ERROR contains unimplemented expression type
pub fn main() {
let y = { static x: Box<isize> = box 3; x };
//~^ ERROR allocations are not allowed in statics
//~^^ ERROR cannot move out of static item
+ //~| ERROR contains unimplemented expression type
}
LL | static STATIC11: Box<MyOwned> = box MyOwned;
| ^^^^^^^^^^^ 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
- --> $DIR/check-static-values-constraints.rs:99:32
+ --> $DIR/check-static-values-constraints.rs:100:32
|
LL | field2: SafeEnum::Variant4("str".to_string())
| ^^^^^^^^^^^^^^^^^
error[E0010]: allocations are not allowed in statics
- --> $DIR/check-static-values-constraints.rs:104:5
+ --> $DIR/check-static-values-constraints.rs:105: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:105: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:105:5
+ --> $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:109:6
+ --> $DIR/check-static-values-constraints.rs:112:6
|
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:112:10
+ |
+LL | &box MyOwned, //~ ERROR 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
| ^^^^^^^^^^^ 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
- --> $DIR/check-static-values-constraints.rs:116:5
+ --> $DIR/check-static-values-constraints.rs:121:5
|
LL | box 3;
| ^^^^^ 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
- --> $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 };
| ^ cannot move out of static item
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 };
| ^^^^^ 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 };
+ | ^
+
+error: aborting due to 17 previous errors
-Some errors occurred: E0010, E0015, E0493, E0507.
+Some errors occurred: E0010, E0015, E0019, E0493, E0507.
For more information about an error, try `rustc --explain E0010`.
// option. This file may not be copied, modified, or distributed
// except according to those terms.
+// compile-pass
+
const A: usize = { 1; 2 };
-//~^ ERROR statements in constants are unstable
const B: usize = { { } 2 };
-//~^ ERROR statements in constants are unstable
macro_rules! foo {
- () => (()) //~ ERROR statements in constants are unstable
+ () => (())
}
const C: usize = { foo!(); 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() {}
+++ /dev/null
-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`.
// option. This file may not be copied, modified, or distributed
// except according to those terms.
+// compile-pass
+
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() {}
+++ /dev/null
-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`.
// option. This file may not be copied, modified, or distributed
// except according to those terms.
+// compile-pass
+
enum Foo {
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() {}
+++ /dev/null
-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`.
// The test should never compile successfully
#![feature(const_raw_ptr_deref)]
-#![feature(const_let)]
use std::cell::UnsafeCell;
static FOO: Foo = Foo(UnsafeCell::new(42));
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() {}
-error[E0080]: could not evaluate static initializer
- --> $DIR/assign-to-static-within-other-static-2.rs:27:5
+error[E0019]: static contains unimplemented expression type
+ --> $DIR/assign-to-static-within-other-static-2.rs:26:5
|
-LL | *FOO.0.get() = 5; //~ ERROR could not evaluate static initializer
- | ^^^^^^^^^^^^^^^^ tried to modify a static's initial value from another static's initializer
+LL | *FOO.0.get() = 5; //~ ERROR static contains unimplemented expression type
+ | ^^^^^^^^^^^^^^^^
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`.
// The test should never compile successfully
#![feature(const_raw_ptr_deref)]
-#![feature(const_let)]
use std::cell::UnsafeCell;
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
| ^^^^^^^
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-#![feature(const_let)]
-
fn main() {}
struct FakeNeedsDrop;
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 };
| ^
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); };
| ^
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-#![feature(const_let)]
-
fn main() {
// Tests the Collatz conjecture with an incorrect base case (0 instead of 1).
// The value of `n` will loop indefinitely (4 - 2 - 1 - 4).
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 | | n = if n % 2 == 0 { n/2 } else { 3*n + 1 };
| |_________^
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 _ = [(); {
| __________________^
| |_____^
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 };
| ^^^^^^^^^^ duplicate interpreter state observed here, const evaluation will never terminate
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-#![feature(const_let)]
-
fn main() {
let _ = [(); {
//~^ WARNING Constant evaluating a complex constant, this might take some time
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 | | n = (n + 1) % 5; //~ ERROR evaluation of constant value failed
| |_________^
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 _ = [(); {
| __________________^
| |_____^
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
| ^^^^^^^^^^^ duplicate interpreter state observed here, const evaluation will never terminate
// The test should never compile successfully
#![feature(const_raw_ptr_deref)]
-#![feature(const_let)]
use std::cell::UnsafeCell;
static BAR: () = unsafe {
*FOO.0.get() = 5;
- // we do not error on the above access, because that is not detectable statically. Instead,
- // 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
+ //~^ ERROR static contains unimplemented expression
foo();
//~^ ERROR calls in statics are limited to constant functions, tuple structs and tuple variants
+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
- --> $DIR/mod-static-with-const-fn.rs:34:5
+ --> $DIR/mod-static-with-const-fn.rs:31:5
|
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`.
LL | }
| - 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
--> $DIR/promoted_raw_ptr_ops.rs:18:29
|
LL | }
| - 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`.
// option. This file may not be copied, modified, or distributed
// 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
use std::mem;
// compile-pass
-#![feature(const_let)]
-
struct S(i32);
const A: () = {
-#![feature(const_let)]
#![feature(const_fn)]
struct S {
impl S {
const fn foo(&mut self, x: u32) {
self.state = x;
+ //~^ ERROR constant function contains unimplemented expression
}
}
+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
--> $DIR/const_let_assign3.rs:16:5
|
LL | s.foo(3); //~ ERROR references in constants may only refer to 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`.
// https://github.com/rust-lang/rust/issues/55223
-#![feature(const_let)]
-
union Foo<'a> {
y: &'a (),
long_live_the_unit: &'static (),
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 | | let y = ();
-#![feature(const_let)]
-
const FOO: *const u32 = { //~ ERROR any use of this value will cause an error
let x = 42;
&x
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 | | let x = 42;
+// compile-pass
+
#![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;
pub const Z: Cow<'static, [ [u8; 3] ]> = Cow::Borrowed(&[*b"ABC"]);
-//~^ ERROR temporary value dropped while borrowed
fn main() {}
+++ /dev/null
-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`.
--- /dev/null
+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`.
}
}
+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() {}
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`.
-#![feature(const_let)]
-
use std::cell::Cell;
const FOO: &(Cell<usize>, bool) = {
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
| ^^^^
-#![feature(const_let)]
-
use std::cell::Cell;
const FOO: &u32 = {
{
let b: *mut u32 = &mut a; //~ ERROR may only refer to immutable values
unsafe { *b = 5; } //~ ERROR dereferencing raw pointers in constants
+ //~^ ERROR constant contains unimplemented expression
}
&{a}
};
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
| ^^^^^^ 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)
- --> $DIR/projection_qualif.rs:9:18
+ --> $DIR/projection_qualif.rs:7:18
|
LL | unsafe { *b = 5; } //~ ERROR dereferencing raw pointers in constants
| ^^^^^^
|
= 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`.
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 = {
| ------------ type annotation requires that `y` is borrowed for `'static`
-#![feature(const_let)]
-
fn main() {
let x: &'static u32 = {
let y = 42;
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
| ^ borrowed value does not live long enough
-#![feature(const_let)]
-
use std::cell::Cell;
// this is overly conservative. The reset to `None` should clear `a` of all qualifications
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
| ^^^^
-#![feature(const_let)]
-
use std::cell::Cell;
// const qualification is not smart enough to know about fields and always assumes that there might
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
| ^^^^^^
#![allow(warnings)]
const CON : Box<i32> = box 0; //~ ERROR E0010
+//~^ ERROR contains unimplemented expression type
fn main() {}
|
= 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.
+
+error: aborting due to 2 previous errors
-For more information about this error, try `rustc --explain E0010`.
+Some errors occurred: E0010, E0019.
+For more information about an error, try `rustc --explain E0010`.
#![allow(warnings)]
const CON : Box<i32> = box 0; //~ ERROR E0010
+//~^ ERROR contains unimplemented expression type
fn main() {}
LL | const CON : Box<i32> = box 0; //~ ERROR E0010
| ^^^^^ 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
+ | ^
+
+error: aborting due to 2 previous errors
-For more information about this error, try `rustc --explain E0010`.
+Some errors occurred: E0010, E0019.
+For more information about an error, try `rustc --explain E0010`.
// <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.
-#![feature(const_let)]
trait Trt {}
struct Str {}
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 | | use std::marker::PhantomData;
+++ /dev/null
-// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-// 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() {}
-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
- --> $DIR/issue-18118.rs:18:9
+ --> $DIR/issue-18118.rs:14:9
|
LL | &p //~ ERROR `p` 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`
-LL | //~^ ERROR let bindings in constants are unstable
LL | };
| - `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 an error, try `rustc --explain E0597`.
+For more information about this error, try `rustc --explain E0597`.
pub fn main() {
const z: &'static isize = {
- //~^ ERROR let bindings in constants are unstable
- //~| ERROR statements in constants are unstable
let p = 3;
- //~^ ERROR let bindings in constants are unstable
- //~| ERROR statements in constants are unstable
&p //~ ERROR `p` does not live long enough
- //~^ ERROR let bindings in constants are unstable
};
}
-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
- --> $DIR/issue-18118.rs:18:10
+ --> $DIR/issue-18118.rs:14:10
|
LL | &p //~ ERROR `p` does not live long enough
| ^ borrowed value does not live long enough
-LL | //~^ ERROR let bindings in constants are unstable
LL | };
| - borrowed value only lives until here
|
= 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 an error, try `rustc --explain E0597`.
+For more information about this error, try `rustc --explain E0597`.
const bad : u32 = {
{
5;
- //~^ ERROR statements in constants are unstable
0
}
};
const bad_two : u32 = {
{
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
}
};
const bad_three : u32 = {
{
valid();
- //~^ ERROR statements in constants are unstable
0
}
};
static bad_four : u32 = {
{
5;
- //~^ ERROR statements in statics are unstable
0
}
};
{
invalid();
//~^ ERROR: calls in statics are limited to constant functions, tuple structs and tuple variants
- //~| ERROR statements in statics are unstable
0
}
};
static bad_six : u32 = {
{
valid();
- //~^ ERROR statements in statics are unstable
0
}
};
static mut bad_seven : u32 = {
{
5;
- //~^ ERROR statements in statics are unstable
0
}
};
static mut bad_eight : u32 = {
{
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
}
};
static mut bad_nine : u32 = {
{
valid();
- //~^ ERROR statements in statics are unstable
0
}
};
-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
- --> $DIR/issue-32829-2.rs:25:9
+ --> $DIR/issue-32829-2.rs:24:9
|
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
- --> $DIR/issue-32829-2.rs:50:9
+ --> $DIR/issue-32829-2.rs:46:9
|
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
- --> $DIR/issue-32829-2.rs:75:9
+ --> $DIR/issue-32829-2.rs:68:9
|
LL | invalid();
| ^^^^^^^^^
-error[E0658]: statements in statics are unstable (see issue #48821)
- --> $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)
- --> $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
+error: aborting due to 3 previous errors
-Some errors occurred: E0015, E0658.
-For more information about an error, try `rustc --explain E0015`.
+For more information about this error, try `rustc --explain E0015`.
static boxed: Box<RefCell<isize>> = box RefCell::new(0);
//~^ ERROR allocations are not allowed in statics
//~| ERROR `std::cell::RefCell<isize>` cannot be shared between threads safely [E0277]
+//~| ERROR contains unimplemented expression type
fn main() { }
LL | static boxed: Box<RefCell<isize>> = box RefCell::new(0);
| ^^^^^^^^^^^^^^^^^^^ 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
--> $DIR/issue-7364.rs:16:1
|
= 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`
-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`.
static mut a: Box<isize> = box 3;
//~^ ERROR allocations are not allowed in statics
+//~| ERROR static contains unimplemented expression
fn main() {}
LL | static mut a: Box<isize> = box 3;
| ^^^^^ 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;
+ | ^
+
+error: aborting due to 2 previous errors
-For more information about this error, try `rustc --explain E0010`.
+Some errors occurred: E0010, E0019.
+For more information about an error, try `rustc --explain E0010`.
// compile-pass
-#![feature(const_let)]
#![feature(underscore_const_names)]
trait Trt {}
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-#![feature(const_let)]
-
pub static mut A: u32 = 0;
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:14:33
+ --> $DIR/write-to-static-mut-in-static.rs:12:33
|
LL | pub static mut B: () = unsafe { A = 1; };
| ^^^^^
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 };
| ^^^^^