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@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@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@lists.llvm.org> wrote: > > On 3 Mar 2016 3:18 a.m., "Argyrios Kyrtzidis via cfe-commits" > <cfe-commits@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@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@lists.llvm.org >> > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >> >> _______________________________________________ >> cfe-commits mailing list >> cfe-commits@lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits