diff options
Diffstat (limited to 'src/libsyntax/ext')
| -rw-r--r-- | src/libsyntax/ext/format.rs | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/src/libsyntax/ext/format.rs b/src/libsyntax/ext/format.rs index 1893cc0c722..9d2a891bf6b 100644 --- a/src/libsyntax/ext/format.rs +++ b/src/libsyntax/ext/format.rs @@ -786,22 +786,25 @@ pub fn expand_args(ecx: &mut ExtCtxt, sp: Span, None => return MacResult::dummy_expr() }; - let mut err = false; - parse::parse_error::cond.trap(|m| { - if !err { - err = true; - cx.ecx.span_err(efmt.span, m); - } - }).inside(|| { - for piece in parse::Parser::new(fmt.get()) { - if !err { + let mut parser = parse::Parser::new(fmt.get()); + loop { + match parser.next() { + Some(piece) => { + if parser.errors.len() > 0 { break } cx.verify_piece(&piece); let piece = cx.trans_piece(&piece); cx.pieces.push(piece); } + None => break + } + } + match parser.errors.shift() { + Some(error) => { + cx.ecx.span_err(efmt.span, "invalid format string: " + error); + return MRExpr(efmt); } - }); - if err { return MRExpr(efmt) } + None => {} + } // Make sure that all arguments were used and all arguments have types. for (i, ty) in cx.arg_types.iter().enumerate() { |
