My apologies for sending this a second time. I forgot to add the
mailing list to the CC list. :-(


c++: Treat OPAQUE_TYPE types as an aggregate type

MODE_OPAQUE and the associated OPAQUE_TYPE were added to stop the optimizers
from knowing how the bits in a variable with an opaque type are laid out.
This makes them a kind of pseudo aggregate type and we need to treat them
as such when we process the INIT initializer for variables with an
opaque type.

This passed bootstrap and regtesting on powerpc64le-linux with no regressions.
Ok for trunk?

Peter


gcc/cp/
        PR c++/97947
        * typeck2.c (digest_init_r): Handle OPAQUE_TYPE as an aggregate type.

gcc/testsuite/
        PR c++/97947
        * g++.target/powerpc/pr97947.C: New test.

diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c
index 721987e8502..97bb41b7d2e 100644
--- a/gcc/cp/typeck2.c
+++ b/gcc/cp/typeck2.c
@@ -1147,6 +1147,7 @@ digest_init_r (tree type, tree init, int nested, int 
flags,
              || VECTOR_TYPE_P (type)
              || code == RECORD_TYPE
              || code == UNION_TYPE
+             || code == OPAQUE_TYPE
              || code == COMPLEX_TYPE);
 
   /* "If T is a class type and the initializer list has a single
diff --git a/gcc/testsuite/g++.target/powerpc/pr97947.C 
b/gcc/testsuite/g++.target/powerpc/pr97947.C
new file mode 100644
index 00000000000..05ddbef2d17
--- /dev/null
+++ b/gcc/testsuite/g++.target/powerpc/pr97947.C
@@ -0,0 +1,12 @@
+/* PR c++/97947 */
+/* { dg-do compile } */
+/* { dg-require-effective-target power10_ok } */
+/* { dg-options "-O2 -mdejagnu-cpu=power10" } */
+
+/* Verify we do not ICE on the test below.  */
+
+void
+bug (__vector_pair *src)
+{
+  volatile __vector_pair dd = *src;
+}

Reply via email to