> On Apr 27, 2014, at 10:09 AM, Prathamesh Kulkarni 
> <bilbotheelffri...@gmail.com> wrote:
> 
>> On Sun, Apr 27, 2014 at 8:48 PM, Trevor Saunders <tsaund...@mozilla.com> 
>> wrote:
>>> On Sun, Apr 27, 2014 at 06:21:20PM +0530, Prathamesh Kulkarni wrote:
>>>> On Sun, Apr 27, 2014 at 5:31 PM, Trevor Saunders <tsaund...@mozilla.com> 
>>>> wrote:
>>>>> On Sun, Apr 27, 2014 at 02:31:46AM +0530, Prathamesh Kulkarni wrote:
>>>>> Hi,
>>>>>    Shall it a good idea to add new warning -Wsizeof-array-argument that
>>>>> warns when sizeof is applied on parameter declared as an array ?
>>>> 
>>>> Seems reasonable enough.
>>>> 
>>>>> Similar to clang's -Wsizeof-array-argument:
>>>>> http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20110613/042812.html
>>>>> This was also reported as PR6940:
>>>>> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=6940
>>>>> 
>>>>> I have attached a patch that adds the warning to C front-end.
>>>> 
>>>> if we're doing this for C, we should probably do it for C++ too.
>>>> 
>>>>> I implemented it by adding a new member BOOL_BITFIELD is_array_parm to
>>>>> tree_parm_decl. Not sure if that's a good approach.
>>>> 
>>>> I'm about the last one who should comment on this, but it seems pretty
>>>> crazy you can't use data that's already stored.
>>> AFAIU, the information about declarator is stored in c_declarator.
>>> c_declarator->kind == cdk_array holds true
>>> if the declarator is an array. However in push_parm_decl, call to
>>> grokdeclarator returns decl of pointer_type, corresponding to array
>>> declarator if the array is parameter (TREE_TYPE (decl) is
>>> pointer_type). So I guess we lose that information there.
>> 
>> I guess that sort of makes sense, so I'll shut up ;)
>> 
>>>>> Index: gcc/tree-core.h
>>>>> ===================================================================
>>>>> --- gcc/tree-core.h   (revision 209800)
>>>>> +++ gcc/tree-core.h   (working copy)
>>>>> @@ -1411,6 +1411,7 @@ struct GTY(()) tree_const_decl {
>>>>> struct GTY(()) tree_parm_decl {
>>>>>   struct tree_decl_with_rtl common;
>>>>>   rtx incoming_rtl;
>>>>> +  BOOL_BITFIELD is_array_parm;
>>>> 
>>>> BOOL_BITFIELD only makes sense if you declare it as an actually bitfield
>>>> with size less than that of unisgned int, otherwise you might as well
>>>> use that directly.  On the other hand I wonder if we can't just nuke
>>>> BOOL_BITFIELD, it seems to be legacy from a time of C and bool not being
>>>> a builtin type?
>>> Thanks, I wasn't aware of that. Could we now use C++ bool type instead ?
>> 
>> you can certainly do |bool x;| as struct fields, that's already all
>> over.  However its not entirely clear to me if |bool x : 1;| will work
>> everywhere and take the single bit you'd expect, istr there being
>> compilers that do stupid things if you use multiple types next to each
>> other in bitfields, but I'm not sure if we need to care about any of
>> those.
> Changed to bool is_array_parm;
> and from macros to inline functions.

I don't like this field being part of the generic code as it increases the size 
of the struct for all front-ends and even during LTO. Is there a way to do this 
using one of the language specific bitfields that are already there (language 
flags iirc)?

Thanks,
Andrew


> 
> [gcc]
> * tree-core.h (tree_parm_decl): Add new member bool is_array_parm
> * tree.h (set_parm_decl_is_array): New function.
>            (parm_decl_array_p): New function.
> 
> [gcc/c]
> * c-decl.c (push_parm_decl): Call set_parm_decl_is_array.
> * c-typeck.c (c_expr_sizeof_expr): Add check for sizeof-array-argument 
> warning.
> 
> [gcc/c-family]
> * c.opt (-Wsizeof-array-argument): New option.
> 
> [gcc/testsuite/gcc.dg]
> * sizeof-array-argument.c: New test-case.
> 
> Thanks and Regards,
> Prathamesh
>> 
>> Trev
>> 
>>>> 
>>>>> Index: gcc/tree.h
>>>>> ===================================================================
>>>>> --- gcc/tree.h        (revision 209800)
>>>>> +++ gcc/tree.h        (working copy)
>>>>> @@ -1742,6 +1742,7 @@ extern void protected_set_expr_location
>>>>> #define TYPE_LANG_SPECIFIC(NODE) \
>>>>>   (TYPE_CHECK (NODE)->type_with_lang_specific.lang_specific)
>>>>> 
>>>>> +
>>>>> #define TYPE_VALUES(NODE) (ENUMERAL_TYPE_CHECK 
>>>>> (NODE)->type_non_common.values)
>>>>> #define TYPE_DOMAIN(NODE) (ARRAY_TYPE_CHECK 
>>>>> (NODE)->type_non_common.values)
>>>>> #define TYPE_FIELDS(NODE) \
>>>>> @@ -2258,6 +2259,12 @@ extern void decl_value_expr_insert (tree
>>>>> #define DECL_INCOMING_RTL(NODE) \
>>>>>   (PARM_DECL_CHECK (NODE)->parm_decl.incoming_rtl)
>>>>> 
>>>>> +#define SET_PARM_DECL_IS_ARRAY(NODE, val) \
>>>>> +  (PARM_DECL_CHECK (NODE)->parm_decl.is_array_parm = (val))
>>>> 
>>>> if we're adding more stuff here is there a reason it needs to be a macro
>>>> not a inline function?
>>> No, shall change that to inline function.
>>>> 
>>>> Trev
> <sizeof-array-argument.patch>

Reply via email to