aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2016-07-07 18:45:43 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2016-07-07 18:45:43 +0000
commitbcc4d868d943d77d0373989a040933c4b3cda16f (patch)
tree2921d133aa939d48c09f7060d04886a291f93d59
parentb39328b2a5e45c8747310a87b3650f70e1fb54ef (diff)
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@238124 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/cp-gimplify.c10
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/pr70869.C25
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/pr71054.C21
5 files changed, 71 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index c129b5f7ce6..12f15db59dd 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c
index 97b043acbf2..1d81fb1e3d2 100644
--- a/gcc/cp/cp-gimplify.c
+++ b/gcc/cp/cp-gimplify.c
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 88b4be6b24c..c61e6e5a201 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 00000000000..84c532b6772
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/pr70869.C
@@ -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
index 00000000000..518bafcbd21
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/pr71054.C
@@ -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;