diff options
-rw-r--r-- | include/clang/Basic/DiagnosticLexKinds.td | 2 | ||||
-rw-r--r-- | include/clang/Lex/Preprocessor.h | 1 | ||||
-rw-r--r-- | lib/Lex/PPDirectives.cpp | 21 |
3 files changed, 23 insertions, 1 deletions
diff --git a/include/clang/Basic/DiagnosticLexKinds.td b/include/clang/Basic/DiagnosticLexKinds.td index 74a1b5903a..adce63c489 100644 --- a/include/clang/Basic/DiagnosticLexKinds.td +++ b/include/clang/Basic/DiagnosticLexKinds.td @@ -85,6 +85,8 @@ def warn_hex_escape_too_large : ExtWarn<"hex escape sequence out of range">; def pp_hash_warning : Warning<"#warning%0">; def pp_include_next_in_primary : Warning< "#include_next in primary source file">; +def pp_include_macros_out_of_predefines : Error< + "the #__include_macros directive is only for internal use by -imacros">; def pp_include_next_absolute_path : Warning<"#include_next with absolute path">; def ext_c99_whitespace_required_after_macro_name : ExtWarn< "ISO C99 requires whitespace after the macro name">; diff --git a/include/clang/Lex/Preprocessor.h b/include/clang/Lex/Preprocessor.h index 7e03d196c4..0e16ef8287 100644 --- a/include/clang/Lex/Preprocessor.h +++ b/include/clang/Lex/Preprocessor.h @@ -748,6 +748,7 @@ private: const DirectoryLookup *LookupFrom = 0, bool isImport = false); void HandleIncludeNextDirective(Token &Tok); + void HandleIncludeMacrosDirective(Token &Tok); void HandleImportDirective(Token &Tok); // Macro handling. diff --git a/lib/Lex/PPDirectives.cpp b/lib/Lex/PPDirectives.cpp index a60d9ba4e1..034d484a93 100644 --- a/lib/Lex/PPDirectives.cpp +++ b/lib/Lex/PPDirectives.cpp @@ -530,7 +530,7 @@ TryAgain: case tok::pp_include: return HandleIncludeDirective(Result); // Handle #include. case tok::pp___include_macros: - return HandleIncludeDirective(Result); // Handle #__include_macros. + return HandleIncludeMacrosDirective(Result); // Handle -imacros. // C99 6.10.3 - Macro Replacement. case tok::pp_define: @@ -1126,6 +1126,25 @@ void Preprocessor::HandleImportDirective(Token &ImportTok) { return HandleIncludeDirective(ImportTok, 0, true); } +/// HandleIncludeMacrosDirective - The -imacros command line option turns into a +/// pseudo directive in the predefines buffer. This handles it by sucking all +/// tokens through the preprocessor and discarding them (only keeping the side +/// effects on the preprocessor). +void Preprocessor::HandleIncludeMacrosDirective(Token &IncludeMacrosTok) { + // This directive should only occur in the predefines buffer. If not, emit an + // error and reject it. + SourceLocation Loc = IncludeMacrosTok.getLocation(); + if (strcmp(SourceMgr.getBufferName(Loc), "<built-in>") != 0) { + Diag(IncludeMacrosTok.getLocation(), + diag::pp_include_macros_out_of_predefines); + DiscardUntilEndOfDirective(); + return; + } + + // TODO: implement me :) + DiscardUntilEndOfDirective(); +} + //===----------------------------------------------------------------------===// // Preprocessor Macro Directive Handling. //===----------------------------------------------------------------------===// |