#![feature(never_type)]
#![feature(nll)]
#![feature(exhaustive_patterns)]
-#![cfg_attr(not(stage0), feature(min_const_unsafe_fn))]
#![feature(no_core)]
#![feature(on_unimplemented)]
#![feature(optin_builtin_traits)]
// hack to ensure that we don't try to access the private parts of `ItemLocalId` in this module
mod item_local_id_inner {
use rustc_data_structures::indexed_vec::Idx;
+ use serialize::{Decodable, Decoder};
/// An `ItemLocalId` uniquely identifies something within a given "item-like",
/// that is within a hir::Item, hir::TraitItem, or hir::ImplItem. There is no
/// guarantee that the numerical value of a given `ItemLocalId` corresponds to
#![feature(in_band_lifetimes)]
#![feature(crate_visibility_modifier)]
#![feature(transpose_result)]
-#![cfg_attr(not(stage0), feature(min_const_unsafe_fn))]
#![recursion_limit="512"]
use std::ops::{Add, Deref, Sub, Mul, AddAssign, Range, RangeInclusive};
use rustc_data_structures::indexed_vec::{Idx, IndexVec};
+use rustc_serialize::{Decodable, Decoder};
pub mod call;
--- /dev/null
+#![feature(rustc_attrs, const_let, const_fn)]
+
+#[rustc_layout_scalar_valid_range_start(1)]
+#[repr(transparent)]
+pub(crate) struct NonZero<T>(pub(crate) T);
+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
+ //~^ 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
+ unsafe { NonZero(1) }
+}
--- /dev/null
+error[E0017]: references in constant functions may only refer to immutable values
+ --> $DIR/ranged_ints2_const.rs:11:13
+ |
+LL | let y = &mut x.0; //~ ERROR references in constant functions may only refer to immutable
+ | ^^^^^^^^ constant functions require immutable values
+
+error[E0017]: references in constant functions may only refer to immutable values
+ --> $DIR/ranged_ints2_const.rs:18:22
+ |
+LL | let y = unsafe { &mut x.0 }; //~ ERROR references in constant functions may only refer to immut
+ | ^^^^^^^^ constant functions require immutable values
+
+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
+ | ^^^^^^^^ 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`.
--- /dev/null
+#![feature(rustc_attrs, const_let, const_fn)]
+
+use std::cell::Cell;
+
+#[rustc_layout_scalar_valid_range_start(1)]
+#[repr(transparent)]
+pub(crate) struct NonZero<T>(pub(crate) T);
+fn main() {}
+
+const fn foo() -> NonZero<Cell<u32>> {
+ let mut x = unsafe { NonZero(Cell::new(1)) };
+ let y = &x.0; //~ ERROR cannot borrow a constant which may contain interior mutability
+ //~^ ERROR borrow of layout constrained field with interior mutability
+ unsafe { NonZero(Cell::new(1)) }
+}
+
+const fn bar() -> NonZero<Cell<u32>> {
+ let mut x = unsafe { NonZero(Cell::new(1)) };
+ let y = unsafe { &x.0 }; //~ ERROR cannot borrow a constant which may contain interior mut
+ unsafe { NonZero(Cell::new(1)) }
+}
--- /dev/null
+error[E0492]: cannot borrow a constant which may contain interior mutability, create a static instead
+ --> $DIR/ranged_ints3_const.rs:12:13
+ |
+LL | let y = &x.0; //~ ERROR cannot borrow a constant which may contain interior mutability
+ | ^^^^
+
+error[E0492]: cannot borrow a constant which may contain interior mutability, create a static instead
+ --> $DIR/ranged_ints3_const.rs:19:22
+ |
+LL | let y = unsafe { &x.0 }; //~ ERROR cannot borrow a constant which may contain interior mut
+ | ^^^^
+
+error[E0133]: borrow of layout constrained field with interior mutability is unsafe and requires unsafe function or block
+ --> $DIR/ranged_ints3_const.rs:12:13
+ |
+LL | let y = &x.0; //~ ERROR cannot borrow a constant which may contain interior mutability
+ | ^^^^ borrow of layout constrained field with interior mutability
+ |
+ = note: references to fields of layout constrained fields lose the constraints. Coupled with interior mutability, the field can be changed to invalid values
+
+error: aborting due to 3 previous errors
+
+Some errors occurred: E0133, E0492.
+For more information about an error, try `rustc --explain E0133`.
--- /dev/null
+#![feature(rustc_attrs, const_let, const_fn)]
+
+#[rustc_layout_scalar_valid_range_start(1)]
+#[repr(transparent)]
+pub(crate) struct NonZero<T>(pub(crate) T);
+fn main() {}
+
+const fn foo() -> NonZero<u32> {
+ let mut x = unsafe { NonZero(1) };
+ x.0 = 0; //~ ERROR statements in constant functions are unstable
+ //~^ ERROR mutation of layout constrained field is unsafe
+ x
+}
+
+const fn bar() -> NonZero<u32> {
+ let mut x = unsafe { NonZero(1) };
+ unsafe { x.0 = 0 }; //~ ERROR statements in constant functions are unstable
+ x
+}
--- /dev/null
+error[E0658]: statements in constant functions are unstable (see issue #48821)
+ --> $DIR/ranged_ints4_const.rs:10:5
+ |
+LL | x.0 = 0; //~ ERROR statements 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/ranged_ints4_const.rs:17:14
+ |
+LL | unsafe { x.0 = 0 }; //~ ERROR statements in constant functions are unstable
+ | ^^^^^^^
+ |
+ = help: add #![feature(const_let)] to the crate attributes to enable
+
+error[E0133]: mutation of layout constrained field is unsafe and requires unsafe function or block
+ --> $DIR/ranged_ints4_const.rs:10:5
+ |
+LL | x.0 = 0; //~ ERROR statements in constant functions 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: E0133, E0658.
+For more information about an error, try `rustc --explain E0133`.
--- /dev/null
+#![feature(rustc_attrs)]
+
+#[rustc_layout_scalar_valid_range_start(1)]
+#[repr(transparent)]
+pub(crate) struct NonZero<T>(pub(crate) T);
+fn main() {}
+
+const fn foo() -> NonZero<u32> { NonZero(0) }
+//~^ ERROR initializing type with `rustc_layout_scalar_valid_range` attr is unsafe
+
+const fn bar() -> NonZero<u32> { unsafe { NonZero(0) } }
--- /dev/null
+error[E0133]: initializing type with `rustc_layout_scalar_valid_range` attr is unsafe and requires unsafe function or block
+ --> $DIR/ranged_ints_const.rs:8:34
+ |
+LL | const fn foo() -> NonZero<u32> { NonZero(0) }
+ | ^^^^^^^^^^ initializing type with `rustc_layout_scalar_valid_range` attr
+ |
+ = note: initializing a layout restricted type's field with a value outside the valid range is undefined behavior
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0133`.