Skip to content
Snippets Groups Projects
Commit b63b4d08 authored by Hubert Tong's avatar Hubert Tong
Browse files

Improved error recovery for _Pragma

Summary:
Currently, if the argument to _Pragma is not a parenthesised string
literal, the bad token will be consumed, as well as the ')', if present.
If additional bad tokens are passed to the _Pragma, this results in
extra error messages which may distract from the true problem.

The proposed patch causes all tokens to be consumed until the closing
')' or a new line, whichever is reached first.

Reviewers: hfinkel, rsmith

Subscribers: hubert.reinterpretcast, fraggamuffin, rnk, cfe-commits

Differential Revision: http://reviews.llvm.org/D8308

Patch by Rachel Craik!


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@243692 91177308-0d34-0410-b5e6-96231b3b80d8
parent 720bfb48
No related branches found
No related tags found
No related merge requests found
...@@ -191,9 +191,13 @@ void Preprocessor::Handle_Pragma(Token &Tok) { ...@@ -191,9 +191,13 @@ void Preprocessor::Handle_Pragma(Token &Tok) {
Lex(Tok); Lex(Tok);
if (!tok::isStringLiteral(Tok.getKind())) { if (!tok::isStringLiteral(Tok.getKind())) {
Diag(PragmaLoc, diag::err__Pragma_malformed); Diag(PragmaLoc, diag::err__Pragma_malformed);
// Skip this token, and the ')', if present. // Skip bad tokens, and the ')', if present.
if (Tok.isNot(tok::r_paren) && Tok.isNot(tok::eof)) if (Tok.isNot(tok::r_paren) && Tok.isNot(tok::eof))
Lex(Tok); Lex(Tok);
while (Tok.isNot(tok::r_paren) &&
!Tok.isAtStartOfLine() &&
Tok.isNot(tok::eof))
Lex(Tok);
if (Tok.is(tok::r_paren)) if (Tok.is(tok::r_paren))
Lex(Tok); Lex(Tok);
return _PragmaLexing.failed(); return _PragmaLexing.failed();
......
...@@ -12,4 +12,8 @@ _Pragma("message(\"foo \\\\\\\\ bar\")") // expected-warning {{foo \\ bar}} ...@@ -12,4 +12,8 @@ _Pragma("message(\"foo \\\\\\\\ bar\")") // expected-warning {{foo \\ bar}}
#error #define invalid #error #define invalid
#endif #endif
_Pragma(unroll 1 // expected-error{{_Pragma takes a parenthesized string literal}}
_Pragma(clang diagnostic push) // expected-error{{_Pragma takes a parenthesized string literal}}
_Pragma( // expected-error{{_Pragma takes a parenthesized string literal}} _Pragma( // expected-error{{_Pragma takes a parenthesized string literal}}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment