Add ability to apply custom derive to union types.

The Union item type has been included in the allowed types for a custom
derive. Closes #50223
This commit is contained in:
Steve Pentland 2018-05-01 19:57:42 -04:00
parent 5230979794
commit 14abb550bf
No known key found for this signature in database
GPG Key ID: 53DC590050EA371C
3 changed files with 56 additions and 3 deletions

View File

@ -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()
}
}

View File

@ -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()
}

View File

@ -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 };
}