-
-
Notifications
You must be signed in to change notification settings - Fork 14.7k
Add const_param_ty_unchecked gate
#153536
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -575,6 +575,11 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> { | |
| if self.tcx().is_lang_item(def_id, LangItem::Sized) { | ||
| return Default::default(); | ||
| } | ||
| if self.tcx().is_lang_item(def_id, LangItem::ConstParamTy) | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I wouldn't expect this to actually do anything 🤔 do you have an example that needs this code? otherwise we should drop this
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Without it Vec<[u8]> works :< (
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. can you double check this, and if it is definitely a problem can you try look into why |
||
| && self.tcx().features().const_param_ty_unchecked() | ||
| { | ||
| return Default::default(); | ||
| } | ||
|
|
||
| let predicates = self.tcx().predicates_of(def_id); | ||
| let mut origins = vec![def_id; predicates.predicates.len()]; | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -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() {} |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -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`. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,28 @@ | ||
| //@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() { | ||
| assert_eq!(2.0, something::<{1.0}>(1.0)); | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -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() {} |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -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`. |
Uh oh!
There was an error while loading. Please reload this page.