re PR c++/70869 (internal compiler error: Segmentation fault on array of pointer...
authorJakub Jelinek <jakub@redhat.com>
Thu, 7 Jul 2016 18:45:43 +0000 (20:45 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 7 Jul 2016 18:45:43 +0000 (20:45 +0200)
PR c++/70869
PR c++/71054
* cp-gimplify.c (cp_genericize_r): For DECL_EXPR for non-static
artificial vars, genericize their initializers.

* g++.dg/cpp0x/pr70869.C: New test.
* g++.dg/cpp0x/pr71054.C: New test.

Co-Authored-By: Kai Tietz <ktietz70@googlemail.com>
From-SVN: r238124

gcc/cp/ChangeLog
gcc/cp/cp-gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/pr70869.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/pr71054.C [new file with mode: 0644]

index c129b5f7ce6ef908b67f585aee3fc8693b892f77..12f15db59dd8320e0bbf2a3f68c1d4ca6d93b03a 100644 (file)
@@ -1,3 +1,11 @@
+2016-07-07  Jakub Jelinek  <jakub@redhat.com>
+           Kai Tietz  <ktietz70@googlemail.com>
+
+       PR c++/70869
+       PR c++/71054
+       * cp-gimplify.c (cp_genericize_r): For DECL_EXPR for non-static
+       artificial vars, genericize their initializers.
+
 2016-07-05  David Malcolm  <dmalcolm@redhat.com>
 
        PR c++/62314
index 97b043acbf293ba959340c0b97747e1cf361a26c..1d81fb1e3d2baf8b6bc0bcc334d5731afb3c11a4 100644 (file)
@@ -1304,7 +1304,15 @@ cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data)
     {
       tree d = DECL_EXPR_DECL (stmt);
       if (TREE_CODE (d) == VAR_DECL)
-       gcc_assert (CP_DECL_THREAD_LOCAL_P (d) == DECL_THREAD_LOCAL_P (d));
+       {
+         gcc_assert (CP_DECL_THREAD_LOCAL_P (d) == DECL_THREAD_LOCAL_P (d));
+         /* User var initializers should be genericized during containing
+            BIND_EXPR genericization when walk_tree walks DECL_INITIAL
+            of BIND_EXPR_VARS.  Artificial temporaries might not be
+            mentioned there though, so walk them now.  */
+         if (DECL_ARTIFICIAL (d) && !TREE_STATIC (d) && DECL_INITIAL (d))
+           cp_walk_tree (&DECL_INITIAL (d), cp_genericize_r, data, NULL);
+       }
     }
   else if (TREE_CODE (stmt) == OMP_PARALLEL
           || TREE_CODE (stmt) == OMP_TASK
index 88b4be6b24c4bb9726dba6a0415bcefd2be7f832..c61e6e5a201afaca7ed1479a5aed1abe22f4b257 100644 (file)
@@ -1,3 +1,11 @@
+2016-07-07  Jakub Jelinek  <jakub@redhat.com>
+           Kai Tietz  <ktietz70@googlemail.com>
+
+       PR c++/70869
+       PR c++/71054
+       * g++.dg/cpp0x/pr70869.C: New test.
+       * g++.dg/cpp0x/pr71054.C: New test.
+
 2016-07-07  David Edelsohn  <dje.gcc@gmail.com>
 
        * g++.dg/debug/pr71432.C: Fail on AIX.
diff --git a/gcc/testsuite/g++.dg/cpp0x/pr70869.C b/gcc/testsuite/g++.dg/cpp0x/pr70869.C
new file mode 100644 (file)
index 0000000..84c532b
--- /dev/null
@@ -0,0 +1,25 @@
+// PR c++/70869
+// { dg-do run { target c++11 } }
+
+#include <initializer_list>
+
+struct A
+{
+  int f () { return 1; }
+  int g () { return 2; }
+  int h () { return 3; }
+};
+
+int
+main ()
+{
+  int cnt = 0;
+  for (const auto &m : { &A::f, &A::g, &A::h })
+    {
+      A a;
+      if ((a.*m) () != ++cnt)
+       __builtin_abort ();
+    }
+  if (cnt != 3)
+    __builtin_abort ();
+}
diff --git a/gcc/testsuite/g++.dg/cpp0x/pr71054.C b/gcc/testsuite/g++.dg/cpp0x/pr71054.C
new file mode 100644 (file)
index 0000000..518bafc
--- /dev/null
@@ -0,0 +1,21 @@
+// PR c++/71054
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+template <typename D, typename T = decltype (&D::U)>
+struct S
+{
+  struct A
+  {
+    int a;
+    int b;
+    T p;
+  };
+  S () { std::initializer_list<A> a{ {0, 0, &D::V} }; }
+};
+struct R {
+  void V (int);
+  void U (int);
+};
+S<R> b;