On Mon, 8 Sept 2025 at 07:42, Jonathan Wakely <jwakely....@gmail.com> wrote:
>
>
>
> On Sun, 7 Sept 2025, 20:46 Iain Sandoe, <iains....@gmail.com> wrote:
>>
>> Thanks to reviewers for feedback.
>>
>> Version 2 changes;
>>  use version.def to add the library versioning information.
>>
>> --- 8< ---
>>
>> This implements the library parts of P1494 as amended by P3641.  For GCC the
>> compiler itself treats stdio operations as equivalent to the observable
>> checkpoint and thus it does not appear to be necessary to add calls to those
>> functions (it will not alter the outcome).
>>
>> This adds the facility for C++26, although there is no reason, in principle,
>> that it would not work back to C++11 at least.
>>
>>         PR c++/119060
>>
>> libstdc++-v3/ChangeLog:
>>
>>         * include/bits/version.def: Add observable_checkpoint at present
>>         allowed from C++11.
>>         * include/bits/version.h: Regenerate.
>>         * include/std/utility: Add std::observable_checkpoint().
>>
>> Signed-off-by: Iain Sandoe <i...@sandoe.co.uk>
>> ---
>>  libstdc++-v3/include/bits/version.def |  9 +++++++++
>>  libstdc++-v3/include/bits/version.h   | 10 ++++++++++
>>  libstdc++-v3/include/std/utility      | 19 +++++++++++++++++++
>>  3 files changed, 38 insertions(+)
>>
>> diff --git a/libstdc++-v3/include/bits/version.def 
>> b/libstdc++-v3/include/bits/version.def
>> index 8707a123109..c085e3dfcd7 100644
>> --- a/libstdc++-v3/include/bits/version.def
>> +++ b/libstdc++-v3/include/bits/version.def
>> @@ -1899,6 +1899,15 @@ ftms = {
>>    };
>>  };
>>
>> +ftms = {
>> +  name = observable_checkpoint;
>> +  values = {
>> +    v = 202506;
>> +    cxxmin = 11;
>
>
> This affects when the macro is defined, which affects when the function is 
> defined. But it's not a reserved name in C++11 so we shouldn't declare it.
>
> So this should be cxxmin = 26
>
>
>> +    extra_cond = "__has_builtin(__builtin_observable_checkpoint)";
>> +  };
>> +};
>> +
>>  ftms = {
>>    name = algorithm_default_value_type;
>>    values = {
>> diff --git a/libstdc++-v3/include/bits/version.h 
>> b/libstdc++-v3/include/bits/version.h
>> index c7569f42773..107646960f3 100644
>> --- a/libstdc++-v3/include/bits/version.h
>> +++ b/libstdc++-v3/include/bits/version.h
>> @@ -2123,6 +2123,16 @@
>>  #endif /* !defined(__cpp_lib_unreachable) && 
>> defined(__glibcxx_want_unreachable) */
>>  #undef __glibcxx_want_unreachable
>>
>> +#if !defined(__cpp_lib_observable_checkpoint)
>> +# if (__cplusplus >= 201103L) && 
>> (__has_builtin(__builtin_observable_checkpoint))
>> +#  define __glibcxx_observable_checkpoint 202506L
>> +#  if defined(__glibcxx_want_all) || 
>> defined(__glibcxx_want_observable_checkpoint)
>> +#   define __cpp_lib_observable_checkpoint 202506L
>> +#  endif
>> +# endif
>> +#endif /* !defined(__cpp_lib_observable_checkpoint) && 
>> defined(__glibcxx_want_observable_checkpoint) */
>> +#undef __glibcxx_want_observable_checkpoint
>> +
>>  #if !defined(__cpp_lib_algorithm_default_value_type)
>>  # if (__cplusplus >  202302L)
>>  #  define __glibcxx_algorithm_default_value_type 202403L
>> diff --git a/libstdc++-v3/include/std/utility 
>> b/libstdc++-v3/include/std/utility
>> index 8a85ccfd09b..4a33a369f9c 100644
>> --- a/libstdc++-v3/include/std/utility
>> +++ b/libstdc++-v3/include/std/utility
>> @@ -98,6 +98,7 @@
>>  #define __glibcxx_want_tuple_element_t
>>  #define __glibcxx_want_tuples_by_type
>>  #define __glibcxx_want_unreachable
>> +#define __glibcxx_want_observable_checkpoint
>>  #define __glibcxx_want_tuple_like
>>  #define __glibcxx_want_constrained_equality
>>  #include <bits/version.h>
>> @@ -234,6 +235,24 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>>    }
>>  #endif
>>
>> +
>> +#ifdef __cpp_lib_observable_checkpoint // C++ >= 26
>> +  /// Informs the compiler that prior actions are considered observable.
>> +  /**
>> +   * This may be used to limit the extent to which optimisations based on 
>> the
>> +   * assumed unreachability of undefined behaviour can propagate to earlier
>> +   * code.
>> +   *
>> +   * @since C++26
>> +   */
>> +  [[__gnu__::__always_inline__]]
>> +  inline void
>> +  observable_checkpoint() _GLIBCXX_NOTHROW
>
>
> This can be just noexcept because it doesn't need to be compiled as C++98.
>
> OK with those changes.

Oh we also need to add the new name to src/c++23/std.cc.in

--- a/libstdc++-v3/src/c++23/std.cc.in
+++ b/libstdc++-v3/src/c++23/std.cc.in
@@ -3327,6 +3327,9 @@ export namespace std
#if __cpp_lib_unreachable
  using std::unreachable;
#endif
+#if __cpp_lib_observable_checkpoint
+  using std::observable_checkpoint;
+#endif
}

// <valarray>

Reply via email to