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

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
This commit is contained in:
Jason Merrill 2019-06-14 09:22:33 -04:00 committed by Jason Merrill
parent e748435795
commit 8a26547b39
3 changed files with 39 additions and 1 deletions

View 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

View 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);

View file

@ -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;
}