From: Richard Smith Date: Sun, 16 Jun 2013 05:05:39 +0000 (+0000) Subject: PR16339: Don't produce a diagnostic pointing at the whitespace between a '#if' X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4196019db7a9b22d09c31a290c49d45eab2fa1d3;p=clang PR16339: Don't produce a diagnostic pointing at the whitespace between a '#if' and a '!defined(X)' if we find a broken header guard. This is suboptimal; we should point the diagnostic at the 'X' token not the 'if' token, but it fixes the crash. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@184054 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Lex/PPDirectives.cpp b/lib/Lex/PPDirectives.cpp index 0cfdac92d2..3e3312a926 100644 --- a/lib/Lex/PPDirectives.cpp +++ b/lib/Lex/PPDirectives.cpp @@ -2132,7 +2132,8 @@ void Preprocessor::HandleIfDirective(Token &IfToken, // directive seen, handle it for the multiple-include optimization. if (CurPPLexer->getConditionalStackDepth() == 0) { if (!ReadAnyTokensBeforeDirective && IfNDefMacro && ConditionalTrue) - CurPPLexer->MIOpt.EnterTopLevelIfndef(IfNDefMacro, ConditionalBegin); + // FIXME: Pass in the location of the macro name, not the 'if' token. + CurPPLexer->MIOpt.EnterTopLevelIfndef(IfNDefMacro, IfToken.getLocation()); else CurPPLexer->MIOpt.EnterTopLevelConditional(); } diff --git a/test/Lexer/Inputs/bad-header-guard-defined.h b/test/Lexer/Inputs/bad-header-guard-defined.h new file mode 100644 index 0000000000..b28f1a8873 --- /dev/null +++ b/test/Lexer/Inputs/bad-header-guard-defined.h @@ -0,0 +1,4 @@ +#if !defined(foo) +#define goo +int n; +#endif diff --git a/test/Lexer/header.cpp b/test/Lexer/header.cpp index 278ff2e432..047240ac0f 100644 --- a/test/Lexer/header.cpp +++ b/test/Lexer/header.cpp @@ -17,6 +17,16 @@ // CHECK: {{^}} ^~~~~~~~~ // CHECK: {{^}} bad_header_guard +#include "Inputs/bad-header-guard-defined.h" +// CHECK: In file included from {{.*}}header.cpp:{{[0-9]*}}: +// CHECK: {{.*}}bad-header-guard-defined.h:1:2: warning: 'foo' is used as a header guard here, followed by #define of a different macro +// CHECK: {{^}}#if !defined(foo) +// CHECK: {{^}} ^~ +// CHECK: {{.*}}bad-header-guard-defined.h:2:9: note: 'goo' is defined here; did you mean 'foo'? +// CHECK: {{^}}#define goo +// CHECK: {{^}} ^~~ +// CHECK: {{^}} foo + #include "Inputs/multiple.h" #include "Inputs/multiple.h" #include "Inputs/multiple.h" @@ -30,4 +40,4 @@ // CHECK: {{^}} ^~~~~ // CHECK: {{^}} multiple -// CHECK: 2 warnings generated. +// CHECK: 3 warnings generated.