aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2017-02-20 13:18:30 -0500
committerJason Merrill <jason@gcc.gnu.org>2017-02-20 13:18:30 -0500
commit0e53a276bc87edde32d88697d27eb38ffb8805ad (patch)
tree72d807ed20f236145f422e774af591b9e2f346b5 /gcc
parentf05df2ac59209394588ac62b629bb9c190029a50 (diff)
downloadgcc-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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/call.c8
-rw-r--r--gcc/testsuite/g++.dg/init/new48.C18
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));
+}