diff --git a/llvm/lib/TableGen/TGLexer.cpp b/llvm/lib/TableGen/TGLexer.cpp --- a/llvm/lib/TableGen/TGLexer.cpp +++ b/llvm/lib/TableGen/TGLexer.cpp @@ -723,16 +723,15 @@ bool MacroIsDefined = DefinedMacros.count(MacroName) != 0; - // Canonicalize ifndef to ifdef equivalent - if (Kind == tgtok::Ifndef) { + // Canonicalize ifndef's MacroIsDefined to its ifdef equivalent. + if (Kind == tgtok::Ifndef) MacroIsDefined = !MacroIsDefined; - Kind = tgtok::Ifdef; - } // Regardless of whether we are processing tokens or not, // we put the #ifdef control on stack. + // Note that MacroIsDefined has been canonicalized against ifdef. PrepIncludeStack.back()->push_back( - {Kind, MacroIsDefined, SMLoc::getFromPointer(TokStart)}); + {tgtok::Ifdef, MacroIsDefined, SMLoc::getFromPointer(TokStart)}); if (!prepSkipDirectiveEnd()) return ReturnError(CurPtr, "Only comments are supported after " + diff --git a/llvm/test/TableGen/nested_ifdef.inc b/llvm/test/TableGen/nested_ifdef.inc new file mode 100644 --- /dev/null +++ b/llvm/test/TableGen/nested_ifdef.inc @@ -0,0 +1,10 @@ +#ifndef NESTED_IFDEF +#define NESTED_IFDEF + +def foo; + +#ifndef HAHA +def haha; +#endif + +#endif diff --git a/llvm/test/TableGen/nested_ifdef2.inc b/llvm/test/TableGen/nested_ifdef2.inc new file mode 100644 --- /dev/null +++ b/llvm/test/TableGen/nested_ifdef2.inc @@ -0,0 +1,8 @@ +#ifndef NESTED_IFDEF2 +#define NESTED_IFDEF2 + +include "nested_ifdef.inc" + +def bar; + +#endif diff --git a/llvm/test/TableGen/nested_ifdef_main.td b/llvm/test/TableGen/nested_ifdef_main.td new file mode 100644 --- /dev/null +++ b/llvm/test/TableGen/nested_ifdef_main.td @@ -0,0 +1,11 @@ +// RUN: llvm-tblgen -I %p %s | FileCheck %s + +include "nested_ifdef.inc" +include "nested_ifdef2.inc" + +// CHECK: def bar +// CHECK: def foo +// CHECK: def haha +// CHECK: def zoo + +def zoo;