[PLUGIN] Fix PLUGIN_FINISH_TYPE
Romain Geissler
romain.geissler@st.com
Tue Sep 13 12:25:00 GMT 2011
Hi
2011/9/12 Dodji Seketeli <dodji@seketeli.org>:
> Romain Geissler <romain.geissler@gmail.com> a écrit:
>> When i recontributed the PLUGIN_FINISH_DECL patch from the original
>> Brian Hackett, i didn't exactly checked what may or may not trigger
>> this new event. I know for example that declaring a function triggers
>> this event, but defining it does not.
>>
>> I don't really know when those event should be triggered, we should
>> clarify the meaning of those.
>>
>> According to me:
>> PLUGIN_FINISH_DECL should be triggered anytime the parser parse a
>> declaration (which includes declaration + definition of function,
>> typedef definition, namespaces, ..., all DECL_P trees built by the
>> parser).
>
> The general idea sounds sensible, IMHO. However, we must keep in mind
> that there are cases like, e.g, 'struct C;' where G++ creates a typedef
> 'typedef struct C C;' so that you can name that type 'C' instead of
> having to type "struct C' all the time. For these cases, I don't think
> the PLUGIN_FINISH_DECL event should be emitted.
I agree.
>
>> For, PLUGIN_FINISH_TYPE i don't really know it means a new type
>> declaration (or declaration + definition) or if it means usage of a
>> type (in a function prototype, the type of a local variable.
>
> I'd say it's a definition of a new type, IMHO.
Ok, so it only involves struct, unions, enum and class declaration / definitions.
>
>> I would rather vote for new type definition (including typedefs)
>
> My understanding is that a typedef declaration doesn't define a new
> type. Rather, it declares an alias for an existing type. As such, I
> would think that notifying typedef declarations via PLUGIN_FINISH_DECL
> would be the way to go.
Ok
>
>> but for special cases of struct, you can declare and use them at the
>> same time:
>
> Just to be sure I understand, do you need to be notified about *uses* of
> types and decls as well? If so, maybe a new kind of event should
> probably be defined, because PLUGIN_FINISH_DECL and PLUGIN_FINISH_TYPE
> seem to have more to do with declaring/defining decls and types than
> using them.
>
Personally i don't need to catch all struct uses, but i need to catch struct declarations.
I want to apply some __attributes__ to a given struct type, for example let's say i need
to mark *struct my_struct* as deprecated thanks to a plugin. I know how to apply some
attributes to a type or a decl. See the plugin (test_plugin.c) and the test files attached.
With test_pass.c, my_struct is declared first, then defined after, applying the deprecated
attribute works.
With test_fail.c, my_struct is declared and defined at the same time, applying the
deprecated attribute doesn't work with the current trunk (and also with my patch).
I got:
test_fail.c:4:1: warning: type attributes ignored after type is already defined [-Wattributes]
So i may need a PLUGIN_FINISH_TYPE_DECLARATION triggered when the type is declared but
before it is finally defined.
Does two different events PLUGIN_FINISH_TYPE_DECLARATION and PLUGIN_FINISH_TYPE_DEFINITION
make sens to you ?
> --
> Dodji
>
Romain Geissler
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: test_fail.c
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20110913/4a7d8395/attachment.c>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: test_pass.c
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20110913/4a7d8395/attachment-0001.c>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: test_plugin.c
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20110913/4a7d8395/attachment-0002.c>
More information about the Gcc-patches
mailing list