xref: /llvm-project/libcxx/test/std/experimental/simd/simd.class/simd_subscr.pass.cpp (revision 503dbe75a042af2af35b90d23153752c66dcbf25)
1dc534106SZhangYin //===----------------------------------------------------------------------===//
2dc534106SZhangYin //
3dc534106SZhangYin // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4dc534106SZhangYin // See https://llvm.org/LICENSE.txt for license information.
5dc534106SZhangYin // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6dc534106SZhangYin //
7dc534106SZhangYin //===----------------------------------------------------------------------===//
8dc534106SZhangYin 
9dc534106SZhangYin // UNSUPPORTED: c++03, c++11, c++14
10*503dbe75SKamau Bridgeman // XFAIL: target=powerpc{{.*}}le-unknown-linux-gnu
11dc534106SZhangYin 
12dc534106SZhangYin // <experimental/simd>
13dc534106SZhangYin //
14dc534106SZhangYin // [simd.class]
15dc534106SZhangYin // reference operator[](size_t i);
16dc534106SZhangYin // value_type operator[](size_t i) const;
17dc534106SZhangYin 
18dc534106SZhangYin #include "../test_utils.h"
19dc534106SZhangYin #include <experimental/simd>
20dc534106SZhangYin 
21dc534106SZhangYin namespace ex = std::experimental::parallelism_v2;
22dc534106SZhangYin 
23dc534106SZhangYin template <class T, std::size_t>
24dc534106SZhangYin struct CheckSimdReferenceSubscr {
25dc534106SZhangYin   template <class SimdAbi>
operator ()CheckSimdReferenceSubscr26dc534106SZhangYin   void operator()() {
27dc534106SZhangYin     ex::simd<T, SimdAbi> origin_simd([](T i) { return i; });
28dc534106SZhangYin     for (size_t i = 0; i < origin_simd.size(); ++i) {
29dc534106SZhangYin       static_assert(noexcept(origin_simd[i]));
30dc534106SZhangYin       static_assert(std::is_same_v<typename ex::simd<T, SimdAbi>::reference, decltype(origin_simd[i])>);
31dc534106SZhangYin       assert(origin_simd[i] == static_cast<T>(i));
32dc534106SZhangYin     }
33dc534106SZhangYin   }
34dc534106SZhangYin };
35dc534106SZhangYin 
36dc534106SZhangYin template <class T, std::size_t>
37dc534106SZhangYin struct CheckSimdValueTypeSubscr {
38dc534106SZhangYin   template <class SimdAbi>
operator ()CheckSimdValueTypeSubscr39dc534106SZhangYin   void operator()() {
40dc534106SZhangYin     const ex::simd<T, SimdAbi> origin_simd([](T i) { return i; });
41dc534106SZhangYin     for (size_t i = 0; i < origin_simd.size(); ++i) {
42dc534106SZhangYin       static_assert(noexcept(origin_simd[i]));
43dc534106SZhangYin       static_assert(std::is_same_v<T, decltype(origin_simd[i])>);
44dc534106SZhangYin       assert(origin_simd[i] == static_cast<T>(i));
45dc534106SZhangYin     }
46dc534106SZhangYin   }
47dc534106SZhangYin };
48dc534106SZhangYin 
main(int,char **)49dc534106SZhangYin int main(int, char**) {
50dc534106SZhangYin   test_all_simd_abi<CheckSimdReferenceSubscr>();
51dc534106SZhangYin   test_all_simd_abi<CheckSimdValueTypeSubscr>();
52dc534106SZhangYin   return 0;
53dc534106SZhangYin }
54