diff options
author | Jason Merrill <jason@redhat.com> | 2017-02-20 13:18:30 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2017-02-20 13:18:30 -0500 |
commit | 0e53a276bc87edde32d88697d27eb38ffb8805ad (patch) | |
tree | 72d807ed20f236145f422e774af591b9e2f346b5 | |
parent | f05df2ac59209394588ac62b629bb9c190029a50 (diff) | |
download | gcc-0e53a276bc87edde32d88697d27eb38ffb8805ad.zip gcc-0e53a276bc87edde32d88697d27eb38ffb8805ad.tar.gz gcc-0e53a276bc87edde32d88697d27eb38ffb8805ad.tar.bz2 |
PR c++/78139 - destructor needed by new-expression
* call.c (build_special_member_call): Use tf_no_cleanup.
From-SVN: r245612
-rw-r--r-- | gcc/cp/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/cp/call.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/init/new48.C | 18 |
3 files changed, 28 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b5def8c..385c509 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2017-02-19 Jason Merrill <jason@redhat.com> + PR c++/78139 - destructor needed by new-expression + * call.c (build_special_member_call): Use tf_no_cleanup. + PR c++/78282 - auto template and pack expansion * pt.c (find_parameter_packs_r): Don't walk into the type of templates other than template template-parameters. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index d6d3a8f..93fae0d 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -8356,9 +8356,15 @@ build_special_member_call (tree instance, tree name, vec<tree, va_gc> **args, /* FIXME P0135 doesn't say how to handle direct initialization from a type with a suitable conversion operator. Let's handle it like copy-initialization, but allowing explict conversions. */ + tsubst_flags_t sub_complain = tf_warning; + if (!is_dummy_object (instance)) + /* If we're using this to initialize a non-temporary object, don't + require the destructor to be accessible. */ + sub_complain |= tf_no_cleanup; if (!reference_related_p (class_type, TREE_TYPE (arg))) arg = perform_implicit_conversion_flags (class_type, arg, - tf_warning, flags); + sub_complain, + flags); if ((TREE_CODE (arg) == TARGET_EXPR || TREE_CODE (arg) == CONSTRUCTOR) && (same_type_ignoring_top_level_qualifiers_p diff --git a/gcc/testsuite/g++.dg/init/new48.C b/gcc/testsuite/g++.dg/init/new48.C new file mode 100644 index 0000000..528a582 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new48.C @@ -0,0 +1,18 @@ +// PR c++/78139 + +struct A +{ + A(int); +private: + ~A(); +}; + +struct B +{ + B(void*); +}; + +int main() +{ + B(new A(42)); +} |