about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBastian Kauschke <bastian_kauschke@hotmail.de>2020-07-22 22:58:54 +0200
committerBastian Kauschke <bastian_kauschke@hotmail.de>2020-07-22 22:58:54 +0200
commita95e6bb91673e250e35886ff09a2ba023e536ff6 (patch)
tree47d43a7d8a4f80f24be1ea8575a683333730066f
parent9e92106d457abd14f82adc29e7f2496861e07916 (diff)
downloadrust-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.rs25
-rw-r--r--src/test/ui/const-generics/defaults/wrong-order.rs8
-rw-r--r--src/test/ui/const-generics/defaults/wrong-order.stderr19
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
+