aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2024-09-26 16:55:07 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2024-10-09 13:39:16 +0100
commit361d230fd7800a7e749aba8ed020f54f5c26d504 (patch)
treeaa237d273949733bd26601e567893b541ecb91e3
parent6ce1df379a64439ea429b6c5834e9f853d520112 (diff)
downloadgcc-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.html12
-rw-r--r--libstdc++-v3/doc/xml/manual/using.xml16
-rw-r--r--libstdc++-v3/include/bits/c++config9
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.