1*42ba740aSDamien L-G //===----------------------------------------------------------------------===// 2*42ba740aSDamien L-G // 3*42ba740aSDamien L-G // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*42ba740aSDamien L-G // See https://llvm.org/LICENSE.txt for license information. 5*42ba740aSDamien L-G // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*42ba740aSDamien L-G // 7*42ba740aSDamien L-G //===----------------------------------------------------------------------===// 8*42ba740aSDamien L-G 9*42ba740aSDamien L-G // UNSUPPORTED: c++03, c++11, c++14, c++17 10*42ba740aSDamien L-G 11*42ba740aSDamien L-G // <atomic> 12*42ba740aSDamien L-G 13*42ba740aSDamien L-G // explicit atomic_ref(T&); 14*42ba740aSDamien L-G 15*42ba740aSDamien L-G #include <atomic> 16*42ba740aSDamien L-G #include <type_traits> 17*42ba740aSDamien L-G 18*42ba740aSDamien L-G #include "atomic_helpers.h" 19*42ba740aSDamien L-G #include "test_macros.h" 20*42ba740aSDamien L-G 21*42ba740aSDamien L-G template <typename T> 22*42ba740aSDamien L-G struct TestCtor { operator ()TestCtor23*42ba740aSDamien L-G void operator()() const { 24*42ba740aSDamien L-G // check that the constructor is explicit 25*42ba740aSDamien L-G static_assert(!std::is_convertible_v<T, std::atomic_ref<T>>); 26*42ba740aSDamien L-G static_assert(std::is_constructible_v<std::atomic_ref<T>, T&>); 27*42ba740aSDamien L-G 28*42ba740aSDamien L-G T x(T(0)); 29*42ba740aSDamien L-G std::atomic_ref<T> a(x); 30*42ba740aSDamien L-G (void)a; 31*42ba740aSDamien L-G } 32*42ba740aSDamien L-G }; 33*42ba740aSDamien L-G main(int,char **)34*42ba740aSDamien L-Gint main(int, char**) { 35*42ba740aSDamien L-G TestEachAtomicType<TestCtor>()(); 36*42ba740aSDamien L-G return 0; 37*42ba740aSDamien L-G } 38