* Iain Sandoe:

>> On 5 Sep 2025, at 10:07, Florian Weimer <fwei...@redhat.com> wrote:
>> 
>> * Iain Sandoe:
>> 
>>> diff --git a/gcc/testsuite/g++.dg/cpp26/observable-checkpoint.C 
>>> b/gcc/testsuite/g++.dg/cpp26/observable-checkpoint.C
>>> new file mode 100644
>>> index 00000000000..886cda7ae33
>>> --- /dev/null
>>> +++ b/gcc/testsuite/g++.dg/cpp26/observable-checkpoint.C
>>> @@ -0,0 +1,24 @@
>>> +// P1494R5+P3641R0 - Partial program correctness.
>>> +// { dg-do compile { target c++11 } }
>>> +// { dg-additional-options "-fdump-tree-optimized -Wno-return-type -O" }
>>> +// { dg-final { scan-tree-dump  {\+\s42} "optimized" } }
>>> +// { dg-final { scan-tree-dump  {__builtin_observable_checkpoint} 
>>> "optimized" } }
>>> +
>>> +int x = 0;
>>> +
>>> +int
>>> +here_b_ub ()
>>> +{
>>> +  // missing return triggers UB (we must ignore the warning for this 
>>> test). 
>>> +}
>>> +
>>> +int
>>> +main ()
>>> +{
>>> +  __builtin_printf (" start \n");
>>> +  x += 42;
>>> +  // Without this checkpoint the addition above is elided (along with the 
>>> rest
>>> +  // of main).
>>> +  __builtin_observable_checkpoint ();
>>> +  here_b_ub ();
>>> +}
>> 
>> What happens if you have this?
>> 
>> static int x = 0;
>> 
>> Does the linkage matter?
>
> I don’t think it does.

Jakub and the compiler disagree. 8-)

I don't think the test case (without the static) is valid: the write to
x is not considered observable behavior by the standard.  Even without a
closed-world assumption, there is no synchronization with other threads,
so if they produce observable behavior in relation to x, it does not
become part of the observable prefix.

Thanks,
Florian

Reply via email to