diff --git a/src/librustc/middle/astencode.rs b/src/librustc/middle/astencode.rs index 64aaef99ef6..1c7338fe317 100644 --- a/src/librustc/middle/astencode.rs +++ b/src/librustc/middle/astencode.rs @@ -242,7 +242,8 @@ fn simplify_ast(ii: ast::inlined_item) -> ast::inlined_item { match stmt.node { ast::stmt_expr(_, _) | ast::stmt_semi(_, _) | ast::stmt_decl(@{node: ast::decl_local(_), span: _}, _) => true, - ast::stmt_decl(@{node: ast::decl_item(_), span: _}, _) => false + ast::stmt_decl(@{node: ast::decl_item(_), span: _}, _) => false, + ast::stmt_mac(*) => fail ~"unexpanded macro in astencode" } }; let blk_sans_items = { stmts: stmts_sans_items,.. blk }; diff --git a/src/librustc/middle/liveness.rs b/src/librustc/middle/liveness.rs index 0f1b7489f43..40b1e293351 100644 --- a/src/librustc/middle/liveness.rs +++ b/src/librustc/middle/liveness.rs @@ -980,6 +980,10 @@ impl Liveness { stmt_expr(expr, _) | stmt_semi(expr, _) => { return self.propagate_through_expr(expr, succ); } + + stmt_mac(*) => { + self.tcx.sess.span_bug(stmt.span, ~"unexpanded macro"); + } } } diff --git a/src/librustc/middle/region.rs b/src/librustc/middle/region.rs index e7dec95f09a..2950d7bd95d 100644 --- a/src/librustc/middle/region.rs +++ b/src/librustc/middle/region.rs @@ -245,6 +245,7 @@ fn resolve_stmt(stmt: @ast::stmt, cx: ctxt, visitor: visit::vt) { expr_cx.parent = Some(stmt_id); visit::visit_stmt(stmt, expr_cx, visitor); } + ast::stmt_mac(*) => cx.sess.bug(~"unexpanded macro") } } diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs index f4530a28633..7aac60c5f1d 100644 --- a/src/librustc/middle/trans/base.rs +++ b/src/librustc/middle/trans/base.rs @@ -1026,6 +1026,7 @@ fn trans_stmt(cx: block, s: ast::stmt) -> block { ast::decl_item(i) => trans_item(cx.fcx.ccx, *i) } } + ast::stmt_mac(*) => cx.tcx().sess.bug(~"unexpanded macro") } return bcx; diff --git a/src/librustc/middle/ty.rs b/src/librustc/middle/ty.rs index b37fbd9feb4..ad6ca83fe4e 100644 --- a/src/librustc/middle/ty.rs +++ b/src/librustc/middle/ty.rs @@ -3437,6 +3437,7 @@ fn stmt_node_id(s: @ast::stmt) -> ast::node_id { ast::stmt_decl(_, id) | stmt_expr(_, id) | stmt_semi(_, id) => { return id; } + ast::stmt_mac(*) => fail ~"unexpanded macro in trans" } } diff --git a/src/librustc/middle/typeck/check.rs b/src/librustc/middle/typeck/check.rs index b24550f2bc6..5807e338ebd 100644 --- a/src/librustc/middle/typeck/check.rs +++ b/src/librustc/middle/typeck/check.rs @@ -2344,6 +2344,7 @@ fn check_stmt(fcx: @fn_ctxt, stmt: @ast::stmt) -> bool { node_id = id; bot = check_expr(fcx, expr, None); } + ast::stmt_mac(*) => fcx.ccx.tcx.sess.bug(~"unexpanded macro") } fcx.write_nil(node_id); return bot; diff --git a/src/librusti/rusti.rc b/src/librusti/rusti.rc index 1b90a227098..923a36c01d2 100644 --- a/src/librusti/rusti.rc +++ b/src/librusti/rusti.rc @@ -86,7 +86,7 @@ fn record(repl: Repl, blk: @ast::blk, intr: @token::ident_interner) -> Repl { let new_stmts = do with_pp(intr) |pp, writer| { for blk.node.stmts.each |stmt| { match stmt.node { - ast::stmt_decl(*) => { + ast::stmt_decl(*) | ast::stmt_mac(*) => { pprust::print_stmt(pp, **stmt); writer.write_line(~""); } diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs index 1adcadf1b6a..bc3ae65618a 100644 --- a/src/libsyntax/ast.rs +++ b/src/libsyntax/ast.rs @@ -665,6 +665,8 @@ enum stmt_ { // expr with trailing semi-colon (may have any type): stmt_semi(@expr, node_id), + + stmt_mac(mac), } // FIXME (pending discussion of #1697, #2178...): local should really be diff --git a/src/libsyntax/ast_util.rs b/src/libsyntax/ast_util.rs index 12ebca87a80..e6cd413c430 100644 --- a/src/libsyntax/ast_util.rs +++ b/src/libsyntax/ast_util.rs @@ -39,7 +39,8 @@ pure fn stmt_id(s: stmt) -> node_id { match s.node { stmt_decl(_, id) => id, stmt_expr(_, id) => id, - stmt_semi(_, id) => id + stmt_semi(_, id) => id, + stmt_mac(_) => fail ~"attempted to analyze unexpanded stmt", } } diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs index 1db37418370..a92c902ae3f 100644 --- a/src/libsyntax/fold.rs +++ b/src/libsyntax/fold.rs @@ -305,10 +305,12 @@ fn noop_fold_block(b: blk_, fld: ast_fold) -> blk_ { } fn noop_fold_stmt(s: stmt_, fld: ast_fold) -> stmt_ { + let fold_mac = |x| fold_mac_(x, fld); return match s { stmt_decl(d, nid) => stmt_decl(fld.fold_decl(d), fld.new_id(nid)), stmt_expr(e, nid) => stmt_expr(fld.fold_expr(e), fld.new_id(nid)), - stmt_semi(e, nid) => stmt_semi(fld.fold_expr(e), fld.new_id(nid)) + stmt_semi(e, nid) => stmt_semi(fld.fold_expr(e), fld.new_id(nid)), + stmt_mac(mac) => stmt_mac(fold_mac(mac)) }; } diff --git a/src/libsyntax/parse/classify.rs b/src/libsyntax/parse/classify.rs index 2f3e29bd90f..0d370525d17 100644 --- a/src/libsyntax/parse/classify.rs +++ b/src/libsyntax/parse/classify.rs @@ -21,18 +21,15 @@ fn expr_is_simple_block(e: @ast::expr) -> bool { } fn stmt_ends_with_semi(stmt: ast::stmt) -> bool { - match stmt.node { - ast::stmt_decl(d, _) => { - return match d.node { - ast::decl_local(_) => true, - ast::decl_item(_) => false + return match stmt.node { + ast::stmt_decl(d, _) => { + match d.node { + ast::decl_local(_) => true, + ast::decl_item(_) => false } - } - ast::stmt_expr(e, _) => { - return expr_requires_semi_to_be_stmt(e); - } - ast::stmt_semi(*) => { - return false; - } + } + ast::stmt_expr(e, _) => { expr_requires_semi_to_be_stmt(e) } + ast::stmt_semi(*) => { false } + ast::stmt_mac(*) => { false } } } diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index f525436cc3e..b55eec80a93 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -882,6 +882,10 @@ fn print_stmt(s: ps, st: ast::stmt) { print_expr(s, expr); word(s.s, ~";"); } + ast::stmt_mac(mac) => { + space_if_not_bol(s); + print_mac(s, mac); + } } if parse::classify::stmt_ends_with_semi(st) { word(s.s, ~";"); } maybe_print_trailing_comment(s, st.span, None); diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs index afd928a9fbc..ca2af67771e 100644 --- a/src/libsyntax/visit.rs +++ b/src/libsyntax/visit.rs @@ -347,7 +347,8 @@ fn visit_stmt(s: @stmt, e: E, v: vt) { match s.node { stmt_decl(d, _) => v.visit_decl(d, e, v), stmt_expr(ex, _) => v.visit_expr(ex, e, v), - stmt_semi(ex, _) => v.visit_expr(ex, e, v) + stmt_semi(ex, _) => v.visit_expr(ex, e, v), + stmt_mac(mac) => visit_mac(mac, e, v) } }