about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2017-09-26 22:26:13 +0000
committerbors <bors@rust-lang.org>2017-09-26 22:26:13 +0000
commitd4da74424729fd27e007dbcf6858201515f3e971 (patch)
tree093865460308303046c19ea87dcc6c053a0d4ab7
parent930d3b17dd91b6564cf535ac717c688db757be5d (diff)
parent375332c6b9e70427cf12ede3af447ce285266892 (diff)
downloadrust-d4da74424729fd27e007dbcf6858201515f3e971.tar.gz
rust-d4da74424729fd27e007dbcf6858201515f3e971.zip
Auto merge of #44757 - jseyfried:fix_bad_derive_collection, r=nrc
macros: fix bug in collecting trait and impl items with derives.

Fixes #43023.
r? @nrc
-rw-r--r--src/libsyntax/ext/expand.rs8
-rw-r--r--src/test/compile-fail/issue-43023.rs28
2 files changed, 29 insertions, 7 deletions
diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs
index 5deb4c3cc00..68ddfdc404a 100644
--- a/src/libsyntax/ext/expand.rs
+++ b/src/libsyntax/ext/expand.rs
@@ -774,13 +774,7 @@ impl<'a, 'b> InvocationCollector<'a, 'b> {
                     item: Annotatable,
                     kind: ExpansionKind)
                     -> Expansion {
-        if !traits.is_empty() &&
-           (kind == ExpansionKind::TraitItems || kind == ExpansionKind::ImplItems) {
-            self.cx.span_err(traits[0].span, "`derive` can be only be applied to items");
-            self.cx.trace_macros_diag();
-            return kind.expect_from_annotatables(::std::iter::once(item));
-        }
-        self.collect(kind, InvocationKind::Attr { attr: attr, traits: traits, item: item })
+        self.collect(kind, InvocationKind::Attr { attr, traits, item })
     }
 
     // If `item` is an attr invocation, remove and return the macro attribute.
diff --git a/src/test/compile-fail/issue-43023.rs b/src/test/compile-fail/issue-43023.rs
new file mode 100644
index 00000000000..6a5f7a1136a
--- /dev/null
+++ b/src/test/compile-fail/issue-43023.rs
@@ -0,0 +1,28 @@
+// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+struct S;
+
+impl S {
+    #[derive(Debug)] //~ ERROR `derive` may only be applied to structs, enums and unions
+    fn f() {
+        file!();
+    }
+}
+
+trait Tr1 {
+    #[derive(Debug)] //~ ERROR `derive` may only be applied to structs, enums and unions
+    fn f();
+}
+
+trait Tr2 {
+    #[derive(Debug)] //~ ERROR `derive` may only be applied to structs, enums and unions
+    type F;
+}