Fix combining pragma __debug dump & parser_crash with -E

Previously these would be transformed into annotation tokens and the
preprocessor would then assume they were real tokens with source
locations and assert/UB.

Other pragmas that produce annotation tokens aren't a problem because
they aren't handled if the parser isn't hooked up - ParsePragma.cpp
registers those handlers & isn't run for pure preprocessing. So they're
treated as unknown pragmas & printed verbatim by the preprocessor.

Perhaps these pragmas should be treated the same way? But they got mixed
in with other __debug pragmas that do need to be handled during
preprocessing.

The third __debug pragma that produces an annotation token is 'captured'
- which had its own fix for this issue - by not inserting the annotation
token in the first place if it detected that it was in preprocessing
mode. I've removed that fix (from Lex/Pragma.cpp) in favor of the more
general one in Frontend/PrintPreprocessedOutput.cpp.

llvm-svn: 346928
This commit is contained in:
David Blaikie 2018-11-15 03:04:21 +00:00
parent a99b8e4c35
commit 1013fe7451
3 changed files with 13 additions and 4 deletions

View File

@ -750,6 +750,11 @@ static void PrintPreprocessedTokens(Preprocessor &PP, Token &Tok,
reinterpret_cast<Module *>(Tok.getAnnotationValue()));
PP.Lex(Tok);
continue;
} else if (Tok.isAnnotation()) {
// Ignore annotation tokens created by pragmas - the pragmas themselves
// will be reproduced in the preprocessed output.
PP.Lex(Tok);
continue;
} else if (IdentifierInfo *II = Tok.getIdentifierInfo()) {
OS << II->getName();
} else if (Tok.isLiteral() && !Tok.needsCleaning() &&

View File

@ -1130,10 +1130,6 @@ struct PragmaDebugHandler : public PragmaHandler {
}
void HandleCaptured(Preprocessor &PP) {
// Skip if emitting preprocessed output.
if (PP.isPreprocessedOutput())
return;
Token Tok;
PP.LexUnexpandedToken(Tok);

View File

@ -0,0 +1,8 @@
// RUN: %clang_cc1 -E %s | FileCheck %s
#pragma clang __debug parser_crash
#pragma clang __debug dump Test
// CHECK: #pragma clang __debug parser_crash
// FIXME: The dump parameter is dropped.
// CHECK: #pragma clang __debug dump{{$}}