about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2018-06-19 08:50:41 +0000
committerbors <bors@rust-lang.org>2018-06-19 08:50:41 +0000
commit1080203e9788d2e2dee46bf4d2abbb1c7535ee45 (patch)
treea8e84392259635629595c79ea5865f97b968214f /src
parent1cfb628eade1fc41d2dc57aafe5ca637c777f3c2 (diff)
parent14abb550bf676d221866e5ad5f588850d018acbf (diff)
downloadrust-1080203e9788d2e2dee46bf4d2abbb1c7535ee45.tar.gz
rust-1080203e9788d2e2dee46bf4d2abbb1c7535ee45.zip
Auto merge of #50383 - stevepentland:union-derive, r=oli-obk
Add ability to apply custom derive to union types.

The Union item type has been included in the allowed types for a custom derive.
fyi @abonander

Closes #50223
Diffstat (limited to 'src')
-rw-r--r--src/libsyntax_ext/deriving/custom.rs7
-rw-r--r--src/test/run-pass-fulldeps/proc-macro/auxiliary/derive-union.rs27
-rw-r--r--src/test/run-pass-fulldeps/proc-macro/derive-union.rs25
3 files changed, 56 insertions, 3 deletions
diff --git a/src/libsyntax_ext/deriving/custom.rs b/src/libsyntax_ext/deriving/custom.rs
index 76da1746a03..c3958bb58dd 100644
--- a/src/libsyntax_ext/deriving/custom.rs
+++ b/src/libsyntax_ext/deriving/custom.rs
@@ -57,16 +57,17 @@ impl MultiItemModifier for ProcMacroDerive {
             Annotatable::Stmt(_) |
             Annotatable::Expr(_) => {
                 ecx.span_err(span, "proc-macro derives may only be \
-                                    applied to struct/enum items");
+                                    applied to a struct, enum, or union");
                 return Vec::new()
             }
         };
         match item.node {
             ItemKind::Struct(..) |
-            ItemKind::Enum(..) => {},
+            ItemKind::Enum(..) |
+            ItemKind::Union(..) => {},
             _ => {
                 ecx.span_err(span, "proc-macro derives may only be \
-                                    applied to struct/enum items");
+                                    applied to a struct, enum, or union");
                 return Vec::new()
             }
         }
diff --git a/src/test/run-pass-fulldeps/proc-macro/auxiliary/derive-union.rs b/src/test/run-pass-fulldeps/proc-macro/auxiliary/derive-union.rs
new file mode 100644
index 00000000000..41bb88a0a92
--- /dev/null
+++ b/src/test/run-pass-fulldeps/proc-macro/auxiliary/derive-union.rs
@@ -0,0 +1,27 @@
+// Copyright 2018 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.
+
+// no-prefer-dynamic
+
+#![crate_type = "proc-macro"]
+
+extern crate proc_macro;
+
+use proc_macro::TokenStream;
+
+#[proc_macro_derive(UnionTest)]
+pub fn derive(input: TokenStream) -> TokenStream {
+    let input = input.to_string();
+    assert!(input.contains("#[repr(C)]"));
+    assert!(input.contains("union Test {"));
+    assert!(input.contains("a: u8,"));
+    assert!(input.contains("}"));
+    "".parse().unwrap()
+}
diff --git a/src/test/run-pass-fulldeps/proc-macro/derive-union.rs b/src/test/run-pass-fulldeps/proc-macro/derive-union.rs
new file mode 100644
index 00000000000..71807e21d96
--- /dev/null
+++ b/src/test/run-pass-fulldeps/proc-macro/derive-union.rs
@@ -0,0 +1,25 @@
+// Copyright 2018 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.
+
+// aux-build:derive-union.rs
+// ignore-stage1
+
+#[macro_use]
+extern crate derive_union;
+
+#[repr(C)]
+#[derive(UnionTest)]
+union Test {
+    a: u8,
+}
+
+fn main() {
+    let t = Test { a: 0 };
+}