[cfe-dev] Fixing MemberPointerTypeLoc.

Enea Zaffanella zaffanella at cs.unipr.it
Fri Mar 4 10:42:53 PST 2011


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);

However, this assumes a Context object is available to build the
ElaboratedType.

Enea.




More information about the cfe-dev mailing list