Commit e2fbf4c5 by Jason Merrill Committed by Jason Merrill

LWG 2165

	LWG 2165
	* method.c (defaulted_late_check): Delete on eh-spec mismatch.
	(maybe_explain_implicit_delete): Explain it.

From-SVN: r203989
parent 3f04b1bb
2013-10-23 Jason Merrill <jason@redhat.com> 2013-10-23 Jason Merrill <jason@redhat.com>
LWG 2165
* method.c (defaulted_late_check): Delete on eh-spec mismatch.
(maybe_explain_implicit_delete): Explain it.
* error.c (eh_spec_to_string): New. * error.c (eh_spec_to_string): New.
(cp_printer): Use it for %X. (cp_printer): Use it for %X.
......
...@@ -1466,13 +1466,34 @@ maybe_explain_implicit_delete (tree decl) ...@@ -1466,13 +1466,34 @@ maybe_explain_implicit_delete (tree decl)
tree parms = FUNCTION_FIRST_USER_PARMTYPE (decl); tree parms = FUNCTION_FIRST_USER_PARMTYPE (decl);
tree parm_type = TREE_VALUE (parms); tree parm_type = TREE_VALUE (parms);
bool const_p = CP_TYPE_CONST_P (non_reference (parm_type)); bool const_p = CP_TYPE_CONST_P (non_reference (parm_type));
tree raises = NULL_TREE;
bool deleted_p = false;
tree scope = push_scope (ctype); tree scope = push_scope (ctype);
inform (0, "%q+#D is implicitly deleted because the default "
"definition would be ill-formed:", decl);
pop_scope (scope);
synthesized_method_walk (ctype, sfk, const_p, synthesized_method_walk (ctype, sfk, const_p,
NULL, NULL, NULL, NULL, true, &raises, NULL, &deleted_p, NULL, false,
DECL_INHERITED_CTOR_BASE (decl), parms); DECL_INHERITED_CTOR_BASE (decl), parms);
if (deleted_p)
{
inform (0, "%q+#D is implicitly deleted because the default "
"definition would be ill-formed:", decl);
synthesized_method_walk (ctype, sfk, const_p,
NULL, NULL, NULL, NULL, true,
DECL_INHERITED_CTOR_BASE (decl), parms);
}
else if (!comp_except_specs
(TYPE_RAISES_EXCEPTIONS (TREE_TYPE (decl)),
raises, ce_normal))
inform (DECL_SOURCE_LOCATION (decl), "%q#F is implicitly "
"deleted because its exception-specification does not "
"match the implicit exception-specification %qX",
decl, raises);
#ifdef ENABLE_CHECKING
else
gcc_unreachable ();
#endif
pop_scope (scope);
} }
input_location = loc; input_location = loc;
...@@ -1782,9 +1803,10 @@ defaulted_late_check (tree fn) ...@@ -1782,9 +1803,10 @@ defaulted_late_check (tree fn)
eh_spec, ce_normal)) eh_spec, ce_normal))
{ {
if (DECL_DEFAULTED_IN_CLASS_P (fn)) if (DECL_DEFAULTED_IN_CLASS_P (fn))
error ("function %q+D defaulted on its first declaration " {
"with an exception-specification that differs from " DECL_DELETED_FN (fn) = true;
"the implicit declaration %q#D", fn, implicit_fn); eh_spec = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn));
}
else else
error ("function %q+D defaulted on its redeclaration " error ("function %q+D defaulted on its redeclaration "
"with an exception-specification that differs from " "with an exception-specification that differs from "
......
...@@ -6,22 +6,32 @@ struct A ...@@ -6,22 +6,32 @@ struct A
A() noexcept = default; A() noexcept = default;
}; };
A a;
struct B struct B
{ {
B() throw (int) = default; // { dg-error "exception-specification that differs from the implicit declaration" } B() throw (int) = default; // { dg-message "exception-specification" }
}; };
B b; // { dg-error "deleted" }
struct C struct C
{ {
C() throw (int) { } C() throw (int) { }
}; };
C c;
struct D: C struct D: C
{ {
D() throw (int) = default; D() throw (int) = default;
}; };
D d;
struct E struct E
{ {
E() = default; E() = default;
}; };
E e;
...@@ -7,6 +7,8 @@ struct T ...@@ -7,6 +7,8 @@ struct T
~T() noexcept(false) { } ~T() noexcept(false) { }
}; };
T t;
struct A struct A
{ {
A() noexcept; A() noexcept;
...@@ -24,6 +26,8 @@ struct U ...@@ -24,6 +26,8 @@ struct U
~U() noexcept(false) { } ~U() noexcept(false) { }
}; };
U u;
struct B struct B
{ {
B() noexcept(false); B() noexcept(false);
...@@ -35,16 +39,22 @@ struct B ...@@ -35,16 +39,22 @@ struct B
B::B() noexcept(false) = default; B::B() noexcept(false) = default;
B::~B() noexcept(false) = default; B::~B() noexcept(false) = default;
B b;
struct V struct V
{ {
V() noexcept(false) { } V() noexcept(false) { }
~V() noexcept(false) { } ~V() noexcept(false) { }
}; };
V v;
struct C struct C
{ {
C() noexcept = default; // { dg-error "defaulted" } C() noexcept = default; // { dg-message "exception-specification" }
~C() noexcept = default; // { dg-error "defaulted" } ~C() noexcept = default; // { dg-message "exception-specification" }
V v; V v;
}; };
C c; // { dg-error "deleted" }
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