Merged in r324215.
On Thu, Feb 1, 2018 at 10:18 AM, Hans Wennborg <h...@chromium.org> wrote: > > > On Thu, Feb 1, 2018 at 2:42 AM, Richard Smith <rich...@metafoo.co.uk> wrote: >> >> On 31 January 2018 at 16:42, Shoaib Meenai via cfe-commits >> <cfe-commits@lists.llvm.org> wrote: >>> >>> Is this viable for backporting to 6.0? It fixes a bug that's been hit in >>> various forms by quite a few people: >>> https://bugs.llvm.org/show_bug.cgi?id=36181, >>> https://bugs.llvm.org/show_bug.cgi?id=35473, and >>> https://bugs.llvm.org/show_bug.cgi?id=35939. >> >> >> I'd be OK with that once it's had a few days to work its way through >> various automated build systems. > > > Sounds good. I'll merge when it's baked a bit. > > >> >> >>> >>> >>> From: cfe-commits <cfe-commits-boun...@lists.llvm.org> on behalf of >>> Richard Smith via cfe-commits <cfe-commits@lists.llvm.org> >>> Reply-To: Richard Smith <richard-l...@metafoo.co.uk> >>> Date: Wednesday, January 31, 2018 at 4:32 PM >>> To: "cfe-commits@lists.llvm.org" <cfe-commits@lists.llvm.org> >>> Subject: r323935 - PR36181: Teach CodeGen to properly ignore requests to >>> emit dependent entities. >>> >>> >>> >>> Author: rsmith >>> >>> Date: Wed Jan 31 16:28:36 2018 >>> >>> New Revision: 323935 >>> >>> >>> >>> URL: >>> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D323935-26view-3Drev&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=lpLH9VUhmNJcmdOGGUS4JH7kl-0dHB_UbZJavDZFar8&s=gXiqdj7RcmFitXxzq_T6trCkulPJ1hKO9JTh4N1W1Ds&e= >>> >>> Log: >>> >>> PR36181: Teach CodeGen to properly ignore requests to emit dependent >>> entities. >>> >>> >>> >>> Previously, friend function definitions within class templates slipped >>> through >>> >>> the gaps and caused the MS mangler to assert. >>> >>> >>> >>> Added: >>> >>> cfe/trunk/test/CodeGenCXX/microsoft-abi-emit-dependent.cpp >>> >>> Modified: >>> >>> cfe/trunk/include/clang/AST/DeclBase.h >>> >>> cfe/trunk/lib/AST/DeclBase.cpp >>> >>> cfe/trunk/lib/CodeGen/CodeGenModule.cpp >>> >>> >>> >>> Modified: cfe/trunk/include/clang/AST/DeclBase.h >>> >>> URL: >>> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_include_clang_AST_DeclBase.h-3Frev-3D323935-26r1-3D323934-26r2-3D323935-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=lpLH9VUhmNJcmdOGGUS4JH7kl-0dHB_UbZJavDZFar8&s=IdB02f1U8VHa1i4Dvuj1BkcyoWf9sYvY3xE1L8bzfM0&e= >>> >>> >>> ============================================================================== >>> >>> --- cfe/trunk/include/clang/AST/DeclBase.h (original) >>> >>> +++ cfe/trunk/include/clang/AST/DeclBase.h Wed Jan 31 16:28:36 2018 >>> >>> @@ -836,6 +836,10 @@ public: >>> >>> void setLexicalDeclContext(DeclContext *DC); >>> >>> + /// Determine whether this declaration is a templated entity (whether >>> it is >>> >>> + // within the scope of a template parameter). >>> >>> + bool isTemplated() const; >>> >>> + >>> >>> /// isDefinedOutsideFunctionOrMethod - This predicate returns true if >>> this >>> >>> /// scoped decl is defined outside the current function or method. >>> This is >>> >>> /// roughly global variables and functions, but also handles enums >>> (which >>> >>> >>> >>> Modified: cfe/trunk/lib/AST/DeclBase.cpp >>> >>> URL: >>> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_AST_DeclBase.cpp-3Frev-3D323935-26r1-3D323934-26r2-3D323935-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=lpLH9VUhmNJcmdOGGUS4JH7kl-0dHB_UbZJavDZFar8&s=3WgES9JYNm2mJaPKUnRnaFndAGpGnj0AJ9kR5ARgxao&e= >>> >>> >>> ============================================================================== >>> >>> --- cfe/trunk/lib/AST/DeclBase.cpp (original) >>> >>> +++ cfe/trunk/lib/AST/DeclBase.cpp Wed Jan 31 16:28:36 2018 >>> >>> @@ -236,10 +236,23 @@ TemplateDecl *Decl::getDescribedTemplate >>> >>> return RD->getDescribedClassTemplate(); >>> >>> else if (auto *VD = dyn_cast<VarDecl>(this)) >>> >>> return VD->getDescribedVarTemplate(); >>> >>> + else if (auto *AD = dyn_cast<TypeAliasDecl>(this)) >>> >>> + return AD->getDescribedAliasTemplate(); >>> >>> return nullptr; >>> >>> } >>> >>> +bool Decl::isTemplated() const { >>> >>> + // A declaration is dependent if it is a template or a template >>> pattern, or >>> >>> + // is within (lexcially for a friend, semantically otherwise) a >>> dependent >>> >>> + // context. >>> >>> + // FIXME: Should local extern declarations be treated like friends? >>> >>> + if (auto *AsDC = dyn_cast<DeclContext>(this)) >>> >>> + return AsDC->isDependentContext(); >>> >>> + auto *DC = getFriendObjectKind() ? getLexicalDeclContext() : >>> getDeclContext(); >>> >>> + return DC->isDependentContext() || isTemplateDecl() || >>> getDescribedTemplate(); >>> >>> +} >>> >>> + >>> >>> const DeclContext *Decl::getParentFunctionOrMethod() const { >>> >>> for (const DeclContext *DC = getDeclContext(); >>> >>> DC && !DC->isTranslationUnit() && !DC->isNamespace(); >>> >>> >>> >>> Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp >>> >>> URL: >>> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_CodeGen_CodeGenModule.cpp-3Frev-3D323935-26r1-3D323934-26r2-3D323935-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=lpLH9VUhmNJcmdOGGUS4JH7kl-0dHB_UbZJavDZFar8&s=h8Z9xGHMAkSO6Ph5TtmYjbR5XdFVkIgGMgUXGk2oMqc&e= >>> >>> >>> ============================================================================== >>> >>> --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original) >>> >>> +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Wed Jan 31 16:28:36 2018 >>> >>> @@ -4190,18 +4190,13 @@ void CodeGenModule::EmitDeclContext(cons >>> >>> /// EmitTopLevelDecl - Emit code for a single top level declaration. >>> >>> void CodeGenModule::EmitTopLevelDecl(Decl *D) { >>> >>> // Ignore dependent declarations. >>> >>> - if (D->getDeclContext() && D->getDeclContext()->isDependentContext()) >>> >>> + if (D->isTemplated()) >>> >>> return; >>> >>> switch (D->getKind()) { >>> >>> case Decl::CXXConversion: >>> >>> case Decl::CXXMethod: >>> >>> case Decl::Function: >>> >>> - // Skip function templates >>> >>> - if (cast<FunctionDecl>(D)->getDescribedFunctionTemplate() || >>> >>> - cast<FunctionDecl>(D)->isLateTemplateParsed()) >>> >>> - return; >>> >>> - >>> >>> EmitGlobal(cast<FunctionDecl>(D)); >>> >>> // Always provide some coverage mapping >>> >>> // even for the functions that aren't emitted. >>> >>> @@ -4214,10 +4209,6 @@ void CodeGenModule::EmitTopLevelDecl(Dec >>> >>> case Decl::Var: >>> >>> case Decl::Decomposition: >>> >>> - // Skip variable templates >>> >>> - if (cast<VarDecl>(D)->getDescribedVarTemplate()) >>> >>> - return; >>> >>> - LLVM_FALLTHROUGH; >>> >>> case Decl::VarTemplateSpecialization: >>> >>> EmitGlobal(cast<VarDecl>(D)); >>> >>> if (auto *DD = dyn_cast<DecompositionDecl>(D)) >>> >>> @@ -4276,16 +4267,9 @@ void CodeGenModule::EmitTopLevelDecl(Dec >>> >>> DI->EmitUsingDirective(cast<UsingDirectiveDecl>(*D)); >>> >>> return; >>> >>> case Decl::CXXConstructor: >>> >>> - // Skip function templates >>> >>> - if (cast<FunctionDecl>(D)->getDescribedFunctionTemplate() || >>> >>> - cast<FunctionDecl>(D)->isLateTemplateParsed()) >>> >>> - return; >>> >>> - >>> >>> getCXXABI().EmitCXXConstructors(cast<CXXConstructorDecl>(D)); >>> >>> break; >>> >>> case Decl::CXXDestructor: >>> >>> - if (cast<FunctionDecl>(D)->isLateTemplateParsed()) >>> >>> - return; >>> >>> getCXXABI().EmitCXXDestructors(cast<CXXDestructorDecl>(D)); >>> >>> break; >>> >>> >>> >>> Added: cfe/trunk/test/CodeGenCXX/microsoft-abi-emit-dependent.cpp >>> >>> URL: >>> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_test_CodeGenCXX_microsoft-2Dabi-2Demit-2Ddependent.cpp-3Frev-3D323935-26view-3Dauto&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=lpLH9VUhmNJcmdOGGUS4JH7kl-0dHB_UbZJavDZFar8&s=mAm9nqXVQhIgVg8KPFJg-dzCh8yKufwWzfiUNbPDk-Q&e= >>> >>> >>> ============================================================================== >>> >>> --- cfe/trunk/test/CodeGenCXX/microsoft-abi-emit-dependent.cpp (added) >>> >>> +++ cfe/trunk/test/CodeGenCXX/microsoft-abi-emit-dependent.cpp Wed Jan 31 >>> 16:28:36 2018 >>> >>> @@ -0,0 +1,11 @@ >>> >>> +// RUN: %clang_cc1 -emit-llvm-only -fmodules -triple x86_64-windows %s >>> >>> +// PR36181 >>> >>> +#pragma clang module build foo >>> >>> +module foo {} >>> >>> +#pragma clang module contents >>> >>> +template <typename T> struct A { >>> >>> + friend void f(A<T>) {} >>> >>> +}; >>> >>> +#pragma clang module endbuild >>> >>> +#pragma clang module import foo >>> >>> +void g() { f(A<int>()); } >>> >>> >>> >>> >>> >>> _______________________________________________ >>> >>> cfe-commits mailing list >>> >>> cfe-commits@lists.llvm.org >>> >>> >>> https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.llvm.org_cgi-2Dbin_mailman_listinfo_cfe-2Dcommits&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=lpLH9VUhmNJcmdOGGUS4JH7kl-0dHB_UbZJavDZFar8&s=DpwzUMYVSTyRYllZ8J2SVU1ikJcj5-_6D5qjr2dNSL0&e= >>> >>> >>> >>> >>> _______________________________________________ >>> cfe-commits mailing list >>> cfe-commits@lists.llvm.org >>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >>> >> > _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits