diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2024-09-26 16:55:07 +0100 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2024-10-09 13:39:16 +0100 |
commit | 361d230fd7800a7e749aba8ed020f54f5c26d504 (patch) | |
tree | aa237d273949733bd26601e567893b541ecb91e3 | |
parent | 6ce1df379a64439ea429b6c5834e9f853d520112 (diff) | |
download | gcc-361d230fd7800a7e749aba8ed020f54f5c26d504.zip gcc-361d230fd7800a7e749aba8ed020f54f5c26d504.tar.gz gcc-361d230fd7800a7e749aba8ed020f54f5c26d504.tar.bz2 |
libstdc++: Enable _GLIBCXX_ASSERTIONS by default for -O0 [PR112808]
Too many users don't know about -D_GLIBCXX_ASSERTIONS and so are missing
valuable checks for C++ standard library preconditions. This change
enables libstdc++ assertions by default when compiling with -O0 so that
we diagnose more bugs by default.
When users enable optimization we don't add the assertions by default
(because they have non-zero overhead) so they still need to enable them
manually.
For users who really don't want the assertions even in unoptimized
builds, defining _GLIBCXX_NO_ASSERTIONS will prevent them from being
enabled automatically.
libstdc++-v3/ChangeLog:
PR libstdc++/112808
* doc/xml/manual/using.xml (_GLIBCXX_ASSERTIONS): Document
implicit definition for -O0 compilation.
(_GLIBCXX_NO_ASSERTIONS): Document.
* doc/html/manual/using_macros.html: Regenerate.
* include/bits/c++config [!__OPTIMIZE__] (_GLIBCXX_ASSERTIONS):
Define for unoptimized builds.
-rw-r--r-- | libstdc++-v3/doc/html/manual/using_macros.html | 12 | ||||
-rw-r--r-- | libstdc++-v3/doc/xml/manual/using.xml | 16 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/c++config | 9 |
3 files changed, 29 insertions, 8 deletions
diff --git a/libstdc++-v3/doc/html/manual/using_macros.html b/libstdc++-v3/doc/html/manual/using_macros.html index 67623b5..c1406ec 100644 --- a/libstdc++-v3/doc/html/manual/using_macros.html +++ b/libstdc++-v3/doc/html/manual/using_macros.html @@ -82,9 +82,15 @@ This is described in more detail in <a class="link" href="ext_compile_checks.html" title="Chapter 16. Compile Time Checks">Compile Time Checks</a>. </p></dd><dt><span class="term"><code class="code">_GLIBCXX_ASSERTIONS</code></span></dt><dd><p> - Undefined by default. When defined, enables extra error checking in - the form of precondition assertions, such as bounds checking in - strings and null pointer checks when dereferencing smart pointers. + Defined by default when compiling with no optimization, undefined + by default when compiling with optimization. + When defined, enables extra error checking in the form of + precondition assertions, such as bounds checking in strings + and null pointer checks when dereferencing smart pointers. + </p></dd><dt><span class="term"><code class="code">_GLIBCXX_NO_ASSERTIONS</code></span></dt><dd><p> + Undefined by default. When defined, prevents the implicit + definition of <code class="code">_GLIBCXX_ASSERTIONS</code> when compiling + with no optimization. </p></dd><dt><span class="term"><code class="code">_GLIBCXX_DEBUG</code></span></dt><dd><p> Undefined by default. When defined, compiles user code using the <a class="link" href="debug_mode.html" title="Chapter 17. Debug Mode">debug mode</a>. diff --git a/libstdc++-v3/doc/xml/manual/using.xml b/libstdc++-v3/doc/xml/manual/using.xml index 89119f6..7ca3a3f 100644 --- a/libstdc++-v3/doc/xml/manual/using.xml +++ b/libstdc++-v3/doc/xml/manual/using.xml @@ -1247,9 +1247,19 @@ g++ -Winvalid-pch -I. -include stdc++.h -H -g -O2 hello.cc -o test.exe <varlistentry><term><code>_GLIBCXX_ASSERTIONS</code></term> <listitem> <para> - Undefined by default. When defined, enables extra error checking in - the form of precondition assertions, such as bounds checking in - strings and null pointer checks when dereferencing smart pointers. + Defined by default when compiling with no optimization, undefined + by default when compiling with optimization. + When defined, enables extra error checking in the form of + precondition assertions, such as bounds checking in strings + and null pointer checks when dereferencing smart pointers. + </para> + </listitem></varlistentry> + <varlistentry><term><code>_GLIBCXX_NO_ASSERTIONS</code></term> + <listitem> + <para> + Undefined by default. When defined, prevents the implicit + definition of <code>_GLIBCXX_ASSERTIONS</code> when compiling + with no optimization. </para> </listitem></varlistentry> <varlistentry><term><code>_GLIBCXX_DEBUG</code></term> diff --git a/libstdc++-v3/include/bits/c++config b/libstdc++-v3/include/bits/c++config index 29d795f..b87a352 100644 --- a/libstdc++-v3/include/bits/c++config +++ b/libstdc++-v3/include/bits/c++config @@ -586,9 +586,14 @@ namespace std #pragma GCC visibility pop } +#ifndef _GLIBCXX_ASSERTIONS +# if defined(_GLIBCXX_DEBUG) // Debug Mode implies checking assertions. -#if defined(_GLIBCXX_DEBUG) && !defined(_GLIBCXX_ASSERTIONS) -# define _GLIBCXX_ASSERTIONS 1 +# define _GLIBCXX_ASSERTIONS 1 +# elif ! defined(__OPTIMIZE__) && ! defined(_GLIBCXX_NO_ASSERTIONS) +// Enable assertions for unoptimized builds. +# define _GLIBCXX_ASSERTIONS 1 +# endif #endif // Disable std::string explicit instantiation declarations in order to assert. |