[v3] c++: handle nullptr_t in can_convert_eh

Message ID 20260706181108.88645-2-egas.g.ribeiro@gmail.com
State Committed
Commit cc2a9b13bbf9994f5f27c08a95314b07f4dd7730
Headers
Series [v3] c++: handle nullptr_t in can_convert_eh |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gcc_build--master-arm success Build passed
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 success Build passed

Commit Message

Egas Ribeiro July 6, 2026, 6:11 p.m. UTC
  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 <egas.g.ribeiro@gmail.com>
---
 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
  

Comments

Jason Merrill July 7, 2026, 4:52 p.m. UTC | #1
On 7/6/26 2:11 PM, 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.

Pushed, thanks!
> 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 <egas.g.ribeiro@gmail.com>
> ---
>   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..9ec635af74d 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 (NULLPTR_TYPE_P (from) && TYPE_PTR_OR_PTRMEM_P (to))
> +    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" }
> +}
  

Patch

diff --git a/gcc/cp/except.cc b/gcc/cp/except.cc
index 4f40a49ae3f..9ec635af74d 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 (NULLPTR_TYPE_P (from) && TYPE_PTR_OR_PTRMEM_P (to))
+    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" }
+}