Hi!

-Wpadded warnings aren't really useful for the artificial types that GCC
lays out for ubsan.

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk?

2020-04-20  Jakub Jelinek  <ja...@redhat.com>

        PR c/94641
        * ubsan.c (ubsan_get_type_descriptor_type,
        ubsan_get_source_location_type, ubsan_create_data): Temporarily
        disable warn_padded for the layout_type calls.

        * c-c++-common/ubsan/pr94641.c: New test.

--- gcc/ubsan.c.jj      2020-01-12 11:54:38.529381484 +0100
+++ gcc/ubsan.c 2020-04-20 09:51:16.805090228 +0200
@@ -229,7 +229,10 @@ ubsan_get_type_descriptor_type (void)
   TYPE_FIELDS (ret) = fields[0];
   TYPE_NAME (ret) = type_decl;
   TYPE_STUB_DECL (ret) = type_decl;
+  int saved_warn_padded = warn_padded;
+  warn_padded = 0;
   layout_type (ret);
+  warn_padded = saved_warn_padded;
   ubsan_type_descriptor_type = ret;
   return ret;
 }
@@ -277,7 +280,10 @@ ubsan_get_source_location_type (void)
   TYPE_FIELDS (ret) = fields[0];
   TYPE_NAME (ret) = type_decl;
   TYPE_STUB_DECL (ret) = type_decl;
+  int saved_warn_padded = warn_padded;
+  warn_padded = 0;
   layout_type (ret);
+  warn_padded = saved_warn_padded;
   ubsan_source_location_type = ret;
   return ret;
 }
@@ -593,7 +599,10 @@ ubsan_create_data (const char *name, int
   TYPE_FIELDS (ret) = fields[0];
   TYPE_NAME (ret) = type_decl;
   TYPE_STUB_DECL (ret) = type_decl;
+  int saved_warn_padded = warn_padded;
+  warn_padded = 0;
   layout_type (ret);
+  warn_padded = saved_warn_padded;
 
   /* Now, fill in the type.  */
   char tmp_name[32];
--- gcc/testsuite/c-c++-common/ubsan/pr94641.c.jj       2020-04-20 
09:54:02.036564064 +0200
+++ gcc/testsuite/c-c++-common/ubsan/pr94641.c  2020-04-20 09:53:01.101495679 
+0200
@@ -0,0 +1,11 @@
+/* PR c/94641 */
+/* { dg-do compile } */
+/* { dg-options "-fsanitize=undefined -Wpadded" } */
+
+void foo (void *) __attribute__((nonnull));
+
+void
+bar (void *p)
+{
+  foo (p);
+}

        Jakub

Reply via email to