[cfe-commits] [Patch] Handle qualifiers for template types in during template type diffing.
Richard Trieu
rtrieu at google.com
Fri Sep 28 13:21:17 PDT 2012
On Wed, Sep 26, 2012 at 7:22 PM, Richard Smith <richard at metafoo.co.uk>wrote:
> Hi Richard!
>
> @@ -778,17 +793,19 @@
> if (Context.hasSameType(FromType, ToType)) {
> Tree.SetSame(true);
> } else {
> - const TemplateSpecializationType *FromArgTST =
> - GetTemplateSpecializationType(Context, FromType);
> - const TemplateSpecializationType *ToArgTST =
> - GetTemplateSpecializationType(Context, ToType);
> -
> - if (FromArgTST && ToArgTST) {
> - bool SameTemplate = hasSameTemplate(FromArgTST, ToArgTST);
> - if (SameTemplate) {
> -
> Tree.SetNode(FromArgTST->getTemplateName().getAsTemplateDecl(),
> -
> ToArgTST->getTemplateName().getAsTemplateDecl());
> - DiffTemplate(FromArgTST, ToArgTST);
> + Qualifiers FromQual, ToQual;
> + bool SameTemplate = hasSameTemplate(Context, FromType, ToType,
> + FromQual, ToQual);
> + if (SameTemplate) {
> + const TemplateSpecializationType *FromArgTST =
> + GetTemplateSpecializationType(Context, FromType);
> + const TemplateSpecializationType *ToArgTST =
> + GetTemplateSpecializationType(Context, ToType);
> + if (FromArgTST && ToArgTST) {
> +
> Tree.SetNode(FromArgTST->getTemplateName().getAsTemplateDecl(),
> +
> ToArgTST->getTemplateName().getAsTemplateDecl());
> + Tree.SetNode(FromQual, ToQual);
> + DiffTemplate(FromArgTST, ToArgTST);
>
> Missing some indentation here.
>
> + FromType = FromIter[-1].second;
> + ToType = ToIter[-1].second;
> +
> + // Remove all the qualifiers that are already in the type. This gets
> + // all the qualifiers that are added between this qualifier and the
> + // original type passed into this function.
> + FromQual -= FromType.getLocalUnqualifiedType().getQualifiers();
>
> It looks like that's the same as QualType(FromIter[-1].first,
> 0).getQualifiers(). Using that would avoid the need to track QualTypes as
> you descend through alias templates. Maybe also move this computation out
> into the caller (where it's "QualType(FromArgTST, 0).getQualifiers()")?
>
> Thanks!
>
> On Thu, Sep 13, 2012 at 4:44 PM, Richard Trieu <rtrieu at google.com> wrote:
>
>> On Mon, Aug 27, 2012 at 4:29 PM, Richard Trieu <rtrieu at google.com> wrote:
>>
>>> On Mon, Aug 27, 2012 at 11:04 AM, Chandler Carruth <chandlerc at google.com
>>> > wrote:
>>>
>>>> Cool, a couple of high level comments:
>>>>
>>>> @@ -778,17 +793,19 @@
>>>> if (Context.hasSameType(FromType, ToType)) {
>>>> Tree.SetSame(true);
>>>> } else {
>>>> - const TemplateSpecializationType *FromArgTST =
>>>> - GetTemplateSpecializationType(Context, FromType);
>>>> - const TemplateSpecializationType *ToArgTST =
>>>> - GetTemplateSpecializationType(Context, ToType);
>>>> -
>>>> - if (FromArgTST && ToArgTST) {
>>>> - bool SameTemplate = hasSameTemplate(FromArgTST,
>>>> ToArgTST);
>>>> - if (SameTemplate) {
>>>> -
>>>> Tree.SetNode(FromArgTST->getTemplateName().getAsTemplateDecl(),
>>>> -
>>>> ToArgTST->getTemplateName().getAsTemplateDecl());
>>>> - DiffTemplate(FromArgTST, ToArgTST);
>>>> + Qualifiers FromQual, ToQual;
>>>> + bool SameTemplate = hasSameTemplate(Context, FromType,
>>>> ToType,
>>>> + FromQual, ToQual);
>>>> + if (SameTemplate) {
>>>> + const TemplateSpecializationType *FromArgTST =
>>>> + GetTemplateSpecializationType(Context, FromType);
>>>> + const TemplateSpecializationType *ToArgTST =
>>>> + GetTemplateSpecializationType(Context, ToType);
>>>> + if (FromArgTST && ToArgTST) {
>>>> +
>>>> Tree.SetNode(FromArgTST->getTemplateName().getAsTemplateDecl(),
>>>> +
>>>> ToArgTST->getTemplateName().getAsTemplateDecl());
>>>> + Tree.SetNode(FromQual, ToQual);
>>>> + DiffTemplate(FromArgTST, ToArgTST);
>>>> }
>>>> }
>>>> }
>>>>
>>>> The indent here is now off... and this is crazily nested.
>>>>
>>>> Can we factor this function into smaller pieces with less nesting? I
>>>> think that would make it much easier to read.
>>>>
>>>> @@ -824,62 +841,120 @@
>>>> }
>>>> }
>>>>
>>>> + static void RemoveQualifiers(Qualifiers &Qual, Qualifiers
>>>> RemoveQual) {
>>>>
>>>> I feel like this should be a method on Qualifiers?
>>>>
>>>> + // Removes any common qualifiers from ToQual and FromQual and places
>>>> them
>>>> + // in CommonQual.
>>>> + void DiffQualifiers(Qualifiers &FromQual, Qualifiers &ToQual,
>>>>
>>>> I feel like this should also be provided by Qualifiers -- probably as a
>>>> static factory function?
>>>>
>>>
>>> Good idea. I'll make a new patch for the Qualifiers stuff.
>>>
>>
>> Qualifiers functions pulled out and committed in a separate patch.
>> Updated patch attached.
>>
>
>
New patch, with the much simpler Qualifers handling.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20120928/224a9c73/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: qualifers-type-diffing4.patch
Type: application/octet-stream
Size: 21349 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20120928/224a9c73/attachment.obj>
More information about the cfe-commits
mailing list