diff options
| author | Bastian Kauschke <bastian_kauschke@hotmail.de> | 2020-07-22 22:58:54 +0200 |
|---|---|---|
| committer | Bastian Kauschke <bastian_kauschke@hotmail.de> | 2020-07-22 22:58:54 +0200 |
| commit | a95e6bb91673e250e35886ff09a2ba023e536ff6 (patch) | |
| tree | 47d43a7d8a4f80f24be1ea8575a683333730066f | |
| parent | 9e92106d457abd14f82adc29e7f2496861e07916 (diff) | |
| download | rust-a95e6bb91673e250e35886ff09a2ba023e536ff6.tar.gz rust-a95e6bb91673e250e35886ff09a2ba023e536ff6.zip | |
require type defaults to be after const generic parameters
as if this is currently possible. HA!
| -rw-r--r-- | src/librustc_ast_passes/ast_validation.rs | 25 | ||||
| -rw-r--r-- | src/test/ui/const-generics/defaults/wrong-order.rs | 8 | ||||
| -rw-r--r-- | src/test/ui/const-generics/defaults/wrong-order.stderr | 19 |
3 files changed, 46 insertions, 6 deletions
diff --git a/src/librustc_ast_passes/ast_validation.rs b/src/librustc_ast_passes/ast_validation.rs index 975881d9a0a..f25f5d563eb 100644 --- a/src/librustc_ast_passes/ast_validation.rs +++ b/src/librustc_ast_passes/ast_validation.rs @@ -1118,13 +1118,26 @@ impl<'a> Visitor<'a> for AstValidator<'a> { fn visit_generics(&mut self, generics: &'a Generics) { let mut prev_ty_default = None; for param in &generics.params { - if let GenericParamKind::Type { ref default, .. } = param.kind { - if default.is_some() { + match param.kind { + GenericParamKind::Lifetime => (), + GenericParamKind::Type { default: Some(_), .. } => { prev_ty_default = Some(param.ident.span); - } else if let Some(span) = prev_ty_default { - self.err_handler() - .span_err(span, "type parameters with a default must be trailing"); - break; + } + GenericParamKind::Type { .. } | GenericParamKind::Const { .. } => { + if let Some(span) = prev_ty_default { + let mut err = self.err_handler().struct_span_err( + span, + "type parameters with a default must be trailing", + ); + if matches!(param.kind, GenericParamKind::Const { .. }) { + err.note( + "using type defaults and const parameters \ + in the same parameter listing is currently not possible", + ); + } + err.emit(); + break; + } } } } diff --git a/src/test/ui/const-generics/defaults/wrong-order.rs b/src/test/ui/const-generics/defaults/wrong-order.rs new file mode 100644 index 00000000000..7f17c6358b7 --- /dev/null +++ b/src/test/ui/const-generics/defaults/wrong-order.rs @@ -0,0 +1,8 @@ +#![feature(const_generics)] //~ WARN the feature `const_generics` is incomplete + +struct A<T = u32, const N: usize> { + //~^ ERROR type parameters with a default must be trailing + arg: T, +} + +fn main() {} diff --git a/src/test/ui/const-generics/defaults/wrong-order.stderr b/src/test/ui/const-generics/defaults/wrong-order.stderr new file mode 100644 index 00000000000..7d7cd0fa36f --- /dev/null +++ b/src/test/ui/const-generics/defaults/wrong-order.stderr @@ -0,0 +1,19 @@ +error: type parameters with a default must be trailing + --> $DIR/wrong-order.rs:3:10 + | +LL | struct A<T = u32, const N: usize> { + | ^ + | + = note: using type defaults and const parameters in the same parameter listing is currently not possible + +warning: the feature `const_generics` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/wrong-order.rs:1:12 + | +LL | #![feature(const_generics)] + | ^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #44580 <https://github.com/rust-lang/rust/issues/44580> for more information + +error: aborting due to previous error; 1 warning emitted + |
