diff options
| author | Eric Fiselier <eric@efcs.ca> | 2015-07-14 17:50:27 +0000 |
|---|---|---|
| committer | Eric Fiselier <eric@efcs.ca> | 2015-07-14 17:50:27 +0000 |
| commit | 092c475e250af64e7b9ba459067d43cb71fb6dfd (patch) | |
| tree | 6c2533a1755a5e2af6c4980ddb02325b121bf585 /libcxx | |
| parent | 6c363ed67a58565623857297657e81db303b09da (diff) | |
| download | bcm5719-llvm-092c475e250af64e7b9ba459067d43cb71fb6dfd.tar.gz bcm5719-llvm-092c475e250af64e7b9ba459067d43cb71fb6dfd.zip | |
Fix PR24114 - std::atomic for non-Clang is not a literal type
Add _LIBCPP_CONSTEXPR to the implementation of __gcc_atomic_t.
llvm-svn: 242172
Diffstat (limited to 'libcxx')
| -rw-r--r-- | libcxx/include/atomic | 3 | ||||
| -rw-r--r-- | libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/ctor.pass.cpp | 56 |
2 files changed, 58 insertions, 1 deletions
diff --git a/libcxx/include/atomic b/libcxx/include/atomic index 5bc71f0032b..97a998d3363 100644 --- a/libcxx/include/atomic +++ b/libcxx/include/atomic @@ -554,7 +554,8 @@ namespace __gcc_atomic { template <typename _Tp> struct __gcc_atomic_t { __gcc_atomic_t() _NOEXCEPT {} - explicit __gcc_atomic_t(_Tp value) _NOEXCEPT : __a_value(value) {} + _LIBCPP_CONSTEXPR explicit __gcc_atomic_t(_Tp value) _NOEXCEPT + : __a_value(value) {} _Tp __a_value; }; #define _Atomic(x) __gcc_atomic::__gcc_atomic_t<x> diff --git a/libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/ctor.pass.cpp b/libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/ctor.pass.cpp new file mode 100644 index 00000000000..0eda2338d25 --- /dev/null +++ b/libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/ctor.pass.cpp @@ -0,0 +1,56 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 + +// <atomic> + +// constexpr atomic<T>::atomic(T value) + +#include <atomic> +#include <type_traits> +#include <cassert> + +struct UserType { + int i; + + UserType() noexcept {} + constexpr explicit UserType(int d) noexcept : i(d) {} + + friend bool operator==(const UserType& x, const UserType& y) { + return x.i == y.i; + } +}; + +template <class Tp> +void test() { + typedef std::atomic<Tp> Atomic; + static_assert(std::is_literal_type<Atomic>::value, ""); + constexpr Tp t(42); + { + constexpr Atomic a(t); + assert(a == t); + } + { + constexpr Atomic a{t}; + assert(a == t); + } + { + constexpr Atomic a = ATOMIC_VAR_INIT(t); + assert(a == t); + } +} + + +int main() +{ + test<int>(); + test<UserType>(); +} |

