PR c++/85552 - wrong instantiation of dtor for DMI.
authorJason Merrill <jason@redhat.com>
Fri, 14 Jun 2019 13:22:33 +0000 (09:22 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 14 Jun 2019 13:22:33 +0000 (09:22 -0400)
The problem here is that when processing direct-initialization of a data
member, we don't need to worry about destruction semantics; that will be
handled in the [cd]tor.  Conveniently, we already have tf_no_cleanup from a
similar fix to new-expressions.

* typeck2.c (digest_nsdmi_init): Set tf_no_cleanup for direct-init.

From-SVN: r272287

gcc/cp/ChangeLog
gcc/cp/typeck2.c
gcc/testsuite/g++.dg/cpp0x/nsdmi-list5.C [new file with mode: 0644]

index c6823b57aa7b0cab3e6b6e55f942d94c4c36c99a..62e541736ecf053a033b15f1eaca6db207872ce3 100644 (file)
@@ -1,3 +1,8 @@
+2019-06-12  Jason Merrill  <jason@redhat.com>
+
+       PR c++/85552 - wrong instantiation of dtor for DMI.
+       * typeck2.c (digest_nsdmi_init): Set tf_no_cleanup for direct-init.
+
 2019-06-13  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * decl.c (grokdeclarator): Use id_loc in five additional places
index 0109d6e52f569c1a3c9b0f839e594c96c1c7a4ea..e8627dd38c00c4de846818d787e07df13061c965 100644 (file)
@@ -1309,7 +1309,10 @@ digest_nsdmi_init (tree decl, tree init, tsubst_flags_t complain)
   tree type = TREE_TYPE (decl);
   int flags = LOOKUP_IMPLICIT;
   if (DIRECT_LIST_INIT_P (init))
-    flags = LOOKUP_NORMAL;
+    {
+      flags = LOOKUP_NORMAL;
+      complain |= tf_no_cleanup;
+    }
   if (BRACE_ENCLOSED_INITIALIZER_P (init)
       && CP_AGGREGATE_TYPE_P (type))
     init = reshape_init (type, init, complain);
diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-list5.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-list5.C
new file mode 100644 (file)
index 0000000..a12740b
--- /dev/null
@@ -0,0 +1,30 @@
+// PR c++/85552
+// { dg-do compile { target c++11 } }
+
+template<typename T>
+struct uptr {
+  uptr() { }
+  uptr(void*) { }
+  ~uptr() { static_assert(sizeof(T), "complete type"); }
+};
+
+class S;
+
+class Compiles
+{
+  uptr<S> s;
+};
+
+class DoesntCompile
+{
+  ~DoesntCompile();
+  DoesntCompile();
+
+  uptr<S> s1 { };
+  uptr<S> s2 { nullptr };
+};
+
+int main()
+{
+  return 0;
+}