Patch for Bug 30413, including test case
Akira Hatanaka via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 6 22:40:44 PST 2017
> On Mar 6, 2017, at 10:17 AM, Lobron, David <dlobron at akamai.com> wrote:
>
> Hi Akira,
>
> Pardon my slowness in addressing your question.
>
>> This patch changes the encoding of an id conforming to a protocol, which I think was not intended: For example:
>>
>> @encode(id<NSObject>)
>>
>> Would passing IVD to the call to getObjCEncodingForType in CGObjCGNU::GenerateClass solve the problem?
>
> Are you suggesting that passing IVD instead of just IVD->getType() will tell getObjCEncodingForType whether the code being compiled is a protocol, as opposed to an object? I'm a little confused here, because IVD is an object of type ObjCIvarDecl, which is supposed to represent an instance variable, not a protocol. Also, I don't see anything in the definition of ObjCIvarDecl (in AST/DeclObjC.h) that would tell us whether it represents an instance variable or a protocol. Can you explain the case you are concerned about a little more?
>
My concern is that the patch changes the encoding of @encode(id<NSObject>) on Darwin, which I think isn’t what you are trying to fix. If you compile the following code with command “clang -cc1 -triple x86_64-apple-macosx”, the type encoding changes after applying the patch.
const char *foo() {
return @encode(id<NSObject>);
}
It seems like you can fix your problem without affecting Darwin by passing an extra argument to getObjCEncodingForType, just like CGObjCCommonMac::GetMethodVarType does.
> If IVD can in fact tell us whether the code being compiled is an object, then we can make the EncodeClassNames argument of getObjCEncodingForTypeImpl true for ivars and false for protocols.
>
> Thanks!
>
> --David
More information about the cfe-commits
mailing list