Skip to content

Commit 79535de

Browse files
committed
Fix compare_exchange_* with only one memory_order
Previously, compare_exchange_weak and compare_exchange_strong with only one memory_order were defined as being equivalent to passing that value as both the success and failure arguments of the overload accepting two memory_orders. This is a bug, because the overload accepting two memory_orders clearly states that failure does not accept certain values of memory_order. The definitions of the equivalent functions in ISO C++ do not have this issue, and so this commit aligns the behavior of these functions with ISO C++.
1 parent 088b965 commit 79535de

1 file changed

Lines changed: 28 additions & 2 deletions

File tree

adoc/chapters/programming_interface.adoc

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20587,7 +20587,20 @@ bool compare_exchange_weak(T& expected, T desired,
2058720587
memory_order order = default_read_modify_write_order,
2058820588
memory_scope scope = default_scope) const
2058920589
----
20590-
a@ Equivalent to [code]#compare_exchange_weak(expected, desired, order, order, scope)#.
20590+
a@ Equivalent to:
20591+
[source, c++]
20592+
----
20593+
memory_order success = order;
20594+
memory_order failure;
20595+
if (order == memory_order::acq_rel) {
20596+
failure = memory_order::acquire;
20597+
} else if (order == memory_order::release) {
20598+
failure = memory_order::relaxed;
20599+
} else {
20600+
failure = order;
20601+
}
20602+
return compare_exchange_weak(expected, desired, success, failure, scope);
20603+
----
2059120604

2059220605
a@
2059320606
[source]
@@ -20617,7 +20630,20 @@ bool compare_exchange_strong(
2061720630
T& expected, T desired,
2061820631
memory_order order = default_read_modify_write_order) const
2061920632
----
20620-
a@ Equivalent to [code]#compare_exchange_strong(expected, desired, order, order, scope)#.
20633+
a@ Equivalent to:
20634+
[source, c++]
20635+
----
20636+
memory_order success = order;
20637+
memory_order failure;
20638+
if (order == memory_order::acq_rel) {
20639+
failure = memory_order::acquire;
20640+
} else if (order == memory_order::release) {
20641+
failure = memory_order::relaxed;
20642+
} else {
20643+
failure = order;
20644+
}
20645+
return compare_exchange_strong(expected, desired, success, failure, scope);
20646+
----
2062120647

2062220648
|====
2062320649

0 commit comments

Comments
 (0)