зеркало из https://github.com/microsoft/clang.git
fix PR2357 (#ifs didnt invalidate the multiple-inclusion optimization state)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@51843 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
1b8956e1ce
Коммит
0049db6ce1
|
@ -1059,17 +1059,18 @@ void Preprocessor::HandleIfDirective(Token &IfToken,
|
|||
IdentifierInfo *IfNDefMacro = 0;
|
||||
bool ConditionalTrue = EvaluateDirectiveExpression(IfNDefMacro);
|
||||
|
||||
|
||||
// If this condition is equivalent to #ifndef X, and if this is the first
|
||||
// directive seen, handle it for the multiple-include optimization.
|
||||
if (CurLexer->getConditionalStackDepth() == 0) {
|
||||
if (!ReadAnyTokensBeforeDirective && IfNDefMacro)
|
||||
CurLexer->MIOpt.EnterTopLevelIFNDEF(IfNDefMacro);
|
||||
else
|
||||
CurLexer->MIOpt.EnterTopLevelConditional();
|
||||
}
|
||||
|
||||
// Should we include the stuff contained by this directive?
|
||||
if (ConditionalTrue) {
|
||||
// If this condition is equivalent to #ifndef X, and if this is the first
|
||||
// directive seen, handle it for the multiple-include optimization.
|
||||
if (CurLexer->getConditionalStackDepth() == 0) {
|
||||
if (!ReadAnyTokensBeforeDirective && IfNDefMacro)
|
||||
CurLexer->MIOpt.EnterTopLevelIFNDEF(IfNDefMacro);
|
||||
else
|
||||
CurLexer->MIOpt.EnterTopLevelConditional();
|
||||
}
|
||||
|
||||
// Yes, remember that we are inside a conditional, then lex the next token.
|
||||
CurLexer->pushConditionalLevel(IfToken.getLocation(), /*wasskip*/false,
|
||||
/*foundnonskip*/true, /*foundelse*/false);
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
// RUN: clang %s -fsyntax-only
|
||||
|
||||
#ifndef XVID_AUTO_INCLUDE
|
||||
|
||||
#define XVID_AUTO_INCLUDE
|
||||
#define FUNC_H H_Pass_16_C
|
||||
#include "multiple-include.c"
|
||||
|
||||
#define FUNC_H H_Pass_8_C
|
||||
|
||||
#include "multiple-include.c"
|
||||
#undef XVID_AUTO_INCLUDE
|
||||
|
||||
typedef void ff();
|
||||
typedef struct { ff *a;} S;
|
||||
|
||||
S s = { H_Pass_8_C };
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(XVID_AUTO_INCLUDE) && defined(REFERENCE_CODE)
|
||||
#elif defined(XVID_AUTO_INCLUDE) && !defined(REFERENCE_CODE)
|
||||
|
||||
static void FUNC_H(){};
|
||||
#undef FUNC_H
|
||||
|
||||
#endif
|
Загрузка…
Ссылка в новой задаче