Read-only mirrors. Development, issues and pull requests are on GitHub.

summaryrefslogtreecommitdiffhomepage
path: root/src/catch2/internal
diff options
context:
space:
mode:
authorMartin Hořeňovský2024-12-27 23:46:25 +0100
committerMartin Hořeňovský2025-07-14 10:39:48 +0200
commit6097bd6ee910f4ebb6216e0d1817fb84a51a7efb (patch)
tree212c1b8e93229f0b9528ea3b3d0d5b1b9fa8ee11 /src/catch2/internal
parentb62413aee344b346d120ccdc676fedf4bd6233b3 (diff)
downloadcatch3-6097bd6ee910f4ebb6216e0d1817fb84a51a7efb.tar.gz
Mark code past FAIL and SKIP as unreachable
This helps the compiler see that the execution does not continue, which in turn means that it is not an error if the user does not return value from the function after FAIL/SKIP. Closes #2941
Diffstat (limited to 'src/catch2/internal')
-rw-r--r--src/catch2/internal/catch_unreachable.hpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/catch2/internal/catch_unreachable.hpp b/src/catch2/internal/catch_unreachable.hpp
new file mode 100644
index 00000000..02cca494
--- /dev/null
+++ b/src/catch2/internal/catch_unreachable.hpp
@@ -0,0 +1,52 @@
+
+// Copyright Catch2 Authors
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.txt or copy at
+// https://www.boost.org/LICENSE_1_0.txt)
+
+// SPDX-License-Identifier: BSL-1.0
+#ifndef CATCH_UNREACHABLE_HPP_INCLUDED
+#define CATCH_UNREACHABLE_HPP_INCLUDED
+
+/**\file
+ * Polyfill `std::unreachable`
+ *
+ * We need something like `std::unreachable` to tell the compiler that
+ * some macros, e.g. `FAIL` or `SKIP`, do not continue execution in normal
+ * manner, and should handle it as such, e.g. not warn if there is no return
+ * from non-void function after a `FAIL` or `SKIP`.
+ */
+
+#include <exception>
+
+#if defined( __cpp_lib_unreachable ) && __cpp_lib_unreachable > 202202L
+# include <utility>
+namespace Catch {
+ namespace Detail {
+ using Unreachable = std::unreachable;
+ }
+} // namespace Catch
+
+#else // vv If we do not have std::unreachable, we implement something similar
+
+namespace Catch {
+ namespace Detail {
+
+ [[noreturn]]
+ inline void Unreachable() noexcept {
+# if defined( NDEBUG )
+# if defined( _MSC_VER ) && !defined( __clang__ )
+ __assume( false );
+# elif defined( __GNUC__ )
+ __builtin_unreachable();
+# endif
+# endif // ^^ NDEBUG
+ std::terminate();
+ }
+
+ } // namespace Detail
+} // end namespace Catch
+
+#endif
+
+#endif // CATCH_UNREACHABLE_HPP_INCLUDED