re PR c++/84502 (Argument corruption when passing empty templated struct)
authorJakub Jelinek <jakub@redhat.com>
Thu, 22 Feb 2018 08:29:56 +0000 (09:29 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 22 Feb 2018 08:29:56 +0000 (09:29 +0100)
PR target/84502
* stor-layout.c (finalize_type_size): Propagate TYPE_EMPTY_P flag
to all type variants.

* g++.dg/torture/pr84502.C: New test.

From-SVN: r257892

gcc/ChangeLog
gcc/stor-layout.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr84502.C [new file with mode: 0644]

index 914d6cba248879039b330a223a7a0b0b871d8f9e..07dd795476df6a59aab56a7e51b8cedf9367bbf8 100644 (file)
@@ -1,5 +1,9 @@
 2018-02-22  Jakub Jelinek  <jakub@redhat.com>
 
+       PR target/84502
+       * stor-layout.c (finalize_type_size): Propagate TYPE_EMPTY_P flag
+       to all type variants.
+
        PR tree-optimization/84503
        * gimple-ssa-store-merging.c (merged_store_group::merge_into): Compute
        width as info->bitpos + info->bitsize - start.
index 5fdf81a9a25f567301215b57fff957aca23d8b40..a4eeff18ec0db855b569505b9096858cbe211d41 100644 (file)
@@ -1883,6 +1883,9 @@ finalize_type_size (tree type)
       && TREE_CODE (TYPE_SIZE_UNIT (type)) != INTEGER_CST)
     TYPE_SIZE_UNIT (type) = variable_size (TYPE_SIZE_UNIT (type));
 
+  /* Handle empty records as per the x86-64 psABI.  */
+  TYPE_EMPTY_P (type) = targetm.calls.empty_record_p (type);
+
   /* Also layout any other variants of the type.  */
   if (TYPE_NEXT_VARIANT (type)
       || type != TYPE_MAIN_VARIANT (type))
@@ -1895,6 +1898,7 @@ finalize_type_size (tree type)
       unsigned int precision = TYPE_PRECISION (type);
       unsigned int user_align = TYPE_USER_ALIGN (type);
       machine_mode mode = TYPE_MODE (type);
+      bool empty_p = TYPE_EMPTY_P (type);
 
       /* Copy it into all variants.  */
       for (variant = TYPE_MAIN_VARIANT (type);
@@ -1911,11 +1915,9 @@ finalize_type_size (tree type)
          SET_TYPE_ALIGN (variant, valign);
          TYPE_PRECISION (variant) = precision;
          SET_TYPE_MODE (variant, mode);
+         TYPE_EMPTY_P (variant) = empty_p;
        }
     }
-
-  /* Handle empty records as per the x86-64 psABI.  */
-  TYPE_EMPTY_P (type) = targetm.calls.empty_record_p (type);
 }
 
 /* Return a new underlying object for a bitfield started with FIELD.  */
index 19b85bb350c812908c89c5d2c229b220e298d616..681971b208e1a468ca836f0822cb12a2ca576d12 100644 (file)
@@ -1,5 +1,8 @@
 2018-02-22  Jakub Jelinek  <jakub@redhat.com>
 
+       PR target/84502
+       * g++.dg/torture/pr84502.C: New test.
+
        PR tree-optimization/84503
        * gcc.dg/pr84503-1.c: New test.
        * gcc.dg/pr84503-2.c: New test.
diff --git a/gcc/testsuite/g++.dg/torture/pr84502.C b/gcc/testsuite/g++.dg/torture/pr84502.C
new file mode 100644 (file)
index 0000000..befde4e
--- /dev/null
@@ -0,0 +1,20 @@
+// PR target/84502
+// { dg-do run }
+
+template<typename T>
+struct A { };
+using X = A<int>;
+
+void
+foo (X, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
+{
+  if (a1 != 0 || a2 != 1 || a3 != 2 || a4 != 3
+      || a5 != 4 || a6 != 5 || a7 != 6 || a8 != 7)
+    __builtin_abort ();
+}
+
+int
+main ()
+{
+  foo (X{}, 0, 1, 2, 3, 4, 5, 6, 7);
+}