I sent you the preproc. sources off-list, as they are rather large (17MB). David M. example should be easier to debug...
Yaron 2014-10-20 20:41 GMT+03:00 David Blaikie <[email protected]>: > Thanks! investigating. On Mon, Oct 20, 2014 at 10:37 AM, David Majnemer <[email protected]> wrote: > I've reproduced it independently: > template <int (*)()> void g() {} > struct S { > static int f(); > }; > auto x = g<S::f>; > > On Mon, Oct 20, 2014 at 10:31 AM, David Blaikie <[email protected]> > wrote: > >> >> >> On Mon, Oct 20, 2014 at 10:28 AM, Yaron Keren <[email protected]> >> wrote: >> >>> Here is the failing code, an example from boost::multiprecision. The >>> boost version is 1.56 (the latest). Compiled with -c -g, nothing special. >>> Maybe you'd like to add this as a test? boost::multiprecision is very >>> demanding code. >>> >> >> It'd be helpful if you could provide the preprocessed source (or the >> include-processed source) - the Clang crash handler should've mentioned two >> files (foo-42.sh and foo-42.cpp) that make it easy to reproduce crashers >> without the need to install external dependencies, etc. >> >> - David >> >> >>> >>> Yaron >>> >>> >>> 2014-10-20 19:59 GMT+03:00 David Blaikie <[email protected]>: >>> >>>> >>>> >>>> On Mon, Oct 20, 2014 at 9:32 AM, Yaron Keren <[email protected]> >>>> wrote: >>>> >>>>> Hi David, >>>>> >>>>> Beyond renaming getTypeForDecl(), this revision also introduced >>>>> functionality changes in CGDebugInfo.cpp, >>>>> >>>> >>>> Yep, sorry - I could've separated those patches. >>>> >>>> >>>>> specifically the >>>>> >>>>> if (InstanceMember) { >>>>> >>>>> test was removed, leading to >>>>> >>>>> http://llvm.org/bugs/show_bug.cgi?id=21312 >>>>> >>>>> Was the condition removed by mistake? >>>>> >>>> >>>> Not exactly - I intentionally removed it, but of course causing bugs >>>> was a mistake. >>>> >>>> Do you have a (preferably minimized) reproduction of this crash? >>>> >>>> >>>>> >>>>> Yaron >>>>> >>>>> >>>>> >>>>> 2014-10-17 21:00 GMT+03:00 David Blaikie <[email protected]>: >>>>> >>>>>> Author: dblaikie >>>>>> Date: Fri Oct 17 13:00:12 2014 >>>>>> New Revision: 220060 >>>>>> >>>>>> URL: http://llvm.org/viewvc/llvm-project?rev=220060&view=rev >>>>>> Log: >>>>>> Rename TemplateArgument::getTypeForDecl to getParamTypeForDecl for >>>>>> clarity >>>>>> >>>>>> Code review feedback from Richard Smith on r219900. >>>>>> >>>>>> Modified: >>>>>> cfe/trunk/include/clang/AST/TemplateBase.h >>>>>> cfe/trunk/lib/AST/ASTContext.cpp >>>>>> cfe/trunk/lib/AST/ASTImporter.cpp >>>>>> cfe/trunk/lib/AST/ItaniumMangle.cpp >>>>>> cfe/trunk/lib/AST/MicrosoftMangle.cpp >>>>>> cfe/trunk/lib/CodeGen/CGDebugInfo.cpp >>>>>> cfe/trunk/lib/Serialization/ASTWriter.cpp >>>>>> >>>>>> Modified: cfe/trunk/include/clang/AST/TemplateBase.h >>>>>> URL: >>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/TemplateBase.h?rev=220060&r1=220059&r2=220060&view=diff >>>>>> >>>>>> ============================================================================== >>>>>> --- cfe/trunk/include/clang/AST/TemplateBase.h (original) >>>>>> +++ cfe/trunk/include/clang/AST/TemplateBase.h Fri Oct 17 13:00:12 >>>>>> 2014 >>>>>> @@ -249,7 +249,7 @@ public: >>>>>> return DeclArg.D; >>>>>> } >>>>>> >>>>>> - QualType getTypeForDecl() const { >>>>>> + QualType getParamTypeForDecl() const { >>>>>> assert(getKind() == Declaration && "Unexpected kind"); >>>>>> return QualType::getFromOpaquePtr(DeclArg.QT); >>>>>> } >>>>>> >>>>>> Modified: cfe/trunk/lib/AST/ASTContext.cpp >>>>>> URL: >>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=220060&r1=220059&r2=220060&view=diff >>>>>> >>>>>> ============================================================================== >>>>>> --- cfe/trunk/lib/AST/ASTContext.cpp (original) >>>>>> +++ cfe/trunk/lib/AST/ASTContext.cpp Fri Oct 17 13:00:12 2014 >>>>>> @@ -4099,7 +4099,7 @@ ASTContext::getCanonicalTemplateArgument >>>>>> >>>>>> case TemplateArgument::Declaration: { >>>>>> ValueDecl *D = >>>>>> cast<ValueDecl>(Arg.getAsDecl()->getCanonicalDecl()); >>>>>> - return TemplateArgument(D, Arg.getTypeForDecl()); >>>>>> + return TemplateArgument(D, Arg.getParamTypeForDecl()); >>>>>> } >>>>>> >>>>>> case TemplateArgument::NullPtr: >>>>>> >>>>>> Modified: cfe/trunk/lib/AST/ASTImporter.cpp >>>>>> URL: >>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTImporter.cpp?rev=220060&r1=220059&r2=220060&view=diff >>>>>> >>>>>> ============================================================================== >>>>>> --- cfe/trunk/lib/AST/ASTImporter.cpp (original) >>>>>> +++ cfe/trunk/lib/AST/ASTImporter.cpp Fri Oct 17 13:00:12 2014 >>>>>> @@ -2094,7 +2094,7 @@ ASTNodeImporter::ImportTemplateArgument( >>>>>> case TemplateArgument::Declaration: { >>>>>> ValueDecl *FromD = From.getAsDecl(); >>>>>> if (ValueDecl *To = >>>>>> cast_or_null<ValueDecl>(Importer.Import(FromD))) >>>>>> - return TemplateArgument(To, From.getTypeForDecl()); >>>>>> + return TemplateArgument(To, From.getParamTypeForDecl()); >>>>>> return TemplateArgument(); >>>>>> } >>>>>> >>>>>> >>>>>> Modified: cfe/trunk/lib/AST/ItaniumMangle.cpp >>>>>> URL: >>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ItaniumMangle.cpp?rev=220060&r1=220059&r2=220060&view=diff >>>>>> >>>>>> ============================================================================== >>>>>> --- cfe/trunk/lib/AST/ItaniumMangle.cpp (original) >>>>>> +++ cfe/trunk/lib/AST/ItaniumMangle.cpp Fri Oct 17 13:00:12 2014 >>>>>> @@ -3403,7 +3403,7 @@ void CXXNameMangler::mangleTemplateArg(T >>>>>> // and pointer-to-function expressions are represented as a >>>>>> declaration not >>>>>> // an expression. We compensate for it here to produce the >>>>>> correct mangling. >>>>>> ValueDecl *D = A.getAsDecl(); >>>>>> - bool compensateMangling = !A.getTypeForDecl()->isReferenceType(); >>>>>> + bool compensateMangling = >>>>>> !A.getParamTypeForDecl()->isReferenceType(); >>>>>> if (compensateMangling) { >>>>>> Out << 'X'; >>>>>> mangleOperatorName(OO_Amp, 1); >>>>>> >>>>>> Modified: cfe/trunk/lib/AST/MicrosoftMangle.cpp >>>>>> URL: >>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/MicrosoftMangle.cpp?rev=220060&r1=220059&r2=220060&view=diff >>>>>> >>>>>> ============================================================================== >>>>>> --- cfe/trunk/lib/AST/MicrosoftMangle.cpp (original) >>>>>> +++ cfe/trunk/lib/AST/MicrosoftMangle.cpp Fri Oct 17 13:00:12 2014 >>>>>> @@ -1139,7 +1139,7 @@ void MicrosoftCXXNameMangler::mangleTemp >>>>>> else >>>>>> mangle(FD, "$1?"); >>>>>> } else { >>>>>> - mangle(ND, TA.getTypeForDecl()->isReferenceType() ? "$E?" : >>>>>> "$1?"); >>>>>> + mangle(ND, TA.getParamTypeForDecl()->isReferenceType() ? "$E?" >>>>>> : "$1?"); >>>>>> } >>>>>> break; >>>>>> } >>>>>> >>>>>> Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp >>>>>> URL: >>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=220060&r1=220059&r2=220060&view=diff >>>>>> >>>>>> ============================================================================== >>>>>> --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original) >>>>>> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Fri Oct 17 13:00:12 2014 >>>>>> @@ -1255,32 +1255,29 @@ CollectTemplateParams(const TemplatePara >>>>>> } break; >>>>>> case TemplateArgument::Declaration: { >>>>>> const ValueDecl *D = TA.getAsDecl(); >>>>>> - bool InstanceMember = D->isCXXInstanceMember(); >>>>>> - QualType T = TA.getTypeForDecl(); >>>>>> + QualType T = TA.getParamTypeForDecl(); >>>>>> llvm::DIType TTy = getOrCreateType(T, Unit); >>>>>> llvm::Value *V = nullptr; >>>>>> // Variable pointer template parameters have a value that is >>>>>> the address >>>>>> // of the variable. >>>>>> - if (const VarDecl *VD = dyn_cast<VarDecl>(D)) >>>>>> + if (const auto *VD = dyn_cast<VarDecl>(D)) >>>>>> V = CGM.GetAddrOfGlobalVar(VD); >>>>>> // Member function pointers have special support for building >>>>>> them, though >>>>>> // this is currently unsupported in LLVM CodeGen. >>>>>> - if (InstanceMember) { >>>>>> - if (const CXXMethodDecl *method = dyn_cast<CXXMethodDecl>(D)) >>>>>> + else if (const auto *method = dyn_cast<CXXMethodDecl>(D)) >>>>>> V = CGM.getCXXABI().EmitMemberPointer(method); >>>>>> - } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) >>>>>> + else if (const auto *FD = dyn_cast<FunctionDecl>(D)) >>>>>> V = CGM.GetAddrOfFunction(FD); >>>>>> // Member data pointers have special handling too to compute >>>>>> the fixed >>>>>> // offset within the object. >>>>>> - if (isa<FieldDecl>(D) || isa<IndirectFieldDecl>(D)) { >>>>>> + else if (const auto *MPT = >>>>>> dyn_cast<MemberPointerType>(T.getTypePtr())) { >>>>>> // These five lines (& possibly the above member function >>>>>> pointer >>>>>> // handling) might be able to be refactored to use similar >>>>>> code in >>>>>> // CodeGenModule::getMemberPointerConstant >>>>>> uint64_t fieldOffset = CGM.getContext().getFieldOffset(D); >>>>>> CharUnits chars = >>>>>> CGM.getContext().toCharUnitsFromBits((int64_t) >>>>>> fieldOffset); >>>>>> - V = CGM.getCXXABI().EmitMemberDataPointer( >>>>>> - cast<MemberPointerType>(T.getTypePtr()), chars); >>>>>> + V = CGM.getCXXABI().EmitMemberDataPointer(MPT, chars); >>>>>> } >>>>>> llvm::DITemplateValueParameter TVP = >>>>>> DBuilder.createTemplateValueParameter(TheCU, Name, TTy, >>>>>> >>>>>> Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp >>>>>> URL: >>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=220060&r1=220059&r2=220060&view=diff >>>>>> >>>>>> ============================================================================== >>>>>> --- cfe/trunk/lib/Serialization/ASTWriter.cpp (original) >>>>>> +++ cfe/trunk/lib/Serialization/ASTWriter.cpp Fri Oct 17 13:00:12 2014 >>>>>> @@ -5372,7 +5372,7 @@ void ASTWriter::AddTemplateArgument(cons >>>>>> break; >>>>>> case TemplateArgument::Declaration: >>>>>> AddDeclRef(Arg.getAsDecl(), Record); >>>>>> - AddTypeRef(Arg.getTypeForDecl(), Record); >>>>>> + AddTypeRef(Arg.getParamTypeForDecl(), Record); >>>>>> break; >>>>>> case TemplateArgument::NullPtr: >>>>>> AddTypeRef(Arg.getNullPtrType(), Record); >>>>>> >>>>>> >>>>>> _______________________________________________ >>>>>> 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 >> >> >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
