Handle trailing arrays in ODR warning (PR lto/81440).
authorMartin Liska <mliska@suse.cz>
Tue, 23 Jan 2018 15:46:02 +0000 (16:46 +0100)
committerMartin Liska <marxin@gcc.gnu.org>
Tue, 23 Jan 2018 15:46:02 +0000 (15:46 +0000)
2018-01-23  Martin Liska  <mliska@suse.cz>

PR lto/81440
* lto-symtab.c (lto_symtab_merge): Handle and do not warn about
trailing arrays at the end of a struct.
2018-01-23  Martin Liska  <mliska@suse.cz>

PR lto/81440
* gcc.dg/lto/pr81440.h: New test.
* gcc.dg/lto/pr81440_0.c: New test.
* gcc.dg/lto/pr81440_1.c: New test.

From-SVN: r256989

gcc/lto/ChangeLog
gcc/lto/lto-symtab.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/lto/pr81440.h [new file with mode: 0644]
gcc/testsuite/gcc.dg/lto/pr81440_0.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/lto/pr81440_1.c [new file with mode: 0644]

index 9c5f292fe5fe26b805c445e063b634f16904ff58..67679bc861d1b6ae8195dfac393cc0384e71816b 100644 (file)
@@ -1,3 +1,9 @@
+2018-01-23  Martin Liska  <mliska@suse.cz>
+
+       PR lto/81440
+       * lto-symtab.c (lto_symtab_merge): Handle and do not warn about
+       trailing arrays at the end of a struct.
+
 2018-01-03  Richard Sandiford  <richard.sandiford@linaro.org>
            Alan Hayward  <alan.hayward@arm.com>
            David Sherwood  <david.sherwood@arm.com>
index ee02a534714ff628c657dc094ba1921a1a8b4120..0f0b958e98dcd347968e5925a31fb787973778db 100644 (file)
@@ -352,18 +352,31 @@ lto_symtab_merge (symtab_node *prevailing, symtab_node *entry)
     return false;
 
   if (DECL_SIZE (decl) && DECL_SIZE (prevailing_decl)
-      && !tree_int_cst_equal (DECL_SIZE (decl), DECL_SIZE (prevailing_decl))
+      && !tree_int_cst_equal (DECL_SIZE (decl), DECL_SIZE (prevailing_decl)))
+      {
+       if (!DECL_COMMON (decl) && !DECL_EXTERNAL (decl))
+         return false;
+
+       tree type = TREE_TYPE (decl);
+
+       /* For record type, check for array at the end of the structure.  */
+       if (TREE_CODE (type) == RECORD_TYPE)
+         {
+           tree field = TYPE_FIELDS (type);
+           while (DECL_CHAIN (field) != NULL_TREE)
+             field = DECL_CHAIN (field);
+
+           return TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE;
+         }
       /* As a special case do not warn about merging
         int a[];
         and
         int a[]={1,2,3};
         here the first declaration is COMMON
         and sizeof(a) == sizeof (int).  */
-      && ((!DECL_COMMON (decl) && !DECL_EXTERNAL (decl))
-         || TREE_CODE (TREE_TYPE (decl)) != ARRAY_TYPE
-         || TYPE_SIZE (TREE_TYPE (decl))
-            != TYPE_SIZE (TREE_TYPE (TREE_TYPE (decl)))))
-    return false;
+       else if (TREE_CODE (type) == ARRAY_TYPE)
+         return (TYPE_SIZE (decl) == TYPE_SIZE (TREE_TYPE (type)));
+      }
 
   return true;
 }
index 17399f97a8004720e763c460dae97bac814d188e..b7211ce8228008f79ebaa6acf148796ee7a43566 100644 (file)
@@ -1,3 +1,10 @@
+2018-01-23  Martin Liska  <mliska@suse.cz>
+
+       PR lto/81440
+       * gcc.dg/lto/pr81440.h: New test.
+       * gcc.dg/lto/pr81440_0.c: New test.
+       * gcc.dg/lto/pr81440_1.c: New test.
+
 2018-01-23  Nathan Sidwell  <nathan@acm.org>
 
        PR c++/83988
diff --git a/gcc/testsuite/gcc.dg/lto/pr81440.h b/gcc/testsuite/gcc.dg/lto/pr81440.h
new file mode 100644 (file)
index 0000000..d9e6c3d
--- /dev/null
@@ -0,0 +1,4 @@
+typedef struct {
+  int i;
+  int ints[];
+} struct_t;
diff --git a/gcc/testsuite/gcc.dg/lto/pr81440_0.c b/gcc/testsuite/gcc.dg/lto/pr81440_0.c
new file mode 100644 (file)
index 0000000..07f2a87
--- /dev/null
@@ -0,0 +1,9 @@
+/* { dg-lto-do link } */
+
+#include "pr81440.h"
+
+extern struct_t my_struct;
+
+int main() {
+ return my_struct.ints[0];
+}
diff --git a/gcc/testsuite/gcc.dg/lto/pr81440_1.c b/gcc/testsuite/gcc.dg/lto/pr81440_1.c
new file mode 100644 (file)
index 0000000..d035330
--- /dev/null
@@ -0,0 +1,6 @@
+#include "pr81440.h"
+
+struct_t my_struct = {
+ 20,
+ { 1, 2 }
+};