On Mon, May 4, 2015 at 12:28 PM, Sean Silva <[email protected]> wrote:
> > > On Fri, May 1, 2015 at 2:22 PM, Richard Smith <[email protected]> > wrote: > >> Author: rsmith >> Date: Fri May 1 16:22:17 2015 >> New Revision: 236350 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=236350&view=rev >> Log: >> [modules] Add -fmodules-local-submodule-visibility flag. >> >> This flag specifies that the normal visibility rules should be used even >> for >> local submodules (submodules of the currently-being-built module). Thus >> names >> will only be visible if a header / module that declares them has actually >> been >> included / imported, and not merely because a submodule that happened to >> be >> built earlier declared those names. This also removes the need to >> modularize >> bottom-up: > > > Nice! > > >> textually-included headers will be included into every submodule >> that includes them, since their include guards will not leak between >> modules. >> > > So is the idea that all of the textually included declarations of in each > submodule will be merged so that they don't cause issues? > Yes. We already do that in the case where we have an imported-but-not-visible declaration and we parse another (this happens if a textually-included header is included into both a module and a user of that module). > -- Sean Silva > > >> >> So far, this only governs visibility of macros, not of declarations, so >> is not >> ready for real use yet. >> >> Modified: >> cfe/trunk/include/clang/Basic/LangOptions.def >> cfe/trunk/include/clang/Basic/Module.h >> cfe/trunk/include/clang/Driver/CC1Options.td >> cfe/trunk/include/clang/Lex/Preprocessor.h >> cfe/trunk/lib/Frontend/CompilerInvocation.cpp >> cfe/trunk/lib/Lex/PPLexerChange.cpp >> cfe/trunk/lib/Serialization/ASTWriter.cpp >> cfe/trunk/test/Modules/macro-ambiguity.cpp >> cfe/trunk/test/Modules/macro-reexport.cpp >> cfe/trunk/test/Modules/macros.c >> cfe/trunk/test/Modules/macros2.c >> >> Modified: cfe/trunk/include/clang/Basic/LangOptions.def >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/LangOptions.def?rev=236350&r1=236349&r2=236350&view=diff >> >> ============================================================================== >> --- cfe/trunk/include/clang/Basic/LangOptions.def (original) >> +++ cfe/trunk/include/clang/Basic/LangOptions.def Fri May 1 16:22:17 2015 >> @@ -130,6 +130,7 @@ COMPATIBLE_LANGOPT(ModulesStrictDeclUse, >> LANGOPT(ModulesErrorRecovery, 1, 1, "automatically import modules as >> needed when performing error recovery") >> BENIGN_LANGOPT(ModulesImplicitMaps, 1, 1, "use files called >> module.modulemap implicitly as module maps") >> BENIGN_LANGOPT(ImplicitModules, 1, 1, "build modules that are not >> specified via -fmodule-file") >> +COMPATIBLE_LANGOPT(ModulesLocalVisibility, 1, 0, "local submodule >> visibility") >> COMPATIBLE_LANGOPT(Optimize , 1, 0, "__OPTIMIZE__ predefined >> macro") >> COMPATIBLE_LANGOPT(OptimizeSize , 1, 0, "__OPTIMIZE_SIZE__ >> predefined macro") >> LANGOPT(Static , 1, 0, "__STATIC__ predefined macro (as >> opposed to __DYNAMIC__)") >> >> Modified: cfe/trunk/include/clang/Basic/Module.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Module.h?rev=236350&r1=236349&r2=236350&view=diff >> >> ============================================================================== >> --- cfe/trunk/include/clang/Basic/Module.h (original) >> +++ cfe/trunk/include/clang/Basic/Module.h Fri May 1 16:22:17 2015 >> @@ -480,14 +480,24 @@ private: >> class VisibleModuleSet { >> public: >> VisibleModuleSet() : Generation(0) {} >> + VisibleModuleSet(VisibleModuleSet &&O) >> + : ImportLocs(std::move(O.ImportLocs)), Generation(O.Generation ? 1 >> : 0) { >> + O.ImportLocs.clear(); >> + ++O.Generation; >> + } >> >> + /// Move from another visible modules set. Guaranteed to leave the >> source >> + /// empty and bump the generation on both. >> VisibleModuleSet &operator=(VisibleModuleSet &&O) { >> ImportLocs = std::move(O.ImportLocs); >> + O.ImportLocs.clear(); >> + ++O.Generation; >> ++Generation; >> return *this; >> } >> >> - /// \brief Get the current visibility generation. >> + /// \brief Get the current visibility generation. Incremented each >> time the >> + /// set of visible modules changes in any way. >> unsigned getGeneration() const { return Generation; } >> >> /// \brief Determine whether a module is visible. >> >> Modified: cfe/trunk/include/clang/Driver/CC1Options.td >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CC1Options.td?rev=236350&r1=236349&r2=236350&view=diff >> >> ============================================================================== >> --- cfe/trunk/include/clang/Driver/CC1Options.td (original) >> +++ cfe/trunk/include/clang/Driver/CC1Options.td Fri May 1 16:22:17 2015 >> @@ -347,6 +347,10 @@ def fmodule_map_file_home_is_cwd : Flag< >> def fmodule_feature : Separate<["-"], "fmodule-feature">, >> MetaVarName<"<feature>">, >> HelpText<"Enable <feature> in module map requires declarations">; >> +def fmodules_local_submodule_visibility : >> + Flag<["-"], "fmodules-local-submodule-visibility">, >> + HelpText<"Enforce name visibility rules across submodules of the same " >> + "top-level module.">; >> >> let Group = Action_Group in { >> >> >> Modified: cfe/trunk/include/clang/Lex/Preprocessor.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/Preprocessor.h?rev=236350&r1=236349&r2=236350&view=diff >> >> ============================================================================== >> --- cfe/trunk/include/clang/Lex/Preprocessor.h (original) >> +++ cfe/trunk/include/clang/Lex/Preprocessor.h Fri May 1 16:22:17 2015 >> @@ -466,12 +466,15 @@ class Preprocessor : public RefCountedBa >> return Info->OverriddenMacros; >> return None; >> } >> - void setOverriddenMacros(ArrayRef<ModuleMacro*> Overrides) { >> + void setOverriddenMacros(Preprocessor &PP, >> + ArrayRef<ModuleMacro *> Overrides) { >> auto *Info = State.dyn_cast<ModuleMacroInfo*>(); >> if (!Info) { >> - assert(Overrides.empty() && >> - "have overrides but never had module macro"); >> - return; >> + if (Overrides.empty()) >> + return; >> + Info = new (PP.getPreprocessorAllocator()) >> + ModuleMacroInfo(State.get<MacroDirective *>()); >> + State = Info; >> } >> Info->OverriddenMacros.clear(); >> Info->OverriddenMacros.insert(Info->OverriddenMacros.end(), >> @@ -498,16 +501,11 @@ class Preprocessor : public RefCountedBa >> Module *M; >> /// The location at which the module was included. >> SourceLocation ImportLoc; >> - >> - struct SavedMacroInfo { >> - SavedMacroInfo() : Latest(nullptr) {} >> - MacroDirective *Latest; >> - llvm::TinyPtrVector<ModuleMacro*> Overridden; >> - }; >> /// The macros that were visible before we entered the module. >> - llvm::DenseMap<const IdentifierInfo*, SavedMacroInfo> Macros; >> + MacroMap Macros; >> + /// The set of modules that was visible in the surrounding submodule. >> + VisibleModuleSet VisibleModules; >> >> - // FIXME: VisibleModules? >> // FIXME: CounterValue? >> // FIXME: PragmaPushMacroInfo? >> }; >> @@ -662,6 +660,7 @@ public: >> HeaderSearch &getHeaderSearchInfo() const { return HeaderInfo; } >> >> IdentifierTable &getIdentifierTable() { return Identifiers; } >> + const IdentifierTable &getIdentifierTable() const { return >> Identifiers; } >> SelectorTable &getSelectorTable() { return Selectors; } >> Builtin::Context &getBuiltinInfo() { return BuiltinInfo; } >> llvm::BumpPtrAllocator &getPreprocessorAllocator() { return BP; } >> >> Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=236350&r1=236349&r2=236350&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original) >> +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Fri May 1 16:22:17 2015 >> @@ -1508,6 +1508,8 @@ static void ParseLangArgs(LangOptions &O >> Opts.ModulesStrictDeclUse = Args.hasArg(OPT_fmodules_strict_decluse); >> Opts.ModulesDeclUse = >> Args.hasArg(OPT_fmodules_decluse) || Opts.ModulesStrictDeclUse; >> + Opts.ModulesLocalVisibility = >> + Args.hasArg(OPT_fmodules_local_submodule_visibility); >> Opts.ModulesSearchAll = Opts.Modules && >> !Args.hasArg(OPT_fno_modules_search_all) && >> Args.hasArg(OPT_fmodules_search_all); >> >> Modified: cfe/trunk/lib/Lex/PPLexerChange.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPLexerChange.cpp?rev=236350&r1=236349&r2=236350&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/Lex/PPLexerChange.cpp (original) >> +++ cfe/trunk/lib/Lex/PPLexerChange.cpp Fri May 1 16:22:17 2015 >> @@ -612,16 +612,25 @@ void Preprocessor::HandleMicrosoftCommen >> void Preprocessor::EnterSubmodule(Module *M, SourceLocation ImportLoc) { >> // Save the current state for future imports. >> BuildingSubmoduleStack.push_back(BuildingSubmoduleInfo(M, ImportLoc)); >> - >> auto &Info = BuildingSubmoduleStack.back(); >> - // Copy across our macros and start the submodule with the current >> state. >> - // FIXME: We should start each submodule with just the predefined >> macros. >> - for (auto &M : Macros) { >> - BuildingSubmoduleInfo::SavedMacroInfo SMI; >> - SMI.Latest = M.second.getLatest(); >> - auto O = M.second.getOverriddenMacros(); >> - SMI.Overridden.insert(SMI.Overridden.end(), O.begin(), O.end()); >> - Info.Macros.insert(std::make_pair(M.first, SMI)); >> + Info.Macros.swap(Macros); >> + // Save our visible modules set. This is guaranteed to clear the set. >> + if (getLangOpts().ModulesLocalVisibility) >> + Info.VisibleModules = std::move(VisibleModules); >> + >> + // Determine the set of starting macros for this submodule. >> + // FIXME: If we re-enter a submodule, should we restore its >> MacroDirectives? >> + auto &StartingMacros = (getLangOpts().ModulesLocalVisibility && >> + BuildingSubmoduleStack.size() > 1) >> + ? BuildingSubmoduleStack[0].Macros >> + : Info.Macros; >> + >> + // Restore to the starting state. >> + // FIXME: Do this lazily, when each macro name is first referenced. >> + for (auto &Macro : StartingMacros) { >> + MacroState MS(Macro.second.getLatest()); >> + MS.setOverriddenMacros(*this, MS.getOverriddenMacros()); >> + Macros.insert(std::make_pair(Macro.first, std::move(MS))); >> } >> } >> >> @@ -631,19 +640,35 @@ void Preprocessor::LeaveSubmodule() { >> // Create ModuleMacros for any macros defined in this submodule. >> for (auto &Macro : Macros) { >> auto *II = const_cast<IdentifierInfo*>(Macro.first); >> - auto SavedInfo = Info.Macros.lookup(II); >> + auto &OuterInfo = Info.Macros[II]; >> + >> + // Find the starting point for the MacroDirective chain in this >> submodule. >> + auto *OldMD = OuterInfo.getLatest(); >> + if (getLangOpts().ModulesLocalVisibility && >> + BuildingSubmoduleStack.size() > 1) { >> + auto &PredefMacros = BuildingSubmoduleStack[0].Macros; >> + auto PredefMacroIt = PredefMacros.find(Macro.first); >> + if (PredefMacroIt == PredefMacros.end()) >> + OldMD = nullptr; >> + else >> + OldMD = PredefMacroIt->second.getLatest(); >> + } >> >> // This module may have exported a new macro. If so, create a >> ModuleMacro >> // representing that fact. >> bool ExplicitlyPublic = false; >> - for (auto *MD = Macro.second.getLatest(); MD != SavedInfo.Latest; >> + for (auto *MD = Macro.second.getLatest(); MD != OldMD; >> MD = MD->getPrevious()) { >> assert(MD && "broken macro directive chain"); >> >> // Skip macros defined in other submodules we #included along the >> way. >> - Module *Mod = getModuleContainingLocation(MD->getLocation()); >> - if (Mod != Info.M) >> - continue; >> + // There's no point doing this if we're tracking local submodule >> + // visibiltiy, since there can be no such directives in our list. >> + if (!getLangOpts().ModulesLocalVisibility) { >> + Module *Mod = getModuleContainingLocation(MD->getLocation()); >> + if (Mod != Info.M) >> + continue; >> + } >> >> if (auto *VisMD = dyn_cast<VisibilityMacroDirective>(MD)) { >> // The latest visibility directive for a name in a submodule >> affects >> @@ -667,11 +692,21 @@ void Preprocessor::LeaveSubmodule() { >> } >> } >> >> - // Restore the macro's overrides list. >> - Macro.second.setOverriddenMacros(SavedInfo.Overridden); >> + // Maintain a single macro directive chain if we're not tracking >> + // per-submodule macro visibility. >> + if (!getLangOpts().ModulesLocalVisibility) >> + OuterInfo.setLatest(Macro.second.getLatest()); >> } >> >> - makeModuleVisible(Info.M, Info.ImportLoc); >> + // Put back the old macros. >> + std::swap(Info.Macros, Macros); >> + >> + if (getLangOpts().ModulesLocalVisibility) >> + VisibleModules = std::move(Info.VisibleModules); >> + >> + // A nested #include makes the included submodule visible. >> + if (BuildingSubmoduleStack.size() > 1) >> + makeModuleVisible(Info.M, Info.ImportLoc); >> >> BuildingSubmoduleStack.pop_back(); >> } >> >> Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=236350&r1=236349&r2=236350&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/Serialization/ASTWriter.cpp (original) >> +++ cfe/trunk/lib/Serialization/ASTWriter.cpp Fri May 1 16:22:17 2015 >> @@ -2019,37 +2019,23 @@ void ASTWriter::WritePreprocessor(const >> // Loop over all the macro directives that are live at the end of the >> file, >> // emitting each to the PP section. >> >> - // Construct the list of macro directives that need to be serialized. >> - typedef std::pair<const IdentifierInfo *, MacroDirective *> MacroChain; >> - SmallVector<MacroChain, 2> MacroDirectives; >> - for (Preprocessor::macro_iterator >> - I = PP.macro_begin(/*IncludeExternalMacros=*/false), >> - E = PP.macro_end(/*IncludeExternalMacros=*/false); >> - I != E; ++I) { >> - MacroDirectives.push_back(std::make_pair(I->first, >> I->second.getLatest())); >> - } >> - >> + // Construct the list of identifiers with macro directives that need >> to be >> + // serialized. >> + SmallVector<const IdentifierInfo *, 128> MacroIdentifiers; >> + for (auto &Id : PP.getIdentifierTable()) >> + if (Id.second->hadMacroDefinition() && >> + (!Id.second->isFromAST() || >> + Id.second->hasChangedSinceDeserialization())) >> + MacroIdentifiers.push_back(Id.second); >> // Sort the set of macro definitions that need to be serialized by the >> // name of the macro, to provide a stable ordering. >> - int (*Cmp)(const MacroChain*, const MacroChain*) = >> - [](const MacroChain *A, const MacroChain *B) -> int { >> - return A->first->getName().compare(B->first->getName()); >> - }; >> - llvm::array_pod_sort(MacroDirectives.begin(), MacroDirectives.end(), >> Cmp); >> + std::sort(MacroIdentifiers.begin(), MacroIdentifiers.end(), >> + llvm::less_ptr<IdentifierInfo>()); >> >> // Emit the macro directives as a list and associate the offset with >> the >> // identifier they belong to. >> - for (auto &Chain : MacroDirectives) { >> - const IdentifierInfo *Name = Chain.first; >> - MacroDirective *MD = Chain.second; >> - >> - // If the macro or identifier need no updates, don't write the macro >> history >> - // for this one. >> - // FIXME: Chain the macro history instead of re-writing it. >> - if (MD && MD->isFromPCH() && >> - Name->isFromAST() && !Name->hasChangedSinceDeserialization()) >> - continue; >> - >> + for (const IdentifierInfo *Name : MacroIdentifiers) { >> + MacroDirective *MD = PP.getLocalMacroDirectiveHistory(Name); >> auto StartOffset = Stream.GetCurrentBitNo(); >> >> // Emit the macro directives in reverse source order. >> @@ -2069,6 +2055,7 @@ void ASTWriter::WritePreprocessor(const >> } >> >> // Write out any exported module macros. >> + bool EmittedModuleMacros = false; >> if (IsModule) { >> auto Leafs = PP.getLeafModuleMacros(Name); >> SmallVector<ModuleMacro*, 8> Worklist(Leafs.begin(), Leafs.end()); >> @@ -2079,7 +2066,7 @@ void ASTWriter::WritePreprocessor(const >> // Emit a record indicating this submodule exports this macro. >> ModuleMacroRecord.push_back( >> getSubmoduleID(Macro->getOwningModule())); >> - ModuleMacroRecord.push_back(getMacroID(Macro->getMacroInfo())); >> + ModuleMacroRecord.push_back(getMacroRef(Macro->getMacroInfo(), >> Name)); >> for (auto *M : Macro->overrides()) >> >> ModuleMacroRecord.push_back(getSubmoduleID(M->getOwningModule())); >> >> @@ -2090,10 +2077,12 @@ void ASTWriter::WritePreprocessor(const >> for (auto *M : Macro->overrides()) >> if (++Visits[M] == M->getNumOverridingMacros()) >> Worklist.push_back(M); >> + >> + EmittedModuleMacros = true; >> } >> } >> >> - if (Record.empty()) >> + if (Record.empty() && !EmittedModuleMacros) >> continue; >> >> IdentMacroDirectivesOffsetMap[Name] = StartOffset; >> >> Modified: cfe/trunk/test/Modules/macro-ambiguity.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/macro-ambiguity.cpp?rev=236350&r1=236349&r2=236350&view=diff >> >> ============================================================================== >> --- cfe/trunk/test/Modules/macro-ambiguity.cpp (original) >> +++ cfe/trunk/test/Modules/macro-ambiguity.cpp Fri May 1 16:22:17 2015 >> @@ -57,6 +57,27 @@ >> // RUN: -fmodule-file=%t/c.pcm \ >> // RUN: -fmodule-file=%t/d.pcm \ >> // RUN: -Wambiguous-macro -verify macro-ambiguity.cpp >> +// >> +// RUN: %clang_cc1 -fmodules -x c++ -fmodules-cache-path=%t \ >> +// RUN: -v -fmodules-local-submodule-visibility \ >> +// RUN: -iquote Inputs/macro-ambiguity/a/quote \ >> +// RUN: -isystem Inputs/macro-ambiguity/a/system \ >> +// RUN: -iquote Inputs/macro-ambiguity/b/quote \ >> +// RUN: -isystem Inputs/macro-ambiguity/b/system \ >> +// RUN: -iquote Inputs/macro-ambiguity/c/quote \ >> +// RUN: -isystem Inputs/macro-ambiguity/c/system \ >> +// RUN: -iquote Inputs/macro-ambiguity/d/quote \ >> +// RUN: -isystem Inputs/macro-ambiguity/d/system \ >> +// RUN: -iquote Inputs/macro-ambiguity/e/quote \ >> +// RUN: -isystem Inputs/macro-ambiguity/e/system \ >> +// RUN: -fno-implicit-modules -fno-modules-implicit-maps \ >> +// RUN: -fmodule-map-file-home-is-cwd \ >> +// RUN: -fmodule-map-file=Inputs/macro-ambiguity/module.modulemap \ >> +// RUN: -fmodule-file=%t/a.pcm \ >> +// RUN: -fmodule-file=%t/b.pcm \ >> +// RUN: -fmodule-file=%t/c.pcm \ >> +// RUN: -fmodule-file=%t/d.pcm \ >> +// RUN: -Wambiguous-macro -verify macro-ambiguity.cpp >> >> // Include the textual headers first to maximize the ways in which >> things can >> // become ambiguous. >> >> Modified: cfe/trunk/test/Modules/macro-reexport.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/macro-reexport.cpp?rev=236350&r1=236349&r2=236350&view=diff >> >> ============================================================================== >> --- cfe/trunk/test/Modules/macro-reexport.cpp (original) >> +++ cfe/trunk/test/Modules/macro-reexport.cpp Fri May 1 16:22:17 2015 >> @@ -7,6 +7,15 @@ >> // RUN: %clang_cc1 -fsyntax-only -DD2 -I%S/Inputs/macro-reexport >> -fmodules %s -fmodules-cache-path=%t -verify >> // RUN: %clang_cc1 -fsyntax-only -DF1 -I%S/Inputs/macro-reexport %s >> -fmodules-cache-path=%t -verify >> // RUN: %clang_cc1 -fsyntax-only -DF1 -I%S/Inputs/macro-reexport >> -fmodules %s -fmodules-cache-path=%t -verify >> +// >> +// RUN: %clang_cc1 -fmodules-local-submodule-visibility -fsyntax-only >> -DC1 -I%S/Inputs/macro-reexport %s -fmodules-cache-path=%t -verify >> +// RUN: %clang_cc1 -fmodules-local-submodule-visibility -fsyntax-only >> -DC1 -I%S/Inputs/macro-reexport -fmodules %s -fmodules-cache-path=%t -verify >> +// RUN: %clang_cc1 -fmodules-local-submodule-visibility -fsyntax-only >> -DD1 -I%S/Inputs/macro-reexport %s -fmodules-cache-path=%t -verify >> +// RUN: %clang_cc1 -fmodules-local-submodule-visibility -fsyntax-only >> -DD1 -I%S/Inputs/macro-reexport -fmodules %s -fmodules-cache-path=%t -verify >> +// RUN: %clang_cc1 -fmodules-local-submodule-visibility -fsyntax-only >> -DD2 -I%S/Inputs/macro-reexport %s -fmodules-cache-path=%t -verify >> +// RUN: %clang_cc1 -fmodules-local-submodule-visibility -fsyntax-only >> -DD2 -I%S/Inputs/macro-reexport -fmodules %s -fmodules-cache-path=%t -verify >> +// RUN: %clang_cc1 -fmodules-local-submodule-visibility -fsyntax-only >> -DF1 -I%S/Inputs/macro-reexport %s -fmodules-cache-path=%t -verify >> +// RUN: %clang_cc1 -fmodules-local-submodule-visibility -fsyntax-only >> -DF1 -I%S/Inputs/macro-reexport -fmodules %s -fmodules-cache-path=%t -verify >> >> #if defined(F1) >> #include "f1.h" >> >> Modified: cfe/trunk/test/Modules/macros.c >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/macros.c?rev=236350&r1=236349&r2=236350&view=diff >> >> ============================================================================== >> --- cfe/trunk/test/Modules/macros.c (original) >> +++ cfe/trunk/test/Modules/macros.c Fri May 1 16:22:17 2015 >> @@ -1,9 +1,6 @@ >> // RUN: rm -rf %t >> -// RUN: %clang_cc1 -fmodules -x objective-c -emit-module >> -fmodules-cache-path=%t -fmodule-name=macros_top %S/Inputs/module.map >> -// RUN: %clang_cc1 -fmodules -x objective-c -emit-module >> -fmodules-cache-path=%t -fmodule-name=macros_left %S/Inputs/module.map >> -// RUN: %clang_cc1 -fmodules -x objective-c -emit-module >> -fmodules-cache-path=%t -fmodule-name=macros_right %S/Inputs/module.map >> -// RUN: %clang_cc1 -fmodules -x objective-c -emit-module >> -fmodules-cache-path=%t -fmodule-name=macros %S/Inputs/module.map >> // RUN: %clang_cc1 -fmodules -x objective-c -verify >> -fmodules-cache-path=%t -I %S/Inputs %s >> +// RUN: %clang_cc1 -fmodules -DLOCAL_VISIBILITY >> -fmodules-local-submodule-visibility -x objective-c -verify >> -fmodules-cache-path=%t -I %S/Inputs %s >> // RUN: not %clang_cc1 -E -fmodules -x objective-c >> -fmodules-cache-path=%t -I %S/Inputs %s | FileCheck -check-prefix >> CHECK-PREPROCESSED %s >> // FIXME: When we have a syntax for modules in C, use that. >> // These notes come from headers in modules, and are bogus. >> @@ -143,11 +140,20 @@ TOP_DEF_RIGHT_UNDEF *TDRUf() { return TD >> >> int TOP_DEF_RIGHT_UNDEF; // ok, no longer defined >> >> -// FIXME: When macros_right.undef is built, macros_top is visible because >> -// the state from building macros_right leaks through, so >> macros_right.undef >> -// undefines macros_top's macro. >> -#ifdef TOP_RIGHT_UNDEF >> -# error TOP_RIGHT_UNDEF should not be defined >> +#ifdef LOCAL_VISIBILITY >> +// TOP_RIGHT_UNDEF should not be undefined, because macros_right.undef >> does >> +// not undefine macros_right's macro. >> +# ifndef TOP_RIGHT_UNDEF >> +# error TOP_RIGHT_UNDEF should still be defined >> +# endif >> +#else >> +// When macros_right.undef is built and local submodule visibility is not >> +// enabled, macros_top is visible because the state from building >> +// macros_right leaks through, so macros_right.undef undefines >> macros_top's >> +// macro. >> +# ifdef TOP_RIGHT_UNDEF >> +# error TOP_RIGHT_UNDEF should not be defined >> +# endif >> #endif >> >> @import macros_other; >> >> Modified: cfe/trunk/test/Modules/macros2.c >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/macros2.c?rev=236350&r1=236349&r2=236350&view=diff >> >> ============================================================================== >> --- cfe/trunk/test/Modules/macros2.c (original) >> +++ cfe/trunk/test/Modules/macros2.c Fri May 1 16:22:17 2015 >> @@ -1,9 +1,6 @@ >> // RUN: rm -rf %t >> -// RUN: %clang_cc1 -fmodules -x objective-c -emit-module >> -fmodules-cache-path=%t -fmodule-name=macros_top %S/Inputs/module.map >> -// RUN: %clang_cc1 -fmodules -x objective-c -emit-module >> -fmodules-cache-path=%t -fmodule-name=macros_left %S/Inputs/module.map >> -// RUN: %clang_cc1 -fmodules -x objective-c -emit-module >> -fmodules-cache-path=%t -fmodule-name=macros_right %S/Inputs/module.map >> -// RUN: %clang_cc1 -fmodules -x objective-c -emit-module >> -fmodules-cache-path=%t -fmodule-name=macros %S/Inputs/module.map >> // RUN: %clang_cc1 -fmodules -x objective-c -verify >> -fmodules-cache-path=%t -I %S/Inputs %s >> +// RUN: %clang_cc1 -fmodules -fmodules-local-submodule-visibility -x >> objective-c -verify -fmodules-cache-path=%t -I %S/Inputs %s >> -DLOCAL_VISIBILITY >> >> // This test checks some of the same things as macros.c, but imports >> modules in >> // a different order. >> @@ -49,9 +46,15 @@ void test() { >> >> @import macros_right.undef; >> >> -// FIXME: See macros.c. >> -#ifdef TOP_RIGHT_UNDEF >> -# error TOP_RIGHT_UNDEF should not be defined >> +// See macros.c. >> +#ifdef LOCAL_VISIBILITY >> +# ifndef TOP_RIGHT_UNDEF >> +# error TOP_RIGHT_UNDEF should still be defined >> +# endif >> +#else >> +# ifdef TOP_RIGHT_UNDEF >> +# error TOP_RIGHT_UNDEF should not be defined >> +# endif >> #endif >> >> #ifndef TOP_OTHER_UNDEF1 >> >> >> _______________________________________________ >> cfe-commits mailing list >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >> > >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
