Author: rsmith Date: Tue Jun 30 16:29:55 2015 New Revision: 241120 URL: http://llvm.org/viewvc/llvm-project?rev=241120&view=rev Log: [modules] Make sure macros get made visible in the top-level file if we've got local submodule visibility enabled; that top-level file might not actually be the module includes buffer if use of prebuilt modules is disabled.
Modified: cfe/trunk/include/clang/Lex/Preprocessor.h cfe/trunk/lib/Lex/PPLexerChange.cpp cfe/trunk/test/Modules/Inputs/submodule-visibility/a.h cfe/trunk/test/Modules/Inputs/submodule-visibility/b.h cfe/trunk/test/Modules/submodule-visibility.cpp Modified: cfe/trunk/include/clang/Lex/Preprocessor.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/Preprocessor.h?rev=241120&r1=241119&r2=241120&view=diff ============================================================================== --- cfe/trunk/include/clang/Lex/Preprocessor.h (original) +++ cfe/trunk/include/clang/Lex/Preprocessor.h Tue Jun 30 16:29:55 2015 @@ -394,7 +394,9 @@ class Preprocessor : public RefCountedBa const IdentifierInfo *II) const { // FIXME: Find a spare bit on IdentifierInfo and store a // HasModuleMacros flag. - if (!II->hasMacroDefinition() || !PP.getLangOpts().Modules || + if (!II->hasMacroDefinition() || + (!PP.getLangOpts().Modules && + !PP.getLangOpts().ModulesLocalVisibility) || !PP.CurSubmoduleState->VisibleModules.getGeneration()) return nullptr; Modified: cfe/trunk/lib/Lex/PPLexerChange.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPLexerChange.cpp?rev=241120&r1=241119&r2=241120&view=diff ============================================================================== --- cfe/trunk/lib/Lex/PPLexerChange.cpp (original) +++ cfe/trunk/lib/Lex/PPLexerChange.cpp Tue Jun 30 16:29:55 2015 @@ -644,11 +644,20 @@ void Preprocessor::EnterSubmodule(Module if (FirstTime) { // Determine the set of starting macros for this submodule; take these // from the "null" module (the predefines buffer). + // + // FIXME: If we have local visibility but not modules enabled, the + // NullSubmoduleState is polluted by #defines in the top-level source + // file. auto &StartingMacros = NullSubmoduleState.Macros; // Restore to the starting state. // FIXME: Do this lazily, when each macro name is first referenced. for (auto &Macro : StartingMacros) { + // Skip uninteresting macros. + if (!Macro.second.getLatest() && + Macro.second.getOverriddenMacros().empty()) + continue; + MacroState MS(Macro.second.getLatest()); MS.setOverriddenMacros(*this, Macro.second.getOverriddenMacros()); State.Macros.insert(std::make_pair(Macro.first, std::move(MS))); @@ -732,6 +741,11 @@ void Preprocessor::LeaveSubmodule() { } } + // FIXME: Before we leave this submodule, we should parse all the other + // headers within it. Otherwise, we're left with an inconsistent state + // where we've made the module visible but don't yet have its complete + // contents. + // Put back the outer module's state, if we're tracking it. if (getLangOpts().ModulesLocalVisibility) CurSubmoduleState = Info.OuterSubmoduleState; @@ -739,6 +753,5 @@ void Preprocessor::LeaveSubmodule() { BuildingSubmoduleStack.pop_back(); // A nested #include makes the included submodule visible. - if (!BuildingSubmoduleStack.empty() || !getLangOpts().ModulesLocalVisibility) - makeModuleVisible(LeavingMod, ImportLoc); + makeModuleVisible(LeavingMod, ImportLoc); } Modified: cfe/trunk/test/Modules/Inputs/submodule-visibility/a.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/submodule-visibility/a.h?rev=241120&r1=241119&r2=241120&view=diff ============================================================================== --- cfe/trunk/test/Modules/Inputs/submodule-visibility/a.h (original) +++ cfe/trunk/test/Modules/Inputs/submodule-visibility/a.h Tue Jun 30 16:29:55 2015 @@ -1 +1,7 @@ int n; + +#ifdef B +#error B is defined +#endif + +#define A Modified: cfe/trunk/test/Modules/Inputs/submodule-visibility/b.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/submodule-visibility/b.h?rev=241120&r1=241119&r2=241120&view=diff ============================================================================== --- cfe/trunk/test/Modules/Inputs/submodule-visibility/b.h (original) +++ cfe/trunk/test/Modules/Inputs/submodule-visibility/b.h Tue Jun 30 16:29:55 2015 @@ -1 +1,7 @@ int m = n; + +#if defined(A) && !defined(ALLOW_NAME_LEAKAGE) +#error A is defined +#endif + +#define B Modified: cfe/trunk/test/Modules/submodule-visibility.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/submodule-visibility.cpp?rev=241120&r1=241119&r2=241120&view=diff ============================================================================== --- cfe/trunk/test/Modules/submodule-visibility.cpp (original) +++ cfe/trunk/test/Modules/submodule-visibility.cpp Tue Jun 30 16:29:55 2015 @@ -20,3 +20,11 @@ #endif int k = n + m; // OK, a and b are visible here. + +#ifndef A +#error A is not defined +#endif + +#ifndef B +#error B is not defined +#endif _______________________________________________ cfe-commits mailing list cfe-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits