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:
Mazdak Farrokhzad 2019-01-12 10:54:56 +01:00 committed by GitHub
commit bd8f464877
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
94 changed files with 416 additions and 977 deletions

View file

@ -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);
}

View file

@ -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)
},

View file

@ -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),
);

View file

@ -1,4 +1,4 @@
#![feature(const_fn, const_let)]
#![feature(const_fn)]
const X : usize = 2;

View file

@ -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];
}

View file

@ -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);
}

View file

@ -2,7 +2,7 @@
#![allow(dead_code)]
#![allow(unused_variables)]
#![feature(const_fn, const_let)]
#![feature(const_fn)]
const fn x() {
let t = true;

View file

@ -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

View file

@ -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`.

View file

@ -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
}

View file

@ -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`.

View file

@ -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() {}

View file

@ -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`.

View file

@ -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() {}

View file

@ -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`.

View file

@ -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() {}

View file

@ -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`.

View file

@ -2,7 +2,6 @@
// The test should never compile successfully
#![feature(const_raw_ptr_deref)]
#![feature(const_let)]
use std::cell::UnsafeCell;

View file

@ -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
| ^^^^^^^^^^^^^^^^

View file

@ -2,7 +2,6 @@
// The test should never compile successfully
#![feature(const_raw_ptr_deref)]
#![feature(const_let)]
use std::cell::UnsafeCell;

View file

@ -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
| ^^^^^^^

View file

@ -1,5 +1,3 @@
#![feature(const_let)]
fn main() {}
struct FakeNeedsDrop;

View file

@ -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); };
| ^

View file

@ -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).

View file

@ -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

View file

@ -1,5 +1,3 @@
#![feature(const_let)]
fn main() {
let _ = [(); {
//~^ WARNING Constant evaluating a complex constant, this might take some time

View file

@ -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

View file

@ -2,7 +2,6 @@
// The test should never compile successfully
#![feature(const_raw_ptr_deref)]
#![feature(const_let)]
use std::cell::UnsafeCell;

View file

@ -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();
| ^^^^^

View file

@ -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;

View file

@ -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() {}

View file

@ -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`.

View file

@ -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() {}

View file

@ -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`.

View file

@ -1,7 +1,5 @@
// compile-pass
#![feature(const_let)]
struct S(i32);
const A: () = {

View file

@ -1,8 +1,5 @@
// compile-pass
#![feature(const_let)]
#![feature(const_fn)]
pub struct AA {
pub data: [u8; 10],
}

View file

@ -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);
}

View file

@ -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`.

View file

@ -1,5 +1,3 @@
#![feature(const_let, const_fn)]
// run-pass
struct Foo<T>(T);

View file

@ -1,6 +1,6 @@
// compile-pass
#![feature(const_let, const_fn)]
#![feature(const_fn)]
struct Foo<T>(T);
struct Bar<T> { x: T }

View 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
}

View file

@ -0,0 +1,5 @@
fn main() {}
const fn slice([a, b]: &[i32]) -> i32 { //~ ERROR refutable pattern in function argument
a + b
}

View 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`.

View file

@ -1,4 +1,4 @@
#![feature(underscore_const_names, const_let)]
#![feature(underscore_const_names)]
const _: bool = false && false;
const _: bool = true && false;

View file

@ -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 (),

View file

@ -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 = ();

View file

@ -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

View file

@ -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;

View file

@ -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`.

View file

@ -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 }

View file

@ -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`.

View file

@ -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
}
}

View file

@ -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

View file

@ -1,5 +1,3 @@
#![feature(const_let)]
use std::cell::Cell;
const FOO: &(Cell<usize>, bool) = {

View file

@ -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
| ^^^^

View file

@ -1,5 +1,3 @@
#![feature(const_let)]
use std::cell::Cell;
const FOO: &u32 = {

View file

@ -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
| ^^^^^^

View file

@ -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`.

View file

@ -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
};
}

View file

@ -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`.

View file

@ -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

View file

@ -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
| ^^^^

View file

@ -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

View file

@ -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
| ^^^^^^

View file

@ -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; };

View file

@ -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; };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View file

@ -1,5 +1,3 @@
#![feature(const_let)]
static mut FOO: (u8, u8) = (42, 43);
static mut BAR: () = unsafe { FOO.0 = 99; };

View file

@ -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

View file

@ -4,5 +4,6 @@
#![allow(warnings)]
const CON : Box<i32> = box 0; //~ ERROR E0010
//~^ ERROR constant contains unimplemented expression type
fn main() {}

View file

@ -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`.

View file

@ -2,5 +2,6 @@
#![allow(warnings)]
const CON : Box<i32> = box 0; //~ ERROR E0010
//~^ ERROR constant contains unimplemented expression type
fn main() {}

View file

@ -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`.

View file

@ -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() {}

View file

@ -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`.

View file

@ -1,5 +1,3 @@
#![feature(const_let)]
trait Trt {}
struct Str {}

View file

@ -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

View file

@ -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`.

View file

@ -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
};
}

View file

@ -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`.

View file

@ -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
}
};

View file

@ -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`.

View file

@ -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() {}

View file

@ -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

View file

@ -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() { }

View file

@ -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`.

View file

@ -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() {}

View file

@ -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`.

View file

@ -1,6 +1,5 @@
// compile-pass
#![feature(const_let)]
#![feature(underscore_const_names)]
trait Trt {}

View file

@ -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) }
}

View file

@ -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`.

View file

@ -1,4 +1,4 @@
#![feature(rustc_attrs, const_let, const_fn)]
#![feature(rustc_attrs)]
use std::cell::Cell;

View file

@ -1,4 +1,4 @@
#![feature(rustc_attrs, const_let, const_fn)]
#![feature(rustc_attrs)]
#[rustc_layout_scalar_valid_range_start(1)]
#[repr(transparent)]

View file

@ -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

View file

@ -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 };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^