From 6ee3de8728731e41c17f1df231c495f8b48bb732 Mon Sep 17 00:00:00 2001
From: timsong-cpp
-This requirement introduces a kind of undefined behavior and permits implementation divergence. Currently
+This requirement introduces a kind of undefined behavior and permits implementation divergence. Currently
MSVC STL
-enforces the requirement, while
-libstdc++
-and
-libc++
+enforces the requirement, while
+libstdc++
+and
+libc++
don't.
@@ -56,8 +56,8 @@ This wording is relative to-[Drafting Note: Two mutually exclusive options are prepared, depicted below by Option A and -Option B, respectively.] +[Drafting Note: Two mutually exclusive options are prepared, depicted below by Option A and +Option B, respectively.]
@@ -79,7 +79,7 @@ requirements. Instantiation of barrier<CompletionFunction> i -3- The phase completion step that is executed at the end of each phase has the following effects:-5- CompletionFunction shall meet the Cpp17MoveConstructible (Table 32) and Cpp17Destructible (Table 36) -requirements. Instantiation of barrier<CompletionFunction> is ill-formed if -is_nothrow_invocable_v<CompletionFunction&> is not +requirements. Instantiation of barrier<CompletionFunction> is ill-formed if +is_nothrow_invocable_v<CompletionFunction&> is not true
is_nothrow_invocable_v<CompletionFunction&> shall be true.
(3.1) — Invokes the completion function, equivalent to completion(). If any invocation
+ (3.1) — Invokes the completion function, equivalent to completion(). If any invocation
to the completion function throws an exception, the behavior is undefined. (3.2) — Unblocks all threads that are blocked on the phase synchronization point.
This wording is relative to
Modify
++ ++-3- The phase completion step that is executed at the end of each phase has the following effects: +
++
+- +
(3.1) — Invokes the completion function, equivalent to +
completion(); if that invocation exits via an exception, +the functionstd::terminateis invoked. +- +
(3.2) — Unblocks all threads that are blocked on the phase synchronization point.
+[…] +
++-5- CompletionFunction shall meet the Cpp17MoveConstructible (Table 32) and Cpp17Destructible (Table 36) +requirements. +
+++ +A program that instantiatesis_nothrow_invocable_v<CompletionFunction&>+shall betrue. +barrier<CompletionFunction>+is ill-formed ifis_invocable_v<CompletionFunction&>+isfalse. + +
Needs an update to the gigantic "when do we call `std::terminate`?" note.
This wording is relative to
This wording is relative to
Modify
+++-1- Some errors in a program cannot be recovered from, such as when an exception is not handled or a `std::thread` object is destroyed +while its thread function is still executing. In such cases, the function `std::terminate` (
+) is invoked. + [Note 1: These situations are:
++
+- +
(1.1) — […]
- +
(1.2) — […]
- +
(1.3) — […]
- +
(1.4) — […]
- +
(1.5) — […]
- +
(1.6) — […]
- +
(1.7) — […]
- +
(1.8) — […]
- +
(1.9) — […]
- +
(1.10) — […]
- +
(1.11) — […]
- +
(1.12) — […]
- +
(1.13) — […]
- +
(1.14) — when a callback invocation exits via an exception when requesting stop on a `std::stop_source` +or a `std::inplace_stop_source` (
, ), +or in the constructor of `std::stop_callback` or `std::inplace_stop_callback` ( , ) +when a callback invocation exits via an exception, or - +
(1.?) — when an invocation of the completion function of a `std::barrier` object (
) exits via an exception, or - +
(1.15) — when a `run_loop` object is destroyed that is still in the `running` state (
), or - +
(1.16) — […]
- +
(1.17) — […]
- +
(1.18) — […]
- +
(1.19) — […]
— end note ]
+
Modify