On Sat, Jul 04, 2026 at 12:39:16PM +0100, Egas Ribeiro wrote:
> can_convert_eh implements the [except.handle] matching rules, but did
> not cover the case of a std::nullptr_t exception being caught by a
> handler of pointer or pointer-to-member type.  Add it.
> 
> gcc/cp/ChangeLog:
>       * except.cc (can_convert_eh): Handle a nullptr_t exception
>       caught by a pointer or pointer-to-member handler.
> 
> gcc/testsuite/ChangeLog:
>       * g++.dg/eh/can-convert-nullptr.C: New test.
> 
> Signed-off-by: Egas Ribeiro <[email protected]>
> ---
>  gcc/cp/except.cc                              | 3 +++
>  gcc/testsuite/g++.dg/eh/can-convert-nullptr.C | 7 +++++++
>  2 files changed, 10 insertions(+)
>  create mode 100644 gcc/testsuite/g++.dg/eh/can-convert-nullptr.C
> 
> diff --git a/gcc/cp/except.cc b/gcc/cp/except.cc
> index 4f40a49ae3f..9c4cb37b6e6 100644
> --- a/gcc/cp/except.cc
> +++ b/gcc/cp/except.cc
> @@ -982,6 +982,9 @@ can_convert_eh (tree to, tree from)
>    if (same_type_ignoring_top_level_qualifiers_p (to, from))
>      return true;
>  
> +  if (TREE_CODE (from) == NULLPTR_TYPE && TYPE_PTR_OR_PTRMEM_P (to))

This can be NULLPTR_TYPE_P (from).

> +    return true;
> +
>    if (TYPE_PTR_P (to) && TYPE_PTR_P (from))
>      {
>        to = TREE_TYPE (to);
> diff --git a/gcc/testsuite/g++.dg/eh/can-convert-nullptr.C 
> b/gcc/testsuite/g++.dg/eh/can-convert-nullptr.C
> new file mode 100644
> index 00000000000..b609234591e
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/eh/can-convert-nullptr.C
> @@ -0,0 +1,7 @@
> +// { dg-do compile { target c++11 } }
> +
> +int main() {
> +  try { throw nullptr; }
> +  catch (void *) {}
> +  catch (decltype(nullptr)) {} // { dg-warning "will be caught by earlier 
> handler" }
> +}
> -- 
> 2.54.0
> 

Marek

Reply via email to