aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2018-02-16 15:05:28 -0500
committerJason Merrill <jason@gcc.gnu.org>2018-02-16 15:05:28 -0500
commitb76f3abcd617a8dd38437464d867516962bca5cc (patch)
tree89e3206688fa3d8bfd985d2e632bdcc39efe86de /gcc
parentf7f77b9d7e59d2ded296954df1bd43872012e957 (diff)
downloadgcc-b76f3abcd617a8dd38437464d867516962bca5cc.zip
gcc-b76f3abcd617a8dd38437464d867516962bca5cc.tar.gz
gcc-b76f3abcd617a8dd38437464d867516962bca5cc.tar.bz2
PR c++/83835 - C++17 error with constructor ctors.
* call.c (build_special_member_call): Set TARGET_EXPR_DIRECT_INIT_P. From-SVN: r257757
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/call.c3
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-ctor21.C15
3 files changed, 21 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 07f093a..076b8f9 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
2018-02-16 Jason Merrill <jason@redhat.com>
+ PR c++/83835 - C++17 error with constructor ctors.
+ * call.c (build_special_member_call): Set TARGET_EXPR_DIRECT_INIT_P.
+
PR c++/82664 - ICE with reference to function template parm.
* pt.c (convert_nontype_argument_function): Avoid obfuscationg
NOP_EXPRs.
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 5698ff6..d3d0966 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -8834,6 +8834,9 @@ build_special_member_call (tree instance, tree name, vec<tree, va_gc> **args,
{
if (is_dummy_object (instance))
return arg;
+ else if (TREE_CODE (arg) == TARGET_EXPR)
+ TARGET_EXPR_DIRECT_INIT_P (arg) = true;
+
if ((complain & tf_error)
&& (flags & LOOKUP_DELEGATING_CONS))
check_self_delegation (arg);
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor21.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor21.C
new file mode 100644
index 0000000..4bf57b9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor21.C
@@ -0,0 +1,15 @@
+// PR c++/83835
+// { dg-do compile { target c++11 } }
+
+struct Z
+{
+ void const * p_;
+ constexpr Z( void const * p ): p_( p ) {}
+ ~Z();
+};
+
+struct Y
+{
+ Z z_;
+ constexpr Y() noexcept: z_( this ) {}
+};