// Copyright (C) 2018-2019 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 3, or (at your option) // any later version. // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License along // with this library; see the file COPYING3. If not see // . // { dg-do compile { target c++11 } } // { dg-require-atomic-builtins "" } #include void test01() { struct X { }; struct Y { }; // Primary template volatile std::atomic v; std::atomic a; const std::memory_order mo = std::memory_order_seq_cst; X x; Y y; auto r1 = atomic_is_lock_free(&v); static_assert( std::is_same::value, "" ); auto r2 = atomic_is_lock_free(&a); static_assert( std::is_same::value, "" ); atomic_init(&v, x); atomic_init(&a, y); atomic_store(&v, x); atomic_store(&a, y); atomic_store_explicit(&v, x, mo); atomic_store_explicit(&a, y, mo); auto r3 = atomic_load(&v); static_assert( std::is_same::value, "" ); auto r4 = atomic_load(&a); static_assert( std::is_same::value, "" ); auto r5 = atomic_load_explicit(&v, mo); static_assert( std::is_same::value, "" ); auto r6 = atomic_load_explicit(&a, mo); static_assert( std::is_same::value, "" ); auto r7 = atomic_exchange(&v, x); static_assert( std::is_same::value, "" ); auto r8 = atomic_exchange(&a, y); static_assert( std::is_same::value, "" ); auto r9 = atomic_exchange_explicit(&v, x, mo); static_assert( std::is_same::value, "" ); auto r10 = atomic_exchange_explicit(&a, y, mo); static_assert( std::is_same::value, "" ); auto r11 = atomic_compare_exchange_weak(&v, &x, x); static_assert( std::is_same::value, "" ); auto r12 = atomic_compare_exchange_weak(&a, &y, y); static_assert( std::is_same::value, "" ); auto r13 = atomic_compare_exchange_strong(&v, &x, x); static_assert( std::is_same::value, "" ); auto r14 = atomic_compare_exchange_strong(&a, &y, y); static_assert( std::is_same::value, "" ); auto r15 = atomic_compare_exchange_weak_explicit(&v, &x, x, mo, mo); static_assert( std::is_same::value, "" ); auto r16 = atomic_compare_exchange_weak_explicit(&a, &y, y, mo, mo); static_assert( std::is_same::value, "" ); auto r17 = atomic_compare_exchange_strong_explicit(&v, &x, x, mo, mo); static_assert( std::is_same::value, "" ); auto r18 = atomic_compare_exchange_strong_explicit(&a, &y, y, mo, mo); static_assert( std::is_same::value, "" ); } void test02() { // Specialization for bool volatile std::atomic v; std::atomic a; const std::memory_order mo = std::memory_order_seq_cst; bool b = false; auto r1 = atomic_is_lock_free(&v); static_assert( std::is_same::value, "" ); auto r2 = atomic_is_lock_free(&a); static_assert( std::is_same::value, "" ); atomic_init(&v, b); atomic_init(&a, b); atomic_store(&v, b); atomic_store(&a, b); atomic_store_explicit(&v, b, mo); atomic_store_explicit(&a, b, mo); auto r3 = atomic_load(&v); static_assert( std::is_same::value, "" ); auto r4 = atomic_load(&a); static_assert( std::is_same::value, "" ); auto r5 = atomic_load_explicit(&v, mo); static_assert( std::is_same::value, "" ); auto r6 = atomic_load_explicit(&a, mo); static_assert( std::is_same::value, "" ); auto r7 = atomic_exchange(&v, b); static_assert( std::is_same::value, "" ); auto r8 = atomic_exchange(&a, b); static_assert( std::is_same::value, "" ); auto r9 = atomic_exchange_explicit(&v, b, mo); static_assert( std::is_same::value, "" ); auto r10 = atomic_exchange_explicit(&a, b, mo); static_assert( std::is_same::value, "" ); auto r11 = atomic_compare_exchange_weak(&v, &b, b); static_assert( std::is_same::value, "" ); auto r12 = atomic_compare_exchange_weak(&a, &b, b); static_assert( std::is_same::value, "" ); auto r13 = atomic_compare_exchange_strong(&v, &b, b); static_assert( std::is_same::value, "" ); auto r14 = atomic_compare_exchange_strong(&a, &b, b); static_assert( std::is_same::value, "" ); auto r15 = atomic_compare_exchange_weak_explicit(&v, &b, b, mo, mo); static_assert( std::is_same::value, "" ); auto r16 = atomic_compare_exchange_weak_explicit(&a, &b, b, mo, mo); static_assert( std::is_same::value, "" ); auto r17 = atomic_compare_exchange_strong_explicit(&v, &b, b, mo, mo); static_assert( std::is_same::value, "" ); auto r18 = atomic_compare_exchange_strong_explicit(&a, &b, b, mo, mo); static_assert( std::is_same::value, "" ); } void test03() { // Partial specialization for pointers volatile std::atomic v; std::atomic a; const std::memory_order mo = std::memory_order_seq_cst; int* i = nullptr; long* l = nullptr; auto r1 = atomic_is_lock_free(&v); static_assert( std::is_same::value, "" ); auto r2 = atomic_is_lock_free(&a); static_assert( std::is_same::value, "" ); atomic_init(&v, i); atomic_init(&a, l); atomic_store(&v, i); atomic_store(&a, l); atomic_store_explicit(&v, i, mo); atomic_store_explicit(&a, l, mo); auto r3 = atomic_load(&v); static_assert( std::is_same::value, "" ); auto r4 = atomic_load(&a); static_assert( std::is_same::value, "" ); auto r5 = atomic_load_explicit(&v, mo); static_assert( std::is_same::value, "" ); auto r6 = atomic_load_explicit(&a, mo); static_assert( std::is_same::value, "" ); auto r7 = atomic_exchange(&v, i); static_assert( std::is_same::value, "" ); auto r8 = atomic_exchange(&a, l); static_assert( std::is_same::value, "" ); auto r9 = atomic_exchange_explicit(&v, i, mo); static_assert( std::is_same::value, "" ); auto r10 = atomic_exchange_explicit(&a, l, mo); static_assert( std::is_same::value, "" ); auto r11 = atomic_compare_exchange_weak(&v, &i, i); static_assert( std::is_same::value, "" ); auto r12 = atomic_compare_exchange_weak(&a, &l, l); static_assert( std::is_same::value, "" ); auto r13 = atomic_compare_exchange_strong(&v, &i, i); static_assert( std::is_same::value, "" ); auto r14 = atomic_compare_exchange_strong(&a, &l, l); static_assert( std::is_same::value, "" ); auto r15 = atomic_compare_exchange_weak_explicit(&v, &i, i, mo, mo); static_assert( std::is_same::value, "" ); auto r16 = atomic_compare_exchange_weak_explicit(&a, &l, l, mo, mo); static_assert( std::is_same::value, "" ); auto r17 = atomic_compare_exchange_strong_explicit(&v, &i, i, mo, mo); static_assert( std::is_same::value, "" ); auto r18 = atomic_compare_exchange_strong_explicit(&a, &l, l, mo, mo); static_assert( std::is_same::value, "" ); auto r19 = atomic_fetch_add(&v, 1); static_assert( std::is_same::value, "" ); auto r20 = atomic_fetch_add(&a, 1); static_assert( std::is_same::value, "" ); auto r21 = atomic_fetch_add_explicit(&v, 1, mo); static_assert( std::is_same::value, "" ); auto r22 = atomic_fetch_add_explicit(&a, 1, mo); static_assert( std::is_same::value, "" ); auto r23 = atomic_fetch_sub(&v, 1); static_assert( std::is_same::value, "" ); auto r24 = atomic_fetch_sub(&a, 1); static_assert( std::is_same::value, "" ); auto r25 = atomic_fetch_sub_explicit(&v, 1, mo); static_assert( std::is_same::value, "" ); auto r26 = atomic_fetch_sub_explicit(&a, 1, mo); static_assert( std::is_same::value, "" ); } void test04() { struct base { }; struct derived : base { }; // Partial specialization for pointers volatile std::atomic v; std::atomic a; const std::memory_order mo = std::memory_order_seq_cst; // Repeat tests with arguments of type different to value_type. derived* const p = nullptr; base* b = nullptr; atomic_init(&v, p); atomic_init(&a, p); atomic_store(&v, p); atomic_store(&a, p); atomic_store_explicit(&v, p, mo); atomic_store_explicit(&a, p, mo); atomic_exchange(&v, p); atomic_exchange(&a, p); atomic_exchange_explicit(&v, p, mo); atomic_exchange_explicit(&a, p, mo); atomic_compare_exchange_weak(&v, &b, p); atomic_compare_exchange_weak(&a, &b, p); atomic_compare_exchange_strong(&v, &b, p); atomic_compare_exchange_strong(&a, &b, p); atomic_compare_exchange_weak_explicit(&v, &b, p, mo, mo); atomic_compare_exchange_weak_explicit(&a, &b, p, mo, mo); atomic_compare_exchange_strong_explicit(&v, &b, p, mo, mo); atomic_compare_exchange_strong_explicit(&a, &b, p, mo, mo); }