[PATCH][_GLIBCXX_DEBUG] Add consteval support
Jonathan Wakely
jwakely@redhat.com
Tue Jan 27 10:31:12 GMT 2026
On Tue, 27 Jan 2026 at 08:30, Tomasz Kaminski <tkaminsk@redhat.com> wrote:
>
>
>
> On Mon, Jan 26, 2026 at 10:25 PM François Dumont <frs.dumont@gmail.com> wrote:
>>
>> Hi
>>
>> libstdc++: [_GLIBCXX_DEBUG] Make constant evaluation compatible
>>
>> In a constant evaluation context the _GLIBCXX_DEBUG is working in a
>> degradated mode where only iterators are keeping a link to their
>> container,
>> the container won't have a list of its iterators.
>>
>> In std::__debug::vector and std::__debug::inplace_vector remove all
>> calls to
>> std::is_constant_evaluated and code associated to it when returning
>> true. The
>> same code is now used in both contexts.
>
> What are the exact benefits of this change? During constant evaluation we already
> detect all UB caused by access via invalid or past the end pointers, so most of the
> cases are detected.
>
> As this will have non-trivial impact on compile-times of programs operation on
> vector at compile time (including c++26) reflection, I would like to see a more concrete
> cost (how much longer a decently size example using reflection compilers) vs benefits
> (examples of situations where this new implementation will detect breach of library preconditions,
> that are not already detected).
Yes, I share the same concerns. This is a lot of extra code to run
during constant evaluation, for unclear benefit.
This would allow us to diagnose some uses of invalid iterators, like
the topic of https://cplusplus.github.io/LWG/issue2256
Currently that code Just Works, because there is a valid object at
that location, and the rule about invalidating iterators is only
enforced with debug mode, so not during constant evaluation:
#include <vector>
#include <cassert>
constexpr bool f()
{
typedef std::vector<int> C;
C c = {1, 2, 3, 4};
C::iterator i = c.begin() + 1;
C::iterator j = c.end() - 1;
assert(*i == 2);
assert(*j == 4);
c.erase(c.begin());
return *i == 3; // Why is this not perfectly fine?!
}
static_assert(f());
But I don't think I really care about this. There *is* a valid object,
and if there wasn't, it would fail to compile.
More information about the Libstdc++
mailing list