diff options
| author | Patrick Walton <pcwalton@mimiga.net> | 2013-06-04 21:43:41 -0700 |
|---|---|---|
| committer | Patrick Walton <pcwalton@mimiga.net> | 2013-06-04 21:45:42 -0700 |
| commit | 8114d0e9505b44856b822dd587293fd7895320e4 (patch) | |
| tree | 1e738ee1a533e43733225d9a66b065fb550b6dc7 /src/libsyntax/ext | |
| parent | 16086ecff7edda82b114a72948762d59095f6fb4 (diff) | |
| download | rust-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.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/ext/deriving/generic.rs | 9 | ||||
| -rw-r--r-- | src/libsyntax/ext/deriving/mod.rs | 7 | ||||
| -rw-r--r-- | src/libsyntax/ext/expand.rs | 22 |
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) } |
