r220060 - Rename TemplateArgument::getTypeForDecl to getParamTypeForDecl for clarity
David Majnemer
david.majnemer at gmail.com
Mon Oct 20 10:37:02 PDT 2014
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 <dblaikie at gmail.com> wrote:
>
>
> On Mon, Oct 20, 2014 at 10:28 AM, Yaron Keren <yaron.keren at gmail.com>
> 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 <dblaikie at gmail.com>:
>>
>>>
>>>
>>> On Mon, Oct 20, 2014 at 9:32 AM, Yaron Keren <yaron.keren at gmail.com>
>>> 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 <dblaikie at gmail.com>:
>>>>
>>>>> 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
>>>>> cfe-commits at cs.uiuc.edu
>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>>>>
>>>>
>>>>
>>>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141020/034b5b56/attachment.html>
More information about the cfe-commits
mailing list