c++: wrong looser exception spec with deleted fn

I noticed we don't implement the "unless the overriding function is
defined as deleted" wording added to [except.spec] via CWG 1351.

	DR 1351

gcc/cp/ChangeLog:

	* search.cc (maybe_check_overriding_exception_spec): Don't error about
	a looser exception specification if the overrider is deleted.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp0x/noexcept82.C: New test.
This commit is contained in:
Marek Polacek 2024-02-15 14:58:31 -05:00
parent c74131e77f
commit 40b8d7b73a
2 changed files with 23 additions and 2 deletions

View file

@ -1949,7 +1949,11 @@ locate_field_accessor (tree basetype_path, tree field_decl, bool const_p)
}
/* Check throw specifier of OVERRIDER is at least as strict as
the one of BASEFN. */
the one of BASEFN. This is due to [except.spec]: "If a virtual function
has a non-throwing exception specification, all declarations, including
the definition, of any function that overrides that virtual function in
any derived class shall have a non-throwing exception specification,
unless the overriding function is defined as deleted." */
bool
maybe_check_overriding_exception_spec (tree overrider, tree basefn)
@ -1959,7 +1963,10 @@ maybe_check_overriding_exception_spec (tree overrider, tree basefn)
tree base_throw = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (basefn));
tree over_throw = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (overrider));
if (DECL_INVALID_OVERRIDER_P (overrider))
if (DECL_INVALID_OVERRIDER_P (overrider)
/* CWG 1351 added the "unless the overriding function is defined as
deleted" wording. */
|| DECL_DELETED_FN (overrider))
return true;
/* Can't check this yet. Pretend this is fine and let

View file

@ -0,0 +1,14 @@
// DR 1351, Problems with implicitly-declared exception-specifications
// { dg-do compile { target c++11 } }
struct B {
virtual void f() noexcept;
virtual void g();
virtual void h() noexcept = delete;
};
struct D: B {
void f(); // { dg-error "looser" }
void g() noexcept; // OK
void h() = delete; // OK
};