[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