179101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant//===----------------------------------------------------------------------===//
279101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant//
379101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant//                     The LLVM Compiler Infrastructure
479101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant//
5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
779101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant//
879101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant//===----------------------------------------------------------------------===//
97112dae6acac544a0271a85d95342c583441e2d1Dan Albert//
107112dae6acac544a0271a85d95342c583441e2d1Dan Albert// UNSUPPORTED: libcpp-has-no-threads
1179101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant
1279101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant// <atomic>
1379101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant
1479101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant// struct atomic_flag
1579101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant
1679101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant// bool atomic_flag_test_and_set_explicit(volatile atomic_flag*, memory_order);
1779101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant// bool atomic_flag_test_and_set_explicit(atomic_flag*, memory_order);
1879101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant
1979101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant#include <atomic>
2079101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant#include <cassert>
2179101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant
2279101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnantint main()
2379101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant{
2479101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant    {
2579101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        std::atomic_flag f;
2679101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        f.clear();
2779101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_relaxed) == 0);
2879101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        assert(f.test_and_set() == 1);
2979101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant    }
3079101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant    {
3179101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        std::atomic_flag f;
3279101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        f.clear();
3379101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_consume) == 0);
3479101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        assert(f.test_and_set() == 1);
3579101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant    }
3679101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant    {
3779101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        std::atomic_flag f;
3879101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        f.clear();
3979101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_acquire) == 0);
4079101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        assert(f.test_and_set() == 1);
4179101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant    }
4279101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant    {
4379101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        std::atomic_flag f;
4479101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        f.clear();
4579101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_release) == 0);
4679101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        assert(f.test_and_set() == 1);
4779101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant    }
4879101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant    {
4979101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        std::atomic_flag f;
5079101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        f.clear();
5179101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_acq_rel) == 0);
5279101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        assert(f.test_and_set() == 1);
5379101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant    }
5479101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant    {
5579101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        std::atomic_flag f;
5679101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        f.clear();
5779101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_seq_cst) == 0);
5879101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        assert(f.test_and_set() == 1);
5979101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant    }
6079101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant    {
6179101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        volatile std::atomic_flag f;
6279101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        f.clear();
6379101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_relaxed) == 0);
6479101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        assert(f.test_and_set() == 1);
6579101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant    }
6679101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant    {
6779101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        volatile std::atomic_flag f;
6879101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        f.clear();
6979101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_consume) == 0);
7079101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        assert(f.test_and_set() == 1);
7179101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant    }
7279101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant    {
7379101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        volatile std::atomic_flag f;
7479101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        f.clear();
7579101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_acquire) == 0);
7679101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        assert(f.test_and_set() == 1);
7779101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant    }
7879101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant    {
7979101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        volatile std::atomic_flag f;
8079101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        f.clear();
8179101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_release) == 0);
8279101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        assert(f.test_and_set() == 1);
8379101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant    }
8479101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant    {
8579101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        volatile std::atomic_flag f;
8679101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        f.clear();
8779101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_acq_rel) == 0);
8879101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        assert(f.test_and_set() == 1);
8979101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant    }
9079101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant    {
9179101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        volatile std::atomic_flag f;
9279101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        f.clear();
9379101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_seq_cst) == 0);
9479101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant        assert(f.test_and_set() == 1);
9579101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant    }
9679101aec3ad3070ad1378ca1450b72edf8ed67daHoward Hinnant}
97