c-decl.c (warn_cxx_compat_finish_struct): New parameters code, record_loc.
authorPrathamesh Kulkarni <prathamesh.kulkarni@linaro.org>
Wed, 3 Jun 2015 15:10:44 +0000 (15:10 +0000)
committerPrathamesh Kulkarni <prathamesh3492@gcc.gnu.org>
Wed, 3 Jun 2015 15:10:44 +0000 (15:10 +0000)
2015-06-03  Prathamesh Kulkarni  <prathamesh.kulkarni@linaro.org>

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.

testsuite/
        * gcc.dg/Wcxx-compat-22.c: New testcase.
        * c-c++-common/Wsizeof-pointer-memaccess1.c: Pass -Wno-c++-compat.
        * c-c++-common/Wsizeof-pointer-memaccess2.c: Likewise.
        * c-c++-common/pr58346-1.c: Likewise.
        * c-c++-common/transparent-union-1.c: Likewise.

From-SVN: r224083

gcc/c/ChangeLog
gcc/c/c-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/Wsizeof-pointer-memaccess1.c
gcc/testsuite/c-c++-common/Wsizeof-pointer-memaccess2.c
gcc/testsuite/c-c++-common/pr58346-1.c
gcc/testsuite/c-c++-common/transparent-union-1.c
gcc/testsuite/gcc.dg/Wcxx-compat-22.c [new file with mode: 0644]

index a4bf6203ccf94217f10883d55afbd0b79b570f6d..69344bb7bb10b372283116a44ca7442d1d94e1e1 100644 (file)
@@ -1,3 +1,9 @@
+2015-06-03  Prathamesh Kulkarni  <prathamesh.kulkarni@linaro.org>
+
+       * 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.
+
 2015-06-02  Andres Tiraboschi  <andres.tiraboschi@tallertechnologies.com>
 
        * c-decl.c (start_function): Call plugin before parsing.
index efdf9028596c2cc3777d6ea2106cfa4cb068508f..efb978b97e1dd0226f355c465f2a100cd6904121 100644 (file)
@@ -7525,12 +7525,23 @@ detect_field_duplicates (tree fieldlist)
 /* Finish up struct info used by -Wc++-compat.  */
 
 static void
-warn_cxx_compat_finish_struct (tree fieldlist)
+warn_cxx_compat_finish_struct (tree fieldlist, enum tree_code code,
+                              location_t record_loc)
 {
   unsigned int ix;
   tree x;
   struct c_binding *b;
 
+  if (fieldlist == NULL_TREE)
+    {
+      if (code == RECORD_TYPE)
+       warning_at (record_loc, OPT_Wc___compat,
+                   "empty struct has size 0 in C, size 1 in C++");
+      else
+       warning_at (record_loc, OPT_Wc___compat,
+                   "empty union has size 0 in C, size 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
@@ -7863,7 +7874,7 @@ finish_struct (location_t loc, tree t, tree fieldlist, tree attributes,
                          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, TREE_CODE (t), loc);
 
   struct_parse_info->struct_types.release ();
   struct_parse_info->fields.release ();
index 13e7ecb4a147a580e4ba317032a2940b4d3e39bf..efd859b8ef55b4e072b3eaae3e2140823b319779 100644 (file)
@@ -1,3 +1,11 @@
+2015-06-03  Prathamesh Kulkarni  <prathamesh.kulkarni@linaro.org>
+
+       * gcc.dg/Wcxx-compat-22.c: New testcase.
+       * c-c++-common/Wsizeof-pointer-memaccess1.c: Pass -Wno-c++-compat.
+       * c-c++-common/Wsizeof-pointer-memaccess2.c: Likewise.
+       * c-c++-common/pr58346-1.c: Likewise.
+       * c-c++-common/transparent-union-1.c: Likewise.
+
 2015-06-02  Andres Tiraboschi  <andres.tiraboschi@tallertechnologies.com>
 
        * g++.dg/plugin/plugin.exp: Add def-plugin-test.C.
index 8e829d61ae0b784fee319753bd916c4a3b2dbdff..27c5da426bdc666da3d67bf735c27f6e4231136c 100644 (file)
@@ -1,6 +1,7 @@
 /* Test -Wsizeof-pointer-memaccess warnings.  */
 /* { dg-do compile } */
 /* { dg-options "-Wall -Wno-sizeof-array-argument" } */
+/* { dg-options "-Wall -Wno-sizeof-array-argument -Wno-c++-compat" { target c } } */
 
 typedef __SIZE_TYPE__ size_t;
 #ifdef __cplusplus
index fe17a7056abdab26e73744c95c3cc9a08f0bdfde..e067d7d44e90f75fdf41e8d6895dd0315aad4bea 100644 (file)
@@ -1,6 +1,7 @@
 /* Test -Wsizeof-pointer-memaccess warnings.  */
 /* { dg-do compile } */
 /* { dg-options "-Wall -O2 -Wno-sizeof-array-argument" } */
+/* { dg-options "-Wall -O2 -Wno-sizeof-array-argument -Wno-c++-compat" {target c} } */
 
 #define bos(ptr) __builtin_object_size (ptr, 1)
 #define bos0(ptr) __builtin_object_size (ptr, 0)
index 371fcf48454d151f1bdbdd7b31d6a0b0a8d5a707..70a16d12d97e86253c987747e3dd7e5045e85361 100644 (file)
@@ -1,5 +1,6 @@
 /* PR c/58346 */
 /* { dg-do compile } */
+/* { dg-options "-Wno-c++-compat" { target c } } */
 
 struct U {
 #ifdef __cplusplus
index 3fb6e782a14eb2d0cf40e763523aa4c85aef9678..91f2642fdbc8930efb300cbc08339f2cd31f3d64 100644 (file)
@@ -1,4 +1,5 @@
 /* PR c++/51228 */
+/* { dg-options "-Wno-c++-compat" { target c } } */
 
 typedef union {} U __attribute__((transparent_union)); /* { dg-warning "ignored" } */
 
diff --git a/gcc/testsuite/gcc.dg/Wcxx-compat-22.c b/gcc/testsuite/gcc.dg/Wcxx-compat-22.c
new file mode 100644 (file)
index 0000000..60b05ca
--- /dev/null
@@ -0,0 +1,8 @@
+/* { 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" } */
+struct C { struct D {}; int x; }; /* { dg-warning "empty struct has size 0 in C|declaration does not declare anything" } */
+struct E { union F {}; int x; }; /* { dg-warning "empty union has size 0 in C|declaration does not declare anything" } */
+union G { union H {}; int x; }; /* { dg-warning "empty union has size 0 in C|declaration does not declare anything" } */
+union I { struct J {}; int x; }; /* { dg-warning "empty struct has size 0 in C|declaration does not declare anything" } */