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:
parent
c74131e77f
commit
40b8d7b73a
2 changed files with 23 additions and 2 deletions
|
@ -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
|
||||
|
|
14
gcc/testsuite/g++.dg/cpp0x/noexcept82.C
Normal file
14
gcc/testsuite/g++.dg/cpp0x/noexcept82.C
Normal 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
|
||||
};
|
Loading…
Add table
Reference in a new issue