xref: /llvm-project/libcxx/test/std/experimental/simd/simd.reference/reference_unary.pass.cpp (revision 812ae91d545811d8800a6e1db5f3ff45afde6ab9)
1*812ae91dSZhangYin //===----------------------------------------------------------------------===//
2*812ae91dSZhangYin //
3*812ae91dSZhangYin // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*812ae91dSZhangYin // See https://llvm.org/LICENSE.txt for license information.
5*812ae91dSZhangYin // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*812ae91dSZhangYin //
7*812ae91dSZhangYin //===----------------------------------------------------------------------===//
8*812ae91dSZhangYin 
9*812ae91dSZhangYin // UNSUPPORTED: c++03, c++11, c++14
10*812ae91dSZhangYin 
11*812ae91dSZhangYin // <experimental/simd>
12*812ae91dSZhangYin //
13*812ae91dSZhangYin // [simd.reference]
14*812ae91dSZhangYin // reference operator++() && noexcept;
15*812ae91dSZhangYin // value_type operator++(int) && noexcept;
16*812ae91dSZhangYin // reference operator--() && noexcept;
17*812ae91dSZhangYin // value_type operator--(int) && noexcept;
18*812ae91dSZhangYin 
19*812ae91dSZhangYin #include "../test_utils.h"
20*812ae91dSZhangYin #include <experimental/simd>
21*812ae91dSZhangYin 
22*812ae91dSZhangYin namespace ex = std::experimental::parallelism_v2;
23*812ae91dSZhangYin 
24*812ae91dSZhangYin template <class T, std::size_t>
25*812ae91dSZhangYin struct CheckSimdReferenceUnaryOperators {
26*812ae91dSZhangYin   template <class SimdAbi>
27*812ae91dSZhangYin   void operator()() const {
28*812ae91dSZhangYin     ex::simd<T, SimdAbi> origin_simd(static_cast<T>(3));
29*812ae91dSZhangYin     static_assert(noexcept(++origin_simd[0]));
30*812ae91dSZhangYin     assert(((T)(++origin_simd[0]) == static_cast<T>(4)) && ((T)origin_simd[0] == static_cast<T>(4)));
31*812ae91dSZhangYin     static_assert(noexcept(origin_simd[0]++));
32*812ae91dSZhangYin     assert(((T)(origin_simd[0]++) == static_cast<T>(4)) && ((T)origin_simd[0] == static_cast<T>(5)));
33*812ae91dSZhangYin     static_assert(noexcept(--origin_simd[0]));
34*812ae91dSZhangYin     assert(((T)(--origin_simd[0]) == static_cast<T>(4)) && ((T)origin_simd[0] == static_cast<T>(4)));
35*812ae91dSZhangYin     static_assert(noexcept(origin_simd[0]--));
36*812ae91dSZhangYin     assert(((T)(origin_simd[0]--) == static_cast<T>(4)) && ((T)origin_simd[0] == static_cast<T>(3)));
37*812ae91dSZhangYin   }
38*812ae91dSZhangYin };
39*812ae91dSZhangYin 
40*812ae91dSZhangYin int main(int, char**) {
41*812ae91dSZhangYin   test_all_simd_abi<CheckSimdReferenceUnaryOperators>();
42*812ae91dSZhangYin   return 0;
43*812ae91dSZhangYin }
44