Hi, For the following test-case: struct A {}; clang -fsyntax-only -Wc++-compat gives following warning and gcc does not: empty-struct.c:1:1: warning: empty struct has size 0 in C, size 1 in C++ [-Wc++-compat] struct F {};
This patch adds the above warning to the C FE. Bootstrapped on x86_64-unknown-linux-gnu (reg-test pending). * gcc/c/c-decl.c (warn_cxx_compat_finish_struct): Add new parameter of type location_t. Warn for empty struct. (finish_struct): Pass loc to warn_cxx_compat_finish_struct. * gcc/testsuite/gcc.dg/Wcxx-compat-22.c: New test-case. Thank you, Prathamesh
Index: gcc/c/c-decl.c =================================================================== --- gcc/c/c-decl.c (revision 217287) +++ gcc/c/c-decl.c (working copy) @@ -7506,12 +7506,15 @@ /* 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 struct has size 0 in C, 1 in C++"); + /* Set the C_TYPE_DEFINED_IN_STRUCT flag for each type defined in the current struct. We do this now at the end of the struct because the flag is used to issue visibility warnings, and we @@ -7844,7 +7847,7 @@ DECL_EXPR, build_decl (loc, TYPE_DECL, NULL, t))); if (warn_cxx_compat) - warn_cxx_compat_finish_struct (fieldlist); + warn_cxx_compat_finish_struct (fieldlist, loc); struct_parse_info->struct_types.release (); struct_parse_info->fields.release (); 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,3 @@ +/* { dg-do compile } */ +/* { dg-options "-Wc++-compat" } */ +struct A {}; /* { dg-warning "empty struct has size 0 in C" } */