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:
Nuno Lopes 2008-06-01 18:31:24 +00:00
Родитель 1b8956e1ce
Коммит 0049db6ce1
2 изменённых файлов: 37 добавлений и 9 удалений

Просмотреть файл

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