[PATCH] Fix return type deduction for member templates

Faisalv faisalv at gmail.com
Thu Jun 13 15:40:21 PDT 2013



On Jun 13, 2013, at 4:30 PM, Richard Smith <richard at metafoo.co.uk> wrote:

> Hi Faisal,
> 
> On Thu, Jun 13, 2013 at 11:30 AM, Faisal Vali <faisalv at gmail.com> wrote:
>> While implementing return type deduction for generic lambdas, I stumbled upon
>> a bug which led to clang mishandling the following code:
>> 
>> struct Lambda {
>>  template<class T> auto operator()(T t) {
>>    return 5;
>>  }
>> template<class T> auto foo(T t) { return t; }
>> };
>> void test() {
>>    Lambda L;
>>    int i = L(3);
>> }
>> 
>> 
>> The issue (as i understand it) was that in some contexts only the
>> function template (and not the specialization) would get passed to
>> DiagnoseUseOfDecl (which deduces the return type of the function).  So
>> the specialization would flow through to Codegen with auto as its
>> return type.
>> 
>> So, with that in mind, this patch implements a trivial fix.
>> 
>> What do you think Richard? Is there a better way to address this bug?
> 
> I was aware of this issue, but got snowed under with other things.
> This bug is not limited to 'auto' type deduction; the other code in
> DiagnoseUseOfDecl suffers the same way. For instance:
> 
> struct Lambda {
>  template<class T> static __attribute__((unused)) int foo(T) {
>    return 5;
>  }
> };
> int bar() {
>    Lambda L;
>    return L.foo(3);
> }
> 
> ... does not warn that the function is marked 'unused' but is used,
> but if you call it as Lambda::foo(3), it does warn.
> 
> I think the right fix here is to pass both the declaration found by
> name lookup and the declaration that is actually used into
> DiagnoseUseOfDecl.
> 

What if i just call diagnoseuseofdecl again on the used specialization instead of adding a parameter to it?




>> Are there other places this could happen (ie. template conversion operator?)
> 
> I think there were, but I don't remember. Another thing to try is
> hiding the function behind a 'using' declaration.




More information about the cfe-commits mailing list