[cfe-dev] Fixing MemberPointerTypeLoc.
Douglas Gregor
dgregor at apple.com
Fri Mar 4 11:03:22 PST 2011
On Mar 4, 2011, at 10:42 AM, Enea Zaffanella wrote:
> Il 04/03/2011 19:31, Douglas Gregor ha scritto:
>>
>> On Mar 4, 2011, at 10:23 AM, Abramo Bagnara wrote:
>>
>>> Il 04/03/2011 16:20, Douglas Gregor ha scritto:
>>>>
>>>> On Mar 4, 2011, at 2:24 AM, Enea Zaffanella wrote:
>>>>
>>>>> Hello.
>>>>>
>>>>> We would like to get rid of the FIXME in MemberPointerTypeLoc so as to
>>>>> provide appropriate NNSLoc info. As an example of the current problem,
>>>>> code such as the following:
>>>>>
>>>>> int S<int[2+3]>::* ptr = 0;
>>>>>
>>>>> gets printed as follows (note that the array size is computed):
>>>>>
>>>>> int S<int [5]>::*ptr = 0;
>>>>>
>>>>> The situation seems to be much like that of ElaboratedTypeLoc, except
>>>>> for the fact that in ElaboratedType we do have an NestedNameSpecifier,
>>>>> while in MemberPointerType we have instead
>>>>>
>>>>> /// The class of which the pointee is a member. Must ultimately be a
>>>>> /// RecordType, but could be a typedef or a template parameter too.
>>>>> const Type *Class;
>>>>>
>>>>>
>>>>> So, what would be the best way to proceed?
>>>>>
>>>>> Can we _add_ a NNS* to MemberPointerType?
>>>>>
>>>>> Should we _replace_ the Type* with the NNS* and have the method
>>>>> getClass() recompute the class type on the fly?
>>>>
>>>> I think this is the best option, since it allows us to represent the source accurately without making MemberPointerType larger. Thanks for working on this!
>>>
>>> In theory it was the best options, but to recompute the class type
>>> inside getClass() we definitely need to have the ASTContext, right?
>>
>>
>> Do we?
>>
>> The nested-name-specifier will have to have, as its last component, a Type*. Isn't that what we want from getClass()?
>>
>> - Doug
>
> Basically, we would need to move this code chunk from SemaType.cpp into
> the getClass() method of MemberPointerType:
>
> QualType ClsType = QualType(NNS->getAsType(), 0);
>
> // Note: if NNS is dependent, then its prefix (if any) is already
> // included in ClsType; this does not hold if ClsNNS is
> // nondependent: in this case (if there is indeed a prefix)
> // ClsType needs to be wrapped into an elaborated type.
> NestedNameSpecifier *NNSPrefix = NNS->getPrefix();
> if (NNSPrefix && !NNS->isDependent())
> ClsType = Context.getElaboratedType(ETK_None, NNSPrefix, ClsType);
So, it seems like this code is trying to make sure that the nested-name-specifier is already encoded within the class type of the MemberPointerType. If that's the case, why can't we just have TypeLoc information for the class type within MemberPointerTypeLoc?
- Doug
More information about the cfe-dev
mailing list