From bdbbf28d15945150b16406d1bce91db58a65ac08 Mon Sep 17 00:00:00 2001 From: Marek Polacek Date: Mon, 6 Mar 2017 17:38:42 +0000 Subject: [PATCH] PR c++/79796 - ICE with NSDMI and this pointer PR c++/79796 - ICE with NSDMI and this pointer * call.c (build_over_call): Handle NSDMI with a 'this' by calling replace_placeholders. * g++.dg/cpp0x/nsdmi13.C: New test. From-SVN: r245927 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/call.c | 3 +++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/cpp0x/nsdmi13.C | 13 +++++++++++++ 4 files changed, 27 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp0x/nsdmi13.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 12d74a6702f..13350b8b347 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2017-03-06 Marek Polacek + + PR c++/79796 - ICE with NSDMI and this pointer + * call.c (build_over_call): Handle NSDMI with a 'this' by calling + replace_placeholders. + 2017-03-06 Jakub Jelinek PR c++/79822 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 5afec4f0897..86c7647e7cd 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -8047,6 +8047,9 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain) { arg = cp_build_indirect_ref (arg, RO_NULL, complain); val = build2 (MODIFY_EXPR, TREE_TYPE (to), to, arg); + if (cxx_dialect >= cxx14) + /* Handle NSDMI that refer to the object being initialized. */ + replace_placeholders (arg, to); } else { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 798d89b2571..445e4141408 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-03-06 Marek Polacek + + PR c++/79796 - ICE with NSDMI and this pointer + * g++.dg/cpp0x/nsdmi13.C: New test. + 2017-03-06 Julia Koval PR target/79793 diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi13.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi13.C new file mode 100644 index 00000000000..2751da3b5cf --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi13.C @@ -0,0 +1,13 @@ +// PR c++/79796 +// { dg-do compile { target c++11 } } + +struct A +{ + A* p = this; +}; + +void foo() +{ + A a; + a = A({}); +} -- 2.30.2