r261372 - [modules] Flatten -fmodule-name= and -fmodule-implementation-of= into a single

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Mon Mar 14 10:58:00 PDT 2016


Sorry for the delay, the past couple of weeks have been crazy with C++
committee stuff. Should be fixed in r263449.

On Mon, Mar 14, 2016 at 8:00 AM, Argyrios Kyrtzidis via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
> If not addressing the issue with '-fmodule-name' could you revert removal of
> original ‘-fmodule-implementation-of’ since we are depending on it ?
>
> On Mar 3, 2016, at 6:13 PM, Argyrios Kyrtzidis via cfe-commits
> <cfe-commits at lists.llvm.org> wrote:
>
> Hey Richard,
>
> -fmodule-name emits bogus warnings about “include of non-modular header
> inside framework module”, while trying to include a header in the
> implementation file.
> This is not new behavior but we noticed it now that we tried to use it as
> replacement of -fmodule-implementation-of.
>
> Could you take a look ? The test case is attached. Unzip and run:
>
> $ clang -fsyntax-only /tmp/test-frame/boo.m -fmodules
> -fmodules-cache-path=/tmp/mcp -F /tmp/test-frame -fmodule-name=boo
> -Werror=non-modular-include-in-framework-module
> /tmp/test-frame/boo.m:2:9: error: include of non-modular header inside
> framework module 'boo' [-Werror,-Wnon-modular-include-in-framework-module]
> #import "blah.h"
>         ^
> 1 error generated.
>
> <test-frame.zip>
>
> On Mar 3, 2016, at 5:28 AM, Richard Smith via cfe-commits
> <cfe-commits at lists.llvm.org> wrote:
>
> On 3 Mar 2016 3:18 a.m., "Argyrios Kyrtzidis via cfe-commits"
> <cfe-commits at lists.llvm.org> wrote:
>>
>> Mind if we keep -fmodule-implementation-of as an alias so that we can
>> gradually transition to -fmodule-name ?
>
> Sure, no problem.
>
>> > On Feb 19, 2016, at 2:25 PM, Richard Smith via cfe-commits
>> > <cfe-commits at lists.llvm.org> wrote:
>> >
>> > Author: rsmith
>> > Date: Fri Feb 19 16:25:36 2016
>> > New Revision: 261372
>> >
>> > URL: http://llvm.org/viewvc/llvm-project?rev=261372&view=rev
>> > Log:
>> > [modules] Flatten -fmodule-name= and -fmodule-implementation-of= into a
>> > single
>> > option. Previously these options could both be used to specify that you
>> > were
>> > compiling the implementation file of a module, with a different set of
>> > minor
>> > bugs in each case.
>> >
>> > This change removes -fmodule-implementation-of, and instead tracks a
>> > flag to
>> > determine whether we're currently building a module. -fmodule-name now
>> > behaves
>> > the same way that -fmodule-implementation-of previously did.
>> >
>> > Modified:
>> >    cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td
>> >    cfe/trunk/include/clang/Basic/LangOptions.def
>> >    cfe/trunk/include/clang/Basic/LangOptions.h
>> >    cfe/trunk/include/clang/Driver/CC1Options.td
>> >    cfe/trunk/include/clang/Driver/Options.td
>> >    cfe/trunk/include/clang/Lex/ModuleMap.h
>> >    cfe/trunk/lib/Basic/LangOptions.cpp
>> >    cfe/trunk/lib/Driver/Tools.cpp
>> >    cfe/trunk/lib/Frontend/ASTUnit.cpp
>> >    cfe/trunk/lib/Frontend/CompilerInstance.cpp
>> >    cfe/trunk/lib/Frontend/CompilerInvocation.cpp
>> >    cfe/trunk/lib/Frontend/FrontendActions.cpp
>> >    cfe/trunk/lib/Lex/ModuleMap.cpp
>> >    cfe/trunk/lib/Lex/PPDirectives.cpp
>> >    cfe/trunk/lib/Lex/PPMacroExpansion.cpp
>> >    cfe/trunk/lib/Lex/Preprocessor.cpp
>> >    cfe/trunk/lib/Sema/SemaDecl.cpp
>> >    cfe/trunk/lib/Sema/SemaDeclObjC.cpp
>> >    cfe/trunk/test/Modules/Inputs/explicit-build/a.h
>> >    cfe/trunk/test/Modules/explicit-build.cpp
>> >    cfe/trunk/test/Modules/implementation-of-module.m
>> >    cfe/trunk/test/Modules/import-self.m
>> >
>> > Modified: cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td?rev=261372&r1=261371&r2=261372&view=diff
>> >
>> > ==============================================================================
>> > --- cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td (original)
>> > +++ cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td Fri Feb 19
>> > 16:25:36 2016
>> > @@ -210,10 +210,6 @@ def err_test_module_file_extension_versi
>> >   "test module file extension '%0' has different version (%1.%2) than
>> > expected "
>> >   "(%3.%4)">;
>> >
>> > -def err_conflicting_module_names : Error<
>> > -  "conflicting module names specified: '-fmodule-name=%0' and "
>> > -  "'-fmodule-implementation-of %1'">;
>> > -
>> > def err_missing_vfs_overlay_file : Error<
>> >   "virtual filesystem overlay file '%0' not found">, DefaultFatal;
>> > def err_invalid_vfs_overlay : Error<
>> >
>> > Modified: cfe/trunk/include/clang/Basic/LangOptions.def
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/LangOptions.def?rev=261372&r1=261371&r2=261372&view=diff
>> >
>> > ==============================================================================
>> > --- cfe/trunk/include/clang/Basic/LangOptions.def (original)
>> > +++ cfe/trunk/include/clang/Basic/LangOptions.def Fri Feb 19 16:25:36
>> > 2016
>> > @@ -127,6 +127,7 @@ BENIGN_LANGOPT(EmitAllDecls      , 1, 0,
>> > LANGOPT(MathErrno         , 1, 1, "errno support for math functions")
>> > 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")
>> > +BENIGN_LANGOPT(CompilingModule, 1, 0, "compiling a module interface")
>> > COMPATIBLE_LANGOPT(ModulesDeclUse    , 1, 0, "require declaration of
>> > module uses")
>> > LANGOPT(ModulesSearchAll  , 1, 1, "search even non-imported modules to
>> > find unresolved references")
>> > COMPATIBLE_LANGOPT(ModulesStrictDeclUse, 1, 0, "require declaration of
>> > module uses and all headers to be in modules")
>> >
>> > Modified: cfe/trunk/include/clang/Basic/LangOptions.h
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/LangOptions.h?rev=261372&r1=261371&r2=261372&view=diff
>> >
>> > ==============================================================================
>> > --- cfe/trunk/include/clang/Basic/LangOptions.h (original)
>> > +++ cfe/trunk/include/clang/Basic/LangOptions.h Fri Feb 19 16:25:36 2016
>> > @@ -92,14 +92,12 @@ public:
>> >   /// If none is specified, abort (GCC-compatible behaviour).
>> >   std::string OverflowHandler;
>> >
>> > -  /// \brief The name of the current module.
>> > +  /// \brief The name of the current module, of which the main source
>> > file
>> > +  /// is a part. If CompilingModule is set, we are compiling the
>> > interface
>> > +  /// of this module, otherwise we are compiling an implementation file
>> > of
>> > +  /// it.
>> >   std::string CurrentModule;
>> >
>> > -  /// \brief The name of the module that the translation unit is an
>> > -  /// implementation of. Prevents semantic imports, but does not
>> > otherwise
>> > -  /// treat this as the CurrentModule.
>> > -  std::string ImplementationOfModule;
>> > -
>> >   /// \brief The names of any features to enable in module 'requires'
>> > decls
>> >   /// in addition to the hard-coded list in Module.cpp and the target
>> > features.
>> >   ///
>> >
>> > Modified: cfe/trunk/include/clang/Driver/CC1Options.td
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CC1Options.td?rev=261372&r1=261371&r2=261372&view=diff
>> >
>> > ==============================================================================
>> > --- cfe/trunk/include/clang/Driver/CC1Options.td (original)
>> > +++ cfe/trunk/include/clang/Driver/CC1Options.td Fri Feb 19 16:25:36
>> > 2016
>> > @@ -382,9 +382,6 @@ def fno_modules_global_index : Flag<["-"
>> >   HelpText<"Do not automatically generate or update the global module
>> > index">;
>> > def fno_modules_error_recovery : Flag<["-"],
>> > "fno-modules-error-recovery">,
>> >   HelpText<"Do not automatically import modules for error recovery">;
>> > -def fmodule_implementation_of : Separate<["-"],
>> > "fmodule-implementation-of">,
>> > -  MetaVarName<"<name>">,
>> > -  HelpText<"Specify the name of the module whose implementation file
>> > this is">;
>> > def fmodule_map_file_home_is_cwd : Flag<["-"],
>> > "fmodule-map-file-home-is-cwd">,
>> >   HelpText<"Use the current working directory as the home directory of "
>> >            "module maps specified by -fmodule-map-file=<FILE>">;
>> >
>> > Modified: cfe/trunk/include/clang/Driver/Options.td
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=261372&r1=261371&r2=261372&view=diff
>> >
>> > ==============================================================================
>> > --- cfe/trunk/include/clang/Driver/Options.td (original)
>> > +++ cfe/trunk/include/clang/Driver/Options.td Fri Feb 19 16:25:36 2016
>> > @@ -786,9 +786,10 @@ def fimplicit_module_maps : Flag <["-"],
>> >   Flags<[DriverOption, CC1Option]>,
>> >   HelpText<"Implicitly search the file system for module map files.">;
>> > def fmodule_maps : Flag <["-"], "fmodule-maps">,
>> > Alias<fimplicit_module_maps>;
>> > -def fmodule_name : JoinedOrSeparate<["-"], "fmodule-name=">,
>> > Group<f_Group>,
>> > +def fmodule_name_EQ : Joined<["-"], "fmodule-name=">, Group<f_Group>,
>> >   Flags<[DriverOption,CC1Option]>, MetaVarName<"<name>">,
>> >   HelpText<"Specify the name of the module to build">;
>> > +def fmodule_name : Separate<["-"], "fmodule-name">,
>> > Alias<fmodule_name_EQ>;
>> > def fmodule_map_file : Joined<["-"], "fmodule-map-file=">,
>> >   Group<f_Group>, Flags<[DriverOption,CC1Option]>,
>> > MetaVarName<"<file>">,
>> >   HelpText<"Load this module map file">;
>> >
>> > Modified: cfe/trunk/include/clang/Lex/ModuleMap.h
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/ModuleMap.h?rev=261372&r1=261371&r2=261372&view=diff
>> >
>> > ==============================================================================
>> > --- cfe/trunk/include/clang/Lex/ModuleMap.h (original)
>> > +++ cfe/trunk/include/clang/Lex/ModuleMap.h Fri Feb 19 16:25:36 2016
>> > @@ -70,15 +70,10 @@ class ModuleMap {
>> >   /// These are always simple C language options.
>> >   LangOptions MMapLangOpts;
>> >
>> > -  // The module that we are building; related to \c
>> > LangOptions::CurrentModule.
>> > -  Module *CompilingModule;
>> > -
>> > -public:
>> > -  // The module that the .cc source file is associated with.
>> > +  // The module that the main source file is associated with (the
>> > module
>> > +  // named LangOpts::CurrentModule, if we've loaded it).
>> >   Module *SourceModule;
>> > -  std::string SourceModuleName;
>> >
>> > -private:
>> >   /// \brief The top-level modules that are known.
>> >   llvm::StringMap<Module *> Modules;
>> >
>> >
>> > Modified: cfe/trunk/lib/Basic/LangOptions.cpp
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/LangOptions.cpp?rev=261372&r1=261371&r2=261372&view=diff
>> >
>> > ==============================================================================
>> > --- cfe/trunk/lib/Basic/LangOptions.cpp (original)
>> > +++ cfe/trunk/lib/Basic/LangOptions.cpp Fri Feb 19 16:25:36 2016
>> > @@ -34,7 +34,6 @@ void LangOptions::resetNonModularOptions
>> >   SanitizerBlacklistFiles.clear();
>> >
>> >   CurrentModule.clear();
>> > -  ImplementationOfModule.clear();
>> > }
>> >
>> > bool LangOptions::isNoBuiltinFunc(const char *Name) const {
>> >
>> > Modified: cfe/trunk/lib/Driver/Tools.cpp
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=261372&r1=261371&r2=261372&view=diff
>> >
>> > ==============================================================================
>> > --- cfe/trunk/lib/Driver/Tools.cpp (original)
>> > +++ cfe/trunk/lib/Driver/Tools.cpp Fri Feb 19 16:25:36 2016
>> > @@ -4909,7 +4909,7 @@ void Clang::ConstructJob(Compilation &C,
>> >
>> >   // -fmodule-name specifies the module that is currently being built
>> > (or
>> >   // used for header checking by -fmodule-maps).
>> > -  Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
>> > +  Args.AddLastArg(CmdArgs, options::OPT_fmodule_name_EQ);
>> >
>> >   // -fmodule-map-file can be used to specify files containing module
>> >   // definitions.
>> >
>> > Modified: cfe/trunk/lib/Frontend/ASTUnit.cpp
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/ASTUnit.cpp?rev=261372&r1=261371&r2=261372&view=diff
>> >
>> > ==============================================================================
>> > --- cfe/trunk/lib/Frontend/ASTUnit.cpp (original)
>> > +++ cfe/trunk/lib/Frontend/ASTUnit.cpp Fri Feb 19 16:25:36 2016
>> > @@ -2814,7 +2814,7 @@ const FileEntry *ASTUnit::getPCHFile() {
>> > }
>> >
>> > bool ASTUnit::isModuleFile() {
>> > -  return isMainFileAST() && !ASTFileLangOpts.CurrentModule.empty();
>> > +  return isMainFileAST() && ASTFileLangOpts.CompilingModule;
>> > }
>> >
>> > void ASTUnit::PreambleData::countLines() const {
>> >
>> > Modified: cfe/trunk/lib/Frontend/CompilerInstance.cpp
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInstance.cpp?rev=261372&r1=261371&r2=261372&view=diff
>> >
>> > ==============================================================================
>> > --- cfe/trunk/lib/Frontend/CompilerInstance.cpp (original)
>> > +++ cfe/trunk/lib/Frontend/CompilerInstance.cpp Fri Feb 19 16:25:36 2016
>> > @@ -1386,8 +1386,7 @@ CompilerInstance::loadModule(SourceLocat
>> >   // when both the preprocessor and parser see the same import
>> > declaration.
>> >   if (ImportLoc.isValid() && LastModuleImportLoc == ImportLoc) {
>> >     // Make the named module visible.
>> > -    if (LastModuleImportResult && ModuleName !=
>> > getLangOpts().CurrentModule &&
>> > -        ModuleName != getLangOpts().ImplementationOfModule)
>> > +    if (LastModuleImportResult && ModuleName !=
>> > getLangOpts().CurrentModule)
>> >       ModuleManager->makeModuleVisible(LastModuleImportResult,
>> > Visibility,
>> >                                        ImportLoc);
>> >     return LastModuleImportResult;
>> > @@ -1401,8 +1400,7 @@ CompilerInstance::loadModule(SourceLocat
>> >   if (Known != KnownModules.end()) {
>> >     // Retrieve the cached top-level module.
>> >     Module = Known->second;
>> > -  } else if (ModuleName == getLangOpts().CurrentModule ||
>> > -             ModuleName == getLangOpts().ImplementationOfModule) {
>> > +  } else if (ModuleName == getLangOpts().CurrentModule) {
>> >     // This is the module we're building.
>> >     Module = PP->getHeaderSearchInfo().lookupModule(ModuleName);
>> >     Known = KnownModules.insert(std::make_pair(Path[0].first,
>> > Module)).first;
>> > @@ -1580,10 +1578,6 @@ CompilerInstance::loadModule(SourceLocat
>> >     }
>> >   }
>> >
>> > -  // Don't make the module visible if we are in the implementation.
>> > -  if (ModuleName == getLangOpts().ImplementationOfModule)
>> > -    return ModuleLoadResult(Module, false);
>> > -
>> >   // Make the named module visible, if it's not already part of the
>> > module
>> >   // we are parsing.
>> >   if (ModuleName != getLangOpts().CurrentModule) {
>> >
>> > Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=261372&r1=261371&r2=261372&view=diff
>> >
>> > ==============================================================================
>> > --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)
>> > +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Fri Feb 19 16:25:36
>> > 2016
>> > @@ -1763,10 +1763,8 @@ static void ParseLangArgs(LangOptions &O
>> >   Opts.DebuggerCastResultToId =
>> > Args.hasArg(OPT_fdebugger_cast_result_to_id);
>> >   Opts.DebuggerObjCLiteral = Args.hasArg(OPT_fdebugger_objc_literal);
>> >   Opts.ApplePragmaPack = Args.hasArg(OPT_fapple_pragma_pack);
>> > -  Opts.CurrentModule = Args.getLastArgValue(OPT_fmodule_name);
>> > +  Opts.CurrentModule = Args.getLastArgValue(OPT_fmodule_name_EQ);
>> >   Opts.AppExt = Args.hasArg(OPT_fapplication_extension);
>> > -  Opts.ImplementationOfModule =
>> > -      Args.getLastArgValue(OPT_fmodule_implementation_of);
>> >   Opts.ModuleFeatures = Args.getAllArgValues(OPT_fmodule_feature);
>> >   std::sort(Opts.ModuleFeatures.begin(), Opts.ModuleFeatures.end());
>> >   Opts.NativeHalfType |= Args.hasArg(OPT_fnative_half_type);
>> > @@ -1784,12 +1782,6 @@ static void ParseLangArgs(LangOptions &O
>> >       Args.hasFlag(OPT_fdeclspec, OPT_fno_declspec,
>> >                    (Opts.MicrosoftExt || Opts.Borland || Opts.CUDA));
>> >
>> > -  if (!Opts.CurrentModule.empty() &&
>> > !Opts.ImplementationOfModule.empty() &&
>> > -      Opts.CurrentModule != Opts.ImplementationOfModule) {
>> > -    Diags.Report(diag::err_conflicting_module_names)
>> > -        << Opts.CurrentModule << Opts.ImplementationOfModule;
>> > -  }
>> > -
>> >   // For now, we only support local submodule visibility in C++ (because
>> > we
>> >   // heavily depend on the ODR for merging redefinitions).
>> >   if (Opts.ModulesLocalVisibility && !Opts.CPlusPlus)
>> >
>> > Modified: cfe/trunk/lib/Frontend/FrontendActions.cpp
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/FrontendActions.cpp?rev=261372&r1=261371&r2=261372&view=diff
>> >
>> > ==============================================================================
>> > --- cfe/trunk/lib/Frontend/FrontendActions.cpp (original)
>> > +++ cfe/trunk/lib/Frontend/FrontendActions.cpp Fri Feb 19 16:25:36 2016
>> > @@ -270,6 +270,8 @@ collectModuleHeaderIncludes(const LangOp
>> >
>> > bool GenerateModuleAction::BeginSourceFileAction(CompilerInstance &CI,
>> >                                                  StringRef Filename) {
>> > +  CI.getLangOpts().CompilingModule = true;
>> > +
>> >   // Find the module map file.
>> >   const FileEntry *ModuleMap =
>> >       CI.getFileManager().getFile(Filename, /*openFile*/true);
>> >
>> > Modified: cfe/trunk/lib/Lex/ModuleMap.cpp
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/ModuleMap.cpp?rev=261372&r1=261371&r2=261372&view=diff
>> >
>> > ==============================================================================
>> > --- cfe/trunk/lib/Lex/ModuleMap.cpp (original)
>> > +++ cfe/trunk/lib/Lex/ModuleMap.cpp Fri Feb 19 16:25:36 2016
>> > @@ -89,7 +89,7 @@ ModuleMap::ModuleMap(SourceManager &Sour
>> >                      HeaderSearch &HeaderInfo)
>> >     : SourceMgr(SourceMgr), Diags(Diags), LangOpts(LangOpts),
>> > Target(Target),
>> >       HeaderInfo(HeaderInfo), BuiltinIncludeDir(nullptr),
>> > -      CompilingModule(nullptr), SourceModule(nullptr),
>> > NumCreatedModules(0) {
>> > +      SourceModule(nullptr), NumCreatedModules(0) {
>> >   MMapLangOpts.LineComment = true;
>> > }
>> >
>> > @@ -343,8 +343,8 @@ ModuleMap::KnownHeader ModuleMap::findMo
>> >     ModuleMap::KnownHeader Result;
>> >     // Iterate over all modules that 'File' is part of to find the best
>> > fit.
>> >     for (KnownHeader &H : Known->second) {
>> > -      // Prefer a header from the current module over all others.
>> > -      if (H.getModule()->getTopLevelModule() == CompilingModule)
>> > +      // Prefer a header from the source module over all others.
>> > +      if (H.getModule()->getTopLevelModule() == SourceModule)
>> >         return MakeResult(H);
>> >       if (!Result || isBetterKnownHeader(H, Result))
>> >         Result = H;
>> > @@ -556,16 +556,10 @@ ModuleMap::findOrCreateModule(StringRef
>> >   // Create a new module with this name.
>> >   Module *Result = new Module(Name, SourceLocation(), Parent,
>> >                               IsFramework, IsExplicit,
>> > NumCreatedModules++);
>> > -  if (LangOpts.CurrentModule == Name) {
>> > -    SourceModule = Result;
>> > -    SourceModuleName = Name;
>> > -  }
>> >   if (!Parent) {
>> > +    if (LangOpts.CurrentModule == Name)
>> > +      SourceModule = Result;
>> >     Modules[Name] = Result;
>> > -    if (!LangOpts.CurrentModule.empty() && !CompilingModule &&
>> > -        Name == LangOpts.CurrentModule) {
>> > -      CompilingModule = Result;
>> > -    }
>> >   }
>> >   return std::make_pair(Result, true);
>> > }
>> > @@ -693,9 +687,10 @@ Module *ModuleMap::inferFrameworkModule(
>> >                               NumCreatedModules++);
>> >   InferredModuleAllowedBy[Result] = ModuleMapFile;
>> >   Result->IsInferred = true;
>> > -  if (LangOpts.CurrentModule == ModuleName) {
>> > -    SourceModule = Result;
>> > -    SourceModuleName = ModuleName;
>> > +  if (!Parent) {
>> > +    if (LangOpts.CurrentModule == ModuleName)
>> > +      SourceModule = Result;
>> > +    Modules[ModuleName] = Result;
>> >   }
>> >
>> >   Result->IsSystem |= Attrs.IsSystem;
>> > @@ -703,9 +698,6 @@ Module *ModuleMap::inferFrameworkModule(
>> >   Result->ConfigMacrosExhaustive |= Attrs.IsExhaustive;
>> >   Result->Directory = FrameworkDir;
>> >
>> > -  if (!Parent)
>> > -    Modules[ModuleName] = Result;
>> > -
>> >   // umbrella header "umbrella-header-name"
>> >   //
>> >   // The "Headers/" component of the name is implied because this is
>> > @@ -812,7 +804,8 @@ void ModuleMap::addHeader(Module *Mod, M
>> >   HeaderList.push_back(KH);
>> >   Mod->Headers[headerRoleToKind(Role)].push_back(std::move(Header));
>> >
>> > -  bool isCompilingModuleHeader = Mod->getTopLevelModule() ==
>> > CompilingModule;
>> > +  bool isCompilingModuleHeader =
>> > +      LangOpts.CompilingModule && Mod->getTopLevelModule() ==
>> > SourceModule;
>> >   if (!Imported || isCompilingModuleHeader) {
>> >     // When we import HeaderFileInfo, the external source is expected to
>> >     // set the isModuleHeader flag itself.
>> >
>> > Modified: cfe/trunk/lib/Lex/PPDirectives.cpp
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPDirectives.cpp?rev=261372&r1=261371&r2=261372&view=diff
>> >
>> > ==============================================================================
>> > --- cfe/trunk/lib/Lex/PPDirectives.cpp (original)
>> > +++ cfe/trunk/lib/Lex/PPDirectives.cpp Fri Feb 19 16:25:36 2016
>> > @@ -573,23 +573,23 @@ void Preprocessor::PTHSkipExcludedCondit
>> > }
>> >
>> > Module *Preprocessor::getModuleForLocation(SourceLocation Loc) {
>> > -  ModuleMap &ModMap = HeaderInfo.getModuleMap();
>> > -  if (SourceMgr.isInMainFile(Loc)) {
>> > -    if (Module *CurMod = getCurrentModule())
>> > -      return CurMod;                               // Compiling a
>> > module.
>> > -    return HeaderInfo.getModuleMap().SourceModule; // Compiling a
>> > source.
>> > -  }
>> > -  // Try to determine the module of the include directive.
>> > -  // FIXME: Look into directly passing the FileEntry from LookupFile
>> > instead.
>> > -  FileID IDOfIncl =
>> > SourceMgr.getFileID(SourceMgr.getExpansionLoc(Loc));
>> > -  if (const FileEntry *EntryOfIncl =
>> > SourceMgr.getFileEntryForID(IDOfIncl)) {
>> > -    // The include comes from a file.
>> > -    return ModMap.findModuleForHeader(EntryOfIncl).getModule();
>> > -  } else {
>> > -    // The include does not come from a file,
>> > -    // so it is probably a module compilation.
>> > -    return getCurrentModule();
>> > +  if (!SourceMgr.isInMainFile(Loc)) {
>> > +    // Try to determine the module of the include directive.
>> > +    // FIXME: Look into directly passing the FileEntry from LookupFile
>> > instead.
>> > +    FileID IDOfIncl =
>> > SourceMgr.getFileID(SourceMgr.getExpansionLoc(Loc));
>> > +    if (const FileEntry *EntryOfIncl =
>> > SourceMgr.getFileEntryForID(IDOfIncl)) {
>> > +      // The include comes from an included file.
>> > +      return HeaderInfo.getModuleMap()
>> > +          .findModuleForHeader(EntryOfIncl)
>> > +          .getModule();
>> > +    }
>> >   }
>> > +
>> > +  // This is either in the main file or not in a file at all. It
>> > belongs
>> > +  // to the current module, if there is one.
>> > +  return getLangOpts().CurrentModule.empty()
>> > +             ? nullptr
>> > +             : HeaderInfo.lookupModule(getLangOpts().CurrentModule);
>> > }
>> >
>> > Module *Preprocessor::getModuleContainingLocation(SourceLocation Loc) {
>> > @@ -1668,10 +1668,7 @@ void Preprocessor::HandleIncludeDirectiv
>> >   // are processing this module textually (because we're building the
>> > module).
>> >   if (File && SuggestedModule && getLangOpts().Modules &&
>> >       SuggestedModule.getModule()->getTopLevelModuleName() !=
>> > -          getLangOpts().CurrentModule &&
>> > -      SuggestedModule.getModule()->getTopLevelModuleName() !=
>> > -          getLangOpts().ImplementationOfModule) {
>> > -
>> > +          getLangOpts().CurrentModule) {
>> >     // If this include corresponds to a module but that module is
>> >     // unavailable, diagnose the situation and bail out.
>> >     if (!SuggestedModule.getModule()->isAvailable()) {
>> >
>> > Modified: cfe/trunk/lib/Lex/PPMacroExpansion.cpp
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPMacroExpansion.cpp?rev=261372&r1=261371&r2=261372&view=diff
>> >
>> > ==============================================================================
>> > --- cfe/trunk/lib/Lex/PPMacroExpansion.cpp (original)
>> > +++ cfe/trunk/lib/Lex/PPMacroExpansion.cpp Fri Feb 19 16:25:36 2016
>> > @@ -1438,8 +1438,9 @@ static bool EvaluateBuildingModule(Token
>> >     return false;
>> >   }
>> >
>> > -  bool Result
>> > -    = Tok.getIdentifierInfo()->getName() ==
>> > PP.getLangOpts().CurrentModule;
>> > +  bool Result =
>> > +      PP.getLangOpts().CompilingModule &&
>> > +      Tok.getIdentifierInfo()->getName() ==
>> > PP.getLangOpts().CurrentModule;
>> >
>> >   // Get ')'.
>> >   PP.LexNonComment(Tok);
>> >
>> > Modified: cfe/trunk/lib/Lex/Preprocessor.cpp
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/Preprocessor.cpp?rev=261372&r1=261371&r2=261372&view=diff
>> >
>> > ==============================================================================
>> > --- cfe/trunk/lib/Lex/Preprocessor.cpp (original)
>> > +++ cfe/trunk/lib/Lex/Preprocessor.cpp Fri Feb 19 16:25:36 2016
>> > @@ -477,7 +477,7 @@ void Preprocessor::CreateString(StringRe
>> > }
>> >
>> > Module *Preprocessor::getCurrentModule() {
>> > -  if (getLangOpts().CurrentModule.empty())
>> > +  if (!getLangOpts().CompilingModule)
>> >     return nullptr;
>> >
>> >   return
>> > getHeaderSearchInfo().lookupModule(getLangOpts().CurrentModule);
>> >
>> > Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=261372&r1=261371&r2=261372&view=diff
>> >
>> > ==============================================================================
>> > --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
>> > +++ cfe/trunk/lib/Sema/SemaDecl.cpp Fri Feb 19 16:25:36 2016
>> > @@ -14752,11 +14752,10 @@ DeclResult Sema::ActOnModuleImport(Sourc
>> >   // of the same top-level module. Until we do, make it an error rather
>> > than
>> >   // silently ignoring the import.
>> >   if (Mod->getTopLevelModuleName() == getLangOpts().CurrentModule)
>> > -    Diag(ImportLoc, diag::err_module_self_import)
>> > +    Diag(ImportLoc, getLangOpts().CompilingModule
>> > +                        ? diag::err_module_self_import
>> > +                        : diag::err_module_import_in_implementation)
>> >         << Mod->getFullModuleName() << getLangOpts().CurrentModule;
>> > -  else if (Mod->getTopLevelModuleName() ==
>> > getLangOpts().ImplementationOfModule)
>> > -    Diag(ImportLoc, diag::err_module_import_in_implementation)
>> > -        << Mod->getFullModuleName() <<
>> > getLangOpts().ImplementationOfModule;
>> >
>> >   SmallVector<SourceLocation, 2> IdentifierLocs;
>> >   Module *ModCheck = Mod;
>> > @@ -14790,11 +14789,13 @@ void Sema::ActOnModuleInclude(SourceLoca
>> >       TUKind == TU_Module &&
>> >       getSourceManager().isWrittenInMainFile(DirectiveLoc);
>> >
>> > -  // Similarly, if this module is specified by
>> > -fmodule-implementation-of
>> > -  // don't actually synthesize an illegal module import.
>> > -  bool ShouldAddImport = !IsInModuleIncludes &&
>> > -    (getLangOpts().ImplementationOfModule.empty() ||
>> > -     getLangOpts().ImplementationOfModule !=
>> > Mod->getTopLevelModuleName());
>> > +  // Similarly, if we're in the implementation of a module, don't
>> > +  // synthesize an illegal module import. FIXME: Why not?
>> > +  bool ShouldAddImport =
>> > +      !IsInModuleIncludes &&
>> > +      (getLangOpts().CompilingModule ||
>> > +       getLangOpts().CurrentModule.empty() ||
>> > +       getLangOpts().CurrentModule != Mod->getTopLevelModuleName());
>> >
>> >   // If this module import was due to an inclusion directive, create an
>> >   // implicit import declaration to capture it in the AST.
>> >
>> > Modified: cfe/trunk/lib/Sema/SemaDeclObjC.cpp
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclObjC.cpp?rev=261372&r1=261371&r2=261372&view=diff
>> >
>> > ==============================================================================
>> > --- cfe/trunk/lib/Sema/SemaDeclObjC.cpp (original)
>> > +++ cfe/trunk/lib/Sema/SemaDeclObjC.cpp Fri Feb 19 16:25:36 2016
>> > @@ -3171,7 +3171,7 @@ void Sema::addMethodToGlobalList(ObjCMet
>> >   ObjCMethodList *Previous = List;
>> >   for (; List; Previous = List, List = List->getNext()) {
>> >     // If we are building a module, keep all of the methods.
>> > -    if (getLangOpts().Modules && !getLangOpts().CurrentModule.empty())
>> > +    if (getLangOpts().CompilingModule)
>> >       continue;
>> >
>> >     if (!MatchTwoMethodDeclarations(Method, List->getMethod())) {
>> >
>> > Modified: cfe/trunk/test/Modules/Inputs/explicit-build/a.h
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/explicit-build/a.h?rev=261372&r1=261371&r2=261372&view=diff
>> >
>> > ==============================================================================
>> > --- cfe/trunk/test/Modules/Inputs/explicit-build/a.h (original)
>> > +++ cfe/trunk/test/Modules/Inputs/explicit-build/a.h Fri Feb 19 16:25:36
>> > 2016
>> > @@ -1,4 +1,4 @@
>> > -#if !__building_module(a)
>> > +#if !__building_module(a) && !BUILDING_A_PCH
>> > #error "should only get here when building module a"
>> > #endif
>> >
>> >
>> > Modified: cfe/trunk/test/Modules/explicit-build.cpp
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/explicit-build.cpp?rev=261372&r1=261371&r2=261372&view=diff
>> >
>> > ==============================================================================
>> > --- cfe/trunk/test/Modules/explicit-build.cpp (original)
>> > +++ cfe/trunk/test/Modules/explicit-build.cpp Fri Feb 19 16:25:36 2016
>> > @@ -143,7 +143,7 @@
>> > // -------------------------------
>> > // Try to import a PCH with -fmodule-file=
>> > // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps
>> > -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:            -fmodule-name=a -emit-pch
>> > %S/Inputs/explicit-build/a.h -o %t/a.pch -DBUILDING_A_PCH \
>> > // RUN:            2>&1 | FileCheck
>> > --check-prefix=CHECK-NO-IMPLICIT-BUILD %s --allow-empty
>> > //
>> > // RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules
>> > -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build
>> > -fno-modules-error-recovery \
>> >
>> > Modified: cfe/trunk/test/Modules/implementation-of-module.m
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/implementation-of-module.m?rev=261372&r1=261371&r2=261372&view=diff
>> >
>> > ==============================================================================
>> > --- cfe/trunk/test/Modules/implementation-of-module.m (original)
>> > +++ cfe/trunk/test/Modules/implementation-of-module.m Fri Feb 19
>> > 16:25:36 2016
>> > @@ -1,22 +1,18 @@
>> > -// RUN: not %clang_cc1 -fmodule-implementation-of Foo -fmodule-name=Bar
>> > %s 2>&1 \
>> > -// RUN:     | FileCheck -check-prefix=CHECK-IMPL-OF-ERR %s
>> > -// CHECK-IMPL-OF-ERR: conflicting module names specified:
>> > '-fmodule-name=Bar' and '-fmodule-implementation-of Foo'
>> > -
>> > // RUN: rm -rf %t
>> > // RUN: %clang_cc1 -fmodules -fimplicit-module-maps
>> > -fmodules-cache-path=%t -w -Werror=auto-import %s -I %S/Inputs \
>> > -// RUN:     -fmodule-implementation-of category_right -fsyntax-only
>> > +// RUN:     -fmodule-name=category_right -fsyntax-only
>> >
>> > // RUN: %clang_cc1 -fmodules -fimplicit-module-maps
>> > -fmodules-cache-path=%t -w -Werror=auto-import %s -I %S/Inputs \
>> > -// RUN:     -fmodule-implementation-of category_right -dM -E -o - 2>&1
>> > | FileCheck %s
>> > +// RUN:     -fmodule-name=category_right -dM -E -o - 2>&1 | FileCheck
>> > %s
>> > // CHECK-NOT: __building_module
>> >
>> > // RUN: %clang_cc1 -fmodules -fimplicit-module-maps
>> > -fmodules-cache-path=%t -w -Werror=auto-import %s -I %S/Inputs \
>> > -// RUN:     -fmodule-implementation-of category_left -verify
>> > +// RUN:     -fmodule-name=category_left -verify
>> >
>> > // RUN: %clang_cc1 -x objective-c-header -fmodules
>> > -fimplicit-module-maps -fmodules-cache-path=%t -w -Werror=auto-import %s -I
>> > %S/Inputs \
>> > -// RUN:     -fmodule-implementation-of category_right -emit-pch -o
>> > %t.pch
>> > +// RUN:     -fmodule-name=category_right -emit-pch -o %t.pch
>> > // RUN: %clang_cc1 -x objective-c-header -fmodules
>> > -fimplicit-module-maps -fmodules-cache-path=%t -w -Werror=auto-import %s -I
>> > %S/Inputs \
>> > -// RUN:     -DWITH_PREFIX -fmodules-ignore-macro=WITH_PREFIX
>> > -include-pch %t.pch -fmodule-implementation-of category_right
>> > +// RUN:     -DWITH_PREFIX -fmodules-ignore-macro=WITH_PREFIX
>> > -include-pch %t.pch -fmodule-name=category_right
>> >
>> > #ifndef WITH_PREFIX
>> >
>> >
>> > Modified: cfe/trunk/test/Modules/import-self.m
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/import-self.m?rev=261372&r1=261371&r2=261372&view=diff
>> >
>> > ==============================================================================
>> > --- cfe/trunk/test/Modules/import-self.m (original)
>> > +++ cfe/trunk/test/Modules/import-self.m Fri Feb 19 16:25:36 2016
>> > @@ -6,6 +6,6 @@
>> > // RUN: not %clang_cc1 -fmodules -fimplicit-module-maps
>> > -fmodules-cache-path=%t \
>> > // RUN:                -I %S/Inputs/submodules -fmodule-name=import_self
>> > %s \
>> > // RUN:     2>&1 |  FileCheck -check-prefix=CHECK-fmodule-name %s
>> > -// CHECK-fmodule-name: import of module 'import_self.b' appears within
>> > same top-level module 'import_self'
>> > +// CHECK-fmodule-name: @import of module 'import_self.b' in
>> > implementation of 'import_self'
>> >
>> > @import import_self.b;
>> >
>> >
>> > _______________________________________________
>> > cfe-commits mailing list
>> > cfe-commits at lists.llvm.org
>> > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>


More information about the cfe-commits mailing list