mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-29 20:46:07 +03:00
add const_param_ty_unchecked gate
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
//! Ensure we don't allow Vec<[u8]> as const parameter even with
|
||||
//! `const_param_ty_unchecked` feature.
|
||||
#![allow(incomplete_features)]
|
||||
#![feature(adt_const_params, const_param_ty_unchecked, const_param_ty_trait)]
|
||||
use std::marker::ConstParamTy_;
|
||||
|
||||
struct VectorOfBytes {
|
||||
a: Vec<[u8]>
|
||||
//~^ ERROR: the size for values of type `[u8]` cannot be known at compilation time [E0277]
|
||||
}
|
||||
impl ConstParamTy_ for VectorOfBytes {}
|
||||
|
||||
fn bar<const N: VectorOfBytes>() {}
|
||||
fn foo<const N: Vec<[u8]>>() {}
|
||||
//~^ ERROR: the size for values of type `[u8]` cannot be known at compilation time [E0277]
|
||||
//~| ERROR: the size for values of type `[u8]` cannot be known at compilation time [E0277]
|
||||
|
||||
|
||||
fn main() {}
|
||||
@@ -0,0 +1,34 @@
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> $DIR/const_param_ty_unchecked-unsupported.rs:8:8
|
||||
|
|
||||
LL | a: Vec<[u8]>
|
||||
| ^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by an implicit `Sized` bound in `Vec`
|
||||
--> $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> $DIR/const_param_ty_unchecked-unsupported.rs:14:8
|
||||
|
|
||||
LL | fn foo<const N: Vec<[u8]>>() {}
|
||||
| ^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by an implicit `Sized` bound in `Vec`
|
||||
--> $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> $DIR/const_param_ty_unchecked-unsupported.rs:14:8
|
||||
|
|
||||
LL | fn foo<const N: Vec<[u8]>>() {}
|
||||
| ^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by an implicit `Sized` bound in `Vec`
|
||||
--> $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
||||
@@ -0,0 +1,26 @@
|
||||
//@run-pass
|
||||
//! Ensure that const_param_ty_unchecked gate allow
|
||||
//! bypassing `ConstParamTy_` implementation check
|
||||
|
||||
#![allow(dead_code, incomplete_features)]
|
||||
#![feature(const_param_ty_unchecked, const_param_ty_trait)]
|
||||
|
||||
use std::marker::ConstParamTy_;
|
||||
|
||||
struct Miow;
|
||||
|
||||
struct Meoww(Miow);
|
||||
|
||||
struct Float {
|
||||
float: f32,
|
||||
}
|
||||
|
||||
impl ConstParamTy_ for Meoww {}
|
||||
impl ConstParamTy_ for Float {}
|
||||
|
||||
fn something2<const N: *mut u8>() {}
|
||||
fn something<const N: f64>(a: f64) -> f64 {
|
||||
N + a
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
@@ -0,0 +1,31 @@
|
||||
// gate-test-const_param_ty_unchecked
|
||||
//! Ensure this fails when const_param_ty_unchecked isn't used
|
||||
#![allow(incomplete_features)]
|
||||
#![feature(const_param_ty_trait)]
|
||||
|
||||
use std::marker::ConstParamTy_;
|
||||
|
||||
struct Miow;
|
||||
|
||||
struct Meoww(Miow);
|
||||
|
||||
struct Float {
|
||||
float: f32,
|
||||
}
|
||||
|
||||
impl ConstParamTy_ for Meoww {}
|
||||
//~^ ERROR: the trait `ConstParamTy_` cannot be implemented for this type [E0204]
|
||||
impl ConstParamTy_ for Float {}
|
||||
//~^ ERROR: the trait `ConstParamTy_` cannot be implemented for this type [E0204]
|
||||
|
||||
fn something2<const N: *mut u8>() {}
|
||||
//~^ ERROR: using raw pointers as const generic parameters is forbidden
|
||||
fn something<const N: f64>(a: f64) -> f64 {
|
||||
//~^ ERROR: `f64` is forbidden as the type of a const generic parameter
|
||||
N + a
|
||||
}
|
||||
fn foo<const N: Vec<[u8]>>() {}
|
||||
//~^ ERROR: the size for values of type `[u8]` cannot be known at compilation time [E0277]
|
||||
//~^^ ERROR: `Vec<[u8]>` is forbidden as the type of a const generic parameter
|
||||
|
||||
fn main() {}
|
||||
@@ -0,0 +1,56 @@
|
||||
error[E0204]: the trait `ConstParamTy_` cannot be implemented for this type
|
||||
--> $DIR/const_param_ty_unchecked_fail.rs:16:24
|
||||
|
|
||||
LL | struct Meoww(Miow);
|
||||
| ---- this field does not implement `ConstParamTy_`
|
||||
...
|
||||
LL | impl ConstParamTy_ for Meoww {}
|
||||
| ^^^^^
|
||||
|
||||
error[E0204]: the trait `ConstParamTy_` cannot be implemented for this type
|
||||
--> $DIR/const_param_ty_unchecked_fail.rs:18:24
|
||||
|
|
||||
LL | float: f32,
|
||||
| ---------- this field does not implement `ConstParamTy_`
|
||||
...
|
||||
LL | impl ConstParamTy_ for Float {}
|
||||
| ^^^^^
|
||||
|
||||
error: using raw pointers as const generic parameters is forbidden
|
||||
--> $DIR/const_param_ty_unchecked_fail.rs:21:24
|
||||
|
|
||||
LL | fn something2<const N: *mut u8>() {}
|
||||
| ^^^^^^^
|
||||
|
|
||||
= note: the only supported types are integers, `bool`, and `char`
|
||||
|
||||
error: `f64` is forbidden as the type of a const generic parameter
|
||||
--> $DIR/const_param_ty_unchecked_fail.rs:23:23
|
||||
|
|
||||
LL | fn something<const N: f64>(a: f64) -> f64 {
|
||||
| ^^^
|
||||
|
|
||||
= note: the only supported types are integers, `bool`, and `char`
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> $DIR/const_param_ty_unchecked_fail.rs:27:8
|
||||
|
|
||||
LL | fn foo<const N: Vec<[u8]>>() {}
|
||||
| ^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by an implicit `Sized` bound in `Vec`
|
||||
--> $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
|
||||
|
||||
error: `Vec<[u8]>` is forbidden as the type of a const generic parameter
|
||||
--> $DIR/const_param_ty_unchecked_fail.rs:27:17
|
||||
|
|
||||
LL | fn foo<const N: Vec<[u8]>>() {}
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
= note: the only supported types are integers, `bool`, and `char`
|
||||
|
||||
error: aborting due to 6 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0204, E0277.
|
||||
For more information about an error, try `rustc --explain E0204`.
|
||||
Reference in New Issue
Block a user