On February 21, 2018 11:37:20 PM GMT+01:00, Jakub Jelinek <ja...@redhat.com> 
wrote:
>Hi!
>
>The following testcase shows that we set TYPE_EMPTY_P just one of the
>possibly many variants of an aggregate type.
>On the testcase, in one case (in the callee) we check TYPE_EMPTY_P on X
>which is
>the type variant for the using type, and in another case we check it on
>the
>A<int> type instead, which has TYPE_EMPTY_P set.
>
>Bootstrap/regtest pending on x86_64-linux and i686-linux, ok if it
>passes?

OK. 

Richard. 

>2018-02-21  Jakub Jelinek  <ja...@redhat.com>
>
>       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.
>
>--- gcc/stor-layout.c.jj       2018-02-13 21:23:29.187981310 +0100
>+++ gcc/stor-layout.c  2018-02-21 21:43:24.783522853 +0100
>@@ -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. 
>*/
>--- gcc/testsuite/g++.dg/torture/pr84502.C.jj  2018-02-21
>22:13:22.279420017 +0100
>+++ gcc/testsuite/g++.dg/torture/pr84502.C     2018-02-21
>22:13:03.727424362 +0100
>@@ -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);
>+}
>
>       Jakub

Reply via email to