[C PATCH] warn for empty struct -Wc++-compat
Marek Polacek
polacek@redhat.com
Tue Nov 11 11:00:00 GMT 2014
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.
Thanks,
Marek
More information about the Gcc-patches
mailing list