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? -- 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
