mirror of git://gcc.gnu.org/git/gcc.git
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
|
@ -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
|
/* 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
|
bool
|
||||||
maybe_check_overriding_exception_spec (tree overrider, tree basefn)
|
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 base_throw = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (basefn));
|
||||||
tree over_throw = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (overrider));
|
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;
|
return true;
|
||||||
|
|
||||||
/* Can't check this yet. Pretend this is fine and let
|
/* Can't check this yet. Pretend this is fine and let
|
||||||
|
|
|
@ -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…
Reference in New Issue