summary refs log tree commit diff
path: root/src/libsyntax/ext
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2013-06-04 21:43:41 -0700
committerPatrick Walton <pcwalton@mimiga.net>2013-06-04 21:45:42 -0700
commit8114d0e9505b44856b822dd587293fd7895320e4 (patch)
tree1e738ee1a533e43733225d9a66b065fb550b6dc7 /src/libsyntax/ext
parent16086ecff7edda82b114a72948762d59095f6fb4 (diff)
downloadrust-8114d0e9505b44856b822dd587293fd7895320e4.tar.gz
rust-8114d0e9505b44856b822dd587293fd7895320e4.zip
librustc: Disallow multiple patterns from appearing in a "let" declaration.
You can still initialize multiple variables at once with "let (x, y) = (1, 2)".
Diffstat (limited to 'src/libsyntax/ext')
-rw-r--r--src/libsyntax/ext/build.rs2
-rw-r--r--src/libsyntax/ext/deriving/generic.rs9
-rw-r--r--src/libsyntax/ext/deriving/mod.rs7
-rw-r--r--src/libsyntax/ext/expand.rs22
4 files changed, 27 insertions, 13 deletions
diff --git a/src/libsyntax/ext/build.rs b/src/libsyntax/ext/build.rs
index c2fa888995a..324b909fbb0 100644
--- a/src/libsyntax/ext/build.rs
+++ b/src/libsyntax/ext/build.rs
@@ -385,7 +385,7 @@ impl AstBuilder for @ExtCtxt {
                                 init: Some(ex),
                                 id: self.next_id(),
                             });
-        let decl = respan(sp, ast::decl_local(~[local]));
+        let decl = respan(sp, ast::decl_local(local));
         @respan(sp, ast::stmt_decl(@decl, self.next_id()))
     }
 
diff --git a/src/libsyntax/ext/deriving/generic.rs b/src/libsyntax/ext/deriving/generic.rs
index d4b3488cc4f..2e6cac1876b 100644
--- a/src/libsyntax/ext/deriving/generic.rs
+++ b/src/libsyntax/ext/deriving/generic.rs
@@ -416,7 +416,9 @@ impl<'self> MethodDef<'self> {
                              type_ident: ident, generics: &Generics)
         -> (ast::explicit_self, ~[@expr], ~[@expr], ~[(ident, @ast::Ty)]) {
 
-        let mut self_args = ~[], nonself_args = ~[], arg_tys = ~[];
+        let mut self_args = ~[];
+        let mut nonself_args = ~[];
+        let mut arg_tys = ~[];
         let mut nonstatic = false;
 
         let ast_explicit_self = match self.explicit_self {
@@ -522,8 +524,9 @@ impl<'self> MethodDef<'self> {
                                  nonself_args: &[@expr])
         -> @expr {
 
-        let mut raw_fields = ~[], // ~[[fields of self], [fields of next Self arg], [etc]]
-                patterns = ~[];
+        let mut raw_fields = ~[]; // ~[[fields of self],
+                                 // [fields of next Self arg], [etc]]
+        let mut patterns = ~[];
         for uint::range(0, self_args.len()) |i| {
             let (pat, ident_expr) = create_struct_pattern(cx, span,
                                                           type_ident, struct_def,
diff --git a/src/libsyntax/ext/deriving/mod.rs b/src/libsyntax/ext/deriving/mod.rs
index 796ccd304ff..13c552388e1 100644
--- a/src/libsyntax/ext/deriving/mod.rs
+++ b/src/libsyntax/ext/deriving/mod.rs
@@ -264,8 +264,8 @@ pub fn create_struct_pattern(cx: @ExtCtxt,
 
     let matching_path = cx.path(span, ~[ struct_ident ]);
 
-    let mut paths = ~[], ident_expr = ~[];
-
+    let mut paths = ~[];
+    let mut ident_expr = ~[];
     let mut struct_type = Unknown;
 
     for struct_def.fields.eachi |i, struct_field| {
@@ -326,7 +326,8 @@ pub fn create_enum_variant_pattern(cx: @ExtCtxt,
 
             let matching_path = cx.path_ident(span, variant_ident);
 
-            let mut paths = ~[], ident_expr = ~[];
+            let mut paths = ~[];
+            let mut ident_expr = ~[];
             for uint::range(0, variant_args.len()) |i| {
                 let path = cx.path_ident(span,
                                          cx.ident_of(fmt!("%s_%u", prefix, i)));
diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs
index 89ed9b7294d..45b9be07a98 100644
--- a/src/libsyntax/ext/expand.rs
+++ b/src/libsyntax/ext/expand.rs
@@ -302,8 +302,9 @@ pub fn expand_stmt(extsbox: @mut SyntaxEnv,
                    s: &stmt_,
                    sp: span,
                    fld: @ast_fold,
-                   orig: @fn(&stmt_, span, @ast_fold) -> (stmt_, span))
-                -> (stmt_, span) {
+                   orig: @fn(&stmt_, span, @ast_fold)
+                             -> (Option<stmt_>, span))
+                -> (Option<stmt_>, span) {
     let (mac, pth, tts, semi) = match *s {
         stmt_mac(ref mac, semi) => {
             match mac.node {
@@ -342,8 +343,17 @@ pub fn expand_stmt(extsbox: @mut SyntaxEnv,
             };
 
             //keep going, outside-in
-            let fully_expanded = copy fld.fold_stmt(expanded).node;
-            cx.bt_pop();
+            let fully_expanded = match fld.fold_stmt(expanded) {
+                Some(stmt) => {
+                    let fully_expanded = &stmt.node;
+                    cx.bt_pop();
+                    copy *fully_expanded
+                }
+                None => {
+                    cx.span_fatal(pth.span,
+                                  "macro didn't expand to a statement")
+                }
+            };
 
             (fully_expanded, sp)
         }
@@ -355,8 +365,8 @@ pub fn expand_stmt(extsbox: @mut SyntaxEnv,
     };
 
     (match fully_expanded {
-        stmt_expr(e, stmt_id) if semi => stmt_semi(e, stmt_id),
-        _ => { fully_expanded } /* might already have a semi */
+        stmt_expr(e, stmt_id) if semi => Some(stmt_semi(e, stmt_id)),
+        _ => { Some(fully_expanded) } /* might already have a semi */
     }, sp)
 
 }