diff options
author | Jason Merrill <jason@redhat.com> | 2018-02-16 15:05:28 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2018-02-16 15:05:28 -0500 |
commit | b76f3abcd617a8dd38437464d867516962bca5cc (patch) | |
tree | 89e3206688fa3d8bfd985d2e632bdcc39efe86de /gcc | |
parent | f7f77b9d7e59d2ded296954df1bd43872012e957 (diff) | |
download | gcc-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/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/cp/call.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-ctor21.C | 15 |
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 ) {} +}; |