aboutsummaryrefslogtreecommitdiff
path: root/lib/Lex/PPDirectives.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-04-17 23:30:53 +0000
committerChris Lattner <sabre@nondot.org>2009-04-17 23:30:53 +0000
commitab82f41b217ce588a9456c0b4411f219d3ed0df8 (patch)
tree830e162ddbc17e38dff53505da711e828341f689 /lib/Lex/PPDirectives.cpp
parent3e1af84bb0092a1aafb49deaa4ab6664c9a9071b (diff)
#line is allowed to have macros that expand to nothing after them.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69401 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Lex/PPDirectives.cpp')
-rw-r--r--lib/Lex/PPDirectives.cpp20
1 files changed, 13 insertions, 7 deletions
diff --git a/lib/Lex/PPDirectives.cpp b/lib/Lex/PPDirectives.cpp
index 742076956d..ce86d0edca 100644
--- a/lib/Lex/PPDirectives.cpp
+++ b/lib/Lex/PPDirectives.cpp
@@ -101,12 +101,17 @@ void Preprocessor::ReadMacroName(Token &MacroNameTok, char isDefineUndef) {
}
/// CheckEndOfDirective - Ensure that the next token is a tok::eom token. If
-/// not, emit a diagnostic and consume up until the eom.
-void Preprocessor::CheckEndOfDirective(const char *DirType) {
+/// not, emit a diagnostic and consume up until the eom. If EnableMacros is
+/// true, then we consider macros that expand to zero tokens as being ok.
+void Preprocessor::CheckEndOfDirective(const char *DirType, bool EnableMacros) {
Token Tmp;
- // Lex unexpanded tokens: macros might expand to zero tokens, causing us to
- // miss diagnosing invalid lines.
- LexUnexpandedToken(Tmp);
+ // Lex unexpanded tokens for most directives: macros might expand to zero
+ // tokens, causing us to miss diagnosing invalid lines. Some directives (like
+ // #line) allow empty macros.
+ if (EnableMacros)
+ Lex(Tmp);
+ else
+ LexUnexpandedToken(Tmp);
// There should be no tokens after the directive, but we allow them as an
// extension.
@@ -694,8 +699,9 @@ void Preprocessor::HandleLineDirective(Token &Tok) {
FilenameID = SourceMgr.getLineTableFilenameID(Literal.GetString(),
Literal.GetStringLength());
- // Verify that there is nothing after the string, other than EOM.
- CheckEndOfDirective("line");
+ // Verify that there is nothing after the string, other than EOM. Because
+ // of C99 6.10.4p5, macros that expand to empty tokens are ok.
+ CheckEndOfDirective("line", true);
}
SourceMgr.AddLineNote(DigitTok.getLocation(), LineNo, FilenameID);