When we treat an #include or #import as a module import, create an

implicit ImportDecl in the translation unit to record the presence of
the import.

llvm-svn: 145727
This commit is contained in:
Douglas Gregor
2011-12-02 23:42:12 +00:00
parent 9dff9f4c41
commit bcfc7d0229
8 changed files with 30 additions and 12 deletions

View File

@@ -11,6 +11,7 @@
#include "clang/Sema/Sema.h"
#include "clang/AST/ASTConsumer.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/Decl.h"
#include "clang/Basic/Diagnostic.h"
#include "clang/Basic/FileManager.h"
#include "clang/Basic/SourceManager.h"
@@ -1070,7 +1071,8 @@ static void compileModule(CompilerInstance &ImportingInstance,
Module *CompilerInstance::loadModule(SourceLocation ImportLoc,
ModuleIdPath Path,
Module::NameVisibilityKind Visibility) {
Module::NameVisibilityKind Visibility,
bool IsInclusionDirective) {
// If we've already handled this import, just return the cached result.
// This one-element cache is important to eliminate redundant diagnostics
// when both the preprocessor and parser see the same import declaration.
@@ -1259,8 +1261,16 @@ Module *CompilerInstance::loadModule(SourceLocation ImportLoc,
}
// Make the named module visible.
if (Module)
ModuleManager->makeModuleVisible(Module, Visibility);
ModuleManager->makeModuleVisible(Module, Visibility);
// If this module import was due to an inclusion directive, create an
// implicit import declaration to capture it in the AST.
if (IsInclusionDirective && hasASTContext()) {
TranslationUnitDecl *TU = getASTContext().getTranslationUnitDecl();
TU->addDecl(ImportDecl::CreateImplicit(getASTContext(), TU,
ImportLoc, Module,
Path.back().second));
}
LastModuleImportLoc = ImportLoc;
LastModuleImportResult = Module;