Commit 5a201862 by Nathan Sidwell Committed by Nathan Sidwell

[C++ PATCH 82560] missing dtor call

https://gcc.gnu.org/ml/gcc-patches/2017-10/msg01068.html
	PR c++/82560
	* call.c (build_over_call): Don't pass tf_no_cleanup to nested
	calls.

	PR c++/82560
	* g++.dg/cpp0x/pr82560.C: New.

From-SVN: r253820
parent 816c4ba2
2017-10-17 Nathan Sidwell <nathan@acm.org> 2017-10-17 Nathan Sidwell <nathan@acm.org>
PR c++/82560
* call.c (build_over_call): Don't pass tf_no_cleanup to nested
calls.
PR middle-end/82546 PR middle-end/82546
* cp-objcp-common.c (cp_tree_size): Reformat. Adjust returns size * cp-objcp-common.c (cp_tree_size): Reformat. Adjust returns size
of TYPE nodes. of TYPE nodes.
......
...@@ -7717,8 +7717,11 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain) ...@@ -7717,8 +7717,11 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
} }
/* N3276 magic doesn't apply to nested calls. */ /* N3276 magic doesn't apply to nested calls. */
int decltype_flag = (complain & tf_decltype); tsubst_flags_t decltype_flag = (complain & tf_decltype);
complain &= ~tf_decltype; complain &= ~tf_decltype;
/* No-Cleanup doesn't apply to nested calls either. */
tsubst_flags_t no_cleanup_complain = complain;
complain &= ~tf_no_cleanup;
/* Find maximum size of vector to hold converted arguments. */ /* Find maximum size of vector to hold converted arguments. */
parmlen = list_length (parm); parmlen = list_length (parm);
...@@ -7916,7 +7919,7 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain) ...@@ -7916,7 +7919,7 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
if (flags & LOOKUP_NO_CONVERSION) if (flags & LOOKUP_NO_CONVERSION)
conv->user_conv_p = true; conv->user_conv_p = true;
tsubst_flags_t arg_complain = complain & (~tf_no_cleanup); tsubst_flags_t arg_complain = complain;
if (!conversion_warning) if (!conversion_warning)
arg_complain &= ~tf_warning; arg_complain &= ~tf_warning;
...@@ -8164,7 +8167,8 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain) ...@@ -8164,7 +8167,8 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
else if (default_ctor_p (fn)) else if (default_ctor_p (fn))
{ {
if (is_dummy_object (argarray[0])) if (is_dummy_object (argarray[0]))
return force_target_expr (DECL_CONTEXT (fn), void_node, complain); return force_target_expr (DECL_CONTEXT (fn), void_node,
no_cleanup_complain);
else else
return cp_build_indirect_ref (argarray[0], RO_NULL, complain); return cp_build_indirect_ref (argarray[0], RO_NULL, complain);
} }
...@@ -9062,7 +9066,6 @@ build_new_method_call_1 (tree instance, tree fns, vec<tree, va_gc> **args, ...@@ -9062,7 +9066,6 @@ build_new_method_call_1 (tree instance, tree fns, vec<tree, va_gc> **args,
static member function. */ static member function. */
instance = mark_type_use (instance); instance = mark_type_use (instance);
/* Figure out whether to skip the first argument for the error /* Figure out whether to skip the first argument for the error
message we will display to users if an error occurs. We don't message we will display to users if an error occurs. We don't
want to display any compiler-generated arguments. The "this" want to display any compiler-generated arguments. The "this"
......
2017-10-17 Nathan Sidwell <nathan@acm.org> 2017-10-17 Nathan Sidwell <nathan@acm.org>
PR c++/82560
* g++.dg/cpp0x/pr82560.C: New.
PR middle-end/82577 PR middle-end/82577
* g++.dg/opt/pr82577.C: New. * g++.dg/opt/pr82577.C: New.
......
// { dg-do run { target c++11 } }
// PR82560, failed to destruct default arg inside new
static int liveness = 0;
struct Foo {
Foo (int) {
liveness++;
}
~Foo() {
liveness--;
}
};
struct Bar {
Bar (Foo = 0) { }
~Bar() { }
};
int main()
{
delete new Bar();
return liveness != 0;;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment