finish the implementation of -imacros. The driver still needs to be hooked up.

llvm-svn: 68640
This commit is contained in:
Chris Lattner 2009-04-08 20:53:24 +00:00
parent 60ce3fe140
commit e01d82b81f
3 changed files with 17 additions and 4 deletions

View File

@ -1050,8 +1050,7 @@ void Preprocessor::HandleIncludeDirective(Token &IncludeTok,
return;
}
// Verify that there is nothing after the filename, other than EOM. Use the
// preprocessor to lex this in case lexing the filename entered a macro.
// Verify that there is nothing after the filename, other than EOM.
CheckEndOfDirective("#include");
// Check that we don't have infinite #include recursion.
@ -1141,8 +1140,15 @@ void Preprocessor::HandleIncludeMacrosDirective(Token &IncludeMacrosTok) {
return;
}
// TODO: implement me :)
DiscardUntilEndOfDirective();
// Treat this as a normal #include for checking purposes. If this is
// successful, it will push a new lexer onto the include stack.
HandleIncludeDirective(IncludeMacrosTok, 0, false);
Token TmpTok;
do {
Lex(TmpTok);
assert(TmpTok.isNot(tok::eof) && "Didn't find end of -imacros!");
} while (TmpTok.isNot(tok::hashhash));
}
//===----------------------------------------------------------------------===//

View File

@ -0,0 +1,4 @@
// RUN: clang-cc -E -Dtest=FOO -imacros pr2086.h %s | grep 'HERE: test'
// This should not be expanded into FOO because pr2086.h undefs 'test'.
HERE: test

View File

@ -1029,6 +1029,9 @@ static void AddImplicitIncludeMacros(std::vector<char> &Buf,
Buf.insert(Buf.end(), EscapedFile.begin(), EscapedFile.end());
Buf.push_back('"');
Buf.push_back('\n');
// Marker token to stop the __include_macros fetch loop.
const char *Marker = "##\n"; // ##?
Buf.insert(Buf.end(), Marker, Marker+strlen(Marker));
}
/// AddImplicitIncludePTH - Add an implicit #include using the original file