Revised 2026-03-27 at 10:28:46 UTC
views::indices is underconstrainedSection: 25.6.4.1 [range.iota.overview] Status: Tentatively NAD Submitter: Hewill Kang Opened: 2025-10-15 Last modified: 2026-01-16
Priority: Not Prioritized
View all other issues in [range.iota.overview].
View all issues with Tentatively NAD status.
Discussion:
Whether an integer-class type satisfies weakly_incrementable is unspecified according to
25.6.4.2 [range.iota.view]. For example, the library may provide a member
type alias difference_type for the integer-class type to make it weakly_incrementable, or not.
views::iota(integer-class-type(0)) is always ill-formed because
iota_view<W, Bound> requires W to be weakly_incrementable.
However, unlike views::iota, views::indices unconditionally accepts integer-class types,
which will lead to a hard error in the function body if the integer-class type is not
weakly_incrementable, which is true for both libstdc++ and MSVC-STL.
[2026-01-16; Reflector poll. Status → Tentatively NAD.]
"This is implied by the expression-equivalence."
Proposed resolution:
This wording is relative to N5014.
Modify 25.6.4.1 [range.iota.overview] as indicated:
-4- The name
views::indicesdenotes a customization point object (16.3.3.3.5 [customization.point.object]). Given subexpressionE, letTberemove_cvref_t<decltype((E))>.views::indices(E)is expression-equivalent toviews::iota(T(0), E)ifis-integer-like<T>istrueandTmodelsweakly_incrementable, and ill-formed otherwise.
Section: 32.6.4.2.1 [thread.mutex.requirements.mutex.general] Status: Tentatively NAD Submitter: jim x Opened: 2025-11-14 Last modified: 2026-01-16
Priority: Not Prioritized
View other active issues in [thread.mutex.requirements.mutex.general].
View all other issues in [thread.mutex.requirements.mutex.general].
View all issues with Tentatively NAD status.
Discussion:
32.6.4.2.1 [thread.mutex.requirements.mutex.general] p4 says:
For purposes of determining the existence of a data race, these behave as atomic operations (6.10.2 [intro.multithread]). The lock and unlock operations on a single mutex appears to occur in a single total order.
Even for atomic operations, the precondition for ordering them in a single total order is that
they must be memory_order::seq_cst operations, such that we can form the total order to reason.
unlock and lock. Is this a possible
total order if lock reads unlock_1, but there is a unlock_2 between them
unlock_1<unlock_2<lock
First, although we have said that lock and unlock operations behave as atomic operations,
and lock reads unlock_1, meaning that unlock_1 is coherence-ordered before lock,
however, we don't specify that they are memory_order::seq_cst operations, so
32.5.4 [atomics.order] p4 doesn't apply here
Second, for every pair of atomic operations
AandBon an objectM, whereAis coherence-ordered beforeB, the following four conditions are required to be satisfied byS:
- (4.1) — if
AandBare bothmemory_order::seq_cstoperations, thenAprecedesBinS; and
So, it is not helpful to decide that unlock_1 precedes lock in a single total order.
Similarly, excluding unlock_1 < unlock_2 < lock is not possible.
memory_order::seq_cst operations
[2026-01-16; Reflector poll. Status → Tentatively NAD.]
For atomic objects, the modification order is already a single total order, seq_cst or not.
This isn't a useful change.
Proposed resolution:
This wording is relative to N5014.
Modify 32.6.4.2.1 [thread.mutex.requirements.mutex.general] as indicated:
-4- The implementation provides lock and unlock operations, as described below. For purposes of determining the existence of a data race, these behave as atomic operations (6.10.2 [intro.multithread]). The lock and unlock operations on a single mutex appears to occur in a single total order; for this purpose, these operations are considered as
memory_order::seq_cstoperations.
consteval to std::meta::exception defaulted member functionsSection: 21.4.4 [meta.reflection.exception] Status: Tentatively NAD Submitter: Marek Polacek Opened: 2025-12-16 Last modified: 2026-01-28
Priority: Not Prioritized
View other active issues in [meta.reflection.exception].
View all other issues in [meta.reflection.exception].
View all issues with Tentatively NAD status.
Discussion:
CWG 3115 states that every function of consteval-only type shall be an
immediate function. This caused a problem for std::meta::exception::what() which was marked constexpr
but not consteval. To be able to mark it consteval, we had to tweak the rules about overriding by a consteval
virtual function (CWG 3117).
std::meta::exception such that it contains these
defaulted special member functions:
exception(const exception&) = default; exception(exception&&) = default; exception& operator=(const exception&) = default; exception& operator=(exception&&) = default;
which aren't consteval (and since they're not templates, they won't be
promoted to consteval as per P2564). I propose to make the four functions
consteval:
consteval exception(const exception&) = default; consteval exception(exception&&) = default; consteval exception& operator=(const exception&) = default; consteval exception& operator=(exception&&) = default;
[2026-01-28; Reflector poll. Status → Tentatively NAD.]
The second change in CWG 3115 fixes this.
Proposed resolution:
This wording is relative to N5032.
Modify 21.4.4 [meta.reflection.exception] as indicated:
namespace std::meta {
class exception : public std::exception {
private:
optional<string> what_; // exposition only
u8string u8what_; // exposition only
info from_; // exposition only
source_location where_; // exposition only
public:
consteval exception(u8string_view what, info from,
source_location where = source_location::current()) noexcept;
consteval exception(string_view what, info from,
source_location where = source_location::current()) noexcept;
consteval exception(const exception&) = default;
consteval exception(exception&&) = default;
consteval exception& operator=(const exception&) = default;
consteval exception& operator=(exception&&) = default;
constexpr const char* what() const noexcept override;
consteval u8string_view u8what() const noexcept;
consteval info from() const noexcept;
consteval source_location where() const noexcept;
};
}