forked from OSchip/llvm-project
Fix PR6282: the include guard optimization cannot happen if the
guard macro is already defined for the first occurrence of the header. If it is, the body will be skipped and not be properly analyzed for the include guard optimization. llvm-svn: 95972
This commit is contained in:
parent
0e4df63bd5
commit
aa1cccbbef
|
@ -1514,18 +1514,21 @@ void Preprocessor::HandleIfdefDirective(Token &Result, bool isIfndef,
|
||||||
// Check to see if this is the last token on the #if[n]def line.
|
// Check to see if this is the last token on the #if[n]def line.
|
||||||
CheckEndOfDirective(isIfndef ? "ifndef" : "ifdef");
|
CheckEndOfDirective(isIfndef ? "ifndef" : "ifdef");
|
||||||
|
|
||||||
|
IdentifierInfo *MII = MacroNameTok.getIdentifierInfo();
|
||||||
|
MacroInfo *MI = getMacroInfo(MII);
|
||||||
|
|
||||||
if (CurPPLexer->getConditionalStackDepth() == 0) {
|
if (CurPPLexer->getConditionalStackDepth() == 0) {
|
||||||
// If the start of a top-level #ifdef, inform MIOpt.
|
// If the start of a top-level #ifdef and if the macro is not defined,
|
||||||
if (!ReadAnyTokensBeforeDirective) {
|
// inform MIOpt that this might be the start of a proper include guard.
|
||||||
|
// Otherwise it is some other form of unknown conditional which we can't
|
||||||
|
// handle.
|
||||||
|
if (!ReadAnyTokensBeforeDirective && MI == 0) {
|
||||||
assert(isIfndef && "#ifdef shouldn't reach here");
|
assert(isIfndef && "#ifdef shouldn't reach here");
|
||||||
CurPPLexer->MIOpt.EnterTopLevelIFNDEF(MacroNameTok.getIdentifierInfo());
|
CurPPLexer->MIOpt.EnterTopLevelIFNDEF(MII);
|
||||||
} else
|
} else
|
||||||
CurPPLexer->MIOpt.EnterTopLevelConditional();
|
CurPPLexer->MIOpt.EnterTopLevelConditional();
|
||||||
}
|
}
|
||||||
|
|
||||||
IdentifierInfo *MII = MacroNameTok.getIdentifierInfo();
|
|
||||||
MacroInfo *MI = getMacroInfo(MII);
|
|
||||||
|
|
||||||
// If there is a macro, process it.
|
// If there is a macro, process it.
|
||||||
if (MI) // Mark it used.
|
if (MI) // Mark it used.
|
||||||
MI->setIsUsed(true);
|
MI->setIsUsed(true);
|
||||||
|
@ -1558,7 +1561,7 @@ void Preprocessor::HandleIfDirective(Token &IfToken,
|
||||||
// If this condition is equivalent to #ifndef X, and if this is the first
|
// If this condition is equivalent to #ifndef X, and if this is the first
|
||||||
// directive seen, handle it for the multiple-include optimization.
|
// directive seen, handle it for the multiple-include optimization.
|
||||||
if (CurPPLexer->getConditionalStackDepth() == 0) {
|
if (CurPPLexer->getConditionalStackDepth() == 0) {
|
||||||
if (!ReadAnyTokensBeforeDirective && IfNDefMacro)
|
if (!ReadAnyTokensBeforeDirective && IfNDefMacro && ConditionalTrue)
|
||||||
CurPPLexer->MIOpt.EnterTopLevelIFNDEF(IfNDefMacro);
|
CurPPLexer->MIOpt.EnterTopLevelIFNDEF(IfNDefMacro);
|
||||||
else
|
else
|
||||||
CurPPLexer->MIOpt.EnterTopLevelConditional();
|
CurPPLexer->MIOpt.EnterTopLevelConditional();
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
// RUN: %clang_cc1 -E %s | FileCheck %s
|
||||||
|
// PR6282
|
||||||
|
// This test should not trigger the include guard optimization since
|
||||||
|
// the guard macro is defined on the first include.
|
||||||
|
|
||||||
|
#define ITERATING 1
|
||||||
|
#define X 1
|
||||||
|
#include "mi_opt2.h"
|
||||||
|
#undef X
|
||||||
|
#define X 2
|
||||||
|
#include "mi_opt2.h"
|
||||||
|
|
||||||
|
// CHECK: b: 1
|
||||||
|
// CHECK: b: 2
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
#ifndef ITERATING
|
||||||
|
a: X
|
||||||
|
#else
|
||||||
|
b: X
|
||||||
|
#endif
|
Loading…
Reference in New Issue