From a95e6bb91673e250e35886ff09a2ba023e536ff6 Mon Sep 17 00:00:00 2001 From: Bastian Kauschke Date: Wed, 22 Jul 2020 22:58:54 +0200 Subject: [PATCH 1/2] require type defaults to be after const generic parameters as if this is currently possible. HA! --- src/librustc_ast_passes/ast_validation.rs | 25 ++++++++++++++----- .../ui/const-generics/defaults/wrong-order.rs | 8 ++++++ .../defaults/wrong-order.stderr | 19 ++++++++++++++ 3 files changed, 46 insertions(+), 6 deletions(-) create mode 100644 src/test/ui/const-generics/defaults/wrong-order.rs create mode 100644 src/test/ui/const-generics/defaults/wrong-order.stderr diff --git a/src/librustc_ast_passes/ast_validation.rs b/src/librustc_ast_passes/ast_validation.rs index 975881d9a0ac0..f25f5d563ebc8 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 0000000000000..7f17c6358b7b6 --- /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 { + //~^ 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 0000000000000..7d7cd0fa36f4f --- /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 { + | ^ + | + = 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 for more information + +error: aborting due to previous error; 1 warning emitted + From 2f565967b056335659ff1dfc2108c746f4ac8af3 Mon Sep 17 00:00:00 2001 From: Bastian Kauschke Date: Thu, 23 Jul 2020 08:06:42 +0200 Subject: [PATCH 2/2] tweak wording Co-authored-by: varkor --- src/librustc_ast_passes/ast_validation.rs | 2 +- src/test/ui/const-generics/defaults/wrong-order.stderr | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/librustc_ast_passes/ast_validation.rs b/src/librustc_ast_passes/ast_validation.rs index f25f5d563ebc8..daf3e23d6a123 100644 --- a/src/librustc_ast_passes/ast_validation.rs +++ b/src/librustc_ast_passes/ast_validation.rs @@ -1132,7 +1132,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> { if matches!(param.kind, GenericParamKind::Const { .. }) { err.note( "using type defaults and const parameters \ - in the same parameter listing is currently not possible", + in the same parameter list is currently not permitted", ); } err.emit(); diff --git a/src/test/ui/const-generics/defaults/wrong-order.stderr b/src/test/ui/const-generics/defaults/wrong-order.stderr index 7d7cd0fa36f4f..283f6656121c3 100644 --- a/src/test/ui/const-generics/defaults/wrong-order.stderr +++ b/src/test/ui/const-generics/defaults/wrong-order.stderr @@ -4,7 +4,7 @@ error: type parameters with a default must be trailing LL | struct A { | ^ | - = note: using type defaults and const parameters in the same parameter listing is currently not possible + = note: using type defaults and const parameters in the same parameter list is currently not permitted 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