diff mbox series

[C++] PR c++/85552 - wrong instantiation of dtor for DMI.

Message ID 20190614132222.26649-1-jason@redhat.com
State New
Headers show
Series [C++] PR c++/85552 - wrong instantiation of dtor for DMI. | expand

Commit Message

Jason Merrill June 14, 2019, 1:22 p.m. UTC
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.

Tested x86_64-pc-linux-gnu, applying to trunk.

	* typeck2.c (digest_nsdmi_init): Set tf_no_cleanup for direct-init.
---
 gcc/cp/typeck2.c                         |  5 +++-
 gcc/testsuite/g++.dg/cpp0x/nsdmi-list5.C | 30 ++++++++++++++++++++++++
 gcc/cp/ChangeLog                         |  5 ++++
 3 files changed, 39 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/cpp0x/nsdmi-list5.C


base-commit: 2ab89918e26a3999ec1df110d45464cf7489fe88
diff mbox series

Patch

diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c
index 0109d6e52f5..e8627dd38c0 100644
--- a/gcc/cp/typeck2.c
+++ b/gcc/cp/typeck2.c
@@ -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
index 00000000000..a12740b23b0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi-list5.C
@@ -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;
+}
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index c6823b57aa7..62e541736ec 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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