https://gcc.gnu.org/g:361d230fd7800a7e749aba8ed020f54f5c26d504

commit r15-4208-g361d230fd7800a7e749aba8ed020f54f5c26d504
Author: Jonathan Wakely <jwak...@redhat.com>
Date:   Thu Sep 26 16:55:07 2024 +0100

    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.

Diff:
---
 libstdc++-v3/doc/html/manual/using_macros.html | 12 +++++++++---
 libstdc++-v3/doc/xml/manual/using.xml          | 16 +++++++++++++---
 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 67623b5e2aff..c1406ec76f77 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 89119f6fb2db..7ca3a3f4b4c0 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 29d795f687c6..b87a3527f24b 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.

Reply via email to