r201965 - Fix crash when both ExpectAndConsume and ConsumeAnyToken emit diagnostics
Alp Toker
alp at nuanti.com
Sat Feb 22 19:45:03 PST 2014
Author: alp
Date: Sat Feb 22 21:45:03 2014
New Revision: 201965
URL: http://llvm.org/viewvc/llvm-project?rev=201965&view=rev
Log:
Fix crash when both ExpectAndConsume and ConsumeAnyToken emit diagnostics
The DiagnosticBuilder's lifetime in parser typo recovery was overlapping with
the subsequent consume which can itself emit PP diagnostics.
Patch by Olivier Goffart!
Added:
cfe/trunk/test/Parser/diag-crash.c
Modified:
cfe/trunk/lib/Parse/Parser.cpp
Modified: cfe/trunk/lib/Parse/Parser.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/Parser.cpp?rev=201965&r1=201964&r2=201965&view=diff
==============================================================================
--- cfe/trunk/lib/Parse/Parser.cpp (original)
+++ cfe/trunk/lib/Parse/Parser.cpp Sat Feb 22 21:45:03 2014
@@ -118,18 +118,20 @@ bool Parser::ExpectAndConsume(tok::Token
// Detect common single-character typos and resume.
if (IsCommonTypo(ExpectedTok, Tok)) {
SourceLocation Loc = Tok.getLocation();
- DiagnosticBuilder DB = Diag(Loc, DiagID);
- DB << FixItHint::CreateReplacement(SourceRange(Loc),
- getPunctuatorSpelling(ExpectedTok));
- if (DiagID == diag::err_expected)
- DB << ExpectedTok;
- else if (DiagID == diag::err_expected_after)
- DB << Msg << ExpectedTok;
- else
- DB << Msg;
- ConsumeAnyToken();
+ {
+ DiagnosticBuilder DB = Diag(Loc, DiagID);
+ DB << FixItHint::CreateReplacement(
+ SourceRange(Loc), tok::getPunctuatorSpelling(ExpectedTok));
+ if (DiagID == diag::err_expected)
+ DB << ExpectedTok;
+ else if (DiagID == diag::err_expected_after)
+ DB << Msg << ExpectedTok;
+ else
+ DB << Msg;
+ }
// Pretend there wasn't a problem.
+ ConsumeAnyToken();
return false;
}
Added: cfe/trunk/test/Parser/diag-crash.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/diag-crash.c?rev=201965&view=auto
==============================================================================
--- cfe/trunk/test/Parser/diag-crash.c (added)
+++ cfe/trunk/test/Parser/diag-crash.c Sat Feb 22 21:45:03 2014
@@ -0,0 +1,6 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+// Avoid preprocessor diag crash caused by a parser diag left in flight.
+
+int foo: // expected-error {{expected ';' after top level declarator}}
+#endif // expected-error {{#endif without #if}}
More information about the cfe-commits
mailing list