Rollup merge of #57175 - oli-obk:const_let_stabilization, r=nikomatsakis
Stabilize `let` bindings and destructuring in constants and const fn
r? @Centril
This PR stabilizes the following features in constants and `const` functions:
* irrefutable destructuring patterns (e.g. `const fn foo((x, y): (u8, u8)) { ... }`)
* `let` bindings (e.g. `let x = 1;`)
* mutable `let` bindings (e.g. `let mut x = 1;`)
* assignment (e.g. `x = y`) and assignment operator (e.g. `x += y`) expressions, even where the assignment target is a projection (e.g. a struct field or index operation like `x[3] = 42`)
* expression statements (e.g. `3;`)
This PR does explicitly *not* stabilize:
* mutable references (i.e. `&mut T`)
* dereferencing mutable references
* refutable patterns (e.g. `Some(x)`)
* operations on `UnsafeCell` types (as that would need raw pointers and mutable references and such, not because it is explicitly forbidden. We can't explicitly forbid it as such values are OK as long as they aren't mutated.)
* We are not stabilizing `let` bindings in constants that use `&&` and `||` short circuiting operations. These are treated as `&` and `|` inside `const` and `static` items right now. If we stopped treating them as `&` and `|` after stabilizing `let` bindings, we'd break code like `let mut x = false; false && { x = true; false };`. So to use `let` bindings in constants you need to change `&&` and `||` to `&` and `|` respectively.
This commit is contained in:
commit
bd8f464877
94 changed files with 416 additions and 977 deletions
|
|
@ -21,7 +21,7 @@ use rustc::mir::visit::{PlaceContext, Visitor, MutatingUseContext, NonMutatingUs
|
|||
use rustc::middle::lang_items;
|
||||
use rustc::session::config::nightly_options;
|
||||
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;
|
||||
|
|
@ -104,7 +104,6 @@ struct Qualifier<'a, 'gcx: 'a+'tcx, 'tcx: 'a> {
|
|||
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>
|
||||
}
|
||||
|
|
@ -139,7 +138,6 @@ impl<'a, 'tcx> Qualifier<'a, 'tcx, 'tcx> {
|
|||
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![]
|
||||
}
|
||||
|
|
@ -168,26 +166,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.
|
||||
fn add(&mut self, qualif: Qualif) {
|
||||
self.qualif = self.qualif | qualif;
|
||||
|
|
@ -233,80 +211,46 @@ impl<'a, 'tcx> Qualifier<'a, 'tcx, 'tcx> {
|
|||
return;
|
||||
}
|
||||
|
||||
if self.tcx.features().const_let {
|
||||
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 {
|
||||
// We treat all locals equal in constants
|
||||
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),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -347,45 +291,6 @@ impl<'a, 'tcx> Qualifier<'a, 'tcx, 'tcx> {
|
|||
TerminatorKind::FalseUnwind { .. } => None,
|
||||
|
||||
TerminatorKind::Return => {
|
||||
if !self.tcx.features().const_let {
|
||||
// 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;
|
||||
}
|
||||
};
|
||||
|
|
@ -454,12 +359,7 @@ impl<'a, 'tcx> Visitor<'tcx> for Qualifier<'a, 'tcx, 'tcx> {
|
|||
LocalKind::ReturnPointer => {
|
||||
self.not_const();
|
||||
}
|
||||
LocalKind::Var if !self.tcx.features().const_let => {
|
||||
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));
|
||||
}
|
||||
LocalKind::Var if self.mode == Mode::Fn => {
|
||||
self.add(Qualif::NOT_CONST);
|
||||
}
|
||||
LocalKind::Var |
|
||||
|
|
@ -569,6 +469,8 @@ impl<'a, 'tcx> Visitor<'tcx> for Qualifier<'a, 'tcx, 'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
ProjectionElem::ConstantIndex {..} |
|
||||
ProjectionElem::Subslice {..} |
|
||||
ProjectionElem::Field(..) |
|
||||
ProjectionElem::Index(_) => {
|
||||
let base_ty = proj.base.ty(this.mir, this.tcx).to_ty(this.tcx);
|
||||
|
|
@ -598,8 +500,6 @@ impl<'a, 'tcx> Visitor<'tcx> for Qualifier<'a, 'tcx, 'tcx> {
|
|||
this.qualif.restrict(ty, this.tcx, this.param_env);
|
||||
}
|
||||
|
||||
ProjectionElem::ConstantIndex {..} |
|
||||
ProjectionElem::Subslice {..} |
|
||||
ProjectionElem::Downcast(..) => {
|
||||
this.not_const()
|
||||
}
|
||||
|
|
@ -1168,46 +1068,6 @@ impl<'a, 'tcx> Visitor<'tcx> for Qualifier<'a, 'tcx, 'tcx> {
|
|||
debug!("visit_assign: dest={:?} rvalue={:?} location={:?}", dest, rvalue, location);
|
||||
self.visit_rvalue(rvalue, location);
|
||||
|
||||
// Check the allowed const fn argument forms.
|
||||
if let (Mode::ConstFn, &Place::Local(index)) = (self.mode, dest) {
|
||||
if self.mir.local_kind(index) == LocalKind::Var &&
|
||||
self.const_fn_arg_vars.insert(index) &&
|
||||
!self.tcx.features().const_let {
|
||||
// Direct use of an argument is permitted.
|
||||
match *rvalue {
|
||||
Rvalue::Use(Operand::Copy(Place::Local(local))) |
|
||||
Rvalue::Use(Operand::Move(Place::Local(local))) => {
|
||||
if self.mir.local_kind(local) == LocalKind::Arg {
|
||||
return;
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
// Avoid a generic error for other uses of arguments.
|
||||
if self.qualif.contains(Qualif::FN_ARGUMENT) {
|
||||
let decl = &self.mir.local_decls[index];
|
||||
let mut err = feature_err(
|
||||
&self.tcx.sess.parse_sess,
|
||||
"const_let",
|
||||
decl.source_info.span,
|
||||
GateIssue::Language,
|
||||
"arguments of constant functions can only be immutable by-value bindings"
|
||||
);
|
||||
if self.tcx.sess.teach(&err.get_code().unwrap()) {
|
||||
err.note("Constant functions are not allowed to mutate anything. Thus, \
|
||||
binding to an argument with a mutable pattern is not allowed.");
|
||||
err.note("Remove any mutable bindings from the argument list to fix this \
|
||||
error. In case you need to mutate the argument, try lazily \
|
||||
initializing a global variable instead of using a const fn, or \
|
||||
refactoring the code to a functional style to avoid mutation if \
|
||||
possible.");
|
||||
}
|
||||
err.emit();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
self.assign(dest, location);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -65,12 +65,6 @@ pub fn is_min_const_fn(
|
|||
}
|
||||
}
|
||||
|
||||
for local in mir.vars_iter() {
|
||||
return Err((
|
||||
mir.local_decls[local].source_info.span,
|
||||
"local variables in const fn are unstable".into(),
|
||||
));
|
||||
}
|
||||
for local in &mir.local_decls {
|
||||
check_ty(tcx, local.ty, local.source_info.span)?;
|
||||
}
|
||||
|
|
@ -147,7 +141,7 @@ fn check_rvalue(
|
|||
check_operand(tcx, mir, operand, span)
|
||||
}
|
||||
Rvalue::Len(place) | Rvalue::Discriminant(place) | Rvalue::Ref(_, _, place) => {
|
||||
check_place(tcx, mir, place, span, PlaceMode::Read)
|
||||
check_place(tcx, mir, place, span)
|
||||
}
|
||||
Rvalue::Cast(CastKind::Misc, operand, cast_ty) => {
|
||||
use rustc::ty::cast::CastTy;
|
||||
|
|
@ -213,11 +207,6 @@ fn check_rvalue(
|
|||
}
|
||||
}
|
||||
|
||||
enum PlaceMode {
|
||||
Assign,
|
||||
Read,
|
||||
}
|
||||
|
||||
fn check_statement(
|
||||
tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||
mir: &'a Mir<'tcx>,
|
||||
|
|
@ -226,11 +215,11 @@ fn check_statement(
|
|||
let span = statement.source_info.span;
|
||||
match &statement.kind {
|
||||
StatementKind::Assign(place, rval) => {
|
||||
check_place(tcx, mir, place, span, PlaceMode::Assign)?;
|
||||
check_place(tcx, mir, place, span)?;
|
||||
check_rvalue(tcx, mir, rval, span)
|
||||
}
|
||||
|
||||
StatementKind::FakeRead(_, place) => check_place(tcx, mir, place, span, PlaceMode::Read),
|
||||
StatementKind::FakeRead(_, place) => check_place(tcx, mir, place, span),
|
||||
|
||||
// just an assignment
|
||||
StatementKind::SetDiscriminant { .. } => Ok(()),
|
||||
|
|
@ -256,7 +245,7 @@ fn check_operand(
|
|||
) -> McfResult {
|
||||
match operand {
|
||||
Operand::Move(place) | Operand::Copy(place) => {
|
||||
check_place(tcx, mir, place, span, PlaceMode::Read)
|
||||
check_place(tcx, mir, place, span)
|
||||
}
|
||||
Operand::Constant(_) => Ok(()),
|
||||
}
|
||||
|
|
@ -267,29 +256,17 @@ fn check_place(
|
|||
mir: &'a Mir<'tcx>,
|
||||
place: &Place<'tcx>,
|
||||
span: Span,
|
||||
mode: PlaceMode,
|
||||
) -> McfResult {
|
||||
match place {
|
||||
Place::Local(l) => match mode {
|
||||
PlaceMode::Assign => match mir.local_kind(*l) {
|
||||
LocalKind::Temp | LocalKind::ReturnPointer => Ok(()),
|
||||
LocalKind::Arg | LocalKind::Var => {
|
||||
Err((span, "assignments in const fn are unstable".into()))
|
||||
}
|
||||
},
|
||||
PlaceMode::Read => Ok(()),
|
||||
},
|
||||
Place::Local(_) => Ok(()),
|
||||
// promoteds are always fine, they are essentially constants
|
||||
Place::Promoted(_) => Ok(()),
|
||||
Place::Static(_) => Err((span, "cannot access `static` items in const fn".into())),
|
||||
Place::Projection(proj) => {
|
||||
match proj.elem {
|
||||
| ProjectionElem::ConstantIndex { .. } | ProjectionElem::Subslice { .. }
|
||||
| ProjectionElem::Deref | ProjectionElem::Field(..) | ProjectionElem::Index(_) => {
|
||||
check_place(tcx, mir, &proj.base, span, mode)
|
||||
}
|
||||
// slice patterns are unstable
|
||||
| ProjectionElem::ConstantIndex { .. } | ProjectionElem::Subslice { .. } => {
|
||||
return Err((span, "slice patterns in const fn are unstable".into()))
|
||||
check_place(tcx, mir, &proj.base, span)
|
||||
}
|
||||
| ProjectionElem::Downcast(..) => {
|
||||
Err((span, "`match` or `if let` in `const fn` is unstable".into()))
|
||||
|
|
@ -311,10 +288,10 @@ fn check_terminator(
|
|||
| TerminatorKind::Resume => Ok(()),
|
||||
|
||||
TerminatorKind::Drop { location, .. } => {
|
||||
check_place(tcx, mir, location, span, PlaceMode::Read)
|
||||
check_place(tcx, mir, location, span)
|
||||
}
|
||||
TerminatorKind::DropAndReplace { location, value, .. } => {
|
||||
check_place(tcx, mir, location, span, PlaceMode::Read)?;
|
||||
check_place(tcx, mir, location, span)?;
|
||||
check_operand(tcx, mir, value, span)
|
||||
},
|
||||
|
||||
|
|
|
|||
|
|
@ -193,9 +193,6 @@ declare_features! (
|
|||
// Allows the definition of `const` functions with some advanced features.
|
||||
(active, const_fn, "1.2.0", Some(24111), None),
|
||||
|
||||
// Allows let bindings and destructuring in `const` functions and constants.
|
||||
(active, const_let, "1.22.1", Some(48821), None),
|
||||
|
||||
// Allows accessing fields of unions inside `const` functions.
|
||||
(active, const_fn_union, "1.27.0", Some(51909), None),
|
||||
|
||||
|
|
@ -686,6 +683,10 @@ declare_features! (
|
|||
(accepted, repr_packed, "1.33.0", Some(33158), None),
|
||||
// Allows calling `const unsafe fn` inside `unsafe` blocks in `const fn` functions.
|
||||
(accepted, min_const_unsafe_fn, "1.33.0", Some(55607), None),
|
||||
// Allows let bindings, assignments and destructuring in `const` functions and constants.
|
||||
// As long as control flow is not implemented in const eval, `&&` and `||` may not be used
|
||||
// at the same time as let bindings.
|
||||
(accepted, const_let, "1.33.0", Some(48821), None),
|
||||
// `#[cfg_attr(predicate, multiple, attributes, here)]`
|
||||
(accepted, cfg_attr_multi, "1.33.0", Some(54881), None),
|
||||
);
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#![feature(const_fn, const_let)]
|
||||
#![feature(const_fn)]
|
||||
|
||||
const X : usize = 2;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
// run-pass
|
||||
#![allow(dead_code)]
|
||||
|
||||
#![feature(const_let)]
|
||||
|
||||
type Array = [u32; { let x = 2; 5 }];
|
||||
|
||||
pub fn main() {}
|
||||
pub fn main() {
|
||||
let _: Array = [0; 5];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,10 +1,11 @@
|
|||
// run-pass
|
||||
#![allow(dead_code)]
|
||||
|
||||
#![feature(const_let)]
|
||||
|
||||
#[repr(u8)]
|
||||
enum Foo {
|
||||
Bar = { let x = 1; 3 }
|
||||
}
|
||||
|
||||
pub fn main() {}
|
||||
pub fn main() {
|
||||
assert_eq!(3, Foo::Bar as u8);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
#![allow(dead_code)]
|
||||
#![allow(unused_variables)]
|
||||
|
||||
#![feature(const_fn, const_let)]
|
||||
#![feature(const_fn)]
|
||||
|
||||
const fn x() {
|
||||
let t = true;
|
||||
|
|
|
|||
|
|
@ -2,8 +2,6 @@
|
|||
|
||||
// https://github.com/rust-lang/rust/issues/48821
|
||||
|
||||
#![feature(const_fn, const_let)]
|
||||
|
||||
const fn foo(i: usize) -> usize {
|
||||
let x = i;
|
||||
x
|
||||
|
|
|
|||
|
|
@ -13,44 +13,80 @@ error[E0010]: allocations are not allowed in statics
|
|||
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:79: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:89:32
|
||||
--> $DIR/check-static-values-constraints.rs:90:32
|
||||
|
|
||||
LL | field2: SafeEnum::Variant4("str".to_string())
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0010]: allocations are not allowed in statics
|
||||
--> $DIR/check-static-values-constraints.rs:94:5
|
||||
|
|
||||
LL | box MyOwned, //~ ERROR allocations are not allowed in statics
|
||||
| ^^^^^^^^^^^ allocation not allowed in statics
|
||||
|
||||
error[E0010]: allocations are not allowed in statics
|
||||
--> $DIR/check-static-values-constraints.rs:95: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:95: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:99:6
|
||||
--> $DIR/check-static-values-constraints.rs:97: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:97: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:102: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:102: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:100:6
|
||||
--> $DIR/check-static-values-constraints.rs:104: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:104: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:106:5
|
||||
--> $DIR/check-static-values-constraints.rs:111:5
|
||||
|
|
||||
LL | box 3;
|
||||
| ^^^^^ allocation not allowed in statics
|
||||
|
||||
error[E0019]: static contains unimplemented expression type
|
||||
--> $DIR/check-static-values-constraints.rs:111:9
|
||||
|
|
||||
LL | box 3;
|
||||
| ^
|
||||
|
||||
error[E0507]: cannot move out of static item
|
||||
--> $DIR/check-static-values-constraints.rs:110:45
|
||||
--> $DIR/check-static-values-constraints.rs:116:45
|
||||
|
|
||||
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`
|
||||
|
||||
error[E0010]: allocations are not allowed in statics
|
||||
--> $DIR/check-static-values-constraints.rs:110:38
|
||||
--> $DIR/check-static-values-constraints.rs:116: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:116: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`.
|
||||
|
|
|
|||
|
|
@ -78,6 +78,7 @@ struct MyOwned;
|
|||
|
||||
static STATIC11: Box<MyOwned> = box MyOwned;
|
||||
//~^ ERROR allocations are not allowed in statics
|
||||
//~| ERROR static contains unimplemented expression type
|
||||
|
||||
static mut STATIC12: UnsafeStruct = UnsafeStruct;
|
||||
|
||||
|
|
@ -92,12 +93,16 @@ static mut STATIC14: SafeStruct = SafeStruct {
|
|||
|
||||
static STATIC15: &'static [Box<MyOwned>] = &[
|
||||
box MyOwned, //~ ERROR allocations are not allowed in statics
|
||||
//~| ERROR contains unimplemented expression
|
||||
box MyOwned, //~ ERROR allocations are not allowed in statics
|
||||
//~| ERROR contains unimplemented expression
|
||||
];
|
||||
|
||||
static STATIC16: (&'static Box<MyOwned>, &'static Box<MyOwned>) = (
|
||||
&box MyOwned, //~ ERROR allocations are not allowed in statics
|
||||
//~| ERROR contains unimplemented expression
|
||||
&box MyOwned, //~ ERROR allocations are not allowed in statics
|
||||
//~| ERROR contains unimplemented expression
|
||||
);
|
||||
|
||||
static mut STATIC17: SafeEnum = SafeEnum::Variant1;
|
||||
|
|
@ -105,9 +110,11 @@ static mut STATIC17: SafeEnum = SafeEnum::Variant1;
|
|||
static STATIC19: Box<isize> =
|
||||
box 3;
|
||||
//~^ ERROR allocations are not allowed in statics
|
||||
//~| ERROR contains unimplemented expression
|
||||
|
||||
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 cannot move out of static item
|
||||
//~| ERROR contains unimplemented expression
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,55 +13,97 @@ error[E0010]: allocations are not allowed in statics
|
|||
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:79: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:89:32
|
||||
--> $DIR/check-static-values-constraints.rs:90:32
|
||||
|
|
||||
LL | field2: SafeEnum::Variant4("str".to_string())
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0010]: allocations are not allowed in statics
|
||||
--> $DIR/check-static-values-constraints.rs:94:5
|
||||
|
|
||||
LL | box MyOwned, //~ ERROR allocations are not allowed in statics
|
||||
| ^^^^^^^^^^^ allocation not allowed in statics
|
||||
|
||||
error[E0010]: allocations are not allowed in statics
|
||||
--> $DIR/check-static-values-constraints.rs:95: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:95: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:99:6
|
||||
--> $DIR/check-static-values-constraints.rs:97: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:97: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:102: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:102: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:100:6
|
||||
--> $DIR/check-static-values-constraints.rs:104: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:104: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:106:5
|
||||
--> $DIR/check-static-values-constraints.rs:111:5
|
||||
|
|
||||
LL | box 3;
|
||||
| ^^^^^ allocation not allowed in statics
|
||||
|
||||
error[E0019]: static contains unimplemented expression type
|
||||
--> $DIR/check-static-values-constraints.rs:111:9
|
||||
|
|
||||
LL | box 3;
|
||||
| ^
|
||||
|
||||
error[E0507]: cannot move out of static item
|
||||
--> $DIR/check-static-values-constraints.rs:110:45
|
||||
--> $DIR/check-static-values-constraints.rs:116: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:110:38
|
||||
--> $DIR/check-static-values-constraints.rs:116: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:116: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`.
|
||||
|
|
|
|||
|
|
@ -1,18 +0,0 @@
|
|||
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() {}
|
||||
|
|
@ -1,62 +0,0 @@
|
|||
error[E0658]: statements in constants are unstable (see issue #48821)
|
||||
--> $DIR/const-block-non-item-statement-2.rs:1: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:4: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:8: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:12: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:12: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:12: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:12: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`.
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
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() {}
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
error[E0658]: let bindings in constants are unstable (see issue #48821)
|
||||
--> $DIR/const-block-non-item-statement-3.rs:1: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:1: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:1: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:1: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`.
|
||||
|
|
@ -1,9 +1,23 @@
|
|||
// 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
|
||||
}
|
||||
|
||||
|
||||
const A: usize = { 1; 2 };
|
||||
|
||||
const B: usize = { { } 2 };
|
||||
|
||||
macro_rules! foo {
|
||||
() => (())
|
||||
}
|
||||
|
||||
const C: usize = { foo!(); 2 };
|
||||
|
||||
const D: usize = { let x = 4; 2 };
|
||||
|
||||
type Array = [u32; { let x = 2; 5 }];
|
||||
type Array2 = [u32; { let mut x = 2; x = 3; x}];
|
||||
|
||||
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:2: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:2: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:2: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:2: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`.
|
||||
|
|
@ -2,7 +2,6 @@
|
|||
// The test should never compile successfully
|
||||
|
||||
#![feature(const_raw_ptr_deref)]
|
||||
#![feature(const_let)]
|
||||
|
||||
use std::cell::UnsafeCell;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
error[E0019]: static contains unimplemented expression type
|
||||
--> $DIR/assign-to-static-within-other-static-2.rs:17:5
|
||||
--> $DIR/assign-to-static-within-other-static-2.rs:16:5
|
||||
|
|
||||
LL | *FOO.0.get() = 5; //~ ERROR contains unimplemented expression type
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
// The test should never compile successfully
|
||||
|
||||
#![feature(const_raw_ptr_deref)]
|
||||
#![feature(const_let)]
|
||||
|
||||
use std::cell::UnsafeCell;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
error: cannot mutate statics in the initializer of another static
|
||||
--> $DIR/assign-to-static-within-other-static.rs:11:5
|
||||
--> $DIR/assign-to-static-within-other-static.rs:10:5
|
||||
|
|
||||
LL | FOO = 5; //~ ERROR cannot mutate statics in the initializer of another static
|
||||
| ^^^^^^^
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
#![feature(const_let)]
|
||||
|
||||
fn main() {}
|
||||
|
||||
struct FakeNeedsDrop;
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
error[E0019]: constant contains unimplemented expression type
|
||||
--> $DIR/const_let.rs:15:55
|
||||
--> $DIR/const_let.rs:13:55
|
||||
|
|
||||
LL | const Y: FakeNeedsDrop = { let mut x = FakeNeedsDrop; x = FakeNeedsDrop; x };
|
||||
| ^
|
||||
|
||||
error[E0019]: constant contains unimplemented expression type
|
||||
--> $DIR/const_let.rs:19:35
|
||||
--> $DIR/const_let.rs:17:35
|
||||
|
|
||||
LL | const Z: () = { let mut x = None; x = Some(FakeNeedsDrop); };
|
||||
| ^
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
#![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).
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
error[E0019]: constant contains unimplemented expression type
|
||||
--> $DIR/infinite_loop.rs:9:9
|
||||
--> $DIR/infinite_loop.rs:7:9
|
||||
|
|
||||
LL | / while n != 0 { //~ ERROR constant contains unimplemented expression type
|
||||
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
|
||||
--> $DIR/infinite_loop.rs:6:18
|
||||
--> $DIR/infinite_loop.rs:4:18
|
||||
|
|
||||
LL | let _ = [(); {
|
||||
| __________________^
|
||||
|
|
@ -21,7 +21,7 @@ LL | | }];
|
|||
| |_____^
|
||||
|
||||
error[E0080]: evaluation of constant value failed
|
||||
--> $DIR/infinite_loop.rs:10:20
|
||||
--> $DIR/infinite_loop.rs:8:20
|
||||
|
|
||||
LL | n = if n % 2 == 0 { n/2 } else { 3*n + 1 };
|
||||
| ^^^^^^^^^^ duplicate interpreter state observed here, const evaluation will never terminate
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
#![feature(const_let)]
|
||||
|
||||
fn main() {
|
||||
let _ = [(); {
|
||||
//~^ WARNING Constant evaluating a complex constant, this might take some time
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
error[E0019]: constant contains unimplemented expression type
|
||||
--> $DIR/issue-52475.rs:8:9
|
||||
--> $DIR/issue-52475.rs:6:9
|
||||
|
|
||||
LL | / while n < 5 { //~ ERROR constant contains unimplemented expression type
|
||||
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
|
||||
--> $DIR/issue-52475.rs:4:18
|
||||
--> $DIR/issue-52475.rs:2:18
|
||||
|
|
||||
LL | let _ = [(); {
|
||||
| __________________^
|
||||
|
|
@ -21,7 +21,7 @@ LL | | }];
|
|||
| |_____^
|
||||
|
||||
error[E0080]: evaluation of constant value failed
|
||||
--> $DIR/issue-52475.rs:9:17
|
||||
--> $DIR/issue-52475.rs:7:17
|
||||
|
|
||||
LL | n = (n + 1) % 5; //~ ERROR evaluation of constant value failed
|
||||
| ^^^^^^^^^^^ duplicate interpreter state observed here, const evaluation will never terminate
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
// The test should never compile successfully
|
||||
|
||||
#![feature(const_raw_ptr_deref)]
|
||||
#![feature(const_let)]
|
||||
|
||||
use std::cell::UnsafeCell;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
error[E0019]: static contains unimplemented expression type
|
||||
--> $DIR/mod-static-with-const-fn.rs:19:5
|
||||
--> $DIR/mod-static-with-const-fn.rs:18: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:22:5
|
||||
--> $DIR/mod-static-with-const-fn.rs:21:5
|
||||
|
|
||||
LL | foo();
|
||||
| ^^^^^
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#![feature(const_transmute,const_let)]
|
||||
#![feature(const_transmute)]
|
||||
#![allow(const_err)] // make sure we cannot allow away the errors tested here
|
||||
|
||||
use std::mem;
|
||||
|
|
|
|||
|
|
@ -1,17 +1,7 @@
|
|||
// test that certain things are disallowed in constant functions
|
||||
// compile-pass
|
||||
|
||||
#![feature(const_fn)]
|
||||
|
||||
// no destructuring
|
||||
const fn i((
|
||||
a,
|
||||
//~^ ERROR arguments of constant functions can only be immutable by-value bindings
|
||||
b
|
||||
//~^ ERROR arguments of constant functions can only be immutable by-value bindings
|
||||
): (u32, u32)) -> u32 {
|
||||
const fn i((a, b): (u32, u32)) -> u32 {
|
||||
a + b
|
||||
//~^ ERROR let bindings in constant functions are unstable
|
||||
//~| ERROR let bindings in constant functions are unstable
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
|
|||
|
|
@ -1,35 +0,0 @@
|
|||
error[E0658]: arguments of constant functions can only be immutable by-value bindings (see issue #48821)
|
||||
--> $DIR/const-fn-destructuring-arg.rs:7:13
|
||||
|
|
||||
LL | a,
|
||||
| ^
|
||||
|
|
||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
||||
|
||||
error[E0658]: arguments of constant functions can only be immutable by-value bindings (see issue #48821)
|
||||
--> $DIR/const-fn-destructuring-arg.rs:9:13
|
||||
|
|
||||
LL | b
|
||||
| ^
|
||||
|
|
||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
||||
|
||||
error[E0658]: let bindings in constant functions are unstable (see issue #48821)
|
||||
--> $DIR/const-fn-destructuring-arg.rs:12:5
|
||||
|
|
||||
LL | a + b
|
||||
| ^
|
||||
|
|
||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
||||
|
||||
error[E0658]: let bindings in constant functions are unstable (see issue #48821)
|
||||
--> $DIR/const-fn-destructuring-arg.rs:12:9
|
||||
|
|
||||
LL | a + b
|
||||
| ^
|
||||
|
|
||||
= 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`.
|
||||
|
|
@ -27,13 +27,9 @@ const fn get_Y_addr() -> &'static u32 {
|
|||
}
|
||||
|
||||
const fn get() -> u32 {
|
||||
let x = 22; //~ ERROR let bindings in constant functions are unstable
|
||||
//~^ ERROR statements in constant functions
|
||||
let y = 44; //~ ERROR let bindings in constant functions are unstable
|
||||
//~^ ERROR statements in constant functions
|
||||
let x = 22;
|
||||
let y = 44;
|
||||
x + y
|
||||
//~^ ERROR let bindings in constant functions are unstable
|
||||
//~| ERROR let bindings in constant functions are unstable
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
|
|||
|
|
@ -16,55 +16,7 @@ error[E0013]: constant functions cannot refer to statics, use a constant instead
|
|||
LL | &Y
|
||||
| ^^
|
||||
|
||||
error[E0658]: let bindings in constant functions are unstable (see issue #48821)
|
||||
--> $DIR/const-fn-not-safe-for-const.rs:30:13
|
||||
|
|
||||
LL | let x = 22; //~ ERROR let bindings in constant functions are unstable
|
||||
| ^^
|
||||
|
|
||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
error[E0658]: statements in constant functions are unstable (see issue #48821)
|
||||
--> $DIR/const-fn-not-safe-for-const.rs:30:13
|
||||
|
|
||||
LL | let x = 22; //~ ERROR let bindings in constant functions are unstable
|
||||
| ^^
|
||||
|
|
||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
||||
|
||||
error[E0658]: let bindings in constant functions are unstable (see issue #48821)
|
||||
--> $DIR/const-fn-not-safe-for-const.rs:32:13
|
||||
|
|
||||
LL | let y = 44; //~ ERROR let bindings in constant functions are unstable
|
||||
| ^^
|
||||
|
|
||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
||||
|
||||
error[E0658]: statements in constant functions are unstable (see issue #48821)
|
||||
--> $DIR/const-fn-not-safe-for-const.rs:32:13
|
||||
|
|
||||
LL | let y = 44; //~ ERROR let bindings in constant functions are unstable
|
||||
| ^^
|
||||
|
|
||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
||||
|
||||
error[E0658]: let bindings in constant functions are unstable (see issue #48821)
|
||||
--> $DIR/const-fn-not-safe-for-const.rs:34:5
|
||||
|
|
||||
LL | x + y
|
||||
| ^
|
||||
|
|
||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
||||
|
||||
error[E0658]: let bindings in constant functions are unstable (see issue #48821)
|
||||
--> $DIR/const-fn-not-safe-for-const.rs:34:9
|
||||
|
|
||||
LL | x + y
|
||||
| ^
|
||||
|
|
||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
||||
|
||||
error: aborting due to 9 previous errors
|
||||
|
||||
Some errors occurred: E0013, E0015, E0658.
|
||||
Some errors occurred: E0013, E0015.
|
||||
For more information about an error, try `rustc --explain E0013`.
|
||||
|
|
|
|||
|
|
@ -1,7 +1,5 @@
|
|||
// compile-pass
|
||||
|
||||
#![feature(const_let)]
|
||||
|
||||
struct S(i32);
|
||||
|
||||
const A: () = {
|
||||
|
|
|
|||
|
|
@ -1,8 +1,5 @@
|
|||
// compile-pass
|
||||
|
||||
#![feature(const_let)]
|
||||
#![feature(const_fn)]
|
||||
|
||||
pub struct AA {
|
||||
pub data: [u8; 10],
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
#![feature(const_let)]
|
||||
#![feature(const_fn)]
|
||||
|
||||
struct S {
|
||||
|
|
@ -18,6 +17,15 @@ const FOO: S = {
|
|||
s
|
||||
};
|
||||
|
||||
type Array = [u32; {
|
||||
let mut x = 2;
|
||||
let y = &mut x;
|
||||
//~^ ERROR references in constants may only refer to immutable values
|
||||
*y = 42;
|
||||
//~^ ERROR constant contains unimplemented expression type
|
||||
*y
|
||||
}];
|
||||
|
||||
fn main() {
|
||||
assert_eq!(FOO.state, 3);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,16 +1,28 @@
|
|||
error[E0019]: constant function contains unimplemented expression type
|
||||
--> $DIR/const_let_assign3.rs:10:9
|
||||
--> $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:17:5
|
||||
--> $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 2 previous errors
|
||||
error[E0017]: references in constants may only refer to immutable values
|
||||
--> $DIR/const_let_assign3.rs:22:13
|
||||
|
|
||||
LL | let y = &mut x;
|
||||
| ^^^^^^ constants require immutable values
|
||||
|
||||
error[E0019]: constant contains unimplemented expression type
|
||||
--> $DIR/const_let_assign3.rs:24:5
|
||||
|
|
||||
LL | *y = 42;
|
||||
| ^^^^^^^
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
Some errors occurred: E0017, E0019.
|
||||
For more information about an error, try `rustc --explain E0017`.
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
#![feature(const_let, const_fn)]
|
||||
|
||||
// run-pass
|
||||
|
||||
struct Foo<T>(T);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// compile-pass
|
||||
|
||||
#![feature(const_let, const_fn)]
|
||||
#![feature(const_fn)]
|
||||
|
||||
struct Foo<T>(T);
|
||||
struct Bar<T> { x: T }
|
||||
|
|
|
|||
11
src/test/ui/consts/const_let_irrefutable.rs
Normal file
11
src/test/ui/consts/const_let_irrefutable.rs
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
// compile-pass
|
||||
|
||||
fn main() {}
|
||||
|
||||
const fn tup((a, b): (i32, i32)) -> i32 {
|
||||
a + b
|
||||
}
|
||||
|
||||
const fn array([a, b]: [i32; 2]) -> i32 {
|
||||
a + b
|
||||
}
|
||||
5
src/test/ui/consts/const_let_refutable.rs
Normal file
5
src/test/ui/consts/const_let_refutable.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
fn main() {}
|
||||
|
||||
const fn slice([a, b]: &[i32]) -> i32 { //~ ERROR refutable pattern in function argument
|
||||
a + b
|
||||
}
|
||||
9
src/test/ui/consts/const_let_refutable.stderr
Normal file
9
src/test/ui/consts/const_let_refutable.stderr
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
error[E0005]: refutable pattern in function argument: `&[]` not covered
|
||||
--> $DIR/const_let_refutable.rs:3:16
|
||||
|
|
||||
LL | const fn slice([a, b]: &[i32]) -> i32 { //~ ERROR refutable pattern in function argument
|
||||
| ^^^^^^ pattern `&[]` not covered
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0005`.
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
#![feature(underscore_const_names, const_let)]
|
||||
#![feature(underscore_const_names)]
|
||||
|
||||
const _: bool = false && false;
|
||||
const _: bool = true && false;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,5 @@
|
|||
// https://github.com/rust-lang/rust/issues/55223
|
||||
|
||||
#![feature(const_let)]
|
||||
|
||||
union Foo<'a> {
|
||||
y: &'a (),
|
||||
long_live_the_unit: &'static (),
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
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 = ();
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
#![feature(const_let)]
|
||||
|
||||
const FOO: *const u32 = { //~ ERROR any use of this value will cause an error
|
||||
let x = 42;
|
||||
&x
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
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;
|
||||
|
|
|
|||
|
|
@ -112,12 +112,6 @@ error: `if`, `match`, `&&` and `||` are not stable in const fn
|
|||
LL | const fn foo30_5(b: bool) { while b { } } //~ ERROR not stable in const fn
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
error: local variables in const fn are unstable
|
||||
--> $DIR/min_const_fn.rs:99:34
|
||||
|
|
||||
LL | const fn foo30_6() -> bool { let x = true; x } //~ ERROR local variables in const fn
|
||||
| ^
|
||||
|
||||
error: `if`, `match`, `&&` and `||` are not stable in const fn
|
||||
--> $DIR/min_const_fn.rs:100:44
|
||||
|
|
||||
|
|
@ -220,7 +214,7 @@ error: function pointers in const fn are unstable
|
|||
LL | const fn no_fn_ptrs2() -> fn() { fn foo() {} foo }
|
||||
| ^^^^
|
||||
|
||||
error: aborting due to 35 previous errors
|
||||
error: aborting due to 34 previous errors
|
||||
|
||||
Some errors occurred: E0493, E0515.
|
||||
For more information about an error, try `rustc --explain E0493`.
|
||||
|
|
|
|||
|
|
@ -96,7 +96,7 @@ const fn foo30_2(x: *mut u32) -> usize { x as usize }
|
|||
const fn foo30_4(b: bool) -> usize { if b { 1 } else { 42 } }
|
||||
//~^ ERROR `if`, `match`, `&&` and `||` are not stable in const fn
|
||||
const fn foo30_5(b: bool) { while b { } } //~ ERROR not stable in const fn
|
||||
const fn foo30_6() -> bool { let x = true; x } //~ ERROR local variables in const fn
|
||||
const fn foo30_6() -> bool { let x = true; x }
|
||||
const fn foo36(a: bool, b: bool) -> bool { a && b }
|
||||
//~^ ERROR `if`, `match`, `&&` and `||` are not stable in const fn
|
||||
const fn foo37(a: bool, b: bool) -> bool { a || b }
|
||||
|
|
|
|||
|
|
@ -112,12 +112,6 @@ error: `if`, `match`, `&&` and `||` are not stable in const fn
|
|||
LL | const fn foo30_5(b: bool) { while b { } } //~ ERROR not stable in const fn
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
error: local variables in const fn are unstable
|
||||
--> $DIR/min_const_fn.rs:99:34
|
||||
|
|
||||
LL | const fn foo30_6() -> bool { let x = true; x } //~ ERROR local variables in const fn
|
||||
| ^
|
||||
|
||||
error: `if`, `match`, `&&` and `||` are not stable in const fn
|
||||
--> $DIR/min_const_fn.rs:100:44
|
||||
|
|
||||
|
|
@ -208,6 +202,6 @@ error: function pointers in const fn are unstable
|
|||
LL | const fn no_fn_ptrs2() -> fn() { fn foo() {} foo }
|
||||
| ^^^^
|
||||
|
||||
error: aborting due to 35 previous errors
|
||||
error: aborting due to 34 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0493`.
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
const fn mutable_ref_in_const() -> u8 {
|
||||
let mut a = 0; //~ ERROR local variables in const fn
|
||||
let b = &mut a;
|
||||
let mut a = 0;
|
||||
let b = &mut a; //~ ERROR mutable references in const fn
|
||||
*b
|
||||
}
|
||||
|
||||
|
|
@ -8,8 +8,8 @@ struct X;
|
|||
|
||||
impl X {
|
||||
const fn inherent_mutable_ref_in_const() -> u8 {
|
||||
let mut a = 0; //~ ERROR local variables in const fn
|
||||
let b = &mut a;
|
||||
let mut a = 0;
|
||||
let b = &mut a; //~ ERROR mutable references in const fn
|
||||
*b
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,14 +1,14 @@
|
|||
error: local variables in const fn are unstable
|
||||
--> $DIR/mutable_borrow.rs:2:9
|
||||
error: mutable references in const fn are unstable
|
||||
--> $DIR/mutable_borrow.rs:3:9
|
||||
|
|
||||
LL | let mut a = 0; //~ ERROR local variables in const fn
|
||||
| ^^^^^
|
||||
LL | let b = &mut a; //~ ERROR mutable references in const fn
|
||||
| ^
|
||||
|
||||
error: local variables in const fn are unstable
|
||||
--> $DIR/mutable_borrow.rs:11:13
|
||||
error: mutable references in const fn are unstable
|
||||
--> $DIR/mutable_borrow.rs:12:13
|
||||
|
|
||||
LL | let mut a = 0; //~ ERROR local variables in const fn
|
||||
| ^^^^^
|
||||
LL | let b = &mut a; //~ ERROR mutable references in const fn
|
||||
| ^
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
#![feature(const_let)]
|
||||
|
||||
use std::cell::Cell;
|
||||
|
||||
const FOO: &(Cell<usize>, bool) = {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
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
|
||||
| ^^^^
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
#![feature(const_let)]
|
||||
|
||||
use std::cell::Cell;
|
||||
|
||||
const FOO: &u32 = {
|
||||
|
|
|
|||
|
|
@ -1,17 +1,17 @@
|
|||
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:9:18
|
||||
--> $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
|
||||
| ^^^^^^
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
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`
|
||||
|
|
@ -9,6 +9,21 @@ LL | &y //~ ERROR does not live long enough
|
|||
LL | };
|
||||
| - `y` dropped here while still borrowed
|
||||
|
||||
error: aborting due to previous error
|
||||
error[E0716]: temporary value dropped while borrowed
|
||||
--> $DIR/promote_const_let.rs:6:28
|
||||
|
|
||||
LL | let x: &'static u32 = &{ //~ ERROR does not live long enough
|
||||
| ____________------------____^
|
||||
| | |
|
||||
| | type annotation requires that borrow lasts for `'static`
|
||||
LL | | let y = 42;
|
||||
LL | | y
|
||||
LL | | };
|
||||
| |_____^ creates a temporary which is freed while still in use
|
||||
LL | }
|
||||
| - temporary value is freed at the end of this statement
|
||||
|
||||
For more information about this error, try `rustc --explain E0597`.
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
Some errors occurred: E0597, E0716.
|
||||
For more information about an error, try `rustc --explain E0597`.
|
||||
|
|
|
|||
|
|
@ -1,8 +1,10 @@
|
|||
#![feature(const_let)]
|
||||
|
||||
fn main() {
|
||||
let x: &'static u32 = {
|
||||
let y = 42;
|
||||
&y //~ ERROR does not live long enough
|
||||
};
|
||||
let x: &'static u32 = &{ //~ ERROR does not live long enough
|
||||
let y = 42;
|
||||
y
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
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
|
||||
|
|
@ -8,6 +8,20 @@ LL | };
|
|||
|
|
||||
= note: borrowed value must be valid for the static lifetime...
|
||||
|
||||
error: aborting due to previous error
|
||||
error[E0597]: borrowed value does not live long enough
|
||||
--> $DIR/promote_const_let.rs:6:28
|
||||
|
|
||||
LL | let x: &'static u32 = &{ //~ ERROR does not live long enough
|
||||
| ____________________________^
|
||||
LL | | let y = 42;
|
||||
LL | | y
|
||||
LL | | };
|
||||
| |_____^ temporary value does not live long enough
|
||||
LL | }
|
||||
| - temporary value only lives until here
|
||||
|
|
||||
= note: borrowed value must be valid for the static lifetime...
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0597`.
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
#![feature(const_let)]
|
||||
|
||||
use std::cell::Cell;
|
||||
|
||||
// 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
|
||||
--> $DIR/qualif_overwrite.rs:12:5
|
||||
--> $DIR/qualif_overwrite.rs:10:5
|
||||
|
|
||||
LL | &{a} //~ ERROR cannot borrow a constant which may contain interior mutability
|
||||
| ^^^^
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
#![feature(const_let)]
|
||||
|
||||
use std::cell::Cell;
|
||||
|
||||
// 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
|
||||
--> $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
|
||||
| ^^^^^^
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
#![feature(const_let)]
|
||||
|
||||
static mut STDERR_BUFFER_SPACE: u8 = 0;
|
||||
|
||||
pub static mut STDERR_BUFFER: () = unsafe { *(&mut STDERR_BUFFER_SPACE) = 42; };
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
error[E0017]: references in statics may only refer to immutable values
|
||||
--> $DIR/static_mut_containing_mut_ref2.rs:5:46
|
||||
--> $DIR/static_mut_containing_mut_ref2.rs:3:46
|
||||
|
|
||||
LL | pub static mut STDERR_BUFFER: () = unsafe { *(&mut STDERR_BUFFER_SPACE) = 42; };
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ statics require immutable values
|
||||
|
||||
error[E0019]: static contains unimplemented expression type
|
||||
--> $DIR/static_mut_containing_mut_ref2.rs:5:45
|
||||
--> $DIR/static_mut_containing_mut_ref2.rs:3:45
|
||||
|
|
||||
LL | pub static mut STDERR_BUFFER: () = unsafe { *(&mut STDERR_BUFFER_SPACE) = 42; };
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
#![feature(const_let)]
|
||||
|
||||
static mut FOO: (u8, u8) = (42, 43);
|
||||
|
||||
static mut BAR: () = unsafe { FOO.0 = 99; };
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
error[E0080]: could not evaluate static initializer
|
||||
--> $DIR/static_mut_containing_mut_ref3.rs:5:31
|
||||
--> $DIR/static_mut_containing_mut_ref3.rs:3:31
|
||||
|
|
||||
LL | static mut BAR: () = unsafe { FOO.0 = 99; };
|
||||
| ^^^^^^^^^^ tried to modify a static's initial value from another static's initializer
|
||||
|
|
|
|||
|
|
@ -4,5 +4,6 @@
|
|||
#![allow(warnings)]
|
||||
|
||||
const CON : Box<i32> = box 0; //~ ERROR E0010
|
||||
//~^ ERROR constant contains unimplemented expression type
|
||||
|
||||
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.
|
||||
|
||||
error: aborting due to previous error
|
||||
error[E0019]: constant contains unimplemented expression type
|
||||
--> $DIR/E0010-teach.rs:6: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`.
|
||||
|
|
|
|||
|
|
@ -2,5 +2,6 @@
|
|||
#![allow(warnings)]
|
||||
|
||||
const CON : Box<i32> = box 0; //~ ERROR E0010
|
||||
//~^ ERROR constant contains unimplemented expression type
|
||||
|
||||
fn main() {}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,13 @@ error[E0010]: allocations are not allowed in constants
|
|||
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:4: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`.
|
||||
|
|
|
|||
|
|
@ -1,21 +0,0 @@
|
|||
// 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,91 +0,0 @@
|
|||
error[E0658]: let bindings in constants are unstable (see issue #48821)
|
||||
--> $DIR/feature-gate-const_let.rs:6:13
|
||||
|
|
||||
LL | let x = 42;
|
||||
| ^^
|
||||
|
|
||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
||||
|
||||
error[E0658]: statements in constants are unstable (see issue #48821)
|
||||
--> $DIR/feature-gate-const_let.rs:6:13
|
||||
|
|
||||
LL | let x = 42;
|
||||
| ^^
|
||||
|
|
||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
||||
|
||||
error[E0658]: let bindings in constants are unstable (see issue #48821)
|
||||
--> $DIR/feature-gate-const_let.rs:3:1
|
||||
|
|
||||
LL | / const FOO: usize = {
|
||||
LL | | //~^ ERROR statements in constants are unstable
|
||||
LL | | //~| ERROR: let bindings in constants are unstable
|
||||
LL | | let x = 42;
|
||||
... |
|
||||
LL | | 42
|
||||
LL | | };
|
||||
| |__^
|
||||
|
|
||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
||||
|
||||
error[E0658]: statements in constants are unstable (see issue #48821)
|
||||
--> $DIR/feature-gate-const_let.rs:3:1
|
||||
|
|
||||
LL | / const FOO: usize = {
|
||||
LL | | //~^ ERROR statements in constants are unstable
|
||||
LL | | //~| ERROR: let bindings in constants are unstable
|
||||
LL | | let x = 42;
|
||||
... |
|
||||
LL | | 42
|
||||
LL | | };
|
||||
| |__^
|
||||
|
|
||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
||||
|
||||
error[E0658]: let bindings in statics are unstable (see issue #48821)
|
||||
--> $DIR/feature-gate-const_let.rs:15:13
|
||||
|
|
||||
LL | let x = 42;
|
||||
| ^^
|
||||
|
|
||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
||||
|
||||
error[E0658]: statements in statics are unstable (see issue #48821)
|
||||
--> $DIR/feature-gate-const_let.rs:15:13
|
||||
|
|
||||
LL | let x = 42;
|
||||
| ^^
|
||||
|
|
||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
||||
|
||||
error[E0658]: let bindings in statics are unstable (see issue #48821)
|
||||
--> $DIR/feature-gate-const_let.rs:12:1
|
||||
|
|
||||
LL | / static BAR: usize = {
|
||||
LL | | //~^ ERROR statements in statics are unstable
|
||||
LL | | //~| ERROR: let bindings in statics are unstable
|
||||
LL | | let x = 42;
|
||||
... |
|
||||
LL | | 42
|
||||
LL | | };
|
||||
| |__^
|
||||
|
|
||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
||||
|
||||
error[E0658]: statements in statics are unstable (see issue #48821)
|
||||
--> $DIR/feature-gate-const_let.rs:12:1
|
||||
|
|
||||
LL | / static BAR: usize = {
|
||||
LL | | //~^ ERROR statements in statics are unstable
|
||||
LL | | //~| ERROR: let bindings in statics are unstable
|
||||
LL | | let x = 42;
|
||||
... |
|
||||
LL | | 42
|
||||
LL | | };
|
||||
| |__^
|
||||
|
|
||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
||||
|
||||
error: aborting due to 8 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0658`.
|
||||
|
|
@ -1,5 +1,3 @@
|
|||
#![feature(const_let)]
|
||||
|
||||
trait Trt {}
|
||||
struct Str {}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
error[E0658]: naming constants with `_` is unstable (see issue #54912)
|
||||
--> $DIR/feature-gate-underscore_const_names.rs:8:1
|
||||
--> $DIR/feature-gate-underscore_const_names.rs:6:1
|
||||
|
|
||||
LL | / const _ : () = {
|
||||
LL | | //~^ ERROR is unstable
|
||||
|
|
|
|||
|
|
@ -1,68 +1,14 @@
|
|||
error[E0658]: let bindings in constants are unstable (see issue #48821)
|
||||
--> $DIR/issue-18118.rs:5: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:5: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:8: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:2: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:2: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:8:9
|
||||
--> $DIR/issue-18118.rs:4: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`.
|
||||
|
|
|
|||
|
|
@ -1,11 +1,6 @@
|
|||
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
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,67 +1,13 @@
|
|||
error[E0658]: let bindings in constants are unstable (see issue #48821)
|
||||
--> $DIR/issue-18118.rs:5: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:5: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:8: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:2: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:2: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:8:10
|
||||
--> $DIR/issue-18118.rs:4: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`.
|
||||
|
|
|
|||
|
|
@ -1,11 +1,8 @@
|
|||
// ignore-tidy-linelength
|
||||
|
||||
#![feature(const_fn)]
|
||||
|
||||
const bad : u32 = {
|
||||
{
|
||||
5;
|
||||
//~^ ERROR statements in constants are unstable
|
||||
0
|
||||
}
|
||||
};
|
||||
|
|
@ -13,8 +10,7 @@ const bad : u32 = {
|
|||
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
|
||||
}
|
||||
};
|
||||
|
|
@ -22,7 +18,6 @@ const bad_two : u32 = {
|
|||
const bad_three : u32 = {
|
||||
{
|
||||
valid();
|
||||
//~^ ERROR statements in constants are unstable
|
||||
0
|
||||
}
|
||||
};
|
||||
|
|
@ -30,7 +25,6 @@ const bad_three : u32 = {
|
|||
static bad_four : u32 = {
|
||||
{
|
||||
5;
|
||||
//~^ ERROR statements in statics are unstable
|
||||
0
|
||||
}
|
||||
};
|
||||
|
|
@ -39,7 +33,6 @@ static bad_five : u32 = {
|
|||
{
|
||||
invalid();
|
||||
//~^ ERROR: calls in statics are limited to constant functions, tuple structs and tuple variants
|
||||
//~| ERROR statements in statics are unstable
|
||||
0
|
||||
}
|
||||
};
|
||||
|
|
@ -47,7 +40,6 @@ static bad_five : u32 = {
|
|||
static bad_six : u32 = {
|
||||
{
|
||||
valid();
|
||||
//~^ ERROR statements in statics are unstable
|
||||
0
|
||||
}
|
||||
};
|
||||
|
|
@ -55,7 +47,6 @@ static bad_six : u32 = {
|
|||
static mut bad_seven : u32 = {
|
||||
{
|
||||
5;
|
||||
//~^ ERROR statements in statics are unstable
|
||||
0
|
||||
}
|
||||
};
|
||||
|
|
@ -63,8 +54,7 @@ static mut bad_seven : u32 = {
|
|||
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
|
||||
}
|
||||
};
|
||||
|
|
@ -72,7 +62,6 @@ static mut bad_eight : u32 = {
|
|||
static mut bad_nine : u32 = {
|
||||
{
|
||||
valid();
|
||||
//~^ ERROR statements in statics are unstable
|
||||
0
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,94 +1,21 @@
|
|||
error[E0658]: statements in constants are unstable (see issue #48821)
|
||||
--> $DIR/issue-32829-2.rs:7: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:15:9
|
||||
--> $DIR/issue-32829-2.rs:12:9
|
||||
|
|
||||
LL | invalid();
|
||||
| ^^^^^^^^^
|
||||
|
||||
error[E0658]: statements in constants are unstable (see issue #48821)
|
||||
--> $DIR/issue-32829-2.rs:15: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:24: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:32: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:40:9
|
||||
--> $DIR/issue-32829-2.rs:34:9
|
||||
|
|
||||
LL | invalid();
|
||||
| ^^^^^^^^^
|
||||
|
||||
error[E0658]: statements in statics are unstable (see issue #48821)
|
||||
--> $DIR/issue-32829-2.rs:40: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:49: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:57: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:65:9
|
||||
--> $DIR/issue-32829-2.rs:56:9
|
||||
|
|
||||
LL | invalid();
|
||||
| ^^^^^^^^^
|
||||
|
||||
error[E0658]: statements in statics are unstable (see issue #48821)
|
||||
--> $DIR/issue-32829-2.rs:65:9
|
||||
|
|
||||
LL | invalid();
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
= help: add #![feature(const_let)] to the crate attributes to enable
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
error[E0658]: statements in statics are unstable (see issue #48821)
|
||||
--> $DIR/issue-32829-2.rs:74: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`.
|
||||
For more information about this error, try `rustc --explain E0015`.
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
const fn x() {
|
||||
let t = true; //~ ERROR local variables in const fn
|
||||
let x = || t;
|
||||
let t = true;
|
||||
let x = || t; //~ ERROR function pointers in const fn are unstable
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
error: local variables in const fn are unstable
|
||||
--> $DIR/issue-37550.rs:2:9
|
||||
error: function pointers in const fn are unstable
|
||||
--> $DIR/issue-37550.rs:3:9
|
||||
|
|
||||
LL | let t = true; //~ ERROR local variables in const fn
|
||||
LL | let x = || t; //~ ERROR function pointers in const fn are unstable
|
||||
| ^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
|
|
|||
|
|
@ -6,5 +6,6 @@ use std::cell::RefCell;
|
|||
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 static contains unimplemented expression type
|
||||
|
||||
fn main() { }
|
||||
|
|
|
|||
|
|
@ -4,6 +4,12 @@ error[E0010]: allocations are not allowed in statics
|
|||
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:6: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:6: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: 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`.
|
||||
|
|
|
|||
|
|
@ -2,5 +2,6 @@
|
|||
|
||||
static mut a: Box<isize> = box 3;
|
||||
//~^ ERROR allocations are not allowed in statics
|
||||
//~| ERROR static contains unimplemented expression type
|
||||
|
||||
fn main() {}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,13 @@ error[E0010]: allocations are not allowed in statics
|
|||
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:3: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`.
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
// compile-pass
|
||||
|
||||
#![feature(const_let)]
|
||||
#![feature(underscore_const_names)]
|
||||
|
||||
trait Trt {}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#![feature(rustc_attrs, const_let, const_fn)]
|
||||
#![feature(rustc_attrs)]
|
||||
|
||||
#[rustc_layout_scalar_valid_range_start(1)]
|
||||
#[repr(transparent)]
|
||||
|
|
@ -8,13 +8,13 @@ fn main() {
|
|||
|
||||
const fn foo() -> NonZero<u32> {
|
||||
let mut x = unsafe { NonZero(1) };
|
||||
let y = &mut x.0; //~ ERROR references in constant functions may only refer to immutable
|
||||
let y = &mut x.0; //~ ERROR references in const fn are unstable
|
||||
//~^ ERROR mutation of layout constrained field is unsafe
|
||||
unsafe { NonZero(1) }
|
||||
}
|
||||
|
||||
const fn bar() -> NonZero<u32> {
|
||||
let mut x = unsafe { NonZero(1) };
|
||||
let y = unsafe { &mut x.0 }; //~ ERROR references in constant functions may only refer to immut
|
||||
let y = unsafe { &mut x.0 }; //~ ERROR mutable references in const fn are unstable
|
||||
unsafe { NonZero(1) }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,24 +1,23 @@
|
|||
error[E0017]: references in constant functions may only refer to immutable values
|
||||
--> $DIR/ranged_ints2_const.rs:11:13
|
||||
error: mutable references in const fn are unstable
|
||||
--> $DIR/ranged_ints2_const.rs:11:9
|
||||
|
|
||||
LL | let y = &mut x.0; //~ ERROR references in constant functions may only refer to immutable
|
||||
| ^^^^^^^^ constant functions require immutable values
|
||||
LL | let y = &mut x.0; //~ ERROR references in const fn are unstable
|
||||
| ^
|
||||
|
||||
error[E0017]: references in constant functions may only refer to immutable values
|
||||
--> $DIR/ranged_ints2_const.rs:18:22
|
||||
error: mutable references in const fn are unstable
|
||||
--> $DIR/ranged_ints2_const.rs:18:9
|
||||
|
|
||||
LL | let y = unsafe { &mut x.0 }; //~ ERROR references in constant functions may only refer to immut
|
||||
| ^^^^^^^^ constant functions require immutable values
|
||||
LL | let y = unsafe { &mut x.0 }; //~ ERROR mutable references in const fn are unstable
|
||||
| ^
|
||||
|
||||
error[E0133]: mutation of layout constrained field is unsafe and requires unsafe function or block
|
||||
--> $DIR/ranged_ints2_const.rs:11:13
|
||||
|
|
||||
LL | let y = &mut x.0; //~ ERROR references in constant functions may only refer to immutable
|
||||
LL | let y = &mut x.0; //~ ERROR references in const fn are unstable
|
||||
| ^^^^^^^^ mutation of layout constrained field
|
||||
|
|
||||
= note: mutating layout constrained fields cannot statically be checked for valid values
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
Some errors occurred: E0017, E0133.
|
||||
For more information about an error, try `rustc --explain E0017`.
|
||||
For more information about this error, try `rustc --explain E0133`.
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#![feature(rustc_attrs, const_let, const_fn)]
|
||||
#![feature(rustc_attrs)]
|
||||
|
||||
use std::cell::Cell;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#![feature(rustc_attrs, const_let, const_fn)]
|
||||
#![feature(rustc_attrs)]
|
||||
|
||||
#[rustc_layout_scalar_valid_range_start(1)]
|
||||
#[repr(transparent)]
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
#![feature(const_let)]
|
||||
|
||||
pub static mut A: u32 = 0;
|
||||
pub static mut B: () = unsafe { A = 1; };
|
||||
//~^ ERROR could not evaluate static initializer
|
||||
|
|
|
|||
|
|
@ -1,23 +1,23 @@
|
|||
error[E0080]: could not evaluate static initializer
|
||||
--> $DIR/write-to-static-mut-in-static.rs:4:33
|
||||
--> $DIR/write-to-static-mut-in-static.rs:2:33
|
||||
|
|
||||
LL | pub static mut B: () = unsafe { A = 1; };
|
||||
| ^^^^^ tried to modify a static's initial value from another static's initializer
|
||||
|
||||
error[E0391]: cycle detected when const-evaluating `C`
|
||||
--> $DIR/write-to-static-mut-in-static.rs:7:34
|
||||
--> $DIR/write-to-static-mut-in-static.rs:5:34
|
||||
|
|
||||
LL | pub static mut C: u32 = unsafe { C = 1; 0 };
|
||||
| ^^^^^
|
||||
|
|
||||
note: ...which requires const-evaluating `C`...
|
||||
--> $DIR/write-to-static-mut-in-static.rs:7:1
|
||||
--> $DIR/write-to-static-mut-in-static.rs:5:1
|
||||
|
|
||||
LL | pub static mut C: u32 = unsafe { C = 1; 0 };
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: ...which again requires const-evaluating `C`, completing the cycle
|
||||
note: cycle used when const-evaluating + checking `C`
|
||||
--> $DIR/write-to-static-mut-in-static.rs:7:1
|
||||
--> $DIR/write-to-static-mut-in-static.rs:5:1
|
||||
|
|
||||
LL | pub static mut C: u32 = unsafe { C = 1; 0 };
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue