diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-07-07 18:45:43 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-07-07 18:45:43 +0000 |
commit | bcc4d868d943d77d0373989a040933c4b3cda16f (patch) | |
tree | 2921d133aa939d48c09f7060d04886a291f93d59 | |
parent | b39328b2a5e45c8747310a87b3650f70e1fb54ef (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/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/cp-gimplify.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/pr70869.C | 25 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/pr71054.C | 21 |
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; |