10f51543bb
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. |
||
---|---|---|
.. | ||
algo.h | ||
algobase.h | ||
algorithm | ||
algorithmfwd.h | ||
balanced_quicksort.h | ||
base.h | ||
basic_iterator.h | ||
checkers.h | ||
compatibility.h | ||
compiletime_settings.h | ||
equally_split.h | ||
features.h | ||
find_selectors.h | ||
find.h | ||
for_each_selectors.h | ||
for_each.h | ||
iterator.h | ||
list_partition.h | ||
losertree.h | ||
merge.h | ||
multiseq_selection.h | ||
multiway_merge.h | ||
multiway_mergesort.h | ||
numeric | ||
numericfwd.h | ||
omp_loop_static.h | ||
omp_loop.h | ||
par_loop.h | ||
parallel.h | ||
partial_sum.h | ||
partition.h | ||
queue.h | ||
quicksort.h | ||
random_number.h | ||
random_shuffle.h | ||
search.h | ||
set_operations.h | ||
settings.h | ||
sort.h | ||
tags.h | ||
types.h | ||
unique_copy.h | ||
workstealing.h |