diff options
| author | kadmin <julianknodt@gmail.com> | 2020-08-11 00:02:45 +0000 |
|---|---|---|
| committer | kadmin <julianknodt@gmail.com> | 2021-03-23 17:16:20 +0000 |
| commit | e4e5db4e4207e21c38c07640d44005dab022f1b8 (patch) | |
| tree | 32856def2da071e067f79505960bf18debd407e4 /src | |
| parent | 79e5814f4520f2c51b5307421db45cd82d134e76 (diff) | |
| download | rust-e4e5db4e4207e21c38c07640d44005dab022f1b8.tar.gz rust-e4e5db4e4207e21c38c07640d44005dab022f1b8.zip | |
Add has_default to GenericParamDefKind::Const
This currently creates a field which is always false on GenericParamDefKind for future use when consts are permitted to have defaults Update const_generics:default locations Previously just ignored them, now actually do something about them. Fix using type check instead of value Add parsing This adds all the necessary changes to lower const-generics defaults from parsing. Change P<Expr> to AnonConst This matches the arguments passed to instantiations of const generics, and makes it specific to just anonymous constants. Attempt to fix lowering bugs
Diffstat (limited to 'src')
6 files changed, 37 insertions, 6 deletions
diff --git a/src/test/ui/const-generics/defaults/const-default.rs b/src/test/ui/const-generics/defaults/const-default.rs new file mode 100644 index 00000000000..b2286e7d5bd --- /dev/null +++ b/src/test/ui/const-generics/defaults/const-default.rs @@ -0,0 +1,15 @@ +// check-pass + +#![feature(const_generics)] +#![feature(const_generic_defaults)] +#![allow(incomplete_features)] + + +#[derive(Default)] +pub struct ConstDefault<const N: usize = 3> { + items: [u32; N] +} + +pub fn main() { + let s = ConstDefault::default(); +} diff --git a/src/test/ui/const-generics/min_const_generics/default_function_param.rs b/src/test/ui/const-generics/min_const_generics/default_function_param.rs index 5b0a42a4556..e4044eaaa7c 100644 --- a/src/test/ui/const-generics/min_const_generics/default_function_param.rs +++ b/src/test/ui/const-generics/min_const_generics/default_function_param.rs @@ -1,3 +1,6 @@ +#![feature(const_generic_defaults)] +#![feature(min_const_generics)] + fn foo<const SIZE: usize = 5>() {} //~^ ERROR default values for const generic parameters are experimental diff --git a/src/test/ui/const-generics/min_const_generics/default_trait_param.rs b/src/test/ui/const-generics/min_const_generics/default_trait_param.rs index 14bac473ed9..c3581aca1cf 100644 --- a/src/test/ui/const-generics/min_const_generics/default_trait_param.rs +++ b/src/test/ui/const-generics/min_const_generics/default_trait_param.rs @@ -1,4 +1,2 @@ trait Foo<const KIND: bool = true> {} //~^ ERROR default values for const generic parameters are experimental - -fn main() {} diff --git a/src/test/ui/feature-gate/feature-gate-const_generic_defaults.rs b/src/test/ui/feature-gate/feature-gate-const_generic_defaults.rs new file mode 100644 index 00000000000..6ba314666e2 --- /dev/null +++ b/src/test/ui/feature-gate/feature-gate-const_generic_defaults.rs @@ -0,0 +1,5 @@ +#![feature(min_const_generics)] +#![crate_type="lib"] + +struct A<const N: usize = 3>; +//~^ ERROR default values for diff --git a/src/test/ui/feature-gate/feature-gate-const_generic_defaults.stderr b/src/test/ui/feature-gate/feature-gate-const_generic_defaults.stderr new file mode 100644 index 00000000000..0b7140c0c0f --- /dev/null +++ b/src/test/ui/feature-gate/feature-gate-const_generic_defaults.stderr @@ -0,0 +1,10 @@ +error: default values for const generic parameters are unstable + --> $DIR/feature-gate-const_generic_defaults.rs:4:27 + | +LL | struct A<const N: usize = 3>; + | ^ + | + = note: to enable them use #![feature(const_generic_defaults)] + +error: aborting due to previous error + diff --git a/src/tools/clippy/clippy_utils/src/ast_utils.rs b/src/tools/clippy/clippy_utils/src/ast_utils.rs index ea9a910d1b9..e202b5061a6 100644 --- a/src/tools/clippy/clippy_utils/src/ast_utils.rs +++ b/src/tools/clippy/clippy_utils/src/ast_utils.rs @@ -408,6 +408,10 @@ pub fn eq_use_tree(l: &UseTree, r: &UseTree) -> bool { eq_path(&l.prefix, &r.prefix) && eq_use_tree_kind(&l.kind, &r.kind) } +pub fn eq_anon_const(l: &AnonConst, r: &AnonConst) -> bool { + eq_expr(&l.value, &r.value) +} + pub fn eq_use_tree_kind(l: &UseTreeKind, r: &UseTreeKind) -> bool { use UseTreeKind::*; match (l, r) { @@ -418,10 +422,6 @@ pub fn eq_use_tree_kind(l: &UseTreeKind, r: &UseTreeKind) -> bool { } } -pub fn eq_anon_const(l: &AnonConst, r: &AnonConst) -> bool { - eq_expr(&l.value, &r.value) -} - pub fn eq_defaultness(l: Defaultness, r: Defaultness) -> bool { matches!( (l, r), |
