diff options
Diffstat (limited to 'lib/Lex/Preprocessor.cpp')
-rw-r--r-- | lib/Lex/Preprocessor.cpp | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/lib/Lex/Preprocessor.cpp b/lib/Lex/Preprocessor.cpp index aeba32f96a..b01113041e 100644 --- a/lib/Lex/Preprocessor.cpp +++ b/lib/Lex/Preprocessor.cpp @@ -546,6 +546,8 @@ void Preprocessor::HandleIdentifier(Token &Identifier) { if (II.getTokenID() == tok::kw___import_module__ && !InMacroArgs && !DisableMacroExpansion) { ModuleImportLoc = Identifier.getLocation(); + ModuleImportPath.clear(); + ModuleImportExpectsIdentifier = true; CurLexerKind = CLK_LexAfterModuleImport; } } @@ -567,19 +569,31 @@ void Preprocessor::LexAfterModuleImport(Token &Result) { // The token sequence // - // __import_module__ identifier + // __import_module__ identifier (. identifier)* // // indicates a module import directive. We already saw the __import_module__ - // keyword, so now we're looking for the identifier. - if (Result.getKind() != tok::identifier) + // keyword, so now we're looking for the identifiers. + if (ModuleImportExpectsIdentifier && Result.getKind() == tok::identifier) { + // We expected to see an identifier here, and we did; continue handling + // identifiers. + ModuleImportPath.push_back(std::make_pair(Result.getIdentifierInfo(), + Result.getLocation())); + ModuleImportExpectsIdentifier = false; + CurLexerKind = CLK_LexAfterModuleImport; return; + } - // Load the module. - llvm::SmallVector<std::pair<IdentifierInfo *, SourceLocation>, 2> Path; - Path.push_back(std::make_pair(Result.getIdentifierInfo(), - Result.getLocation())); - - (void)TheModuleLoader.loadModule(ModuleImportLoc, Path); + // If we're expecting a '.' or a ';', and we got a '.', then wait until we + // see the next identifier. + if (!ModuleImportExpectsIdentifier && Result.getKind() == tok::period) { + ModuleImportExpectsIdentifier = true; + CurLexerKind = CLK_LexAfterModuleImport; + return; + } + + // If we have a non-empty module path, load the named module. + if (!ModuleImportPath.empty()) + (void)TheModuleLoader.loadModule(ModuleImportLoc, ModuleImportPath); } void Preprocessor::AddCommentHandler(CommentHandler *Handler) { |