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:
parent
a99b8e4c35
commit
1013fe7451
@ -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() &&
|
||||
|
@ -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);
|
||||
|
||||
|
8
clang/test/Preprocessor/pragma.c
Normal file
8
clang/test/Preprocessor/pragma.c
Normal 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{{$}}
|
Loading…
x
Reference in New Issue
Block a user