1 //===----------------------------------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
11 // template<class T> class valarray;
14 // Any function returning a valarray<T> is permitted to return an object of
15 // another type, provided all the const member functions of valarray<T> are
16 // also applicable to this type.
18 // Libc++ uses this and returns __val_expr<_Expr> for several operations.
20 // The const overloads of
21 // valarray::operator[](...) const
22 // return propxy objects. These proxies are implicitly convertible to
25 // Validate the function works for valarray, the proxies, and __val_expr.
27 // valarray& operator<<=(const valarray& v);
33 #include "test_macros.h"
36 void test(const A
& rhs
) {
37 int input
[] = {1, 2, 3, 4, 5};
38 int expected
[] = {64, 256, 768, 2048, 5120};
39 const unsigned N
= sizeof(input
) / sizeof(input
[0]);
40 std::valarray
<int> value(input
, N
);
44 assert(value
.size() == N
);
45 for (std::size_t i
= 0; i
< value
.size(); ++i
)
46 assert(value
[i
] == expected
[i
]);
49 int main(int, char**) {
50 int input
[] = {6, 7, 8, 9, 10};
51 const unsigned N
= sizeof(input
) / sizeof(input
[0]);
53 std::valarray
<bool> mask(true, N
);
54 std::size_t indices
[] = {0, 1, 2, 3, 4};
55 std::valarray
<std::size_t> indirect(indices
, N
);
57 std::valarray
<int> zero(0, N
);
60 std::valarray
<int> value(input
, N
);
63 test(value
[std::slice(0, N
, 1)]);
64 test(value
[std::gslice(0, std::valarray
<std::size_t>(N
, 1), std::valarray
<std::size_t>(1, 1))]);
66 test(value
[indirect
]);
71 const std::valarray
<int> value(input
, N
);
74 test(value
[std::slice(0, N
, 1)]);
75 test(value
[std::gslice(0, std::valarray
<std::size_t>(N
, 1), std::valarray
<std::size_t>(1, 1))]);
77 test(value
[indirect
]);