[cfe-commits] [Patch] Add handling of APSInt to Template Type Diffing - Fixes PR14015

Richard Trieu rtrieu at google.com
Thu Nov 1 14:32:10 PDT 2012


On Mon, Oct 22, 2012 at 3:24 PM, Richard Trieu <rtrieu at google.com> wrote:

>
>
> On Mon, Oct 22, 2012 at 2:37 PM, Matthew Curtis <mcurtis at codeaurora.org>wrote:
>
>>  On 10/8/2012 8:55 PM, Richard Trieu wrote:
>>
>> An assumption during the creation of Template Type Diffing expected that
>> integral arguments would be available as Expr's (e.g. IntegralLiteral).
>>  However, it appears that in some cases, the TemplateArgument gives an
>> Expr, and in others, TemplateArgument only gives an APSInt.  This patch
>> allows Template Type Diffing to handle APSInt by storing in inside the tree
>> nodes, as well as other bits of information needed.  Also, in cases where
>> one argument is given as an Expr and the other as an APSInt, evaluate the
>> Expr and store the result as an APSInt.
>>
>> _______________________________________________
>> cfe-commits mailing listcfe-commits at cs.uiuc.eduhttp://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>>
>> A couple of minor things related to comments:
>>
>>  @@ -566,6 +581,12 @@
>>               (FlatTree[ReadNode].FromTD || FlatTree[ReadNode].ToTD);
>>      }
>>
>> +    /// NodeIsAPSInt - Returns true if the *arugments* are stored in
>> APSInt's.
>>
>>                                               *^** misspelling*
>>
>> +    bool NodeIsAPSInt() {
>> +      return FlatTree[ReadNode].IsValidFromInt ||
>> +             FlatTree[ReadNode].IsValidToInt;
>> +    }
>> +
>>
>>
>>        // Handle Expressions
>>
>>            *^ should update comment now that we handle Integrals*
>>
>>       if (NonTypeTemplateParmDecl *DefaultNTTPD =
>>               dyn_cast<NonTypeTemplateParmDecl>(ParamND)) {
>>         Expr *FromExpr, *ToExpr;
>>         llvm::APSInt FromInt, ToInt;
>>         bool HasFromInt = !FromIter.isEnd() &&
>>                           FromIter->getKind() ==
>> TemplateArgument::Integral;
>>         bool HasToInt = !ToIter.isEnd() &&
>>                         ToIter->getKind() == TemplateArgument::Integral;
>>
>>
>>
>> And an observation:
>>
>> The patch favors converting Exprs to Ints which may lose information that
>> might be helpful to the user. For example, compiling this:
>>
>> template <int i> struct A { };
>> A<1+6> a1;
>> A<5+3> a2;
>> void f() { a1 = a2; }
>>
>> produces:
>>
>> error: no viable overloaded '='
>> void f() { a1 = a2; }
>>            ~~ ^ ~~
>> note: candidate function (the implicit copy assignment operator) not
>> viable: no known conversion from *'A<8>' to 'A<7>'* for 1st argument
>> template <int i> struct A { };
>>                         ^
>> 1 error generated.
>>
>>
>> If we preserve Exprs in, we get:
>>
>> error: no viable overloaded '='
>> void f() { a1 = a2; }
>>            ~~ ^ ~~
>> note: candidate function (the implicit copy assignment operator) not
>> viable: no known conversion from *'A<5 + 3>' to 'A<7>'* for 1st argument
>> template <int i> struct A { };
>>                         ^
>> 1 error generated.
>>
>>
>> Not sure how important this is, just something I noticed. In this simple
>> example it's obvious that '8' is '5 + 3', but I could see a more
>> complicated expression causing confusion.
>>
>
> It doesn't seem as useful to have the whole expression on one side when
> the other side already has 1+6 changed to 7.  This also allows for the
> assumption that if the two templates have an argument, they are of the same
> type.
>
>>
>> Otherwise LGTM (though I'm perhaps too much of a newbie here for my
>> approval to carry much weight).
>>
>> Cheers,
>> Matthew Curtis.
>>
>>
>> --
>> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
>>
>>
> Committed at r167252.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20121101/028e488b/attachment.html>


More information about the cfe-commits mailing list