On 23.04.2014, at 14:57, John Thompson <[email protected]> wrote:
> Author: jtsoftware > Date: Wed Apr 23 07:57:01 2014 > New Revision: 206977 > > URL: http://llvm.org/viewvc/llvm-project?rev=206977&view=rev > Log: > Initial implementation of -modules-earch-all option, for searching for > symbols in non-imported modules. > > Added: > cfe/trunk/test/Modules/Inputs/undefined-type-fixit/ > cfe/trunk/test/Modules/Inputs/undefined-type-fixit/module.map > cfe/trunk/test/Modules/Inputs/undefined-type-fixit/public1.h > cfe/trunk/test/Modules/Inputs/undefined-type-fixit/public2.h > cfe/trunk/test/Modules/Inputs/undefined-type-fixit/public2sub.h > cfe/trunk/test/Modules/undefined-type-fixit1.cpp > Modified: > cfe/trunk/docs/Modules.rst > cfe/trunk/include/clang/Basic/LangOptions.def > cfe/trunk/include/clang/Driver/Options.td > cfe/trunk/include/clang/Frontend/ASTUnit.h > cfe/trunk/include/clang/Frontend/CompilerInstance.h > cfe/trunk/include/clang/Lex/HeaderSearch.h > cfe/trunk/include/clang/Lex/ModuleLoader.h > cfe/trunk/include/clang/Sema/Sema.h > cfe/trunk/include/clang/Serialization/ASTReader.h > cfe/trunk/lib/Frontend/CompilerInstance.cpp > cfe/trunk/lib/Frontend/CompilerInvocation.cpp > cfe/trunk/lib/Sema/SemaCXXScopeSpec.cpp > cfe/trunk/lib/Sema/SemaDecl.cpp > cfe/trunk/lib/Sema/SemaDeclCXX.cpp > cfe/trunk/lib/Sema/SemaDeclObjC.cpp > cfe/trunk/lib/Sema/SemaExpr.cpp > cfe/trunk/lib/Sema/SemaExprMember.cpp > cfe/trunk/lib/Sema/SemaExprObjC.cpp > cfe/trunk/lib/Sema/SemaInit.cpp > cfe/trunk/lib/Sema/SemaLookup.cpp > cfe/trunk/lib/Sema/SemaOpenMP.cpp > cfe/trunk/lib/Sema/SemaTemplate.cpp > cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp > cfe/trunk/unittests/Basic/SourceManagerTest.cpp > cfe/trunk/unittests/Lex/CMakeLists.txt > cfe/trunk/unittests/Lex/LexerTest.cpp > cfe/trunk/unittests/Lex/Makefile > cfe/trunk/unittests/Lex/PPCallbacksTest.cpp > cfe/trunk/unittests/Lex/PPConditionalDirectiveRecordTest.cpp > > Modified: cfe/trunk/docs/Modules.rst > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/Modules.rst?rev=206977&r1=206976&r2=206977&view=diff > ============================================================================== > --- cfe/trunk/docs/Modules.rst (original) > +++ cfe/trunk/docs/Modules.rst Wed Apr 23 07:57:01 2014 > @@ -198,6 +198,9 @@ Command-line parameters > ``-fmodule-map-file=<file>`` > Load the given module map file if a header from its directory or one of its > subdirectories is loaded. > > +``-fmodules-search-all`` > + If a symbol is not found, search modules referenced in the current module > maps but not imported for symbols, so the error message can reference the > module by name. Note that if the global module index has not been built > before, this might take some time as it needs to build all the modules. Note > that this option doesn't apply in module builds, to avoid the recursion. > + > Module Semantics > ================ > > > Modified: cfe/trunk/include/clang/Basic/LangOptions.def > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/LangOptions.def?rev=206977&r1=206976&r2=206977&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Basic/LangOptions.def (original) > +++ cfe/trunk/include/clang/Basic/LangOptions.def Wed Apr 23 07:57:01 2014 > @@ -96,6 +96,7 @@ LANGOPT(MathErrno , 1, 1, "errno > BENIGN_LANGOPT(HeinousExtensions , 1, 0, "Extensions that we really don't > like and may be ripped out at any time") > LANGOPT(Modules , 1, 0, "modules extension to C") > LANGOPT(ModulesDeclUse , 1, 0, "require declaration of module uses") > +LANGOPT(ModulesSearchAll , 1, 1, "search even non-imported modules to find > unresolved references") > LANGOPT(ModulesStrictDeclUse, 1, 0, "require declaration of module uses and > all headers to be in modules") > LANGOPT(Optimize , 1, 0, "__OPTIMIZE__ predefined macro") > LANGOPT(OptimizeSize , 1, 0, "__OPTIMIZE_SIZE__ predefined macro") > > Modified: cfe/trunk/include/clang/Driver/Options.td > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=206977&r1=206976&r2=206977&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Driver/Options.td (original) > +++ cfe/trunk/include/clang/Driver/Options.td Wed Apr 23 07:57:01 2014 > @@ -583,6 +583,9 @@ def fmodules_prune_interval : Joined<["- > def fmodules_prune_after : Joined<["-"], "fmodules-prune-after=">, > Group<i_Group>, > Flags<[CC1Option]>, MetaVarName<"<seconds>">, > HelpText<"Specify the interval (in seconds) after which a module file will > be considered unused">; > +def fmodules_search_all : Flag <["-"], "fmodules-search-all">, > Group<f_Group>, > + Flags<[DriverOption, CC1Option]>, > + HelpText<"Search even non-imported modules to resolve references">; > def fbuild_session_timestamp : Joined<["-"], "fbuild-session-timestamp=">, > Group<i_Group>, Flags<[CC1Option]>, MetaVarName<"<time since Epoch in > seconds>">, > HelpText<"Time when the current build session started">; > @@ -613,6 +616,8 @@ def fmodules_decluse : Flag <["-"], "fmo > def fmodules_strict_decluse : Flag <["-"], "fmodules-strict-decluse">, > Group<f_Group>, > Flags<[DriverOption,CC1Option]>, > HelpText<"Like -fmodules-decluse but requires all headers to be in > modules">; > +def fno_modules_search_all : Flag <["-"], "fno-modules-search-all">, > Group<f_Group>, > + Flags<[DriverOption, CC1Option]>; > def fretain_comments_from_system_headers : Flag<["-"], > "fretain-comments-from-system-headers">, Group<f_Group>, Flags<[CC1Option]>; > > def fmudflapth : Flag<["-"], "fmudflapth">, Group<f_Group>; > > Modified: cfe/trunk/include/clang/Frontend/ASTUnit.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/ASTUnit.h?rev=206977&r1=206976&r2=206977&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Frontend/ASTUnit.h (original) > +++ cfe/trunk/include/clang/Frontend/ASTUnit.h Wed Apr 23 07:57:01 2014 > @@ -874,6 +874,8 @@ public: > void makeModuleVisible(Module *Mod, Module::NameVisibilityKind Visibility, > SourceLocation ImportLoc, bool Complain) override {} > > + GlobalModuleIndex *loadGlobalModuleIndex(SourceLocation TriggerLoc) > + { return 0; } > }; > > } // namespace clang > > Modified: cfe/trunk/include/clang/Frontend/CompilerInstance.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/CompilerInstance.h?rev=206977&r1=206976&r2=206977&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Frontend/CompilerInstance.h (original) > +++ cfe/trunk/include/clang/Frontend/CompilerInstance.h Wed Apr 23 07:57:01 > 2014 > @@ -124,6 +124,9 @@ class CompilerInstance : public ModuleLo > /// have finished with this translation unit. > bool BuildGlobalModuleIndex; > > + /// \brief We have a full global module index, with all modules. > + bool HaveFullGlobalModuleIndex; > + > /// \brief One or more modules failed to build. > bool ModuleBuildFailed; > > @@ -148,7 +151,7 @@ class CompilerInstance : public ModuleLo > CompilerInstance(const CompilerInstance &) LLVM_DELETED_FUNCTION; > void operator=(const CompilerInstance &) LLVM_DELETED_FUNCTION; > public: > - CompilerInstance(); > + explicit CompilerInstance(bool BuildingModule = false); > ~CompilerInstance(); > > /// @name High-Level Operations > @@ -683,6 +686,9 @@ public: > > /// } > > + // Create module manager. > + void createModuleManager(); > + > ModuleLoadResult loadModule(SourceLocation ImportLoc, ModuleIdPath Path, > Module::NameVisibilityKind Visibility, > bool IsInclusionDirective) override; > @@ -694,6 +700,7 @@ public: > return ModuleLoader::HadFatalFailure; > } > > + GlobalModuleIndex *loadGlobalModuleIndex(SourceLocation TriggerLoc); > }; > > } // end namespace clang > > Modified: cfe/trunk/include/clang/Lex/HeaderSearch.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/HeaderSearch.h?rev=206977&r1=206976&r2=206977&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Lex/HeaderSearch.h (original) > +++ cfe/trunk/include/clang/Lex/HeaderSearch.h Wed Apr 23 07:57:01 2014 > @@ -511,7 +511,6 @@ public: > /// \returns The module with the given name. > Module *lookupModule(StringRef ModuleName, bool AllowSearch = true); > > - > /// \brief Try to find a module map file in the given directory, returning > /// \c nullptr if none is found. > const FileEntry *lookupModuleMapFile(const DirectoryEntry *Dir, > > Modified: cfe/trunk/include/clang/Lex/ModuleLoader.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/ModuleLoader.h?rev=206977&r1=206976&r2=206977&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Lex/ModuleLoader.h (original) > +++ cfe/trunk/include/clang/Lex/ModuleLoader.h Wed Apr 23 07:57:01 2014 > @@ -21,6 +21,7 @@ > > namespace clang { > > +class GlobalModuleIndex; > class IdentifierInfo; > class Module; > > @@ -53,11 +54,24 @@ public: > /// for resolving a module name (e.g., "std") to an actual module file, and > /// then loading that module. > class ModuleLoader { > + // Building a module if true. > + bool BuildingModule; > public: > - ModuleLoader() : HadFatalFailure(false) {} > + explicit ModuleLoader(bool BuildingModule = false) : > + BuildingModule(BuildingModule), > + HadFatalFailure(false) {} > > virtual ~ModuleLoader(); > > + /// \brief Returns true if this instance is building a module. > + bool buildingModule() const { > + return BuildingModule; > + } > + /// \brief Flag indicating whether this instance is building a module. > + void setBuildingModule(bool BuildingModuleFlag) { > + BuildingModule = BuildingModuleFlag; > + } > + > /// \brief Attempt to load the given module. > /// > /// This routine attempts to load the module described by the given > @@ -88,6 +102,19 @@ public: > SourceLocation ImportLoc, > bool Complain) = 0; > > + /// \brief Load, create, or return global module. > + /// This function returns an existing global module index, if one > + /// had already been loaded or created, or loads one if it > + /// exists, or creates one if it doesn't exist. > + /// Also, importantly, if the index doesn't cover all the modules > + /// in the module map, it will be update to do so here, because > + /// of its use in searching for needed module imports and > + /// associated fixit messages. > + /// \param TriggerLoc The location for what triggered the load. > + /// \returns Returns null if load failed. > + virtual GlobalModuleIndex *loadGlobalModuleIndex( > + SourceLocation TriggerLoc) = 0; > + > bool HadFatalFailure; > }; > > > Modified: cfe/trunk/include/clang/Sema/Sema.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=206977&r1=206976&r2=206977&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Sema/Sema.h (original) > +++ cfe/trunk/include/clang/Sema/Sema.h Wed Apr 23 07:57:01 2014 > @@ -2601,10 +2601,16 @@ public: > VisibleDeclConsumer &Consumer, > bool IncludeGlobalScope = true); > > + enum CorrectTypoKind { > + CTK_NonError, // CorrectTypo used in a non error recovery situation. > + CTK_ErrorRecovery // CorrectTypo used in normal error recovery. > + }; > + > TypoCorrection CorrectTypo(const DeclarationNameInfo &Typo, > Sema::LookupNameKind LookupKind, > Scope *S, CXXScopeSpec *SS, > CorrectionCandidateCallback &CCC, > + CorrectTypoKind Mode, > DeclContext *MemberContext = 0, > bool EnteringContext = false, > const ObjCObjectPointerType *OPT = 0, > > Modified: cfe/trunk/include/clang/Serialization/ASTReader.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTReader.h?rev=206977&r1=206976&r2=206977&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Serialization/ASTReader.h (original) > +++ cfe/trunk/include/clang/Serialization/ASTReader.h Wed Apr 23 07:57:01 2014 > @@ -1384,8 +1384,15 @@ public: > /// \brief Determine whether this AST reader has a global index. > bool hasGlobalIndex() const { return (bool)GlobalIndex; } > > + /// \brief Return global module index. > + GlobalModuleIndex *getGlobalIndex() { return GlobalIndex.get(); } > + > + /// \brief Reset reader for a reload try. > + void resetForReload() { TriedLoadingGlobalIndex = false; } > + > /// \brief Attempts to load the global index. > /// > + /// \param TriggerLoc The location for what triggered the load. > /// \returns true if loading the global index has failed for any reason. > bool loadGlobalIndex(); > > > Modified: cfe/trunk/lib/Frontend/CompilerInstance.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInstance.cpp?rev=206977&r1=206976&r2=206977&view=diff > ============================================================================== > --- cfe/trunk/lib/Frontend/CompilerInstance.cpp (original) > +++ cfe/trunk/lib/Frontend/CompilerInstance.cpp Wed Apr 23 07:57:01 2014 > @@ -31,6 +31,7 @@ > #include "clang/Sema/CodeCompleteConsumer.h" > #include "clang/Sema/Sema.h" > #include "clang/Serialization/ASTReader.h" > +#include "clang/Serialization/GlobalModuleIndex.h" > #include "llvm/ADT/Statistic.h" > #include "llvm/Config/config.h" > #include "llvm/Support/CrashRecoveryContext.h" > @@ -49,9 +50,11 @@ > > using namespace clang; > > -CompilerInstance::CompilerInstance() > - : Invocation(new CompilerInvocation()), ModuleManager(0), > - BuildGlobalModuleIndex(false), ModuleBuildFailed(false) { > +CompilerInstance::CompilerInstance(bool BuildingModule) > + : ModuleLoader(BuildingModule), > + Invocation(new CompilerInvocation()), ModuleManager(0), > + BuildGlobalModuleIndex(false), HaveFullGlobalModuleIndex(false), > + ModuleBuildFailed(false) { > } > > CompilerInstance::~CompilerInstance() { > @@ -830,7 +833,7 @@ static void compileModuleImpl(CompilerIn > > // Construct a compiler instance that will be used to actually create the > // module. > - CompilerInstance Instance; > + CompilerInstance Instance(/*BuildingModule=*/true); > Instance.setInvocation(&*Invocation); > > Instance.createDiagnostics(new ForwardingDiagnosticConsumer( > @@ -1097,6 +1100,43 @@ static void pruneModuleCache(const Heade > } > } > > +void CompilerInstance::createModuleManager() { > + if (!ModuleManager) { > + if (!hasASTContext()) > + createASTContext(); > + > + // If we're not recursively building a module, check whether we > + // need to prune the module cache. > + if (getSourceManager().getModuleBuildStack().empty() && > + getHeaderSearchOpts().ModuleCachePruneInterval > 0 && > + getHeaderSearchOpts().ModuleCachePruneAfter > 0) { > + pruneModuleCache(getHeaderSearchOpts()); > + } > + > + HeaderSearchOptions &HSOpts = getHeaderSearchOpts(); > + std::string Sysroot = HSOpts.Sysroot; > + const PreprocessorOptions &PPOpts = getPreprocessorOpts(); > + ModuleManager = new ASTReader(getPreprocessor(), *Context, > + Sysroot.empty() ? "" : Sysroot.c_str(), > + PPOpts.DisablePCHValidation, > + /*AllowASTWithCompilerErrors=*/false, > + /*AllowConfigurationMismatch=*/false, > + HSOpts.ModulesValidateSystemHeaders, > + getFrontendOpts().UseGlobalModuleIndex); > + if (hasASTConsumer()) { > + ModuleManager->setDeserializationListener( > + getASTConsumer().GetASTDeserializationListener()); > + getASTContext().setASTMutationListener( > + getASTConsumer().GetASTMutationListener()); > + } > + getASTContext().setExternalSource(ModuleManager); > + if (hasSema()) > + ModuleManager->InitializeSema(getSema()); > + if (hasASTConsumer()) > + ModuleManager->StartTranslationUnit(&getASTConsumer()); > + } > +} > + > ModuleLoadResult > CompilerInstance::loadModule(SourceLocation ImportLoc, > ModuleIdPath Path, > @@ -1143,40 +1183,8 @@ CompilerInstance::loadModule(SourceLocat > std::string ModuleFileName = > PP->getHeaderSearchInfo().getModuleFileName(Module); > > // If we don't already have an ASTReader, create one now. > - if (!ModuleManager) { > - if (!hasASTContext()) > - createASTContext(); > - > - // If we're not recursively building a module, check whether we > - // need to prune the module cache. > - if (getSourceManager().getModuleBuildStack().empty() && > - getHeaderSearchOpts().ModuleCachePruneInterval > 0 && > - getHeaderSearchOpts().ModuleCachePruneAfter > 0) { > - pruneModuleCache(getHeaderSearchOpts()); > - } > - > - HeaderSearchOptions &HSOpts = getHeaderSearchOpts(); > - std::string Sysroot = HSOpts.Sysroot; > - const PreprocessorOptions &PPOpts = getPreprocessorOpts(); > - ModuleManager = new ASTReader(getPreprocessor(), *Context, > - Sysroot.empty() ? "" : Sysroot.c_str(), > - PPOpts.DisablePCHValidation, > - /*AllowASTWithCompilerErrors=*/false, > - /*AllowConfigurationMismatch=*/false, > - HSOpts.ModulesValidateSystemHeaders, > - getFrontendOpts().UseGlobalModuleIndex); > - if (hasASTConsumer()) { > - ModuleManager->setDeserializationListener( > - getASTConsumer().GetASTDeserializationListener()); > - getASTContext().setASTMutationListener( > - getASTConsumer().GetASTMutationListener()); > - } > - getASTContext().setExternalSource(ModuleManager); > - if (hasSema()) > - ModuleManager->InitializeSema(getSema()); > - if (hasASTConsumer()) > - ModuleManager->StartTranslationUnit(&getASTConsumer()); > - } > + if (!ModuleManager) > + createModuleManager(); > > if (TheDependencyFileGenerator) > TheDependencyFileGenerator->AttachToASTReader(*ModuleManager); > @@ -1403,3 +1411,58 @@ void CompilerInstance::makeModuleVisible > ModuleManager->makeModuleVisible(Mod, Visibility, ImportLoc, Complain); > } > > +GlobalModuleIndex *CompilerInstance::loadGlobalModuleIndex( > + SourceLocation TriggerLoc) { > + if (!ModuleManager) > + createModuleManager(); > + // Can't do anything if we don't have the module manager. > + if (!ModuleManager) > + return 0; > + // Get an existing global index. This loads it if not already > + // loaded. > + ModuleManager->loadGlobalIndex(); > + GlobalModuleIndex *GlobalIndex = ModuleManager->getGlobalIndex(); > + // If the global index doesn't exist, create it. > + if (!GlobalIndex && shouldBuildGlobalModuleIndex() && hasFileManager() && > + hasPreprocessor()) { > + llvm::sys::fs::create_directories( > + getPreprocessor().getHeaderSearchInfo().getModuleCachePath()); > + GlobalModuleIndex::writeIndex( > + getFileManager(), > + getPreprocessor().getHeaderSearchInfo().getModuleCachePath()); > + ModuleManager->resetForReload(); > + ModuleManager->loadGlobalIndex(); > + GlobalIndex = ModuleManager->getGlobalIndex(); > + } > + // For finding modules needing to be imported for fixit messages, > + // we need to make the global index cover all modules, so we do that here. > + if (!HaveFullGlobalModuleIndex && GlobalIndex && !buildingModule()) { > + ModuleMap &MMap = getPreprocessor().getHeaderSearchInfo().getModuleMap(); > + bool RecreateIndex = false; > + for (ModuleMap::module_iterator I = MMap.module_begin(), > + E = MMap.module_end(); I != E; ++I) { > + Module *TheModule = I->second; > + const FileEntry *Entry = TheModule->getASTFile(); > + if (!Entry) { > + SmallVector<std::pair<IdentifierInfo *, SourceLocation>, 2> Path; > + Path.push_back(std::make_pair( > + > getPreprocessor().getIdentifierInfo(TheModule->Name), TriggerLoc)); > + std::reverse(Path.begin(), Path.end()); > + // Load a module as hidden. This also adds it to the > global index. > + ModuleLoadResult Result = loadModule(TheModule->DefinitionLoc, Path, > + Module::Hidden, false); > + RecreateIndex = true; > + } > + } > + if (RecreateIndex) { > + GlobalModuleIndex::writeIndex( > + getFileManager(), > + getPreprocessor().getHeaderSearchInfo().getModuleCachePath()); > + ModuleManager->resetForReload(); > + ModuleManager->loadGlobalIndex(); > + GlobalIndex = ModuleManager->getGlobalIndex(); > + } > + HaveFullGlobalModuleIndex = true; > + } > + return GlobalIndex; > +} > > Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=206977&r1=206976&r2=206977&view=diff > ============================================================================== > --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original) > +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Wed Apr 23 07:57:01 2014 > @@ -1357,6 +1357,9 @@ static void ParseLangArgs(LangOptions &O > Opts.ModulesStrictDeclUse = Args.hasArg(OPT_fmodules_strict_decluse); > Opts.ModulesDeclUse = > Args.hasArg(OPT_fmodules_decluse) || Opts.ModulesStrictDeclUse; > + Opts.ModulesSearchAll = Opts.Modules && > + !Args.hasArg(OPT_fno_modules_search_all) && > + Args.hasArg(OPT_fmodules_search_all); > Opts.CharIsSigned = Opts.OpenCL || !Args.hasArg(OPT_fno_signed_char); > Opts.WChar = Opts.CPlusPlus && !Args.hasArg(OPT_fno_wchar); > Opts.ShortWChar = Args.hasFlag(OPT_fshort_wchar, OPT_fno_short_wchar, > false); > > Modified: cfe/trunk/lib/Sema/SemaCXXScopeSpec.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCXXScopeSpec.cpp?rev=206977&r1=206976&r2=206977&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaCXXScopeSpec.cpp (original) > +++ cfe/trunk/lib/Sema/SemaCXXScopeSpec.cpp Wed Apr 23 07:57:01 2014 > @@ -547,7 +547,8 @@ bool Sema::BuildCXXNestedNameSpecifier(S > Found.clear(); > if (TypoCorrection Corrected = > CorrectTypo(Found.getLookupNameInfo(), Found.getLookupKind(), S, > - &SS, Validator, LookupCtx, EnteringContext)) { > + &SS, Validator, CTK_ErrorRecovery, LookupCtx, > + EnteringContext)) { > if (LookupCtx) { > bool DroppedSpecifier = > Corrected.WillReplaceSpecifier() && > > Modified: cfe/trunk/lib/Sema/SemaDecl.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=206977&r1=206976&r2=206977&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) > +++ cfe/trunk/lib/Sema/SemaDecl.cpp Wed Apr 23 07:57:01 2014 > @@ -218,7 +218,8 @@ ParsedType Sema::getTypeName(const Ident > if (CorrectedII) { > TypeNameValidatorCCC Validator(true, isClassName); > TypoCorrection Correction = CorrectTypo(Result.getLookupNameInfo(), > - Kind, S, SS, Validator); > + Kind, S, SS, Validator, > + CTK_ErrorRecovery); > IdentifierInfo *NewII = Correction.getCorrectionAsIdentifierInfo(); > TemplateTy Template; > bool MemberOfUnknownSpecialization; > @@ -408,7 +409,7 @@ bool Sema::DiagnoseUnknownTypeName(Ident > TypeNameValidatorCCC Validator(false, false, AllowClassTemplates); > if (TypoCorrection Corrected = CorrectTypo(DeclarationNameInfo(II, IILoc), > LookupOrdinaryName, S, SS, > - Validator)) { > + Validator, CTK_ErrorRecovery)) { > if (Corrected.isKeyword()) { > // We corrected to a keyword. > diagnoseTypo(Corrected, PDiag(diag::err_unknown_typename_suggest) << > II); > @@ -650,7 +651,8 @@ Corrected: > SecondTry = true; > if (TypoCorrection Corrected = CorrectTypo(Result.getLookupNameInfo(), > Result.getLookupKind(), S, > - &SS, *CCC)) { > + &SS, *CCC, > + CTK_ErrorRecovery)) { > unsigned UnqualifiedDiag = diag::err_undeclared_var_use_suggest; > unsigned QualifiedDiag = diag::err_no_member_suggest; > > @@ -1422,7 +1424,7 @@ ObjCInterfaceDecl *Sema::getObjCInterfac > DeclFilterCCC<ObjCInterfaceDecl> Validator; > if (TypoCorrection C = CorrectTypo(DeclarationNameInfo(Id, IdLoc), > LookupOrdinaryName, TUScope, NULL, > - Validator)) { > + Validator, CTK_ErrorRecovery)) { > diagnoseTypo(C, PDiag(diag::err_undef_interface_suggest) << Id); > IDecl = C.getCorrectionDeclAs<ObjCInterfaceDecl>(); > Id = IDecl->getIdentifier(); > @@ -6160,7 +6162,7 @@ static NamedDecl *DiagnoseInvalidRedecla > } else if ((Correction = SemaRef.CorrectTypo( > Prev.getLookupNameInfo(), Prev.getLookupKind(), S, > &ExtraArgs.D.getCXXScopeSpec(), Validator, > - IsLocalFriend ? 0 : NewDC))) { > + Sema::CTK_ErrorRecovery, IsLocalFriend ? 0 : NewDC))) { > // Set up everything for the call to ActOnFunctionDeclarator > ExtraArgs.D.SetIdentifier(Correction.getCorrectionAsIdentifierInfo(), > ExtraArgs.D.getIdentifierLoc()); > @@ -10100,7 +10102,8 @@ NamedDecl *Sema::ImplicitlyDefineFunctio > TypoCorrection Corrected; > DeclFilterCCC<FunctionDecl> Validator; > if (S && (Corrected = CorrectTypo(DeclarationNameInfo(&II, Loc), > - LookupOrdinaryName, S, 0, Validator))) > + LookupOrdinaryName, S, 0, Validator, > + CTK_NonError))) > diagnoseTypo(Corrected, PDiag(diag::note_function_suggestion), > /*ErrorRecovery*/false); > } > > Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=206977&r1=206976&r2=206977&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original) > +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Wed Apr 23 07:57:01 2014 > @@ -2605,7 +2605,7 @@ Sema::BuildMemInitializer(Decl *Construc > MemInitializerValidatorCCC Validator(ClassDecl); > if (R.empty() && BaseType.isNull() && > (Corr = CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), S, > &SS, > - Validator, ClassDecl))) { > + Validator, CTK_ErrorRecovery, ClassDecl))) { > if (FieldDecl *Member = Corr.getCorrectionDeclAs<FieldDecl>()) { > // We have found a non-static data member with a similar > // name to what was typed; complain and initialize that > @@ -6900,7 +6900,8 @@ static bool TryNamespaceTypoCorrection(S > R.clear(); > if (TypoCorrection Corrected = S.CorrectTypo(R.getLookupNameInfo(), > R.getLookupKind(), Sc, &SS, > - Validator)) { > + Validator, > + Sema::CTK_ErrorRecovery)) { > if (DeclContext *DC = S.computeDeclContext(SS, false)) { > std::string CorrectedStr(Corrected.getAsString(S.getLangOpts())); > bool DroppedSpecifier = Corrected.WillReplaceSpecifier() && > @@ -7471,7 +7472,8 @@ NamedDecl *Sema::BuildUsingDeclaration(S > UsingValidatorCCC CCC(HasTypenameKeyword, IsInstantiation, > CurContext->isRecord()); > if (TypoCorrection Corrected = CorrectTypo(R.getLookupNameInfo(), > - R.getLookupKind(), S, &SS, > CCC)){ > + R.getLookupKind(), S, &SS, > CCC, > + CTK_ErrorRecovery)){ > // We reject any correction for which ND would be NULL. > NamedDecl *ND = Corrected.getCorrectionDecl(); > R.setLookupName(Corrected.getCorrection()); > > Modified: cfe/trunk/lib/Sema/SemaDeclObjC.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclObjC.cpp?rev=206977&r1=206976&r2=206977&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaDeclObjC.cpp (original) > +++ cfe/trunk/lib/Sema/SemaDeclObjC.cpp Wed Apr 23 07:57:01 2014 > @@ -524,7 +524,7 @@ ActOnStartClassInterface(SourceLocation > ObjCInterfaceValidatorCCC Validator(IDecl); > if (TypoCorrection Corrected = CorrectTypo( > DeclarationNameInfo(SuperName, SuperLoc), LookupOrdinaryName, > TUScope, > - NULL, Validator)) { > + NULL, Validator, CTK_ErrorRecovery)) { > diagnoseTypo(Corrected, PDiag(diag::err_undef_superclass_suggest) > << SuperName << ClassName); > PrevDecl = Corrected.getCorrectionDeclAs<ObjCInterfaceDecl>(); > @@ -794,7 +794,7 @@ Sema::FindProtocolDeclaration(bool WarnO > DeclFilterCCC<ObjCProtocolDecl> Validator; > TypoCorrection Corrected = CorrectTypo( > DeclarationNameInfo(ProtocolId[i].first, ProtocolId[i].second), > - LookupObjCProtocolName, TUScope, NULL, Validator); > + LookupObjCProtocolName, TUScope, NULL, Validator, > CTK_ErrorRecovery); > if ((PDecl = Corrected.getCorrectionDeclAs<ObjCProtocolDecl>())) > diagnoseTypo(Corrected, PDiag(diag::err_undeclared_protocol_suggest) > << ProtocolId[i].first); > @@ -1034,7 +1034,8 @@ Decl *Sema::ActOnStartClassImplementatio > ObjCInterfaceValidatorCCC Validator; > TypoCorrection Corrected = > CorrectTypo(DeclarationNameInfo(ClassName, ClassLoc), > - LookupOrdinaryName, TUScope, NULL, Validator); > + LookupOrdinaryName, TUScope, NULL, Validator, > + CTK_NonError); > if (Corrected.getCorrectionDeclAs<ObjCInterfaceDecl>()) { > // Suggest the (potentially) correct interface name. Don't provide a > // code-modification hint or use the typo name for recovery, because > > Modified: cfe/trunk/lib/Sema/SemaExpr.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=206977&r1=206976&r2=206977&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) > +++ cfe/trunk/lib/Sema/SemaExpr.cpp Wed Apr 23 07:57:01 2014 > @@ -1843,7 +1843,7 @@ bool Sema::DiagnoseEmptyLookup(Scope *S, > // We didn't find anything, so try to correct for a typo. > TypoCorrection Corrected; > if (S && (Corrected = CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), > - S, &SS, CCC))) { > + S, &SS, CCC, CTK_ErrorRecovery))) { > std::string CorrectedStr(Corrected.getAsString(getLangOpts())); > bool DroppedSpecifier = > Corrected.WillReplaceSpecifier() && Name.getAsString() == > CorrectedStr; > @@ -4004,7 +4004,8 @@ static TypoCorrection TryTypoCorrectionF > > if (TypoCorrection Corrected = S.CorrectTypo( > DeclarationNameInfo(FuncName, NameLoc), Sema::LookupOrdinaryName, > - S.getScopeForContext(S.CurContext), NULL, CCC)) { > + S.getScopeForContext(S.CurContext), NULL, CCC, > + Sema::CTK_ErrorRecovery)) { > if (NamedDecl *ND = Corrected.getCorrectionDecl()) { > if (Corrected.isOverloaded()) { > OverloadCandidateSet OCS(NameLoc, OverloadCandidateSet::CSK_Normal); > > Modified: cfe/trunk/lib/Sema/SemaExprMember.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprMember.cpp?rev=206977&r1=206976&r2=206977&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaExprMember.cpp (original) > +++ cfe/trunk/lib/Sema/SemaExprMember.cpp Wed Apr 23 07:57:01 2014 > @@ -627,7 +627,8 @@ LookupMemberExprInRecord(Sema &SemaRef, > RecordMemberExprValidatorCCC Validator(RTy); > TypoCorrection Corrected = SemaRef.CorrectTypo(R.getLookupNameInfo(), > R.getLookupKind(), NULL, > - &SS, Validator, DC); > + &SS, Validator, > + Sema::CTK_ErrorRecovery, > DC); > R.clear(); > if (Corrected.isResolved() && !Corrected.isKeyword()) { > R.setLookupName(Corrected.getCorrection()); > @@ -1270,7 +1271,8 @@ Sema::LookupMemberExpr(LookupResult &R, > Validator.IsObjCIvarLookup = IsArrow; > if (TypoCorrection Corrected = CorrectTypo(R.getLookupNameInfo(), > LookupMemberName, NULL, NULL, > - Validator, IDecl)) { > + Validator, > CTK_ErrorRecovery, > + IDecl)) { > IV = Corrected.getCorrectionDeclAs<ObjCIvarDecl>(); > diagnoseTypo(Corrected, > PDiag(diag::err_typecheck_member_reference_ivar_suggest) > > Modified: cfe/trunk/lib/Sema/SemaExprObjC.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprObjC.cpp?rev=206977&r1=206976&r2=206977&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaExprObjC.cpp (original) > +++ cfe/trunk/lib/Sema/SemaExprObjC.cpp Wed Apr 23 07:57:01 2014 > @@ -1669,7 +1669,7 @@ HandleExprPropertyRefExpr(const ObjCObje > DeclFilterCCC<ObjCPropertyDecl> Validator; > if (TypoCorrection Corrected = CorrectTypo( > DeclarationNameInfo(MemberName, MemberLoc), LookupOrdinaryName, > NULL, > - NULL, Validator, IFace, false, OPT)) { > + NULL, Validator, CTK_ErrorRecovery, IFace, false, OPT)) { > diagnoseTypo(Corrected, PDiag(diag::err_property_not_found_suggest) > << MemberName << QualType(OPT, 0)); > DeclarationName TypoResult = Corrected.getCorrection(); > @@ -1901,7 +1901,8 @@ Sema::ObjCMessageKind Sema::getObjCMessa > ObjCInterfaceOrSuperCCC Validator(getCurMethodDecl()); > if (TypoCorrection Corrected = > CorrectTypo(Result.getLookupNameInfo(), Result.getLookupKind(), S, > - NULL, Validator, NULL, false, NULL, false)) { > + NULL, Validator, CTK_ErrorRecovery, NULL, false, NULL, > + false)) { > if (Corrected.isKeyword()) { > // If we've found the keyword "super" (the only keyword that would be > // returned by CorrectTypo), this is a send to super. > > Modified: cfe/trunk/lib/Sema/SemaInit.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaInit.cpp?rev=206977&r1=206976&r2=206977&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaInit.cpp (original) > +++ cfe/trunk/lib/Sema/SemaInit.cpp Wed Apr 23 07:57:01 2014 > @@ -1816,7 +1816,7 @@ InitListChecker::CheckDesignatedInitiali > if (TypoCorrection Corrected = SemaRef.CorrectTypo( > DeclarationNameInfo(FieldName, D->getFieldLoc()), > Sema::LookupMemberName, /*Scope=*/ 0, /*SS=*/ 0, Validator, > - RT->getDecl())) { > + Sema::CTK_ErrorRecovery, RT->getDecl())) { > SemaRef.diagnoseTypo( > Corrected, > SemaRef.PDiag(diag::err_field_designator_unknown_suggest) > > Modified: cfe/trunk/lib/Sema/SemaLookup.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaLookup.cpp?rev=206977&r1=206976&r2=206977&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaLookup.cpp (original) > +++ cfe/trunk/lib/Sema/SemaLookup.cpp Wed Apr 23 07:57:01 2014 > @@ -23,6 +23,9 @@ > #include "clang/AST/ExprCXX.h" > #include "clang/Basic/Builtins.h" > #include "clang/Basic/LangOptions.h" > +#include "clang/Lex/HeaderSearch.h" > +#include "clang/Lex/ModuleLoader.h" > +#include "clang/Lex/Preprocessor.h" > #include "clang/Sema/DeclSpec.h" > #include "clang/Sema/ExternalSemaSource.h" > #include "clang/Sema/Overload.h" > @@ -32,6 +35,8 @@ > #include "clang/Sema/SemaInternal.h" > #include "clang/Sema/TemplateDeduction.h" > #include "clang/Sema/TypoCorrection.h" > +#include "clang/Serialization/GlobalModuleIndex.h" > +#include "clang/Serialization/Module.h" > #include "llvm/ADT/STLExtras.h" > #include "llvm/ADT/SetVector.h" > #include "llvm/ADT/SmallPtrSet.h" > @@ -3924,6 +3929,7 @@ TypoCorrection Sema::CorrectTypo(const D > Sema::LookupNameKind LookupKind, > Scope *S, CXXScopeSpec *SS, > CorrectionCandidateCallback &CCC, > + CorrectTypoKind Mode, > DeclContext *MemberContext, > bool EnteringContext, > const ObjCObjectPointerType *OPT, > @@ -3978,10 +3984,36 @@ TypoCorrection Sema::CorrectTypo(const D > if (getLangOpts().AltiVec && Typo->isStr("vector")) > return TypoCorrection(); > > - NamespaceSpecifierSet Namespaces(Context, CurContext, SS); > - > TypoCorrectionConsumer Consumer(*this, Typo); > > + // Get the module loader (usually compiler instance). > + ModuleLoader &Loader = PP.getModuleLoader(); > + > + // Look for the symbol in non-imported modules, but only if an error > + // actually occurred. > + if ((Mode == CTK_ErrorRecovery) && !Loader.buildingModule() && > + getLangOpts().Modules && getLangOpts().ModulesSearchAll) { > + // Load global module index, or retrieve a previously loaded one. > + GlobalModuleIndex *GlobalIndex = Loader.loadGlobalModuleIndex( > + TypoName.getLocStart()); > + > + // Only if we have a global index. > + if (GlobalIndex) { > + GlobalModuleIndex::HitSet FoundModules; > + > + // Find the modules that reference the identifier. > + // Note that this only finds top-level modules. > + // We'll let diagnoseTypo find the actual declaration module. > + if (GlobalIndex->lookupIdentifier(Typo->getName(), FoundModules)) { This introduces a cyclic dependency from clangSema to clangSerialization, breaking the shared cmake build. - Ben > + TypoCorrection TC(TypoName.getName(), (NestedNameSpecifier *)0, 0); > + TC.setCorrectionRange(SS, TypoName); > + TC.setRequiresImport(true); > + } > + } > + } > + > + NamespaceSpecifierSet Namespaces(Context, CurContext, SS); > + > // If a callback object considers an empty typo correction candidate to be > // viable, assume it does not do any actual validation of the candidates. > TypoCorrection EmptyCorrection; > > Modified: cfe/trunk/lib/Sema/SemaOpenMP.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOpenMP.cpp?rev=206977&r1=206976&r2=206977&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaOpenMP.cpp (original) > +++ cfe/trunk/lib/Sema/SemaOpenMP.cpp Wed Apr 23 07:57:01 2014 > @@ -429,7 +429,7 @@ ExprResult Sema::ActOnOpenMPIdExpression > if (!Lookup.isSingleResult()) { > VarDeclFilterCCC Validator(*this); > if (TypoCorrection Corrected = CorrectTypo(Id, LookupOrdinaryName, > CurScope, > - 0, Validator)) { > + 0, Validator, > CTK_ErrorRecovery)) { > diagnoseTypo(Corrected, > PDiag(Lookup.empty()? diag::err_undeclared_var_use_suggest > : > diag::err_omp_expected_var_arg_suggest) > > Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=206977&r1=206976&r2=206977&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaTemplate.cpp (original) > +++ cfe/trunk/lib/Sema/SemaTemplate.cpp Wed Apr 23 07:57:01 2014 > @@ -325,7 +325,8 @@ void Sema::LookupTemplateName(LookupResu > FilterCCC.WantCXXNamedCasts = true; > if (TypoCorrection Corrected = CorrectTypo(Found.getLookupNameInfo(), > Found.getLookupKind(), S, &SS, > - FilterCCC, LookupCtx)) { > + FilterCCC, CTK_ErrorRecovery, > + LookupCtx)) { > Found.setLookupName(Corrected.getCorrection()); > if (Corrected.getCorrectionDecl()) > Found.addDecl(Corrected.getCorrectionDecl()); > > Modified: cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp?rev=206977&r1=206976&r2=206977&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp (original) > +++ cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp Wed Apr 23 07:57:01 2014 > @@ -810,7 +810,7 @@ ExprResult Sema::ActOnSizeofParameterPac > case LookupResult::NotFoundInCurrentInstantiation: > if (TypoCorrection Corrected = CorrectTypo(R.getLookupNameInfo(), > R.getLookupKind(), S, 0, > - Validator)) { > + Validator, > CTK_ErrorRecovery)) { > diagnoseTypo(Corrected, > PDiag(diag::err_sizeof_pack_no_pack_name_suggest) << &Name, > PDiag(diag::note_parameter_pack_here)); > > Added: cfe/trunk/test/Modules/Inputs/undefined-type-fixit/module.map > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/undefined-type-fixit/module.map?rev=206977&view=auto > ============================================================================== > --- cfe/trunk/test/Modules/Inputs/undefined-type-fixit/module.map (added) > +++ cfe/trunk/test/Modules/Inputs/undefined-type-fixit/module.map Wed Apr 23 > 07:57:01 2014 > @@ -0,0 +1,9 @@ > +module public1 { > + header "public1.h" > +} > +module public2 { > + header "public2.h" > + module public2sub { > + header "public2sub.h" > + } > +} > > Added: cfe/trunk/test/Modules/Inputs/undefined-type-fixit/public1.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/undefined-type-fixit/public1.h?rev=206977&view=auto > ============================================================================== > --- cfe/trunk/test/Modules/Inputs/undefined-type-fixit/public1.h (added) > +++ cfe/trunk/test/Modules/Inputs/undefined-type-fixit/public1.h Wed Apr 23 > 07:57:01 2014 > @@ -0,0 +1,6 @@ > +#ifndef PUBLIC1_H > +#define PUBLIC1_H > + > +struct use_this1 { int field; }; > + > +#endif > > Added: cfe/trunk/test/Modules/Inputs/undefined-type-fixit/public2.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/undefined-type-fixit/public2.h?rev=206977&view=auto > ============================================================================== > --- cfe/trunk/test/Modules/Inputs/undefined-type-fixit/public2.h (added) > +++ cfe/trunk/test/Modules/Inputs/undefined-type-fixit/public2.h Wed Apr 23 > 07:57:01 2014 > @@ -0,0 +1,6 @@ > +#ifndef PUBLIC2_H > +#define PUBLIC2_H > + > +struct use_this2 { int field; }; > + > +#endif > > Added: cfe/trunk/test/Modules/Inputs/undefined-type-fixit/public2sub.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/undefined-type-fixit/public2sub.h?rev=206977&view=auto > ============================================================================== > --- cfe/trunk/test/Modules/Inputs/undefined-type-fixit/public2sub.h (added) > +++ cfe/trunk/test/Modules/Inputs/undefined-type-fixit/public2sub.h Wed Apr > 23 07:57:01 2014 > @@ -0,0 +1,6 @@ > +#ifndef PUBLIC2SUB_H > +#define PUBLIC2SUB_H > + > +struct use_this2sub { int field; }; > + > +#endif > > Added: cfe/trunk/test/Modules/undefined-type-fixit1.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/undefined-type-fixit1.cpp?rev=206977&view=auto > ============================================================================== > --- cfe/trunk/test/Modules/undefined-type-fixit1.cpp (added) > +++ cfe/trunk/test/Modules/undefined-type-fixit1.cpp Wed Apr 23 07:57:01 2014 > @@ -0,0 +1,12 @@ > +// RUN: rm -rf %t > +// RUN: %clang_cc1 -fmodules-cache-path=%t -fmodules -fmodules-search-all -I > %S/Inputs/undefined-type-fixit %s -verify > + > +//#include "public1.h" > +#include "public2.h" > +#include "public2sub.h" > + > +use_this1 client_variable1; // expected-error{{declaration of 'use_this1' > must be imported from module 'public1' before it is required}} > +use_this2 client_variable2; > +use_this2sub client_variable2sub; > + > +// expected-note@Inputs/undefined-type-fixit/public1.h:4 {{previous > declaration is here}} > > Modified: cfe/trunk/unittests/Basic/SourceManagerTest.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Basic/SourceManagerTest.cpp?rev=206977&r1=206976&r2=206977&view=diff > ============================================================================== > --- cfe/trunk/unittests/Basic/SourceManagerTest.cpp (original) > +++ cfe/trunk/unittests/Basic/SourceManagerTest.cpp Wed Apr 23 07:57:01 2014 > @@ -63,6 +63,9 @@ class VoidModuleLoader : public ModuleLo > Module::NameVisibilityKind Visibility, > SourceLocation ImportLoc, > bool Complain) { } > + > + virtual GlobalModuleIndex *loadGlobalModuleIndex(SourceLocation TriggerLoc) > + { return 0; } > }; > > TEST_F(SourceManagerTest, isBeforeInTranslationUnit) { > > Modified: cfe/trunk/unittests/Lex/CMakeLists.txt > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Lex/CMakeLists.txt?rev=206977&r1=206976&r2=206977&view=diff > ============================================================================== > --- cfe/trunk/unittests/Lex/CMakeLists.txt (original) > +++ cfe/trunk/unittests/Lex/CMakeLists.txt Wed Apr 23 07:57:01 2014 > @@ -14,4 +14,5 @@ target_link_libraries(LexTests > clangLex > clangParse > clangSema > + clangSerialization > ) > > Modified: cfe/trunk/unittests/Lex/LexerTest.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Lex/LexerTest.cpp?rev=206977&r1=206976&r2=206977&view=diff > ============================================================================== > --- cfe/trunk/unittests/Lex/LexerTest.cpp (original) > +++ cfe/trunk/unittests/Lex/LexerTest.cpp Wed Apr 23 07:57:01 2014 > @@ -40,6 +40,9 @@ class VoidModuleLoader : public ModuleLo > Module::NameVisibilityKind Visibility, > SourceLocation ImportLoc, > bool Complain) { } > + > + virtual GlobalModuleIndex *loadGlobalModuleIndex(SourceLocation TriggerLoc) > + { return 0; } > }; > > // The test fixture. > > Modified: cfe/trunk/unittests/Lex/Makefile > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Lex/Makefile?rev=206977&r1=206976&r2=206977&view=diff > ============================================================================== > --- cfe/trunk/unittests/Lex/Makefile (original) > +++ cfe/trunk/unittests/Lex/Makefile Wed Apr 23 07:57:01 2014 > @@ -9,8 +9,8 @@ > > CLANG_LEVEL = ../.. > TESTNAME = Lex > -LINK_COMPONENTS := mcparser support mc > +LINK_COMPONENTS := mcparser support mc bitreader > USEDLIBS = clangParse.a clangSema.a clangAnalysis.a clangEdit.a \ > - clangAST.a clangLex.a clangBasic.a > + clangSerialization.a clangAST.a clangLex.a clangBasic.a > > include $(CLANG_LEVEL)/unittests/Makefile > > Modified: cfe/trunk/unittests/Lex/PPCallbacksTest.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Lex/PPCallbacksTest.cpp?rev=206977&r1=206976&r2=206977&view=diff > ============================================================================== > --- cfe/trunk/unittests/Lex/PPCallbacksTest.cpp (original) > +++ cfe/trunk/unittests/Lex/PPCallbacksTest.cpp Wed Apr 23 07:57:01 2014 > @@ -45,6 +45,9 @@ class VoidModuleLoader : public ModuleLo > Module::NameVisibilityKind Visibility, > SourceLocation ImportLoc, > bool Complain) { } > + > + virtual GlobalModuleIndex *loadGlobalModuleIndex(SourceLocation TriggerLoc) > + { return 0; } > }; > > // Stub to collect data from InclusionDirective callbacks. > > Modified: cfe/trunk/unittests/Lex/PPConditionalDirectiveRecordTest.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Lex/PPConditionalDirectiveRecordTest.cpp?rev=206977&r1=206976&r2=206977&view=diff > ============================================================================== > --- cfe/trunk/unittests/Lex/PPConditionalDirectiveRecordTest.cpp (original) > +++ cfe/trunk/unittests/Lex/PPConditionalDirectiveRecordTest.cpp Wed Apr 23 > 07:57:01 2014 > @@ -64,6 +64,9 @@ class VoidModuleLoader : public ModuleLo > Module::NameVisibilityKind Visibility, > SourceLocation ImportLoc, > bool Complain) { } > + > + virtual GlobalModuleIndex *loadGlobalModuleIndex(SourceLocation TriggerLoc) > + { return 0; } > }; > > TEST_F(PPConditionalDirectiveRecordTest, PPRecAPI) { > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
