]> git.lizzy.rs Git - rust.git/commitdiff
builtin derive macros: fix error with const generics default
authorSoveu <marx.tomasz@gmail.com>
Fri, 16 Apr 2021 14:29:11 +0000 (16:29 +0200)
committerSoveu <marx.tomasz@gmail.com>
Fri, 16 Apr 2021 14:29:11 +0000 (16:29 +0200)
compiler/rustc_builtin_macros/src/deriving/generic/mod.rs
src/test/ui/derives/derive-macro-const-default.rs [new file with mode: 0644]

index 04753926c3e2a7d7bd5d2cee60d201a6fc4a5377..a3decff3ae7e1892fa075881cb859a80fc41a697 100644 (file)
@@ -541,7 +541,7 @@ fn create_derived_impl(
             self.generics.to_generics(cx, self.span, type_ident, generics);
 
         // Create the generic parameters
-        params.extend(generics.params.iter().map(|param| match param.kind {
+        params.extend(generics.params.iter().map(|param| match &param.kind {
             GenericParamKind::Lifetime { .. } => param.clone(),
             GenericParamKind::Type { .. } => {
                 // I don't think this can be moved out of the loop, since
@@ -561,7 +561,18 @@ fn create_derived_impl(
 
                 cx.typaram(self.span, param.ident, vec![], bounds, None)
             }
-            GenericParamKind::Const { .. } => param.clone(),
+            GenericParamKind::Const { ty, kw_span, .. } => {
+                let const_nodefault_kind = GenericParamKind::Const {
+                    ty: ty.clone(),
+                    kw_span: kw_span.clone(),
+
+                    // We can't have default values inside impl block
+                    default: None,
+                };
+                let mut param_clone = param.clone();
+                param_clone.kind = const_nodefault_kind;
+                param_clone
+            }
         }));
 
         // and similarly for where clauses
diff --git a/src/test/ui/derives/derive-macro-const-default.rs b/src/test/ui/derives/derive-macro-const-default.rs
new file mode 100644 (file)
index 0000000..a844f2d
--- /dev/null
@@ -0,0 +1,14 @@
+// check-pass
+#![allow(incomplete_features)]
+#![feature(const_generics_defaults)]
+
+#[derive(Clone, PartialEq, Debug)]
+struct Example<T, const N: usize = 1usize>([T; N]);
+
+fn main() {
+    let a = Example([(); 16]);
+    let b = a.clone();
+    if a != b {
+        let _c = format!("{:?}", a);
+    }
+}