[PATCH] libstdc++: Add compile-time checks to__glibcxx_assert [PR 71960]

Jonathan Wakely jwakely@redhat.com
Tue Sep 1 19:55:44 GMT 2020


On 26/08/20 17:48 +0100, Jonathan Wakely wrote:
>This change evaluates __glibcxx_assert checks unconditionally when a
>function is being constant evaluated (when std::is_constant_evaluated()
>is true). If the check fails, compilation will fail with an error.
>
>If the function isn't being constant evaluated, the normal runtime check
>will be done if enabled by _GLIBCXX_ASSERTIONS or _GLIBCXX_DEBUG, the
>same as before.
>
>Tangentially, the __glibcxx_assert and _GLIBCXX_PARALLEL_ASSERT macros
>are changed to expand to 'do { } while (false)' when assertions are
>disabled, instead of expanding to nothing. This avoids -Wempty-body
>warnings when a disabled assertion is used in an 'if' or 'else'
>statement e.g.
>
>  if constexpr (/* precondition is testable */)
>    __glibcxx_assert(precondition);
>
>a.C:9:27: warning: suggest braces around empty body in an ‘if’ statement [-Wempty-body]
>    9 |     __glibcxx_assert(precondition);
>      |                                  ^
>
>libstdc++-v3/ChangeLog:
>
>	PR libstdc++/71960
>	* include/bits/c++config (__glibcxx_assert_impl): Remove
>	do-while so that uses of the macro need to add it.
>	(__glibcxx_assert): Rename macro for runtime assertions
>	to __glibcxx_assert_2.
>	(__glibcxx_assert_1): Define macro for constexpr assertions.
>	(__glibcxx_assert): Define macro for constexpr and runtime
>	assertions.
>	* include/bits/range_access.h (ranges::advance): Remove
>	redundant precondition checks during constant evaluation.
>	* include/parallel/base.h (_GLIBCXX_PARALLEL_ASSERT): Always
>	use do-while in macro expansion.
>	* include/std/ranges (iota_view::iota_view(W, B)): Remove
>	redundant braces.
>
>Not yet committed.
>
>Tested powerpc64le-linux, normal and debug modes.
>
>Thoughts?

Pushed to master now. Let's see if it breaks anything!




More information about the Libstdc++ mailing list