r206977 - Initial implementation of -modules-earch-all option, for searching for symbols in non-imported modules.

Benjamin Kramer benny.kra at gmail.com
Wed Apr 23 09:39:27 PDT 2014


On 23.04.2014, at 14:57, John Thompson <john.thompson.jtsoftware at gmail.com> 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 at 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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits





More information about the cfe-commits mailing list