[libcxx-commits] [libcxxabi] [libc++abi] Fix test failures with GCC 14 (PR #95759)

Nikolas Klauser via libcxx-commits libcxx-commits at lists.llvm.org
Wed Jun 26 02:21:15 PDT 2024


https://github.com/philnik777 updated https://github.com/llvm/llvm-project/pull/95759

>From b15f9bf194a0e24c76eddece8ce8e70f0c6255d0 Mon Sep 17 00:00:00 2001
From: Nikolas Klauser <nikolasklauser at berlin.de>
Date: Mon, 17 Jun 2024 11:27:56 +0200
Subject: [PATCH] [libc++abi] Fix test failures with GCC 14

---
 libcxxabi/include/cxxabi.h                    |  5 +++
 libcxxabi/lib/itanium-exceptions.exp          |  1 +
 libcxxabi/src/cxa_exception.cpp               |  5 +++
 .../test/catch_const_pointer_nullptr.pass.cpp | 25 +++-----------
 libcxxabi/test/cxa_call_terminate.pass.cpp    | 34 +++++++++++++++++++
 5 files changed, 49 insertions(+), 21 deletions(-)
 create mode 100644 libcxxabi/test/cxa_call_terminate.pass.cpp

diff --git a/libcxxabi/include/cxxabi.h b/libcxxabi/include/cxxabi.h
index 0e3969084e04f..8d1b5c9b55782 100644
--- a/libcxxabi/include/cxxabi.h
+++ b/libcxxabi/include/cxxabi.h
@@ -77,6 +77,11 @@ extern _LIBCXXABI_FUNC_VIS void __cxa_end_cleanup();
 #endif
 extern _LIBCXXABI_FUNC_VIS std::type_info *__cxa_current_exception_type();
 
+// GNU extension
+// Calls `terminate` with the current exception being caught. This function is used by GCC when a `noexcept` function
+// throws an exception inside a try/catch block and doesn't catch it.
+extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_call_terminate(void*) throw();
+
 // 2.5.4 Rethrowing Exceptions
 extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_rethrow();
 
diff --git a/libcxxabi/lib/itanium-exceptions.exp b/libcxxabi/lib/itanium-exceptions.exp
index 21b19edb92dfc..9a7f317b0232e 100644
--- a/libcxxabi/lib/itanium-exceptions.exp
+++ b/libcxxabi/lib/itanium-exceptions.exp
@@ -5,6 +5,7 @@ ___cxa_begin_catch
 ___cxa_call_unexpected
 ___cxa_current_exception_type
 ___cxa_end_catch
+___cxa_call_terminate
 ___cxa_free_dependent_exception
 ___cxa_free_exception
 ___cxa_get_exception_ptr
diff --git a/libcxxabi/src/cxa_exception.cpp b/libcxxabi/src/cxa_exception.cpp
index ff69a4c65e465..92901a83bfd03 100644
--- a/libcxxabi/src/cxa_exception.cpp
+++ b/libcxxabi/src/cxa_exception.cpp
@@ -589,6 +589,11 @@ void __cxa_end_catch() {
     }
 }
 
+void __cxa_call_terminate(void* unwind_arg) throw() {
+  __cxa_begin_catch(unwind_arg);
+  std::terminate();
+}
+
 // Note:  exception_header may be masquerading as a __cxa_dependent_exception
 //        and that's ok.  exceptionType is there too.
 //        However watch out for foreign exceptions.  Return null for them.
diff --git a/libcxxabi/test/catch_const_pointer_nullptr.pass.cpp b/libcxxabi/test/catch_const_pointer_nullptr.pass.cpp
index a0d1f36f050f0..a66e6c9e53075 100644
--- a/libcxxabi/test/catch_const_pointer_nullptr.pass.cpp
+++ b/libcxxabi/test/catch_const_pointer_nullptr.pass.cpp
@@ -8,16 +8,11 @@
 
 // UNSUPPORTED: no-exceptions
 
-#include <cassert>
-
-// Clang emits  warnings about exceptions of type 'Child' being caught by
-// an earlier handler of type 'Base'. Congrats clang, you've just
-// diagnosed the behavior under test.
-#if defined(__clang__)
-#pragma clang diagnostic ignored "-Wexceptions"
-#endif
+// Clang and GCC emit warnings about exceptions of type 'Child' being caught by
+// an earlier handler of type 'Base'.
+// ADDITIONAL_COMPILE_FLAGS: -Wno-exceptions
 
-#if __has_feature(cxx_nullptr)
+#include <cassert>
 
 struct A {};
 
@@ -124,18 +119,6 @@ void test6()
     }
 }
 
-
-#else
-
-void test1() {}
-void test2() {}
-void test3() {}
-void test4() {}
-void test5() {}
-void test6() {}
-
-#endif
-
 int main(int, char**) {
     test1();
     test2();
diff --git a/libcxxabi/test/cxa_call_terminate.pass.cpp b/libcxxabi/test/cxa_call_terminate.pass.cpp
new file mode 100644
index 0000000000000..236f0e3a838ca
--- /dev/null
+++ b/libcxxabi/test/cxa_call_terminate.pass.cpp
@@ -0,0 +1,34 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// We're testing the diagnosed behaviour here.
+// ADDITIONAL_COMPILE_FLAGS: -Wno-exceptions
+
+#include <cassert>
+#include <cstdlib>
+#include <exception>
+
+#include "test_macros.h"
+
+void func() TEST_NOEXCEPT {
+  try {
+    throw 1;
+  } catch (float) {
+  }
+}
+
+[[noreturn]] void terminate_handler() {
+  assert(std::current_exception() != nullptr);
+  std::exit(0);
+}
+
+int main(int, char**) {
+  std::set_terminate(terminate_handler);
+  func();
+  assert(false);
+}



More information about the libcxx-commits mailing list