<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Hi Richard,<div class=""><br class=""></div><div class="">Another follow-up commit r284263.</div><div class=""><br class=""></div><div class="">When we import the top-level module with “@import X;”, all the initializers in the submodule should be emitted.</div><div class=""><br class=""></div><div class="">Let me know if you see any problem,</div><div class="">Manman</div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Oct 13, 2016, at 4:03 PM, Richard Smith <<a href="mailto:richard@metafoo.co.uk" class="">richard@metafoo.co.uk</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><div class="gmail_extra"><div class="gmail_quote">On Thu, Oct 13, 2016 at 11:52 AM, Manman via cfe-commits <span dir="ltr" class=""><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank" class="">cfe-commits@lists.llvm.org</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Richard,<br class="">
<br class="">
I committed a follow-up patch in r284142 to fix issues with C/ObjC.<br class="">
<br class="">
Let me know if you see any problem.<br class=""></blockquote><div class=""><br class=""></div><div class="">Looks good, thank you!</div><div class=""> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Manman<br class="">
<div class="HOEnZb"><div class="h5"><br class="">
> On Jul 20, 2016, at 12:10 PM, Richard Smith via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" class="">cfe-commits@lists.llvm.org</a>> wrote:<br class="">
><br class="">
> Author: rsmith<br class="">
> Date: Wed Jul 20 14:10:16 2016<br class="">
> New Revision: 276159<br class="">
><br class="">
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=276159&view=rev" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project?rev=276159&view=rev</a><br class="">
> Log:<br class="">
> [modules] Don't emit initializers for VarDecls within a module eagerly whenever<br class="">
> we first touch any part of that module. Instead, defer them until the first<br class="">
> time that module is (transitively) imported. The initializer step for a module<br class="">
> then recursively initializes modules that its own headers imported.<br class="">
><br class="">
> For example, this avoids running the <iostream> global initializer in programs<br class="">
> that don't actually use iostreams, but do use other parts of the standard<br class="">
> library.<br class="">
><br class="">
> Added:<br class="">
> cfe/trunk/test/Modules/Inputs/<wbr class="">unused-global-init/<br class="">
> - copied from r275623, cfe/trunk/test/Modules/Inputs/<wbr class="">unused-global-init/<br class="">
> cfe/trunk/test/Modules/unused-<wbr class="">global-init.cpp<br class="">
> - copied, changed from r275623, cfe/trunk/test/Modules/unused-<wbr class="">global-init.cpp<br class="">
> Modified:<br class="">
> cfe/trunk/include/clang/AST/<wbr class="">ASTContext.h<br class="">
> cfe/trunk/include/clang/Sema/<wbr class="">Sema.h<br class="">
> cfe/trunk/include/clang/<wbr class="">Serialization/ASTBitCodes.h<br class="">
> cfe/trunk/lib/AST/ASTContext.<wbr class="">cpp<br class="">
> cfe/trunk/lib/CodeGen/<wbr class="">CodeGenModule.cpp<br class="">
> cfe/trunk/lib/Sema/SemaDecl.<wbr class="">cpp<br class="">
> cfe/trunk/lib/Sema/SemaLookup.<wbr class="">cpp<br class="">
> cfe/trunk/lib/Serialization/<wbr class="">ASTReader.cpp<br class="">
> cfe/trunk/lib/Serialization/<wbr class="">ASTReaderDecl.cpp<br class="">
> cfe/trunk/lib/Serialization/<wbr class="">ASTWriter.cpp<br class="">
> cfe/trunk/lib/Serialization/<wbr class="">ASTWriterDecl.cpp<br class="">
> cfe/trunk/test/Modules/Inputs/<wbr class="">unused-global-init/used.h<br class="">
> cfe/trunk/test/Modules/odr.cpp<br class="">
> cfe/trunk/test/Modules/<a href="http://templates.mm/" rel="noreferrer" target="_blank" class="">templat<wbr class="">es.mm</a><br class="">
><br class="">
> Modified: cfe/trunk/include/clang/AST/<wbr class="">ASTContext.h<br class="">
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ASTContext.h?rev=276159&r1=276158&r2=276159&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/include/<wbr class="">clang/AST/ASTContext.h?rev=<wbr class="">276159&r1=276158&r2=276159&<wbr class="">view=diff</a><br class="">
> ==============================<wbr class="">==============================<wbr class="">==================<br class="">
> --- cfe/trunk/include/clang/AST/<wbr class="">ASTContext.h (original)<br class="">
> +++ cfe/trunk/include/clang/AST/<wbr class="">ASTContext.h Wed Jul 20 14:10:16 2016<br class="">
> @@ -312,6 +312,18 @@ class ASTContext : public RefCountedBase<br class="">
> /// definitions of that entity.<br class="">
> llvm::DenseMap<NamedDecl*, llvm::TinyPtrVector<Module*>> MergedDefModules;<br class="">
><br class="">
> + /// \brief Initializers for a module, in order. Each Decl will be either<br class="">
> + /// something that has a semantic effect on startup (such as a variable with<br class="">
> + /// a non-constant initializer), or an ImportDecl (which recursively triggers<br class="">
> + /// initialization of another module).<br class="">
> + struct PerModuleInitializers {<br class="">
> + llvm::SmallVector<Decl*, 4> Initializers;<br class="">
> + llvm::SmallVector<uint32_t, 4> LazyInitializers;<br class="">
> +<br class="">
> + void resolve(ASTContext &Ctx);<br class="">
> + };<br class="">
> + llvm::DenseMap<Module*, PerModuleInitializers*> ModuleInitializers;<br class="">
> +<br class="">
> public:<br class="">
> /// \brief A type synonym for the TemplateOrInstantiation mapping.<br class="">
> typedef llvm::PointerUnion<<wbr class="">VarTemplateDecl *, MemberSpecializationInfo *><br class="">
> @@ -883,6 +895,17 @@ public:<br class="">
> return MergedIt->second;<br class="">
> }<br class="">
><br class="">
> + /// Add a declaration to the list of declarations that are initialized<br class="">
> + /// for a module. This will typically be a global variable (with internal<br class="">
> + /// linkage) that runs module initializers, such as the iostream initializer,<br class="">
> + /// or an ImportDecl nominating another module that has initializers.<br class="">
> + void addModuleInitializer(Module *M, Decl *Init);<br class="">
> +<br class="">
> + void addLazyModuleInitializers(<wbr class="">Module *M, ArrayRef<uint32_t> IDs);<br class="">
> +<br class="">
> + /// Get the initializations to perform when importing a module, if any.<br class="">
> + ArrayRef<Decl*> getModuleInitializers(Module *M);<br class="">
> +<br class="">
> TranslationUnitDecl *getTranslationUnitDecl() const { return TUDecl; }<br class="">
><br class="">
> ExternCContextDecl *getExternCContextDecl() const;<br class="">
><br class="">
> Modified: cfe/trunk/include/clang/Sema/<wbr class="">Sema.h<br class="">
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=276159&r1=276158&r2=276159&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/include/<wbr class="">clang/Sema/Sema.h?rev=276159&<wbr class="">r1=276158&r2=276159&view=diff</a><br class="">
> ==============================<wbr class="">==============================<wbr class="">==================<br class="">
> --- cfe/trunk/include/clang/Sema/<wbr class="">Sema.h (original)<br class="">
> +++ cfe/trunk/include/clang/Sema/<wbr class="">Sema.h Wed Jul 20 14:10:16 2016<br class="">
> @@ -1390,8 +1390,14 @@ private:<br class="">
> bool RequireCompleteTypeImpl(<wbr class="">SourceLocation Loc, QualType T,<br class="">
> TypeDiagnoser *Diagnoser);<br class="">
><br class="">
> + struct ModuleScope {<br class="">
> + clang::Module *Module;<br class="">
> + VisibleModuleSet OuterVisibleModules;<br class="">
> + };<br class="">
> + /// The modules we're currently parsing.<br class="">
> + llvm::SmallVector<ModuleScope, 16> ModuleScopes;<br class="">
> +<br class="">
> VisibleModuleSet VisibleModules;<br class="">
> - llvm::SmallVector<<wbr class="">VisibleModuleSet, 16> VisibleModulesStack;<br class="">
><br class="">
> Module *CachedFakeTopLevelModule;<br class="">
><br class="">
><br class="">
> Modified: cfe/trunk/include/clang/<wbr class="">Serialization/ASTBitCodes.h<br class="">
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTBitCodes.h?rev=276159&r1=276158&r2=276159&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/include/<wbr class="">clang/Serialization/<wbr class="">ASTBitCodes.h?rev=276159&r1=<wbr class="">276158&r2=276159&view=diff</a><br class="">
> ==============================<wbr class="">==============================<wbr class="">==================<br class="">
> --- cfe/trunk/include/clang/<wbr class="">Serialization/ASTBitCodes.h (original)<br class="">
> +++ cfe/trunk/include/clang/<wbr class="">Serialization/ASTBitCodes.h Wed Jul 20 14:10:16 2016<br class="">
> @@ -684,6 +684,9 @@ namespace clang {<br class="">
> /// \brief Specifies a header that is private to this submodule but<br class="">
> /// must be textually included.<br class="">
> SUBMODULE_PRIVATE_TEXTUAL_<wbr class="">HEADER = 15,<br class="">
> + /// \brief Specifies some declarations with initializers that must be<br class="">
> + /// emitted to initialize the module.<br class="">
> + SUBMODULE_INITIALIZERS = 16,<br class="">
> };<br class="">
><br class="">
> /// \brief Record types used within a comments block.<br class="">
><br class="">
> Modified: cfe/trunk/lib/AST/ASTContext.<wbr class="">cpp<br class="">
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=276159&r1=276158&r2=276159&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/lib/AST/<wbr class="">ASTContext.cpp?rev=276159&r1=<wbr class="">276158&r2=276159&view=diff</a><br class="">
> ==============================<wbr class="">==============================<wbr class="">==================<br class="">
> --- cfe/trunk/lib/AST/ASTContext.<wbr class="">cpp (original)<br class="">
> +++ cfe/trunk/lib/AST/ASTContext.<wbr class="">cpp Wed Jul 20 14:10:16 2016<br class="">
> @@ -901,6 +901,67 @@ void ASTContext::<wbr class="">deduplicateMergedDefini<br class="">
> Merged.erase(std::remove(<wbr class="">Merged.begin(), Merged.end(), nullptr), Merged.end());<br class="">
> }<br class="">
><br class="">
> +void ASTContext::<wbr class="">PerModuleInitializers::<wbr class="">resolve(ASTContext &Ctx) {<br class="">
> + if (LazyInitializers.empty())<br class="">
> + return;<br class="">
> +<br class="">
> + auto *Source = Ctx.getExternalSource();<br class="">
> + assert(Source && "lazy initializers but no external source");<br class="">
> +<br class="">
> + auto LazyInits = std::move(LazyInitializers);<br class="">
> + LazyInitializers.clear();<br class="">
> +<br class="">
> + for (auto ID : LazyInits)<br class="">
> + Initializers.push_back(Source-<wbr class="">>GetExternalDecl(ID));<br class="">
> +<br class="">
> + assert(LazyInitializers.empty(<wbr class="">) &&<br class="">
> + "GetExternalDecl for lazy module initializer added more inits");<br class="">
> +}<br class="">
> +<br class="">
> +void ASTContext::<wbr class="">addModuleInitializer(Module *M, Decl *D) {<br class="">
> + // One special case: if we add a module initializer that imports another<br class="">
> + // module, and that module's only initializer is an ImportDecl, simplify.<br class="">
> + if (auto *ID = dyn_cast<ImportDecl>(D)) {<br class="">
> + auto It = ModuleInitializers.find(ID-><wbr class="">getImportedModule());<br class="">
> +<br class="">
> + // Maybe the ImportDecl does nothing at all. (Common case.)<br class="">
> + if (It == ModuleInitializers.end())<br class="">
> + return;<br class="">
> +<br class="">
> + // Maybe the ImportDecl only imports another ImportDecl.<br class="">
> + auto &Imported = *It->second;<br class="">
> + if (Imported.Initializers.size() + Imported.LazyInitializers.<wbr class="">size() == 1) {<br class="">
> + Imported.resolve(*this);<br class="">
> + auto *OnlyDecl = Imported.Initializers.front();<br class="">
> + if (isa<ImportDecl>(OnlyDecl))<br class="">
> + D = OnlyDecl;<br class="">
> + }<br class="">
> + }<br class="">
> +<br class="">
> + auto *&Inits = ModuleInitializers[M];<br class="">
> + if (!Inits)<br class="">
> + Inits = new (*this) PerModuleInitializers;<br class="">
> + Inits->Initializers.push_back(<wbr class="">D);<br class="">
> +}<br class="">
> +<br class="">
> +void ASTContext::<wbr class="">addLazyModuleInitializers(<wbr class="">Module *M, ArrayRef<uint32_t> IDs) {<br class="">
> + auto *&Inits = ModuleInitializers[M];<br class="">
> + if (!Inits)<br class="">
> + Inits = new (*this) PerModuleInitializers;<br class="">
> + Inits->LazyInitializers.<wbr class="">insert(Inits-><wbr class="">LazyInitializers.end(),<br class="">
> + IDs.begin(), IDs.end());<br class="">
> +}<br class="">
> +<br class="">
> +ArrayRef<Decl*> ASTContext::<wbr class="">getModuleInitializers(Module *M) {<br class="">
> + auto It = ModuleInitializers.find(M);<br class="">
> + if (It == ModuleInitializers.end())<br class="">
> + return None;<br class="">
> +<br class="">
> + auto *Inits = It->second;<br class="">
> + Inits->resolve(*this);<br class="">
> + return Inits->Initializers;<br class="">
> +}<br class="">
> +<br class="">
> ExternCContextDecl *ASTContext::<wbr class="">getExternCContextDecl() const {<br class="">
> if (!ExternCContext)<br class="">
> ExternCContext = ExternCContextDecl::Create(*<wbr class="">this, getTranslationUnitDecl());<br class="">
> @@ -8575,6 +8636,8 @@ bool ASTContext::DeclMustBeEmitted(<wbr class="">const<br class="">
> return !D->getDeclContext()-><wbr class="">isDependentContext();<br class="">
> else if (isa<OMPDeclareReductionDecl>(<wbr class="">D))<br class="">
> return !D->getDeclContext()-><wbr class="">isDependentContext();<br class="">
> + else if (isa<ImportDecl>(D))<br class="">
> + return true;<br class="">
> else<br class="">
> return false;<br class="">
><br class="">
><br class="">
> Modified: cfe/trunk/lib/CodeGen/<wbr class="">CodeGenModule.cpp<br class="">
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=276159&r1=276158&r2=276159&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/lib/CodeGen/<wbr class="">CodeGenModule.cpp?rev=276159&<wbr class="">r1=276158&r2=276159&view=diff</a><br class="">
> ==============================<wbr class="">==============================<wbr class="">==================<br class="">
> --- cfe/trunk/lib/CodeGen/<wbr class="">CodeGenModule.cpp (original)<br class="">
> +++ cfe/trunk/lib/CodeGen/<wbr class="">CodeGenModule.cpp Wed Jul 20 14:10:16 2016<br class="">
> @@ -3910,13 +3910,19 @@ void CodeGenModule::<wbr class="">EmitTopLevelDecl(Dec<br class="">
> case Decl::Import: {<br class="">
> auto *Import = cast<ImportDecl>(D);<br class="">
><br class="">
> - // Ignore import declarations that come from imported modules.<br class="">
> - if (Import-><wbr class="">getImportedOwningModule())<br class="">
> + // If we've already imported this module, we're done.<br class="">
> + if (!ImportedModules.insert(<wbr class="">Import->getImportedModule()))<br class="">
> break;<br class="">
> - if (CGDebugInfo *DI = getModuleDebugInfo())<br class="">
> - DI->EmitImportDecl(*Import);<br class="">
><br class="">
> - ImportedModules.insert(Import-<wbr class="">>getImportedModule());<br class="">
> + // Emit debug information for direct imports.<br class="">
> + if (!Import-><wbr class="">getImportedOwningModule()) {<br class="">
> + if (CGDebugInfo *DI = getModuleDebugInfo())<br class="">
> + DI->EmitImportDecl(*Import);<br class="">
> + }<br class="">
> +<br class="">
> + // Emit the module initializers.<br class="">
> + for (auto *D : Context.getModuleInitializers(<wbr class="">Import->getImportedModule()))<br class="">
> + EmitTopLevelDecl(D);<br class="">
> break;<br class="">
> }<br class="">
><br class="">
><br class="">
> Modified: cfe/trunk/lib/Sema/SemaDecl.<wbr class="">cpp<br class="">
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=276159&r1=276158&r2=276159&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/lib/Sema/<wbr class="">SemaDecl.cpp?rev=276159&r1=<wbr class="">276158&r2=276159&view=diff</a><br class="">
> ==============================<wbr class="">==============================<wbr class="">==================<br class="">
> --- cfe/trunk/lib/Sema/SemaDecl.<wbr class="">cpp (original)<br class="">
> +++ cfe/trunk/lib/Sema/SemaDecl.<wbr class="">cpp Wed Jul 20 14:10:16 2016<br class="">
> @@ -10473,6 +10473,11 @@ void Sema::<wbr class="">CheckCompleteVariableDeclarat<br class="">
> // Require the destructor.<br class="">
> if (const RecordType *recordType = baseType->getAs<RecordType>())<br class="">
> FinalizeVarWithDestructor(var, recordType);<br class="">
> +<br class="">
> + // If this variable must be emitted, add it as an initializer for the current<br class="">
> + // module.<br class="">
> + if (Context.DeclMustBeEmitted(<wbr class="">var) && !ModuleScopes.empty())<br class="">
> + Context.addModuleInitializer(<wbr class="">ModuleScopes.back().Module, var);<br class="">
> }<br class="">
><br class="">
> /// \brief Determines if a variable's alignment is dependent.<br class="">
> @@ -15095,11 +15100,13 @@ DeclResult Sema::ActOnModuleImport(Sourc<br class="">
> IdentifierLocs.push_back(Path[<wbr class="">I].second);<br class="">
> }<br class="">
><br class="">
> - ImportDecl *Import = ImportDecl::Create(Context,<br class="">
> - Context.<wbr class="">getTranslationUnitDecl(),<br class="">
> + TranslationUnitDecl *TU = getASTContext().<wbr class="">getTranslationUnitDecl();<br class="">
> + ImportDecl *Import = ImportDecl::Create(Context, TU,<br class="">
> AtLoc.isValid()? AtLoc : ImportLoc,<br class="">
> Mod, IdentifierLocs);<br class="">
> - Context.<wbr class="">getTranslationUnitDecl()-><wbr class="">addDecl(Import);<br class="">
> + if (!ModuleScopes.empty())<br class="">
> + Context.addModuleInitializer(<wbr class="">ModuleScopes.back().Module, Import);<br class="">
> + TU->addDecl(Import);<br class="">
> return Import;<br class="">
> }<br class="">
><br class="">
> @@ -15115,13 +15122,7 @@ void Sema::ActOnModuleInclude(<wbr class="">SourceLoca<br class="">
> TUKind == TU_Module &&<br class="">
> getSourceManager().<wbr class="">isWrittenInMainFile(<wbr class="">DirectiveLoc);<br class="">
><br class="">
> - // Similarly, if we're in the implementation of a module, don't<br class="">
> - // synthesize an illegal module import. FIXME: Why not?<br class="">
> - bool ShouldAddImport =<br class="">
> - !IsInModuleIncludes &&<br class="">
> - (getLangOpts().CompilingModule ||<br class="">
> - getLangOpts().CurrentModule.<wbr class="">empty() ||<br class="">
> - getLangOpts().CurrentModule != Mod->getTopLevelModuleName());<br class="">
> + bool ShouldAddImport = !IsInModuleIncludes;<br class="">
><br class="">
> // If this module import was due to an inclusion directive, create an<br class="">
> // implicit import declaration to capture it in the AST.<br class="">
> @@ -15130,6 +15131,8 @@ void Sema::ActOnModuleInclude(<wbr class="">SourceLoca<br class="">
> ImportDecl *ImportD = ImportDecl::CreateImplicit(<wbr class="">getASTContext(), TU,<br class="">
> DirectiveLoc, Mod,<br class="">
> DirectiveLoc);<br class="">
> + if (!ModuleScopes.empty())<br class="">
> + Context.addModuleInitializer(<wbr class="">ModuleScopes.back().Module, ImportD);<br class="">
> TU->addDecl(ImportD);<br class="">
> Consumer.<wbr class="">HandleImplicitImportDecl(<wbr class="">ImportD);<br class="">
> }<br class="">
> @@ -15141,8 +15144,11 @@ void Sema::ActOnModuleInclude(<wbr class="">SourceLoca<br class="">
> void Sema::ActOnModuleBegin(<wbr class="">SourceLocation DirectiveLoc, Module *Mod) {<br class="">
> checkModuleImportContext(*<wbr class="">this, Mod, DirectiveLoc, CurContext);<br class="">
><br class="">
> + ModuleScopes.push_back({});<br class="">
> + ModuleScopes.back().Module = Mod;<br class="">
> if (getLangOpts().<wbr class="">ModulesLocalVisibility)<br class="">
> - VisibleModulesStack.push_back(<wbr class="">std::move(VisibleModules));<br class="">
> + ModuleScopes.back().<wbr class="">OuterVisibleModules = std::move(VisibleModules);<br class="">
> +<br class="">
> VisibleModules.setVisible(Mod, DirectiveLoc);<br class="">
> }<br class="">
><br class="">
> @@ -15150,8 +15156,11 @@ void Sema::ActOnModuleEnd(<wbr class="">SourceLocation<br class="">
> checkModuleImportContext(*<wbr class="">this, Mod, DirectiveLoc, CurContext);<br class="">
><br class="">
> if (getLangOpts().<wbr class="">ModulesLocalVisibility) {<br class="">
> - VisibleModules = std::move(VisibleModulesStack.<wbr class="">back());<br class="">
> - VisibleModulesStack.pop_back()<wbr class="">;<br class="">
> + assert(!ModuleScopes.empty() && ModuleScopes.back().Module == Mod &&<br class="">
> + "left the wrong module scope");<br class="">
> + VisibleModules = std::move(ModuleScopes.back().<wbr class="">OuterVisibleModules);<br class="">
> + ModuleScopes.pop_back();<br class="">
> +<br class="">
> VisibleModules.setVisible(Mod, DirectiveLoc);<br class="">
> // Leaving a module hides namespace names, so our visible namespace cache<br class="">
> // is now out of date.<br class="">
><br class="">
> Modified: cfe/trunk/lib/Sema/SemaLookup.<wbr class="">cpp<br class="">
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaLookup.cpp?rev=276159&r1=276158&r2=276159&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/lib/Sema/<wbr class="">SemaLookup.cpp?rev=276159&r1=<wbr class="">276158&r2=276159&view=diff</a><br class="">
> ==============================<wbr class="">==============================<wbr class="">==================<br class="">
> --- cfe/trunk/lib/Sema/SemaLookup.<wbr class="">cpp (original)<br class="">
> +++ cfe/trunk/lib/Sema/SemaLookup.<wbr class="">cpp Wed Jul 20 14:10:16 2016<br class="">
> @@ -1367,8 +1367,9 @@ Module *Sema::getOwningModule(Decl *Enti<br class="">
> auto &SrcMgr = PP.getSourceManager();<br class="">
> SourceLocation StartLoc =<br class="">
> SrcMgr.getLocForStartOfFile(<wbr class="">SrcMgr.getMainFileID());<br class="">
> - auto &TopLevel =<br class="">
> - VisibleModulesStack.empty() ? VisibleModules : VisibleModulesStack[0];<br class="">
> + auto &TopLevel = ModuleScopes.empty()<br class="">
> + ? VisibleModules<br class="">
> + : ModuleScopes[0].<wbr class="">OuterVisibleModules;<br class="">
> TopLevel.setVisible(<wbr class="">CachedFakeTopLevelModule, StartLoc);<br class="">
> }<br class="">
><br class="">
><br class="">
> Modified: cfe/trunk/lib/Serialization/<wbr class="">ASTReader.cpp<br class="">
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=276159&r1=276158&r2=276159&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/lib/<wbr class="">Serialization/ASTReader.cpp?<wbr class="">rev=276159&r1=276158&r2=<wbr class="">276159&view=diff</a><br class="">
> ==============================<wbr class="">==============================<wbr class="">==================<br class="">
> --- cfe/trunk/lib/Serialization/<wbr class="">ASTReader.cpp (original)<br class="">
> +++ cfe/trunk/lib/Serialization/<wbr class="">ASTReader.cpp Wed Jul 20 14:10:16 2016<br class="">
> @@ -4673,6 +4673,13 @@ ASTReader::ReadSubmoduleBlock(<wbr class="">ModuleFile<br class="">
> UnresolvedModuleRefs.push_<wbr class="">back(Unresolved);<br class="">
> break;<br class="">
> }<br class="">
> +<br class="">
> + case SUBMODULE_INITIALIZERS:<br class="">
> + SmallVector<uint32_t, 16> Inits;<br class="">
> + for (auto &ID : Record)<br class="">
> + Inits.push_back(<wbr class="">getGlobalDeclID(F, ID));<br class="">
> + Context.<wbr class="">addLazyModuleInitializers(<wbr class="">CurrentModule, Inits);<br class="">
> + break;<br class="">
> }<br class="">
> }<br class="">
> }<br class="">
><br class="">
> Modified: cfe/trunk/lib/Serialization/<wbr class="">ASTReaderDecl.cpp<br class="">
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=276159&r1=276158&r2=276159&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/lib/<wbr class="">Serialization/ASTReaderDecl.<wbr class="">cpp?rev=276159&r1=276158&r2=<wbr class="">276159&view=diff</a><br class="">
> ==============================<wbr class="">==============================<wbr class="">==================<br class="">
> --- cfe/trunk/lib/Serialization/<wbr class="">ASTReaderDecl.cpp (original)<br class="">
> +++ cfe/trunk/lib/Serialization/<wbr class="">ASTReaderDecl.cpp Wed Jul 20 14:10:16 2016<br class="">
> @@ -2493,10 +2493,16 @@ inline void ASTReader::LoadedDecl(unsign<br class="">
> /// This routine should return true for anything that might affect<br class="">
> /// code generation, e.g., inline function definitions, Objective-C<br class="">
> /// declarations with metadata, etc.<br class="">
> -static bool isConsumerInterestedIn(Decl *D, bool HasBody) {<br class="">
> +static bool isConsumerInterestedIn(<wbr class="">ASTContext &Ctx, Decl *D, bool HasBody) {<br class="">
> // An ObjCMethodDecl is never considered as "interesting" because its<br class="">
> // implementation container always is.<br class="">
><br class="">
> + // An ImportDecl or VarDecl imported from a module will get emitted when<br class="">
> + // we import the relevant module.<br class="">
> + if ((isa<ImportDecl>(D) || isa<VarDecl>(D)) && Ctx.DeclMustBeEmitted(D) &&<br class="">
> + D->getImportedOwningModule())<br class="">
> + return false;<br class="">
> +<br class="">
> if (isa<FileScopeAsmDecl>(D) ||<br class="">
> isa<ObjCProtocolDecl>(D) ||<br class="">
> isa<ObjCImplDecl>(D) ||<br class="">
> @@ -3473,7 +3479,7 @@ Decl *ASTReader::ReadDeclRecord(<wbr class="">DeclID I<br class="">
> // AST consumer might need to know about, queue it.<br class="">
> // We don't pass it to the consumer immediately because we may be in recursive<br class="">
> // loading, and some declarations may still be initializing.<br class="">
> - if (isConsumerInterestedIn(D, Reader.hasPendingBody()))<br class="">
> + if (isConsumerInterestedIn(<wbr class="">Context, D, Reader.hasPendingBody()))<br class="">
> InterestingDecls.push_back(D);<br class="">
><br class="">
> return D;<br class="">
> @@ -3488,7 +3494,7 @@ void ASTReader::<wbr class="">loadDeclUpdateRecords(se<br class="">
> auto UpdateOffsets = std::move(UpdI->second);<br class="">
> DeclUpdateOffsets.erase(UpdI);<br class="">
><br class="">
> - bool WasInteresting = isConsumerInterestedIn(D, false);<br class="">
> + bool WasInteresting = isConsumerInterestedIn(<wbr class="">Context, D, false);<br class="">
> for (auto &FileAndOffset : UpdateOffsets) {<br class="">
> ModuleFile *F = FileAndOffset.first;<br class="">
> uint64_t Offset = FileAndOffset.second;<br class="">
> @@ -3509,7 +3515,7 @@ void ASTReader::<wbr class="">loadDeclUpdateRecords(se<br class="">
> // We might have made this declaration interesting. If so, remember that<br class="">
> // we need to hand it off to the consumer.<br class="">
> if (!WasInteresting &&<br class="">
> - isConsumerInterestedIn(D, Reader.hasPendingBody())) {<br class="">
> + isConsumerInterestedIn(<wbr class="">Context, D, Reader.hasPendingBody())) {<br class="">
> InterestingDecls.push_back(D);<br class="">
> WasInteresting = true;<br class="">
> }<br class="">
><br class="">
> Modified: cfe/trunk/lib/Serialization/<wbr class="">ASTWriter.cpp<br class="">
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=276159&r1=276158&r2=276159&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/lib/<wbr class="">Serialization/ASTWriter.cpp?<wbr class="">rev=276159&r1=276158&r2=<wbr class="">276159&view=diff</a><br class="">
> ==============================<wbr class="">==============================<wbr class="">==================<br class="">
> --- cfe/trunk/lib/Serialization/<wbr class="">ASTWriter.cpp (original)<br class="">
> +++ cfe/trunk/lib/Serialization/<wbr class="">ASTWriter.cpp Wed Jul 20 14:10:16 2016<br class="">
> @@ -1017,6 +1017,7 @@ void ASTWriter::<wbr class="">WriteBlockInfoBlock() {<br class="">
> RECORD(SUBMODULE_PRIVATE_<wbr class="">HEADER);<br class="">
> RECORD(SUBMODULE_TEXTUAL_<wbr class="">HEADER);<br class="">
> RECORD(SUBMODULE_PRIVATE_<wbr class="">TEXTUAL_HEADER);<br class="">
> + RECORD(SUBMODULE_INITIALIZERS)<wbr class="">;<br class="">
><br class="">
> // Comments Block.<br class="">
> BLOCK(COMMENTS_BLOCK);<br class="">
> @@ -2417,7 +2418,9 @@ unsigned ASTWriter::<wbr class="">getLocalOrImportedSu<br class="">
> if (Known != SubmoduleIDs.end())<br class="">
> return Known->second;<br class="">
><br class="">
> - if (Mod->getTopLevelModule() != WritingModule)<br class="">
> + auto *Top = Mod->getTopLevelModule();<br class="">
> + if (Top != WritingModule &&<br class="">
> + !Top->fullModuleNameIs(<wbr class="">StringRef(getLangOpts().<wbr class="">CurrentModule)))<br class="">
> return 0;<br class="">
><br class="">
> return SubmoduleIDs[Mod] = NextSubmoduleID++;<br class="">
> @@ -2649,6 +2652,13 @@ void ASTWriter::WriteSubmodules(<wbr class="">Module *<br class="">
> Stream.EmitRecordWithBlob(<wbr class="">ConfigMacroAbbrev, Record, CM);<br class="">
> }<br class="">
><br class="">
> + // Emit the initializers, if any.<br class="">
> + RecordData Inits;<br class="">
> + for (Decl *D : Context-><wbr class="">getModuleInitializers(Mod))<br class="">
> + Inits.push_back(GetDeclRef(D))<wbr class="">;<br class="">
> + if (!Inits.empty())<br class="">
> + Stream.EmitRecord(SUBMODULE_<wbr class="">INITIALIZERS, Inits);<br class="">
> +<br class="">
> // Queue up the submodules of this module.<br class="">
> for (auto *M : Mod->submodules())<br class="">
> Q.push(M);<br class="">
> @@ -4514,6 +4524,17 @@ uint64_t ASTWriter::WriteASTCore(Sema &S<br class="">
> // If we're emitting a module, write out the submodule information.<br class="">
> if (WritingModule)<br class="">
> WriteSubmodules(WritingModule)<wbr class="">;<br class="">
> + else if (!getLangOpts().CurrentModule.<wbr class="">empty()) {<br class="">
> + // If we're building a PCH in the implementation of a module, we may need<br class="">
> + // the description of the current module.<br class="">
> + //<br class="">
> + // FIXME: We may need other modules that we did not load from an AST file,<br class="">
> + // such as if a module declares a 'conflicts' on a different module.<br class="">
> + Module *M = PP.getHeaderSearchInfo().<wbr class="">getModuleMap().findModule(<br class="">
> + getLangOpts().CurrentModule);<br class="">
> + if (M && !M->IsFromModuleFile)<br class="">
> + WriteSubmodules(M);<br class="">
> + }<br class="">
><br class="">
> Stream.EmitRecord(SPECIAL_<wbr class="">TYPES, SpecialTypes);<br class="">
><br class="">
><br class="">
> Modified: cfe/trunk/lib/Serialization/<wbr class="">ASTWriterDecl.cpp<br class="">
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterDecl.cpp?rev=276159&r1=276158&r2=276159&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/lib/<wbr class="">Serialization/ASTWriterDecl.<wbr class="">cpp?rev=276159&r1=276158&r2=<wbr class="">276159&view=diff</a><br class="">
> ==============================<wbr class="">==============================<wbr class="">==================<br class="">
> --- cfe/trunk/lib/Serialization/<wbr class="">ASTWriterDecl.cpp (original)<br class="">
> +++ cfe/trunk/lib/Serialization/<wbr class="">ASTWriterDecl.cpp Wed Jul 20 14:10:16 2016<br class="">
> @@ -2122,11 +2122,11 @@ static bool isRequiredDecl(const Decl *D<br class="">
> D->hasAttr<<wbr class="">OMPDeclareTargetDeclAttr>())<br class="">
> return true;<br class="">
><br class="">
> - // ImportDecl is used by codegen to determine the set of imported modules to<br class="">
> - // search for inputs for automatic linking; include it if it has a semantic<br class="">
> - // effect.<br class="">
> - if (isa<ImportDecl>(D) && !WritingModule)<br class="">
> - return true;<br class="">
> + if (WritingModule && (isa<VarDecl>(D) || isa<ImportDecl>(D))) {<br class="">
> + // These declarations are part of the module initializer, and are emitted<br class="">
> + // if and when the module is imported, rather than being emitted eagerly.<br class="">
> + return false;<br class="">
> + }<br class="">
><br class="">
> return Context.DeclMustBeEmitted(D);<br class="">
> }<br class="">
><br class="">
> Modified: cfe/trunk/test/Modules/Inputs/<wbr class="">unused-global-init/used.h<br class="">
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/unused-global-init/used.h?rev=276159&r1=275623&r2=276159&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/test/<wbr class="">Modules/Inputs/unused-global-<wbr class="">init/used.h?rev=276159&r1=<wbr class="">275623&r2=276159&view=diff</a><br class="">
> ==============================<wbr class="">==============================<wbr class="">==================<br class="">
> --- cfe/trunk/test/Modules/Inputs/<wbr class="">unused-global-init/used.h (original)<br class="">
> +++ cfe/trunk/test/Modules/Inputs/<wbr class="">unused-global-init/used.h Wed Jul 20 14:10:16 2016<br class="">
> @@ -1,2 +1,2 @@<br class="">
> // used.h<br class="">
> -#include "other.h"<br class="">
> +#include "init.h"<br class="">
><br class="">
> Modified: cfe/trunk/test/Modules/odr.cpp<br class="">
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/odr.cpp?rev=276159&r1=276158&r2=276159&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/test/<wbr class="">Modules/odr.cpp?rev=276159&r1=<wbr class="">276158&r2=276159&view=diff</a><br class="">
> ==============================<wbr class="">==============================<wbr class="">==================<br class="">
> --- cfe/trunk/test/Modules/odr.cpp (original)<br class="">
> +++ cfe/trunk/test/Modules/odr.cpp Wed Jul 20 14:10:16 2016<br class="">
> @@ -15,9 +15,9 @@ bool b = F<int>{0} == F<int>{1};<br class="">
> int x = f() + g();<br class="">
><br class="">
> // <a href="mailto:expected-note@a.h" class="">expected-note@a.h</a>:5 {{definition has no member 'e2'}}<br class="">
> -// <a href="mailto:expected-note@b.h" class="">expected-note@b.h</a>:3 {{declaration of 'f' does not match}}<br class="">
> -// <a href="mailto:expected-note@b.h" class="">expected-note@b.h</a>:1 {{definition has no member 'n'}}<br class="">
> +// <a href="mailto:expected-note@a.h" class="">expected-note@a.h</a>:3 {{declaration of 'f' does not match}}<br class="">
> +// <a href="mailto:expected-note@a.h" class="">expected-note@a.h</a>:1 {{definition has no member 'm'}}<br class="">
><br class="">
> // <a href="mailto:expected-error@b.h" class="">expected-error@b.h</a>:5 {{'E::e2' from module 'b' is not present in definition of 'E' in module 'a'}}<br class="">
> -// <a href="mailto:expected-error@a.h" class="">expected-error@a.h</a>:3 {{'Y::f' from module 'a' is not present in definition of 'Y' in module 'b'}}<br class="">
> -// <a href="mailto:expected-error@a.h" class="">expected-error@a.h</a>:2 {{'Y::n' from module 'a' is not present in definition of 'Y' in module 'b'}}<br class="">
> +// <a href="mailto:expected-error@b.h" class="">expected-error@b.h</a>:3 {{'Y::f' from module 'b' is not present in definition of 'Y' in module 'a'}}<br class="">
> +// <a href="mailto:expected-error@b.h" class="">expected-error@b.h</a>:2 {{'Y::m' from module 'b' is not present in definition of 'Y' in module 'a'}}<br class="">
><br class="">
> Modified: cfe/trunk/test/Modules/<a href="http://templates.mm/" rel="noreferrer" target="_blank" class="">templat<wbr class="">es.mm</a><br class="">
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/templates.mm?rev=276159&r1=276158&r2=276159&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/test/<wbr class="">Modules/templates.mm?rev=<wbr class="">276159&r1=276158&r2=276159&<wbr class="">view=diff</a><br class="">
> ==============================<wbr class="">==============================<wbr class="">==================<br class="">
> --- cfe/trunk/test/Modules/<a href="http://templates.mm/" rel="noreferrer" target="_blank" class="">templat<wbr class="">es.mm</a> (original)<br class="">
> +++ cfe/trunk/test/Modules/<a href="http://templates.mm/" rel="noreferrer" target="_blank" class="">templat<wbr class="">es.mm</a> Wed Jul 20 14:10:16 2016<br class="">
> @@ -12,10 +12,10 @@ void testInlineRedeclEarly() {<br class="">
><br class="">
> @import templates_right;<br class="">
><br class="">
> -// CHECK-DAG: @list_left = global %class.List { %"struct.List<int>::node"* null, i32 8 }, align 8<br class="">
> -// CHECK-DAG: @list_right = global %class.List { %"struct.List<int>::node"* null, i32 12 }, align 8<br class="">
> -// CHECK-DAG: @_ZZ15testMixedStructvE1l = {{.*}} constant %class.List { %{{.*}}* null, i32 1 }, align 8<br class="">
> -// CHECK-DAG: @_ZZ15testMixedStructvE1r = {{.*}} constant %class.List { %{{.*}}* null, i32 2 }, align 8<br class="">
> +// CHECK-DAG: @list_left = global %[[LIST:.*]] { %[[LISTNODE:.*]]* null, i32 8 }, align 8<br class="">
> +// CHECK-DAG: @list_right = global %[[LIST]] { %[[LISTNODE]]* null, i32 12 }, align 8<br class="">
> +// CHECK-DAG: @_ZZ15testMixedStructvE1l = {{.*}} constant %[[LIST]] { %{{.*}}* null, i32 1 }, align 8<br class="">
> +// CHECK-DAG: @_ZZ15testMixedStructvE1r = {{.*}} constant %[[LIST]] { %{{.*}}* null, i32 2 }, align 8<br class="">
> // CHECK-DAG: @_<wbr class="">ZN29WithUndefinedStaticDataMem<wbr class="">berIA_iE9undefinedE = external global<br class="">
><br class="">
> void testTemplateClasses() {<br class="">
><br class="">
> Copied: cfe/trunk/test/Modules/unused-<wbr class="">global-init.cpp (from r275623, cfe/trunk/test/Modules/unused-<wbr class="">global-init.cpp)<br class="">
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/unused-global-init.cpp?p2=cfe/trunk/test/Modules/unused-global-init.cpp&p1=cfe/trunk/test/Modules/unused-global-init.cpp&r1=275623&r2=276159&rev=276159&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/test/<wbr class="">Modules/unused-global-init.<wbr class="">cpp?p2=cfe/trunk/test/Modules/<wbr class="">unused-global-init.cpp&p1=cfe/<wbr class="">trunk/test/Modules/unused-<wbr class="">global-init.cpp&r1=275623&r2=<wbr class="">276159&rev=276159&view=diff</a><br class="">
> ==============================<wbr class="">==============================<wbr class="">==================<br class="">
> --- cfe/trunk/test/Modules/unused-<wbr class="">global-init.cpp (original)<br class="">
> +++ cfe/trunk/test/Modules/unused-<wbr class="">global-init.cpp Wed Jul 20 14:10:16 2016<br class="">
> @@ -6,13 +6,14 @@<br class="">
> //<br class="">
> // No module file: init.h performs init.<br class="">
> // RUN: %clang_cc1 -fmodules -fno-implicit-modules -x c++ -I %S/Inputs/unused-global-init -triple %itanium_abi_triple -emit-llvm -o - %s -DINIT | FileCheck --check-prefix=CHECK-INIT %s<br class="">
> -// RUN: %clang_cc1 -fmodules -fno-implicit-modules -x c++ -I %S/Inputs/unused-global-init -triple %itanium_abi_triple -emit-llvm -o - %s -DOTHER -DUSED -DUNUSED | FileCheck --check-prefix=CHECK-NO-INIT %s<br class="">
> +// RUN: %clang_cc1 -fmodules -fno-implicit-modules -x c++ -I %S/Inputs/unused-global-init -triple %itanium_abi_triple -emit-llvm -o - %s -DUSED | FileCheck --check-prefix=CHECK-INIT %s<br class="">
> +// RUN: %clang_cc1 -fmodules -fno-implicit-modules -x c++ -I %S/Inputs/unused-global-init -triple %itanium_abi_triple -emit-llvm -o - %s -DOTHER -DUNUSED | FileCheck --check-prefix=CHECK-NO-INIT %s<br class="">
> //<br class="">
> // With module files: if there is a transitive import of any part of the<br class="">
> // module, we run its global initializers (even if the imported piece is not<br class="">
> // visible here).<br class="">
> // RUN: %clang_cc1 -fmodules -fno-implicit-modules -x c++ -I %S/Inputs/unused-global-init -triple %itanium_abi_triple -emit-llvm -o - %s -fmodule-file=%t/used.pcm -fmodule-file=%t/unused.pcm -DINIT | FileCheck --check-prefix=CHECK-INIT %s<br class="">
> -// RUN: %clang_cc1 -fmodules -fno-implicit-modules -x c++ -I %S/Inputs/unused-global-init -triple %itanium_abi_triple -emit-llvm -o - %s -fmodule-file=%t/used.pcm -fmodule-file=%t/unused.pcm -DOTHER | FileCheck --check-prefix=CHECK-INIT %s<br class="">
> +// RUN: %clang_cc1 -fmodules -fno-implicit-modules -x c++ -I %S/Inputs/unused-global-init -triple %itanium_abi_triple -emit-llvm -o - %s -fmodule-file=%t/used.pcm -fmodule-file=%t/unused.pcm -DOTHER | FileCheck --check-prefix=CHECK-NO-INIT %s<br class="">
> // RUN: %clang_cc1 -fmodules -fno-implicit-modules -x c++ -I %S/Inputs/unused-global-init -triple %itanium_abi_triple -emit-llvm -o - %s -fmodule-file=%t/used.pcm -fmodule-file=%t/unused.pcm -DUSED | FileCheck --check-prefix=CHECK-INIT %s<br class="">
> // RUN: %clang_cc1 -fmodules -fno-implicit-modules -x c++ -I %S/Inputs/unused-global-init -triple %itanium_abi_triple -emit-llvm -o - %s -fmodule-file=%t/used.pcm -fmodule-file=%t/unused.pcm -DUNUSED | FileCheck --check-prefix=CHECK-NO-INIT %s<br class="">
><br class="">
><br class="">
><br class="">
> ______________________________<wbr class="">_________________<br class="">
> cfe-commits mailing list<br class="">
> <a href="mailto:cfe-commits@lists.llvm.org" class="">cfe-commits@lists.llvm.org</a><br class="">
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/cgi-bin/<wbr class="">mailman/listinfo/cfe-commits</a><br class="">
<br class="">
______________________________<wbr class="">_________________<br class="">
cfe-commits mailing list<br class="">
<a href="mailto:cfe-commits@lists.llvm.org" class="">cfe-commits@lists.llvm.org</a><br class="">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/cgi-bin/<wbr class="">mailman/listinfo/cfe-commits</a><br class="">
</div></div></blockquote></div><br class=""></div></div>
</div></blockquote></div><br class=""></div></body></html>