[C++ PATCH 82560] missing dtor call
authorNathan Sidwell <nathan@acm.org>
Tue, 17 Oct 2017 15:52:21 +0000 (15:52 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Tue, 17 Oct 2017 15:52:21 +0000 (15:52 +0000)
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

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/pr82560.C [new file with mode: 0644]

index 621efed82acbd6df188f2a67b8c33ac652580cac..daf302fc34963ecd7727b43f27fd8ebbdf4e74ea 100644 (file)
@@ -1,5 +1,9 @@
 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
        * cp-objcp-common.c (cp_tree_size): Reformat.  Adjust returns size
        of TYPE nodes.
index 13269024547b04040a4f004f8f05f696fe10752d..8f33ab51690927ba79450049e05ebf853462ed8a 100644 (file)
@@ -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.  */
-  int decltype_flag = (complain & tf_decltype);
+  tsubst_flags_t decltype_flag = (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.  */
   parmlen = list_length (parm);
@@ -7916,7 +7919,7 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
       if (flags & LOOKUP_NO_CONVERSION)
        conv->user_conv_p = true;
 
-      tsubst_flags_t arg_complain = complain & (~tf_no_cleanup);
+      tsubst_flags_t arg_complain = complain;
       if (!conversion_warning)
        arg_complain &= ~tf_warning;
 
@@ -8164,7 +8167,8 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
       else if (default_ctor_p (fn))
        {
          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
            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,
      static member function.  */
   instance = mark_type_use (instance);
 
-
   /* Figure out whether to skip the first argument for the error
      message we will display to users if an error occurs.  We don't
      want to display any compiler-generated arguments.  The "this"
index 694c23bd1712f7340953f8312597f2304e410dda..f344a46479cebea35a78ba6a77cfb669158f7077 100644 (file)
@@ -1,5 +1,8 @@
 2017-10-17  Nathan Sidwell  <nathan@acm.org>
 
+       PR c++/82560
+       * g++.dg/cpp0x/pr82560.C: New.
+
        PR middle-end/82577
        * g++.dg/opt/pr82577.C: New.
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/pr82560.C b/gcc/testsuite/g++.dg/cpp0x/pr82560.C
new file mode 100644 (file)
index 0000000..3408bae
--- /dev/null
@@ -0,0 +1,28 @@
+// { 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;;
+}