864. Defect in atomic wording

Section: 32.5.8.2 [atomics.types.operations] Status: NAD Editorial Submitter: Anthony Williams Opened: 2008-07-10 Last modified: 2016-01-28

Priority: Not Prioritized

View other active issues in [atomics.types.operations].

View all other issues in [atomics.types.operations].

View all issues with NAD Editorial status.

Discussion:

There's an error in 32.5.8.2 [atomics.types.operations]/p9:

C atomic_load(const volatile A * object);
C atomic_load_explicit(const volatile A * object, memory_order);
C A ::load(memory_order order = memory_order_seq_cst) const volatile;

Requires: The order argument shall not be memory_order_acquire nor memory_order_acq_rel.

I believe that this should state

shall not be memory_order_release.

There's also an error in 32.5.8.2 [atomics.types.operations]/p17:

... When only one memory_order argument is supplied, the value of success is order, and the value of failure is order except that a value of memory_order_acq_rel shall be replaced by the value memory_order_require ...

I believe this should state

shall be replaced by the value memory_order_acquire ...

Proposed resolution:

Change 32.5.8.2 [atomics.types.operations]/p9:

C atomic_load(const volatile A * object);
C atomic_load_explicit(const volatile A * object, memory_order);
C A ::load(memory_order order = memory_order_seq_cst) const volatile;

Requires: The order argument shall not be memory_order_acquire memory_order_release nor memory_order_acq_rel.

Change 32.5.8.2 [atomics.types.operations]/p17:

... When only one memory_order argument is supplied, the value of success is order, and the value of failure is order except that a value of memory_order_acq_rel shall be replaced by the value memory_order_require memory_order_acquire ...

Rationale:

Already fixed by the time the LWG processed it.