[C PATCH] warn for empty struct -Wc++-compat
Prathamesh Kulkarni
bilbotheelffriend@gmail.com
Tue Nov 11 18:04:00 GMT 2014
On Tue, Nov 11, 2014 at 4:30 PM, Marek Polacek <polacek@redhat.com> wrote:
> On Tue, Nov 11, 2014 at 04:45:46AM +0530, Prathamesh Kulkarni wrote:
>> Index: gcc/c/c-decl.c
>> ===================================================================
>> --- gcc/c/c-decl.c (revision 217287)
>> +++ gcc/c/c-decl.c (working copy)
>> @@ -606,6 +606,8 @@
>> /* If warn_cxx_compat, a list of typedef names used when defining
>> fields in this struct. */
>> vec<tree> typedefs_seen;
>> + /* code to distinguish between struct/union */
>> + enum tree_code code;
>
> I don't think this is desirable, you might just pass T down from
> finish_struct to warn_cxx_compat_finish_struct.
>
>> @@ -7506,12 +7509,19 @@
>> /* Finish up struct info used by -Wc++-compat. */
>>
>> static void
>> -warn_cxx_compat_finish_struct (tree fieldlist)
>> +warn_cxx_compat_finish_struct (tree fieldlist, location_t record_loc)
>> {
>> unsigned int ix;
>> tree x;
>> struct c_binding *b;
>>
>> + if (fieldlist == NULL_TREE)
>> + {
>> + warning_at (record_loc, OPT_Wc___compat,
>> + "empty %s has size 0 in C, 1 in C++",
>> + (struct_parse_info->code == RECORD_TYPE) ? "struct" : "union");
>> + }
>> +
>
> I think this won't work well wrt translations, so you need to have
> an if here. See the pedwarns at the beginning of finish_struct.
>
>> Index: gcc/testsuite/gcc.dg/Wcxx-compat-22.c
>> ===================================================================
>> --- gcc/testsuite/gcc.dg/Wcxx-compat-22.c (revision 0)
>> +++ gcc/testsuite/gcc.dg/Wcxx-compat-22.c (working copy)
>> @@ -0,0 +1,4 @@
>> +/* { dg-do compile } */
>> +/* { dg-options "-Wc++-compat" } */
>> +struct A {}; /* { dg-warning "empty struct has size 0 in C" } */
>> +union B {}; /* { dg-warning "empty union has size 0 in C" } */
>
> Please also test an empty struct in a struct.
I tried the following:
struct A { struct B {}; int x; } /* { dg-warning "empty struct has
size 0 in C" } */
/* { dg-bogus "delcaration
does not declare anything" } */
but it fails in excess errors.
How do I resolve this ?
Is the rest okay ?
[gcc/c]
* c-decl.c (warn_cxx_compat_finish_struct): New parameters code, record_loc.
Warn for empty struct.
(finish_struct): Pass TREE_CODE (t) and loc to
warn_cxx_compat_finish_struct.
[gcc/testsuite/gcc.dg]
* Wcxx-compat-22.c: New test-case.
Thank you,
Prathamesh
>
> Thanks,
>
> Marek
-------------- next part --------------
A non-text attachment was scrubbed...
Name: v3.patch
Type: text/x-patch
Size: 1768 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20141111/d383d05f/attachment.bin>
More information about the Gcc-patches
mailing list