diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-10-15 01:34:54 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-10-15 01:34:54 +0000 |
commit | c2c8bb82096bc938d776557c037cb874de695f80 (patch) | |
tree | 8a958628fb0c1a83e8718f411898b66649f52bc0 /clang/lib/Parse/Parser.cpp | |
parent | ec67c90216220daa8e99de11dd4437e8a954d153 (diff) | |
download | bcm5719-llvm-c2c8bb82096bc938d776557c037cb874de695f80.tar.gz bcm5719-llvm-c2c8bb82096bc938d776557c037cb874de695f80.zip |
Tidy up and improve error recovery for C++11 attributes in bad places. Based on
a patch by Michael Han.
llvm-svn: 192666
Diffstat (limited to 'clang/lib/Parse/Parser.cpp')
-rw-r--r-- | clang/lib/Parse/Parser.cpp | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp index 378a239744f..f0a3d9190c3 100644 --- a/clang/lib/Parse/Parser.cpp +++ b/clang/lib/Parse/Parser.cpp @@ -1958,12 +1958,18 @@ bool BalancedDelimiterTracker::diagnoseMissingClose() { } P.Diag(P.Tok, DID); P.Diag(LOpen, diag::note_matching) << LHSName; - if (P.SkipUntil(Close, FinalToken, /*StopAtSemi*/ true, /*DontConsume*/ true) - && P.Tok.is(Close)) + + // If we're not already at some kind of closing bracket, skip to our closing + // token. + if (P.Tok.isNot(tok::r_paren) && P.Tok.isNot(tok::r_brace) && + P.Tok.isNot(tok::r_square) && + P.SkipUntil(Close, FinalToken, /*StopAtSemi*/true, /*DontConsume*/true) && + P.Tok.is(Close)) LClose = P.ConsumeAnyToken(); return true; } void BalancedDelimiterTracker::skipToEnd() { - P.SkipUntil(Close, false); + P.SkipUntil(Close, false, true); + consumeClose(); } |