Commit 5bb1c2be by Jason Merrill Committed by Jason Merrill

PR c++/83956 - wrong dtor error with anonymous union

	* method.c (walk_field_subobs): Variant members only affect
	deletedness.
	(maybe_explain_implicit_delete): Pass &deleted_p for diagnostic.

From-SVN: r257107
parent f8862a1b
2018-01-26 Jason Merrill <jason@redhat.com> 2018-01-26 Jason Merrill <jason@redhat.com>
PR c++/83956 - wrong dtor error with anonymous union
* method.c (walk_field_subobs): Variant members only affect
deletedness.
(maybe_explain_implicit_delete): Pass &deleted_p for diagnostic.
PR c++/84036 - ICE with variadic capture. PR c++/84036 - ICE with variadic capture.
PR c++/82249 PR c++/82249
* pt.c (tsubst_pack_expansion): When optimizing a simple * pt.c (tsubst_pack_expansion): When optimizing a simple
......
...@@ -1305,6 +1305,15 @@ walk_field_subobs (tree fields, tree fnname, special_function_kind sfk, ...@@ -1305,6 +1305,15 @@ walk_field_subobs (tree fields, tree fnname, special_function_kind sfk,
|| DECL_ARTIFICIAL (field)) || DECL_ARTIFICIAL (field))
continue; continue;
/* Variant members only affect deletedness. In particular, they don't
affect the exception-specification of a user-provided destructor,
which we're figuring out via get_defaulted_eh_spec. So if we aren't
asking if this is deleted, don't even look up the function; we don't
want an error about a deleted function we aren't actually calling. */
if (sfk == sfk_destructor && deleted_p == NULL
&& TREE_CODE (DECL_CONTEXT (field)) == UNION_TYPE)
break;
mem_type = strip_array_types (TREE_TYPE (field)); mem_type = strip_array_types (TREE_TYPE (field));
if (assign_p) if (assign_p)
{ {
...@@ -1850,7 +1859,7 @@ maybe_explain_implicit_delete (tree decl) ...@@ -1850,7 +1859,7 @@ maybe_explain_implicit_delete (tree decl)
"%q#D is implicitly deleted because the default " "%q#D is implicitly deleted because the default "
"definition would be ill-formed:", decl); "definition would be ill-formed:", decl);
synthesized_method_walk (ctype, sfk, const_p, synthesized_method_walk (ctype, sfk, const_p,
NULL, NULL, NULL, NULL, true, NULL, NULL, &deleted_p, NULL, true,
&inh, parms); &inh, parms);
} }
else if (!comp_except_specs else if (!comp_except_specs
......
// PR c++/83956
// { dg-do compile { target c++11 } }
struct a {
~a() = delete;
};
struct b {
~b() {}
union {
a c;
};
};
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