r220731 - [modules] Load .pcm files specified by -fmodule-file lazily.
Richard Smith
richard at metafoo.co.uk
Mon Oct 27 16:37:32 PDT 2014
On Mon, Oct 27, 2014 at 4:36 PM, NAKAMURA Takumi <geek4civic at gmail.com>
wrote:
> 2014-10-28 8:01 GMT+09:00 Richard Smith <richard-llvm at metafoo.co.uk>:
> > Author: rsmith
> > Date: Mon Oct 27 18:01:16 2014
> > New Revision: 220731
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=220731&view=rev
> > Log:
> > [modules] Load .pcm files specified by -fmodule-file lazily.
> >
> > Modified:
> > cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td
> > cfe/trunk/include/clang/Frontend/CompilerInstance.h
> > cfe/trunk/include/clang/Serialization/ASTReader.h
> > cfe/trunk/lib/Frontend/CompilerInstance.cpp
> > cfe/trunk/lib/Frontend/FrontendAction.cpp
> > cfe/trunk/lib/Serialization/ASTReader.cpp
> > cfe/trunk/test/Modules/explicit-build.cpp
> >
> > Modified: cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td?rev=220731&r1=220730&r2=220731&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td (original)
> > +++ cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td Mon Oct 27
> 18:01:16 2014
> > @@ -190,8 +190,10 @@ def remark_module_build_done : Remark<"f
> > def err_conflicting_module_names : Error<
> > "conflicting module names specified: '-fmodule-name=%0' and "
> > "'-fmodule-implementation-of %1'">;
> > -def err_module_already_loaded : Error<
> > - "module '%0' has already been loaded; cannot load module file '%1'">;
> > +def err_conflicting_module_files : Error<
> > + "module '%0' is defined in both '%1' and '%2'">;
> > +def err_module_file_not_found : Error<
> > + "file '%0' is not a precompiled module file">, DefaultFatal;
> > def err_module_file_not_module : Error<
> > "AST file '%0' was not built as a module">, DefaultFatal;
> >
> >
> > Modified: cfe/trunk/include/clang/Frontend/CompilerInstance.h
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/CompilerInstance.h?rev=220731&r1=220730&r2=220731&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/include/clang/Frontend/CompilerInstance.h (original)
> > +++ cfe/trunk/include/clang/Frontend/CompilerInstance.h Mon Oct 27
> 18:01:16 2014
> > @@ -117,7 +117,10 @@ class CompilerInstance : public ModuleLo
> > /// \brief The set of top-level modules that has already been loaded,
> > /// along with the module map
> > llvm::DenseMap<const IdentifierInfo *, Module *> KnownModules;
> > -
> > +
> > + /// \brief Module names that have an override for the target file.
> > + llvm::StringMap<std::string> ModuleFileOverrides;
> > +
> > /// \brief The location of the module-import keyword for the last
> module
> > /// import.
> > SourceLocation LastModuleImportLoc;
> > @@ -691,7 +694,7 @@ public:
> > // Create module manager.
> > void createModuleManager();
> >
> > - ModuleLoadResult loadModuleFile(StringRef FileName, SourceLocation
> Loc);
> > + bool loadModuleFile(StringRef FileName);
> >
> > ModuleLoadResult loadModule(SourceLocation ImportLoc, ModuleIdPath
> Path,
> > Module::NameVisibilityKind Visibility,
> >
> > Modified: cfe/trunk/include/clang/Serialization/ASTReader.h
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTReader.h?rev=220731&r1=220730&r2=220731&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/include/clang/Serialization/ASTReader.h (original)
> > +++ cfe/trunk/include/clang/Serialization/ASTReader.h Mon Oct 27
> 18:01:16 2014
> > @@ -193,6 +193,13 @@ public:
> > bool isOverridden) {
> > return true;
> > }
> > +
> > + /// \brief Returns true if this \c ASTReaderListener wants to receive
> the
> > + /// imports of the AST file via \c visitImport, false otherwise.
> > + virtual bool needsImportVisitation() const { return false; }
> > + /// \brief If needsImportVisitation returns \c true, this is called
> for each
> > + /// AST file imported by this AST file.
> > + virtual void visitImport(StringRef Filename) {}
> > };
> >
> > /// \brief Simple wrapper class for chaining listeners.
> >
> > Modified: cfe/trunk/lib/Frontend/CompilerInstance.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInstance.cpp?rev=220731&r1=220730&r2=220731&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/Frontend/CompilerInstance.cpp (original)
> > +++ cfe/trunk/lib/Frontend/CompilerInstance.cpp Mon Oct 27 18:01:16 2014
> > @@ -1257,51 +1257,61 @@ void CompilerInstance::createModuleManag
> > }
> > }
> >
> > -ModuleLoadResult
> > -CompilerInstance::loadModuleFile(StringRef FileName, SourceLocation
> Loc) {
> > - if (!ModuleManager)
> > - createModuleManager();
> > - if (!ModuleManager)
> > - return ModuleLoadResult();
> > -
> > - // Load the module if this is the first time we've been told about
> this file.
> > - auto *MF = ModuleManager->getModuleManager().lookup(FileName);
> > - if (!MF) {
> > - struct ReadModuleNameListener : ASTReaderListener {
> > - std::function<void(StringRef)> OnRead;
> > - ReadModuleNameListener(std::function<void(StringRef)> F) :
> OnRead(F) {}
> > - void ReadModuleName(StringRef ModuleName) override {
> OnRead(ModuleName); }
> > - };
> > -
> > - // Register listener to track the modules that are loaded by
> explicitly
> > - // loading a module file. We suppress any attempts to implicitly
> load
> > - // module files for any such module.
> > - ASTReader::ListenerScope OnReadModuleName(
> > - *ModuleManager,
> > - llvm::make_unique<ReadModuleNameListener>([&](StringRef
> ModuleName) {
> > - auto &PP = getPreprocessor();
> > - auto *NameII = PP.getIdentifierInfo(ModuleName);
> > - auto *Module = PP.getHeaderSearchInfo().lookupModule(ModuleName,
> false);
> > - if (!KnownModules.insert(std::make_pair(NameII, Module)).second)
> > - getDiagnostics().Report(Loc, diag::err_module_already_loaded)
> > - << ModuleName << FileName;
> > - }));
> > +bool CompilerInstance::loadModuleFile(StringRef FileName) {
> > + // Helper to recursively read the module names for all modules we're
> adding.
> > + // We mark these as known and redirect any attempt to load that
> module to
> > + // the files we were handed.
> > + struct ReadModuleNames : ASTReaderListener {
> > + CompilerInstance &CI;
> > + std::vector<StringRef> ModuleFileStack;
> > + bool Failed;
> > + bool TopFileIsModule;
> > +
> > + ReadModuleNames(CompilerInstance &CI)
> > + : CI(CI), Failed(false), TopFileIsModule(false) {}
> > +
> > + bool needsImportVisitation() const override { return true; }
> > +
> > + void visitImport(StringRef FileName) override {
> > + ModuleFileStack.push_back(FileName);
> > + if (ASTReader::readASTFileControlBlock(FileName,
> CI.getFileManager(),
> > + *this)) {
> > + CI.getDiagnostics().Report(SourceLocation(),
> > + diag::err_module_file_not_found)
> > + << FileName;
> > + // FIXME: Produce a note stack explaining how we got here.
> > + Failed = true;
> > + }
> > + ModuleFileStack.pop_back();
> > + }
> >
> > - if (ModuleManager->ReadAST(FileName,
> serialization::MK_ExplicitModule, Loc,
> > - ASTReader::ARR_None) !=
> ASTReader::Success)
> > - return ModuleLoadResult();
> > + void ReadModuleName(StringRef ModuleName) override {
> > + if (ModuleFileStack.size() == 1)
> > + TopFileIsModule = true;
> > +
> > + auto &ModuleFile = CI.ModuleFileOverrides[ModuleName];
> > + if (!ModuleFile.empty() && ModuleFile != ModuleFileStack.back())
> > + CI.getDiagnostics().Report(SourceLocation(),
> > + diag::err_conflicting_module_files)
> > + << ModuleName << ModuleFile << ModuleFileStack.back();
> > + ModuleFile = ModuleFileStack.back();
> > + }
> > + } RMN(*this);
> >
> > - MF = ModuleManager->getModuleManager().lookup(FileName);
> > - assert(MF && "unexpectedly failed to load module file");
> > - }
> > + RMN.visitImport(FileName);
> >
> > - if (MF->ModuleName.empty()) {
> > - getDiagnostics().Report(Loc, diag::err_module_file_not_module)
> > + if (RMN.Failed)
> > + return false;
> > +
> > + // If we never found a module name for the top file, then it's not a
> module,
> > + // it's a PCH or preamble or something.
> > + if (!RMN.TopFileIsModule) {
> > + getDiagnostics().Report(SourceLocation(),
> diag::err_module_file_not_module)
> > << FileName;
> > - return ModuleLoadResult();
> > + return false;
> > }
> > - auto *Module = PP->getHeaderSearchInfo().lookupModule(MF->ModuleName,
> false);
> > - return ModuleLoadResult(Module, false);
> > +
> > + return true;
> > }
> >
> > ModuleLoadResult
> > @@ -1349,8 +1359,12 @@ CompilerInstance::loadModule(SourceLocat
> > return ModuleLoadResult();
> > }
> >
> > + auto Override = ModuleFileOverrides.find(ModuleName);
> > + bool Explicit = Override != ModuleFileOverrides.end();
> > +
> > std::string ModuleFileName =
> > - PP->getHeaderSearchInfo().getModuleFileName(Module);
> > + Explicit ? Override->second
> > + : PP->getHeaderSearchInfo().getModuleFileName(Module);
> >
> > // If we don't already have an ASTReader, create one now.
> > if (!ModuleManager)
> > @@ -1366,15 +1380,24 @@ CompilerInstance::loadModule(SourceLocat
> > Listener->attachToASTReader(*ModuleManager);
> >
> > // Try to load the module file.
> > - unsigned ARRFlags = ASTReader::ARR_OutOfDate |
> ASTReader::ARR_Missing;
> > + unsigned ARRFlags =
> > + Explicit ? 0 : ASTReader::ARR_OutOfDate |
> ASTReader::ARR_Missing;
> > switch (ModuleManager->ReadAST(ModuleFileName,
> > - serialization::MK_ImplicitModule,
> ImportLoc,
> > - ARRFlags)) {
> > + Explicit ?
> serialization::MK_ExplicitModule
> > + :
> serialization::MK_ImplicitModule,
> > + ImportLoc, ARRFlags)) {
> > case ASTReader::Success:
> > break;
> >
> > case ASTReader::OutOfDate:
> > case ASTReader::Missing: {
> > + if (Explicit) {
> > + // ReadAST has already complained for us.
> > + ModuleLoader::HadFatalFailure = true;
> > + KnownModules[Path[0].first] = nullptr;
> > + return ModuleLoadResult();
> > + }
> > +
> > // The module file is missing or out-of-date. Build it.
> > assert(Module && "missing module file");
> > // Check whether there is a cycle in the module graph.
> >
> > Modified: cfe/trunk/lib/Frontend/FrontendAction.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/FrontendAction.cpp?rev=220731&r1=220730&r2=220731&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/Frontend/FrontendAction.cpp (original)
> > +++ cfe/trunk/lib/Frontend/FrontendAction.cpp Mon Oct 27 18:01:16 2014
> > @@ -383,16 +383,10 @@ bool FrontendAction::BeginSourceFile(Com
> > "doesn't support modules");
> > }
> >
> > - // If we were asked to load any module files, do so now. Don't make
> any names
> > - // from those modules visible.
> > - for (const auto &ModuleFile : CI.getFrontendOpts().ModuleFiles) {
> > - // FIXME: Use a better source location here. Perhaps inject
> something
> > - // into the predefines buffer to represent these module files.
> > - if (!CI.loadModuleFile(ModuleFile,
> > - CI.getSourceManager().getLocForStartOfFile(
> > - CI.getSourceManager().getMainFileID())))
> > + // If we were asked to load any module files, do so now.
> > + for (const auto &ModuleFile : CI.getFrontendOpts().ModuleFiles)
> > + if (!CI.loadModuleFile(ModuleFile))
> > goto failure;
> > - }
> >
> > // If there is a layout overrides file, attach an external AST source
> that
> > // provides the layouts from that file.
> >
> > Modified: cfe/trunk/lib/Serialization/ASTReader.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=220731&r1=220730&r2=220731&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/Serialization/ASTReader.cpp (original)
> > +++ cfe/trunk/lib/Serialization/ASTReader.cpp Mon Oct 27 18:01:16 2014
> > @@ -4188,6 +4188,7 @@ bool ASTReader::readASTFileControlBlock(
> >
> > bool NeedsInputFiles = Listener.needsInputFileVisitation();
> > bool NeedsSystemInputFiles =
> Listener.needsSystemInputFileVisitation();
> > + bool NeedsImports = Listener.needsImportVisitation();
> > BitstreamCursor InputFilesCursor;
> > if (NeedsInputFiles) {
> > InputFilesCursor = Stream;
> > @@ -4305,6 +4306,24 @@ bool ASTReader::readASTFileControlBlock(
> > }
> > break;
> > }
> > +
> > + case IMPORTS: {
> > + if (!NeedsImports)
> > + break;
> > +
> > + unsigned Idx = 0, N = Record.size();
> > + while (Idx < N) {
> > + // Read information about the AST file.
> > + ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
>
> ImportedKind is unused around here. Would it be skipped, like Idx++ or
> Idx +=5, for now?
Thanks, already fixed.
> > + Idx += 4; // ImportLoc, Size, ModTime, Signature
> > + unsigned Length = Record[Idx++];
> > + SmallString<128> ImportedFile(Record.begin() + Idx,
> > + Record.begin() + Idx + Length);
> > + Idx += Length;
> > + Listener.visitImport(ImportedFile);
> > + }
> > + break;
> > + }
> >
> > default:
> > // No other validation to perform.
> >
> > Modified: cfe/trunk/test/Modules/explicit-build.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/explicit-build.cpp?rev=220731&r1=220730&r2=220731&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/test/Modules/explicit-build.cpp (original)
> > +++ cfe/trunk/test/Modules/explicit-build.cpp Mon Oct 27 18:01:16 2014
> > @@ -2,16 +2,16 @@
> >
> > // -------------------------------
> > // Build chained modules A, B, and C
> > -// RUN: %clang_cc1 -x c++ -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > +// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > // RUN: -fmodule-name=a -emit-module
> %S/Inputs/explicit-build/module.modulemap -o %t/a.pcm \
> > // RUN: 2>&1 | FileCheck
> --check-prefix=CHECK-NO-IMPLICIT-BUILD %s --allow-empty
> > //
> > -// RUN: %clang_cc1 -x c++ -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > +// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > // RUN: -fmodule-file=%t/a.pcm \
> > // RUN: -fmodule-name=b -emit-module
> %S/Inputs/explicit-build/module.modulemap -o %t/b.pcm \
> > // RUN: 2>&1 | FileCheck
> --check-prefix=CHECK-NO-IMPLICIT-BUILD %s --allow-empty
> > //
> > -// RUN: %clang_cc1 -x c++ -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > +// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > // RUN: -fmodule-file=%t/b.pcm \
> > // RUN: -fmodule-name=c -emit-module
> %S/Inputs/explicit-build/module.modulemap -o %t/c.pcm \
> > // RUN: 2>&1 | FileCheck
> --check-prefix=CHECK-NO-IMPLICIT-BUILD %s --allow-empty
> > @@ -20,7 +20,7 @@
> >
> > // -------------------------------
> > // Build B with an implicit build of A
> > -// RUN: %clang_cc1 -x c++ -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > +// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > // RUN: -fmodule-name=b -emit-module
> %S/Inputs/explicit-build/module.modulemap -o %t/b-not-a.pcm \
> > // RUN: 2>&1 | FileCheck --check-prefix=CHECK-B-NO-A %s
> > //
> > @@ -29,123 +29,127 @@
> >
> > // -------------------------------
> > // Check that we can use the explicitly-built A, B, and C modules.
> > -// RUN: %clang_cc1 -x c++ -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > +// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > +// RUN: -I%S/Inputs/explicit-build \
> > // RUN: -fmodule-file=%t/a.pcm \
> > // RUN: -verify %s -DHAVE_A
> > //
> > -// RUN: %clang_cc1 -x c++ -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > -// RUN: -fmodule-file=%t/a.pcm \
> > +// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > +// RUN: -I%S/Inputs/explicit-build \
> > // RUN:
> -fmodule-map-file=%S/Inputs/explicit-build/module.modulemap \
> > +// RUN: -fmodule-file=%t/a.pcm \
> > // RUN: -verify %s -DHAVE_A
> > //
> > -// RUN: %clang_cc1 -x c++ -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > +// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > +// RUN: -I%S/Inputs/explicit-build \
> > // RUN: -fmodule-file=%t/b.pcm \
> > // RUN: -verify %s -DHAVE_A -DHAVE_B
> > //
> > -// RUN: %clang_cc1 -x c++ -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > +// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > +// RUN: -I%S/Inputs/explicit-build \
> > // RUN: -fmodule-file=%t/a.pcm \
> > // RUN: -fmodule-file=%t/b.pcm \
> > // RUN: -verify %s -DHAVE_A -DHAVE_B
> > //
> > -// RUN: %clang_cc1 -x c++ -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > +// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > +// RUN: -I%S/Inputs/explicit-build \
> > // RUN: -fmodule-file=%t/a.pcm \
> > // RUN: -fmodule-file=%t/b.pcm \
> > // RUN: -fmodule-file=%t/c.pcm \
> > // RUN: -verify %s -DHAVE_A -DHAVE_B -DHAVE_C
> > //
> > -// RUN: %clang_cc1 -x c++ -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > +// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > // RUN: -I%S/Inputs/explicit-build \
> > // RUN: -fmodule-file=%t/a.pcm \
> > -// RUN: -fmodule-file=%t/b.pcm \
> > // RUN: -fmodule-file=%t/c.pcm \
> > -// RUN: -verify %s -INCLUDE_ALL -DHAVE_A -DHAVE_B -DHAVE_C
> > +// RUN: -verify %s -DHAVE_A -DHAVE_B -DHAVE_C
> >
> > -#ifdef INCLUDE_ALL
> > +#if HAVE_A
> > #include "a.h"
> > - #include "b.h"
> > - #include "c.h"
> > static_assert(a == 1, "");
> > +#else
> > + const int use_a = a; // expected-error {{undeclared identifier}}
> > +#endif
> > +
> > +#if HAVE_B
> > + #include "b.h"
> > static_assert(b == 2, "");
> > +#else
> > + const int use_b = b; // expected-error {{undeclared identifier}}
> > +#endif
> > +
> > +#if HAVE_C
> > + #include "c.h"
> > static_assert(c == 3, "");
> > #else
> > - const int use_a = a;
> > - #ifndef HAVE_A
> > - // expected-error at -2 {{undeclared identifier}}
> > - #else
> > - // expected-error at -4 {{must be imported from module 'a'}}
> > - // expected-note at Inputs/explicit-build/a.h:* {{here}}
> > - #endif
> > -
> > - const int use_b = b;
> > - #ifndef HAVE_B
> > - // expected-error at -2 {{undeclared identifier}}
> > - #else
> > - // expected-error at -4 {{must be imported from module 'b'}}
> > - // expected-note at Inputs/explicit-build/b.h:* {{here}}
> > - #endif
> > -
> > - const int use_c = c;
> > - #ifndef HAVE_C
> > - // expected-error at -2 {{undeclared identifier}}
> > - #else
> > - // expected-error at -4 {{must be imported from module 'c'}}
> > - // expected-note at Inputs/explicit-build/c.h:* {{here}}
> > - #endif
> > + const int use_c = c; // expected-error {{undeclared identifier}}
> > +#endif
> > +
> > +#if HAVE_A && HAVE_B && HAVE_C
> > +// expected-no-diagnostics
> > #endif
> >
> > // -------------------------------
> > // Check that we can use a mixture of implicit and explicit modules.
> > -// RUN: not %clang_cc1 -x c++ -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > +// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > +// RUN: -I%S/Inputs/explicit-build \
> > // RUN: -fmodule-file=%t/b-not-a.pcm \
> > -// RUN:
> -fmodule-map-file=%S/Inputs/explicit-build/module.modulemap \
> > -// RUN: %s 2>&1 | FileCheck
> --check-prefix=CHECK-A-AND-B-NO-A %s
> > +// RUN: -verify %s -DHAVE_A -DHAVE_B
> >
> > // -------------------------------
> > -// Check that mixing an implicit and explicit form of the 'a' module is
> rejected.
> > -// RUN: not %clang_cc1 -x c++ -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > +// Try to use two different flavors of the 'a' module.
> > +// RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules
> -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
> > // RUN: -fmodule-file=%t/a.pcm \
> > // RUN: -fmodule-file=%t/b-not-a.pcm \
> > -// RUN: %s 2>&1 | FileCheck
> --check-prefix=CHECK-A-AND-B-NO-A %s
> > +// RUN: %s 2>&1 | FileCheck --check-prefix=CHECK-MULTIPLE-AS
> %s
> > //
> > -// RUN: not %clang_cc1 -x c++ -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > +// RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules
> -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
> > // RUN: -fmodule-file=%t/a.pcm \
> > // RUN: -fmodule-file=%t/b-not-a.pcm \
> > // RUN:
> -fmodule-map-file=%S/Inputs/explicit-build/module.modulemap \
> > -// RUN: %s 2>&1 | FileCheck
> --check-prefix=CHECK-A-AND-B-NO-A %s
> > +// RUN: %s 2>&1 | FileCheck --check-prefix=CHECK-MULTIPLE-AS
> %s
> > //
> > -// FIXME: We should load module map files specified on the command line
> and
> > -// module map files in include paths on demand to allow this, and
> possibly
> > -// also the previous case.
> > -// CHECK-A-AND-B-NO-A: fatal error: module 'a' {{.*}} is not defined in
> any loaded module map
> > -
> > -// -------------------------------
> > -// Try to use two different flavors of the 'a' module.
> > -// RUN: %clang_cc1 -x c++ -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > +// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > // RUN: -fmodule-name=a -emit-module
> %S/Inputs/explicit-build/module.modulemap -o %t/a-alt.pcm \
> > // RUN: 2>&1 | FileCheck
> --check-prefix=CHECK-NO-IMPLICIT-BUILD %s --allow-empty
> > //
> > -// RUN: not %clang_cc1 -x c++ -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > +// RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules
> -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
> > // RUN: -fmodule-file=%t/a.pcm \
> > // RUN: -fmodule-file=%t/a-alt.pcm \
> > // RUN:
> -fmodule-map-file=%S/Inputs/explicit-build/module.modulemap \
> > // RUN: %s 2>&1 | FileCheck --check-prefix=CHECK-MULTIPLE-AS
> %s
> > //
> > -// RUN: not %clang_cc1 -x c++ -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > +// RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules
> -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
> > // RUN: -fmodule-file=%t/a-alt.pcm \
> > // RUN: -fmodule-file=%t/a.pcm \
> > // RUN:
> -fmodule-map-file=%S/Inputs/explicit-build/module.modulemap \
> > // RUN: %s 2>&1 | FileCheck --check-prefix=CHECK-MULTIPLE-AS
> %s
> > //
> > -// CHECK-MULTIPLE-AS: error: module 'a' has already been loaded; cannot
> load module file '{{.*a(-alt)?}}.pcm'
> > +// CHECK-MULTIPLE-AS: error: module 'a' is defined in both
> '{{.*}}/a{{.*}}.pcm' and '{{.*}}/a{{.*}}.pcm'
> >
> > // -------------------------------
> > // Try to import a PCH with -fmodule-file=
> > -// RUN: %clang_cc1 -x c++ -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > +// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > // RUN: -fmodule-name=a -emit-pch
> %S/Inputs/explicit-build/a.h -o %t/a.pch \
> > // RUN: 2>&1 | FileCheck
> --check-prefix=CHECK-NO-IMPLICIT-BUILD %s --allow-empty
> > //
> > -// RUN: not %clang_cc1 -x c++ -fmodules -fmodules-cache-path=%t
> -Rmodule-build -fno-modules-error-recovery \
> > +// RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules
> -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
> > // RUN: -fmodule-file=%t/a.pch \
> > // RUN: %s 2>&1 | FileCheck --check-prefix=CHECK-A-AS-PCH %s
> > //
> > // CHECK-A-AS-PCH: fatal error: AST file '{{.*}}a.pch' was not built as
> a module
> > +
> > +// -------------------------------
> > +// Try to import a non-AST file with -fmodule-file=
> > +//
> > +// RUN: touch %t/not.pcm
> > +//
> > +// RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules
> -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
> > +// RUN: -fmodule-file=%t/not.pcm \
> > +// RUN: %s 2>&1 | FileCheck --check-prefix=CHECK-BAD-FILE %s
> > +//
> > +// RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules
> -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
> > +// RUN: -fmodule-file=%t/nonexistent.pcm \
> > +// RUN: %s 2>&1 | FileCheck --check-prefix=CHECK-BAD-FILE %s
> > +//
> > +// CHECK-BAD-FILE: fatal error: file '{{.*}}t.pcm' is not a precompiled
> module file
> >
> >
> > _______________________________________________
> > cfe-commits mailing list
> > cfe-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141027/ebeb14ab/attachment.html>
More information about the cfe-commits
mailing list