Sent from my iPhone

On Jun 13, 2013, at 7:36 PM, Richard Smith <[email protected]> wrote:

> On Thu, Jun 13, 2013 at 3:40 PM, Faisalv <[email protected]> wrote:
>> 
>> 
>> On Jun 13, 2013, at 4:30 PM, Richard Smith <[email protected]> wrote:
>> 
>>> Hi Faisal,
>>> 
>>> On Thu, Jun 13, 2013 at 11:30 AM, Faisal Vali <[email protected]> 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?
> 
> If this is the only call which has the problem, then that would be OK.
> I suspect there are other cases, though, and there are probably cases
> which have the opposite bug (passing only the used decl and not the
> found decl). As a quick fix, making two calls would work, but it's
> probably not what we want in the longer term.


If its ok w u, for now id rather do the quick fix, place the appropriate fixmes 
- and then try and return to this once generic lambdas are starting to be 
reasonably usable (plus i still have to figure out that pesky non-odr use, 
rvalue emission issue - which also i'm going to deprioritize a lil in favor of 
usable generic lambdas for now). Thoughts?
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to