summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/markdown/snippets/cpp-debug.md10
-rw-r--r--mesonbuild/compilers/cpp.py22
2 files changed, 32 insertions, 0 deletions
diff --git a/docs/markdown/snippets/cpp-debug.md b/docs/markdown/snippets/cpp-debug.md
new file mode 100644
index 000000000..2a62b9399
--- /dev/null
+++ b/docs/markdown/snippets/cpp-debug.md
@@ -0,0 +1,10 @@
+## `ndebug` setting now controls C++ stdlib assertions
+
+The `ndebug` setting, if disabled, now passes preprocessor defines to enable
+debugging assertions within the C++ standard library.
+
+For GCC, `-D_GLIBCXX_ASSERTIONS=1` is set.
+
+For Clang, `-D_GLIBCXX_ASSERTIONS=1` is set to cover libstdc++ usage,
+and `-D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_EXTENSIVE` or
+`-D_LIBCPP_ENABLE_ASSERTIONS=1` is used depending on the Clang version.
diff --git a/mesonbuild/compilers/cpp.py b/mesonbuild/compilers/cpp.py
index 226605390..f6a03caf2 100644
--- a/mesonbuild/compilers/cpp.py
+++ b/mesonbuild/compilers/cpp.py
@@ -293,6 +293,20 @@ class ClangCPPCompiler(_StdCPPLibMixin, ClangCompiler, CPPCompiler):
return libs
return []
+ def get_assert_args(self, disable: bool) -> T.List[str]:
+ args: T.List[str] = []
+ if disable:
+ return ['-DNDEBUG']
+
+ # Clang supports both libstdc++ and libc++
+ args.append('-D_GLIBCXX_ASSERTIONS=1')
+ if version_compare(self.version, '>=18'):
+ args.append('-D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_EXTENSIVE')
+ elif version_compare(self.version, '>=15'):
+ args.append('-D_LIBCPP_ENABLE_ASSERTIONS=1')
+
+ return args
+
class ArmLtdClangCPPCompiler(ClangCPPCompiler):
@@ -462,6 +476,14 @@ class GnuCPPCompiler(_StdCPPLibMixin, GnuCompiler, CPPCompiler):
return libs
return []
+ def get_assert_args(self, disable: bool) -> T.List[str]:
+ if disable:
+ return ['-DNDEBUG']
+
+ # XXX: This needs updating if/when GCC starts to support libc++.
+ # It currently only does so via an experimental configure arg.
+ return ['-D_GLIBCXX_ASSERTIONS=1']
+
def get_pch_use_args(self, pch_dir: str, header: str) -> T.List[str]:
return ['-fpch-preprocess', '-include', os.path.basename(header)]