about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>2016-07-17 00:15:15 +0300
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>2016-09-03 13:37:25 +0300
commit1db878fd38eb00daf794d87ab04cb50c7fa6e4fc (patch)
tree7e5e32abf460625f4a3f64ec17aeb9a3d825d8e5 /src
parenta029ea343fe5c9b7cf550902b5a507cd8c22a833 (diff)
downloadrust-1db878fd38eb00daf794d87ab04cb50c7fa6e4fc.tar.gz
rust-1db878fd38eb00daf794d87ab04cb50c7fa6e4fc.zip
Add unions to AST
Diffstat (limited to 'src')
-rw-r--r--src/librustc_passes/ast_validation.rs10
-rw-r--r--src/libsyntax/ast.rs2
-rw-r--r--src/libsyntax/diagnostics/macros.rs7
3 files changed, 18 insertions, 1 deletions
diff --git a/src/librustc_passes/ast_validation.rs b/src/librustc_passes/ast_validation.rs
index dde1a4a7595..b8284f5dcf1 100644
--- a/src/librustc_passes/ast_validation.rs
+++ b/src/librustc_passes/ast_validation.rs
@@ -196,6 +196,16 @@ impl<'a> Visitor for AstValidator<'a> {
                 // Ensure that `path` attributes on modules are recorded as used (c.f. #35584).
                 attr::first_attr_value_str_by_name(&item.attrs, "path");
             }
+            ItemKind::Union(ref vdata, _) => {
+                if !vdata.is_struct() {
+                    self.err_handler().span_err(item.span,
+                                                "tuple and unit unions are not permitted");
+                }
+                if vdata.fields().len() == 0 {
+                    self.err_handler().span_err(item.span,
+                                                "unions cannot have zero fields");
+                }
+            }
             _ => {}
         }
 
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs
index fcb99444957..4394fb0e143 100644
--- a/src/libsyntax/ast.rs
+++ b/src/libsyntax/ast.rs
@@ -1886,7 +1886,7 @@ pub enum ItemKind {
     /// A union definition (`union` or `pub union`).
     ///
     /// E.g. `union Foo<A, B> { x: A, y: B }`
-    Union(VariantData, Generics), // FIXME: not yet implemented
+    Union(VariantData, Generics),
     /// A Trait declaration (`trait` or `pub trait`).
     ///
     /// E.g. `trait Foo { .. }` or `trait Foo<T> { .. }`
diff --git a/src/libsyntax/diagnostics/macros.rs b/src/libsyntax/diagnostics/macros.rs
index 25e0428248d..e2a7ec0a33d 100644
--- a/src/libsyntax/diagnostics/macros.rs
+++ b/src/libsyntax/diagnostics/macros.rs
@@ -108,6 +108,13 @@ macro_rules! help {
 }
 
 #[macro_export]
+macro_rules! unimplemented_unions {
+    () => ({
+        panic!("unions are not fully implemented");
+    })
+}
+
+#[macro_export]
 macro_rules! register_diagnostics {
     ($($code:tt),*) => (
         $(register_diagnostic! { $code })*