libstdc++: Make std::atomic_flag::test members const

Also fix the tests so they run without an explicit -std=gnu++2a in the
RUNTESTFLAGS, and test the new function on const-qualified objects.

	* include/bits/atomic_base.h (atomic_flag::test): Add missing
	const qualifiers.
	* testsuite/29_atomics/atomic_flag/test/explicit.cc: Add
	dg-options and verify results of test function.
	* testsuite/29_atomics/atomic_flag/test/implicit.cc: Likewise.
This commit is contained in:
Jonathan Wakely 2020-06-12 10:22:05 +01:00
parent a6db99a61a
commit 17412a74c5
3 changed files with 26 additions and 10 deletions

View file

@ -212,7 +212,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
#define __cpp_lib_atomic_flag_test 201907L
_GLIBCXX_ALWAYS_INLINE bool
test(memory_order __m = memory_order_seq_cst) noexcept
test(memory_order __m = memory_order_seq_cst) const noexcept
{
__atomic_flag_data_type __v;
__atomic_load(&_M_i, &__v, int(__m));
@ -220,7 +220,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
_GLIBCXX_ALWAYS_INLINE bool
test(memory_order __m = memory_order_seq_cst) volatile noexcept
test(memory_order __m = memory_order_seq_cst) const volatile noexcept
{
__atomic_flag_data_type __v;
__atomic_load(&_M_i, &__v, int(__m));

View file

@ -1,3 +1,4 @@
// { dg-options "-std=gnu++2a" }
// { dg-do run { target c++2a } }
// { dg-require-thread-fence "" }
@ -19,14 +20,21 @@
// <http://www.gnu.org/licenses/>.
#include <atomic>
#include <testsuite_hooks.h>
int main()
{
using namespace std;
atomic_flag af = ATOMIC_FLAG_INIT;
if (af.test(memory_order_acquire))
af.clear(memory_order_release);
atomic_flag af0 = ATOMIC_FLAG_INIT;
VERIFY( ! af0.test(memory_order_acquire) );
return 0;
atomic_flag af{true};
const atomic_flag& caf = af;
VERIFY( af.test(memory_order_acquire) );
VERIFY( caf.test(memory_order_acquire) );
af.clear(memory_order_release);
VERIFY( ! af.test(memory_order_acquire) );
VERIFY( ! caf.test(memory_order_acquire) );
}

View file

@ -1,3 +1,4 @@
// { dg-options "-std=gnu++2a" }
// { dg-do run { target c++2a } }
// { dg-require-thread-fence "" }
@ -19,14 +20,21 @@
// <http://www.gnu.org/licenses/>.
#include <atomic>
#include <testsuite_hooks.h>
int main()
{
using namespace std;
atomic_flag af = ATOMIC_FLAG_INIT;
if (af.test())
af.clear();
atomic_flag af0 = ATOMIC_FLAG_INIT;
VERIFY( ! af0.test(memory_order_acquire) );
return 0;
atomic_flag af{true};
const atomic_flag& caf = af;
VERIFY( af.test() );
VERIFY( caf.test() );
af.clear();
VERIFY( ! af.test() );
VERIFY( ! caf.test() );
}