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.

llvm-svn: 184054
This commit is contained in:
Richard Smith 2013-06-16 05:05:39 +00:00
parent d1336faf53
commit 089ee1554c
3 changed files with 17 additions and 2 deletions

View File

@ -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();
}

View File

@ -0,0 +1,4 @@
#if !defined(foo)
#define goo
int n;
#endif

View File

@ -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.