diff --git a/clang/lib/Lex/Pragma.cpp b/clang/lib/Lex/Pragma.cpp index 5eb665549e86..db8e3055b85c 100644 --- a/clang/lib/Lex/Pragma.cpp +++ b/clang/lib/Lex/Pragma.cpp @@ -191,9 +191,13 @@ void Preprocessor::Handle_Pragma(Token &Tok) { Lex(Tok); if (!tok::isStringLiteral(Tok.getKind())) { 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)) Lex(Tok); + while (Tok.isNot(tok::r_paren) && + !Tok.isAtStartOfLine() && + Tok.isNot(tok::eof)) + Lex(Tok); if (Tok.is(tok::r_paren)) Lex(Tok); return _PragmaLexing.failed(); diff --git a/clang/test/Preprocessor/_Pragma.c b/clang/test/Preprocessor/_Pragma.c index 120e754cb986..99231879ece0 100644 --- a/clang/test/Preprocessor/_Pragma.c +++ b/clang/test/Preprocessor/_Pragma.c @@ -12,4 +12,8 @@ _Pragma("message(\"foo \\\\\\\\ bar\")") // expected-warning {{foo \\ bar}} #error #define invalid #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}}