From 0bdfd0f4c76fa29a4be774937bc72165390b06d6 Mon Sep 17 00:00:00 2001 From: Douglas Young Date: Tue, 18 Feb 2014 16:14:12 +0000 Subject: Avoid returning original macro if expansion fails. Closes #11692. Instead of returning the original expression, a dummy expression (with identical span) is returned. This prevents infinite loops of failed expansions as well as odd double error messages in certain situations. --- src/libsyntax/ext/base.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'src/libsyntax/ext/base.rs') diff --git a/src/libsyntax/ext/base.rs b/src/libsyntax/ext/base.rs index 3dac82ae3b7..e6fffe8b53f 100644 --- a/src/libsyntax/ext/base.rs +++ b/src/libsyntax/ext/base.rs @@ -101,6 +101,7 @@ pub trait AnyMacro { fn make_stmt(&self) -> @ast::Stmt; } + pub enum MacResult { MRExpr(@ast::Expr), MRItem(@ast::Item), @@ -112,10 +113,15 @@ impl MacResult { /// type signatures after emitting a non-fatal error (which stop /// compilation well before the validity (or otherwise)) of the /// expression are checked. - pub fn dummy_expr() -> MacResult { - MRExpr(@ast::Expr { - id: ast::DUMMY_NODE_ID, node: ast::ExprLogLevel, span: codemap::DUMMY_SP - }) + pub fn raw_dummy_expr(sp: codemap::Span) -> @ast::Expr { + @ast::Expr { + id: ast::DUMMY_NODE_ID, + node: ast::ExprLogLevel, + span: sp + } + } + pub fn dummy_expr(sp: codemap::Span) -> MacResult { + MRExpr(MacResult::raw_dummy_expr(sp)) } } -- cgit 1.4.1-3-g733a5