--- /dev/null
+error[E0277]: the size for values of type `T` cannot be known at compilation time
+ --> $DIR/const-argument-if-length.rs:8:28
+ |
+LL | pub const fn is_zst<T: ?Sized>() -> usize {
+ | - this type parameter needs to be `Sized`
+LL | if std::mem::size_of::<T>() == 0 {
+ | ^ doesn't have a size known at compile-time
+ |
+ ::: $SRC_DIR/core/src/mem/mod.rs:LL:COL
+ |
+LL | pub const fn size_of<T>() -> usize {
+ | - required by this bound in `std::mem::size_of`
+
+error[E0080]: evaluation of constant value failed
+ --> $DIR/const-argument-if-length.rs:19:15
+ |
+LL | pad: [u8; is_zst::<T>()],
+ | ^^^^^^^^^^^^^ referenced constant has errors
+
+error[E0277]: the size for values of type `T` cannot be known at compilation time
+ --> $DIR/const-argument-if-length.rs:17:12
+ |
+LL | pub struct AtLeastByte<T: ?Sized> {
+ | - this type parameter needs to be `Sized`
+LL | value: T,
+ | ^ doesn't have a size known at compile-time
+ |
+ = note: only the last field of a struct may have a dynamically sized type
+ = help: change the field's type to have a statically known size
+help: borrowed types always have a statically known size
+ |
+LL | value: &T,
+ | ^
+help: the `Box` type always has a statically known size and allocates its contents in the heap
+ |
+LL | value: Box<T>,
+ | ^^^^ ^
+
+error: aborting due to 3 previous errors
+
+Some errors have detailed explanations: E0080, E0277.
+For more information about an error, try `rustc --explain E0080`.
--- /dev/null
+error: generic parameters must not be used inside of non-trivial constant values
+ --> $DIR/const-argument-if-length.rs:19:24
+ |
+LL | pad: [u8; is_zst::<T>()],
+ | ^ non-trivial anonymous constants must not depend on the parameter `T`
+ |
+ = note: type parameters are currently not permitted in anonymous constants
+
+error[E0277]: the size for values of type `T` cannot be known at compilation time
+ --> $DIR/const-argument-if-length.rs:17:12
+ |
+LL | pub struct AtLeastByte<T: ?Sized> {
+ | - this type parameter needs to be `Sized`
+LL | value: T,
+ | ^ doesn't have a size known at compile-time
+ |
+ = note: only the last field of a struct may have a dynamically sized type
+ = help: change the field's type to have a statically known size
+help: borrowed types always have a statically known size
+ |
+LL | value: &T,
+ | ^
+help: the `Box` type always has a statically known size and allocates its contents in the heap
+ |
+LL | value: Box<T>,
+ | ^^^^ ^
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0277`.
-#![feature(min_const_generics)]
+// revisions: full min
+
+#![cfg_attr(full, allow(incomplete_features))]
+#![cfg_attr(full, feature(const_generics))]
+#![cfg_attr(min, feature(min_const_generics))]
pub const fn is_zst<T: ?Sized>() -> usize {
if std::mem::size_of::<T>() == 0 {
+ //[full]~^ ERROR the size for values of type `T` cannot be known at compilation time
1
} else {
0
value: T,
//~^ ERROR the size for values of type `T` cannot be known at compilation time
pad: [u8; is_zst::<T>()],
- //~^ ERROR generic parameters must not be used inside of non-trivial constant values
+ //[min]~^ ERROR generic parameters must not be used inside of non-trivial constant values
+ //[full]~^^ ERROR evaluation of constant value failed
}
fn main() {}
--- /dev/null
+error: constant expression depends on a generic parameter
+ --> $DIR/generic-function-call-in-array-length.rs:9:29
+ |
+LL | fn bar<const N: usize>() -> [u32; foo(N)] {
+ | ^^^^^^^^^^^^^
+ |
+ = note: this may fail depending on what value the parameter takes
+
+error: aborting due to previous error
+
--- /dev/null
+error: generic parameters must not be used inside of non-trivial constant values
+ --> $DIR/generic-function-call-in-array-length.rs:9:39
+ |
+LL | fn bar<const N: usize>() -> [u32; foo(N)] {
+ | ^ non-trivial anonymous constants must not depend on the parameter `N`
+ |
+ = help: it is currently only allowed to use either `N` or `{ N }` as generic constants
+
+error: generic parameters must not be used inside of non-trivial constant values
+ --> $DIR/generic-function-call-in-array-length.rs:12:13
+ |
+LL | [0; foo(N)]
+ | ^ non-trivial anonymous constants must not depend on the parameter `N`
+ |
+ = help: it is currently only allowed to use either `N` or `{ N }` as generic constants
+
+error: aborting due to 2 previous errors
+
-#![feature(min_const_generics)]
+// revisions: full min
+
+#![cfg_attr(full, allow(incomplete_features))]
+#![cfg_attr(full, feature(const_generics))]
+#![cfg_attr(min, feature(min_const_generics))]
const fn foo(n: usize) -> usize { n * 2 }
fn bar<const N: usize>() -> [u32; foo(N)] {
- //~^ ERROR generic parameters must not be used inside of non-trivial constant values
+ //[min]~^ ERROR generic parameters must not be used inside of non-trivial constant values
+ //[full]~^^ ERROR constant expression depends on a generic parameter
[0; foo(N)]
- //~^ ERROR generic parameters must not be used inside of non-trivial constant values
+ //[min]~^ ERROR generic parameters must not be used inside of non-trivial constant values
}
fn main() {}
--- /dev/null
+error: constant expression depends on a generic parameter
+ --> $DIR/generic-sum-in-array-length.rs:7:45
+ |
+LL | fn foo<const A: usize, const B: usize>(bar: [usize; A + B]) {}
+ | ^^^^^^^^^^^^^^
+ |
+ = note: this may fail depending on what value the parameter takes
+
+error: aborting due to previous error
+
--- /dev/null
+error: generic parameters must not be used inside of non-trivial constant values
+ --> $DIR/generic-sum-in-array-length.rs:7:53
+ |
+LL | fn foo<const A: usize, const B: usize>(bar: [usize; A + B]) {}
+ | ^ non-trivial anonymous constants must not depend on the parameter `A`
+ |
+ = help: it is currently only allowed to use either `A` or `{ A }` as generic constants
+
+error: generic parameters must not be used inside of non-trivial constant values
+ --> $DIR/generic-sum-in-array-length.rs:7:57
+ |
+LL | fn foo<const A: usize, const B: usize>(bar: [usize; A + B]) {}
+ | ^ non-trivial anonymous constants must not depend on the parameter `B`
+ |
+ = help: it is currently only allowed to use either `B` or `{ B }` as generic constants
+
+error: aborting due to 2 previous errors
+
-#![feature(min_const_generics)]
+// revisions: full min
+
+#![cfg_attr(full, allow(incomplete_features))]
+#![cfg_attr(full, feature(const_generics))]
+#![cfg_attr(min, feature(min_const_generics))]
fn foo<const A: usize, const B: usize>(bar: [usize; A + B]) {}
-//~^ ERROR generic parameters must not be used inside of non-trivial constant values
-//~| ERROR generic parameters must not be used inside of non-trivial constant values
+//[min]~^ ERROR generic parameters must not be used inside of non-trivial constant values
+//[min]~| ERROR generic parameters must not be used inside of non-trivial constant values
+//[full]~^^^ ERROR constant expression depends on a generic parameter
fn main() {}
--- /dev/null
+error: constant expression depends on a generic parameter
+ --> $DIR/intrinsics-type_name-as-const-argument.rs:15:8
+ |
+LL | T: Trait<{std::intrinsics::type_name::<T>()}>
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ |
+ = note: this may fail depending on what value the parameter takes
+
+error: aborting due to previous error
+
--- /dev/null
+error: generic parameters must not be used inside of non-trivial constant values
+ --> $DIR/intrinsics-type_name-as-const-argument.rs:15:44
+ |
+LL | T: Trait<{std::intrinsics::type_name::<T>()}>
+ | ^ non-trivial anonymous constants must not depend on the parameter `T`
+ |
+ = note: type parameters are currently not permitted in anonymous constants
+
+error: `&'static str` is forbidden as the type of a const generic parameter
+ --> $DIR/intrinsics-type_name-as-const-argument.rs:10:22
+ |
+LL | trait Trait<const S: &'static str> {}
+ | ^^^^^^^^^^^^
+ |
+ = note: the only supported types are integers, `bool` and `char`
+ = note: more complex types are supported with `#[feature(const_generics)]`
+
+error: aborting due to 2 previous errors
+
-#![feature(min_const_generics)]
+// revisions: full min
+
+#![cfg_attr(full, allow(incomplete_features))]
+#![cfg_attr(full, feature(const_generics))]
+#![cfg_attr(min, feature(min_const_generics))]
+
#![feature(core_intrinsics)]
+#![feature(const_type_name)]
trait Trait<const S: &'static str> {}
-//~^ ERROR `&'static str` is forbidden as the type of a const generic parameter
+//[min]~^ ERROR `&'static str` is forbidden as the type of a const generic parameter
struct Bug<T>
where
T: Trait<{std::intrinsics::type_name::<T>()}>
- //~^ ERROR generic parameters must not be used inside of non-trivial constant values
+ //[min]~^ ERROR generic parameters must not be used inside of non-trivial constant values
+ //[full]~^^ ERROR constant expression depends on a generic parameter
{
t: T
}
--- /dev/null
+warning: cannot use constants which depend on generic parameters in types
+ --> $DIR/issue-67375.rs:9:12
+ |
+LL | inner: [(); { [|_: &T| {}; 0].len() }],
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ |
+ = note: `#[warn(const_evaluatable_unchecked)]` on by default
+ = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+ = note: for more information, see issue #76200 <https://github.com/rust-lang/rust/issues/76200>
+
+error[E0392]: parameter `T` is never used
+ --> $DIR/issue-67375.rs:7:12
+ |
+LL | struct Bug<T> {
+ | ^ unused parameter
+ |
+ = help: consider removing `T`, referring to it in a field, or using a marker such as `PhantomData`
+
+error: aborting due to previous error; 1 warning emitted
+
+For more information about this error, try `rustc --explain E0392`.
--- /dev/null
+error: generic parameters must not be used inside of non-trivial constant values
+ --> $DIR/issue-67375.rs:9:25
+ |
+LL | inner: [(); { [|_: &T| {}; 0].len() }],
+ | ^ non-trivial anonymous constants must not depend on the parameter `T`
+ |
+ = note: type parameters are currently not permitted in anonymous constants
+
+error[E0392]: parameter `T` is never used
+ --> $DIR/issue-67375.rs:7:12
+ |
+LL | struct Bug<T> {
+ | ^ unused parameter
+ |
+ = help: consider removing `T`, referring to it in a field, or using a marker such as `PhantomData`
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0392`.
-#![feature(min_const_generics)]
+// revisions: full min
+
+#![cfg_attr(full, allow(incomplete_features))]
+#![cfg_attr(full, feature(const_generics))]
+#![cfg_attr(min, feature(min_const_generics))]
struct Bug<T> {
//~^ ERROR parameter `T` is never used
inner: [(); { [|_: &T| {}; 0].len() }],
- //~^ ERROR generic parameters must not be used inside of non-trivial constant values
+ //[min]~^ ERROR generic parameters must not be used inside of non-trivial constant values
+ //[full]~^^ WARN cannot use constants which depend on generic parameters in types
+ //[full]~^^^ WARN this was previously accepted by the compiler
}
fn main() {}
--- /dev/null
+error[E0308]: mismatched types
+ --> $DIR/issue-67945-1.rs:14:20
+ |
+LL | struct Bug<S> {
+ | - this type parameter
+...
+LL | let x: S = MaybeUninit::uninit();
+ | - ^^^^^^^^^^^^^^^^^^^^^ expected type parameter `S`, found union `MaybeUninit`
+ | |
+ | expected due to this
+ |
+ = note: expected type parameter `S`
+ found union `MaybeUninit<_>`
+
+error[E0392]: parameter `S` is never used
+ --> $DIR/issue-67945-1.rs:11:12
+ |
+LL | struct Bug<S> {
+ | ^ unused parameter
+ |
+ = help: consider removing `S`, referring to it in a field, or using a marker such as `PhantomData`
+
+error: aborting due to 2 previous errors
+
+Some errors have detailed explanations: E0308, E0392.
+For more information about an error, try `rustc --explain E0308`.
--- /dev/null
+error: generic parameters must not be used inside of non-trivial constant values
+ --> $DIR/issue-67945-1.rs:14:16
+ |
+LL | let x: S = MaybeUninit::uninit();
+ | ^ non-trivial anonymous constants must not depend on the parameter `S`
+ |
+ = note: type parameters are currently not permitted in anonymous constants
+
+error: generic parameters must not be used inside of non-trivial constant values
+ --> $DIR/issue-67945-1.rs:17:45
+ |
+LL | let b = &*(&x as *const _ as *const S);
+ | ^ non-trivial anonymous constants must not depend on the parameter `S`
+ |
+ = note: type parameters are currently not permitted in anonymous constants
+
+error[E0392]: parameter `S` is never used
+ --> $DIR/issue-67945-1.rs:11:12
+ |
+LL | struct Bug<S> {
+ | ^ unused parameter
+ |
+ = help: consider removing `S`, referring to it in a field, or using a marker such as `PhantomData`
+
+error: aborting due to 3 previous errors
+
+For more information about this error, try `rustc --explain E0392`.
-#![feature(min_const_generics)]
+// revisions: full min
+
+#![cfg_attr(full, allow(incomplete_features))]
+#![cfg_attr(full, feature(const_generics))]
+#![cfg_attr(min, feature(min_const_generics))]
use std::marker::PhantomData;
//~^ ERROR parameter `S` is never used
A: [(); {
let x: S = MaybeUninit::uninit();
- //~^ ERROR generic parameters must not be used inside of non-trivial constant values
+ //[min]~^ ERROR generic parameters must not be used inside of non-trivial constant values
+ //[full]~^^ ERROR mismatched types
let b = &*(&x as *const _ as *const S);
- //~^ ERROR generic parameters must not be used inside of non-trivial constant values
+ //[min]~^ ERROR generic parameters must not be used inside of non-trivial constant values
0
}],
}
--- /dev/null
+error[E0308]: mismatched types
+ --> $DIR/issue-67945-2.rs:12:20
+ |
+LL | struct Bug<S> {
+ | - this type parameter
+...
+LL | let x: S = MaybeUninit::uninit();
+ | - ^^^^^^^^^^^^^^^^^^^^^ expected type parameter `S`, found union `MaybeUninit`
+ | |
+ | expected due to this
+ |
+ = note: expected type parameter `S`
+ found union `MaybeUninit<_>`
+
+error[E0392]: parameter `S` is never used
+ --> $DIR/issue-67945-2.rs:9:12
+ |
+LL | struct Bug<S> {
+ | ^ unused parameter
+ |
+ = help: consider removing `S`, referring to it in a field, or using a marker such as `PhantomData`
+
+error: aborting due to 2 previous errors
+
+Some errors have detailed explanations: E0308, E0392.
+For more information about an error, try `rustc --explain E0308`.
--- /dev/null
+error: generic parameters must not be used inside of non-trivial constant values
+ --> $DIR/issue-67945-2.rs:12:16
+ |
+LL | let x: S = MaybeUninit::uninit();
+ | ^ non-trivial anonymous constants must not depend on the parameter `S`
+ |
+ = note: type parameters are currently not permitted in anonymous constants
+
+error: generic parameters must not be used inside of non-trivial constant values
+ --> $DIR/issue-67945-2.rs:15:45
+ |
+LL | let b = &*(&x as *const _ as *const S);
+ | ^ non-trivial anonymous constants must not depend on the parameter `S`
+ |
+ = note: type parameters are currently not permitted in anonymous constants
+
+error[E0392]: parameter `S` is never used
+ --> $DIR/issue-67945-2.rs:9:12
+ |
+LL | struct Bug<S> {
+ | ^ unused parameter
+ |
+ = help: consider removing `S`, referring to it in a field, or using a marker such as `PhantomData`
+
+error: aborting due to 3 previous errors
+
+For more information about this error, try `rustc --explain E0392`.
-#![feature(min_const_generics)]
+// revisions: full min
+
+#![cfg_attr(full, allow(incomplete_features))]
+#![cfg_attr(full, feature(const_generics))]
+#![cfg_attr(min, feature(min_const_generics))]
use std::mem::MaybeUninit;
//~^ ERROR parameter `S` is never used
A: [(); {
let x: S = MaybeUninit::uninit();
- //~^ ERROR generic parameters must not be used inside of non-trivial constant values
+ //[min]~^ ERROR generic parameters must not be used inside of non-trivial constant values
+ //[full]~^^ ERROR mismatched types
let b = &*(&x as *const _ as *const S);
- //~^ ERROR generic parameters must not be used inside of non-trivial constant values
+ //[min]~^ ERROR generic parameters must not be used inside of non-trivial constant values
0
}],
}
--- /dev/null
+error: constant expression depends on a generic parameter
+ --> $DIR/issue-67945-3.rs:8:8
+ |
+LL | A: [(); {
+ | ________^
+LL | |
+LL | | let x: Option<Box<Self>> = None;
+LL | |
+LL | | 0
+LL | | }],
+ | |______^
+ |
+ = note: this may fail depending on what value the parameter takes
+
+error: aborting due to previous error
+
--- /dev/null
+error: generic `Self` types are currently not permitted in anonymous constants
+ --> $DIR/issue-67945-3.rs:10:27
+ |
+LL | let x: Option<Box<Self>> = None;
+ | ^^^^
+
+error: aborting due to previous error
+
-#![feature(min_const_generics)]
+// revisions: full min
+
+#![cfg_attr(full, allow(incomplete_features))]
+#![cfg_attr(full, feature(const_generics))]
+#![cfg_attr(min, feature(min_const_generics))]
struct Bug<S: ?Sized> {
A: [(); {
+ //[full]~^ ERROR constant expression depends on a generic parameter
let x: Option<Box<Self>> = None;
- //~^ ERROR generic `Self` types are currently not permitted in anonymous constants
+ //[min]~^ ERROR generic `Self` types are currently not permitted in anonymous constants
0
}],
B: S