14777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant//===----------------------------------------------------------------------===//
24777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant//
34777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant//                     The LLVM Compiler Infrastructure
44777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant//
54777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
64777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant// Source Licenses. See LICENSE.TXT for details.
74777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant//
84777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant//===----------------------------------------------------------------------===//
94777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant
104777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant// <atomic>
114777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant
124777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant// template <class T>
134777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant//     bool
144777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant//     atomic_is_lock_free(const volatile atomic<T>* obj);
154777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant//
164777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant// template <class T>
174777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant//     bool
184777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant//     atomic_is_lock_free(const atomic<T>* obj);
194777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant
204777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant#include <atomic>
214777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant
224777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnanttemplate <class T>
234777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnantvoid
244777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnanttest()
254777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant{
264777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    typedef std::atomic<T> A;
2774f4da7219100afcff4baab33d12910d29eb127eHoward Hinnant    A t;
2874f4da7219100afcff4baab33d12910d29eb127eHoward Hinnant    bool b1 = std::atomic_is_lock_free(static_cast<const A*>(&t));
2974f4da7219100afcff4baab33d12910d29eb127eHoward Hinnant    volatile A vt;
3074f4da7219100afcff4baab33d12910d29eb127eHoward Hinnant    bool b2 = std::atomic_is_lock_free(static_cast<const volatile A*>(&vt));
314777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant}
324777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant
334777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnantstruct A
344777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant{
354777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    char _[4];
364777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant};
374777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant
384777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnantint main()
394777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant{
404777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<A>();
414777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<char>();
424777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<signed char>();
434777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<unsigned char>();
444777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<short>();
454777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<unsigned short>();
464777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<int>();
474777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<unsigned int>();
484777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<long>();
494777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<unsigned long>();
504777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<long long>();
514777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<unsigned long long>();
524777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<wchar_t>();
534777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
544777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<char16_t>();
554777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<char32_t>();
564777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant#endif  // _LIBCPP_HAS_NO_UNICODE_CHARS
574777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<int*>();
584777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<const int*>();
594777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant}
60