On Dec 6, 2010, at 10:33 AM, John McCall wrote:

> 
> On Dec 6, 2010, at 10:25 AM, Argyrios Kyrtzidis wrote:
> 
>> 
>> On Dec 6, 2010, at 10:12 AM, John McCall wrote:
>> 
>>> 
>>> On Dec 6, 2010, at 10:06 AM, Argyrios Kyrtzidis wrote:
>>> 
>>>> On Dec 5, 2010, at 8:33 PM, John McCall wrote:
>>>> 
>>>>> 
>>>>> On Dec 3, 2010, at 5:12 PM, Argyrios Kyrtzidis wrote:
>>>>> 
>>>>>> Author: akirtzidis
>>>>>> Date: Fri Dec  3 19:12:11 2010
>>>>>> New Revision: 120872
>>>>>> 
>>>>>> URL: http://llvm.org/viewvc/llvm-project?rev=120872&view=rev
>>>>>> Log:
>>>>>> Mark functions referenced by 'cleanup' attribute as used. Fixes 
>>>>>> rdar://8728293
>>>>> 
>>>>>> 
>>>>>> Modified:
>>>>>> cfe/trunk/lib/Sema/SemaDeclAttr.cpp
>>>>>> cfe/trunk/test/Sema/warn-unused-function.c
>>>>>> 
>>>>>> Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp
>>>>>> URL: 
>>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=120872&r1=120871&r2=120872&view=diff
>>>>>> ==============================================================================
>>>>>> --- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original)
>>>>>> +++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Fri Dec  3 19:12:11 2010
>>>>>> @@ -1450,6 +1450,7 @@
>>>>>> }
>>>>>> 
>>>>>> d->addAttr(::new (S.Context) CleanupAttr(Attr.getLoc(), S.Context, FD));
>>>>>> +  FD->setUsed();
>>>>>> }
>>>>> 
>>>>> Technically, you can use __attribute__((cleanup)) inside a template.  
>>>>> This should use MarkDeclarationReferenced, and then there should be 
>>>>> special instantiation logic for the attribute.
>>>> 
>>>> Hmm, is this really the right approach ? If it's referenced from a 
>>>> template which is not instantiated, it's not used from the codegen 
>>>> perspective but how about from the user's perspective:
>>>> 
>>>> -We emit a warning that the function 'foo' is unused.
>>>> -User removes function 'foo'
>>>> -Now we emit an error that 'foo' is not found.
>>> 
>>> Oh, you mean if a function is referenced from a template definition that's 
>>> never instantiated?  Yeah, that's a valid user complaint.  That's not 
>>> specific to attribute((cleanup)), though;  any reference without dependent 
>>> ADL will have that issue.
>> 
>> For this specific case, the lookup is always non-dependent, I think the 
>> right user perspective is that the 'foo' is referenced if the attribute 
>> references it even in uninstantiated templates.
> 
> It could be dependent if we implemented overloading on it. :)
> 
> I'm not sure why __attribute__((cleanup("foo"))) is different from, say, an 
> explicit call to (foo)(x), or &foo.  In all of these cases, from the user's 
> perspective the function is used, because their code probably won't compile 
> if you remove the declaration.  So you should still use 
> MarkDeclarationReferenced, and if we want to teach MarkDeclarationReferenced 
> about this user notion of a dependent use, we've got one place to change.

Sounds good, thanks.

> 
> John.


_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to