You've already forked Zygisk-Assistant
mirror of
https://github.com/snake-4/Zygisk-Assistant.git
synced 2025-09-06 06:37:02 +00:00
Initial commit
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// <array>
|
||||
// UNSUPPORTED: c++03, c++11, c++14
|
||||
|
||||
// template <class T, class... U>
|
||||
// array(T, U...) -> array<T, 1 + sizeof...(U)>;
|
||||
//
|
||||
// Requires: (is_same_v<T, U> && ...) is true. Otherwise the program is ill-formed.
|
||||
|
||||
|
||||
#include <array>
|
||||
#include <cassert>
|
||||
#include <cstddef>
|
||||
|
||||
#include "test_macros.h"
|
||||
|
||||
int main(int, char**)
|
||||
{
|
||||
{
|
||||
std::array arr{1,2,3L}; // expected-error {{no viable constructor or deduction guide for deduction of template arguments of 'array'}}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// <array>
|
||||
// UNSUPPORTED: c++03, c++11, c++14
|
||||
|
||||
// template <class T, class... U>
|
||||
// array(T, U...) -> array<T, 1 + sizeof...(U)>;
|
||||
//
|
||||
// Requires: (is_same_v<T, U> && ...) is true. Otherwise the program is ill-formed.
|
||||
|
||||
#include <array>
|
||||
#include <cassert>
|
||||
#include <cstddef>
|
||||
|
||||
#include "test_macros.h"
|
||||
|
||||
constexpr bool tests()
|
||||
{
|
||||
// Test the explicit deduction guides
|
||||
{
|
||||
std::array arr{1,2,3}; // array(T, U...)
|
||||
static_assert(std::is_same_v<decltype(arr), std::array<int, 3>>, "");
|
||||
assert(arr[0] == 1);
|
||||
assert(arr[1] == 2);
|
||||
assert(arr[2] == 3);
|
||||
}
|
||||
|
||||
{
|
||||
const long l1 = 42;
|
||||
std::array arr{1L, 4L, 9L, l1}; // array(T, U...)
|
||||
static_assert(std::is_same_v<decltype(arr)::value_type, long>, "");
|
||||
static_assert(arr.size() == 4, "");
|
||||
assert(arr[0] == 1);
|
||||
assert(arr[1] == 4);
|
||||
assert(arr[2] == 9);
|
||||
assert(arr[3] == l1);
|
||||
}
|
||||
|
||||
// Test the implicit deduction guides
|
||||
{
|
||||
std::array<double, 2> source = {4.0, 5.0};
|
||||
std::array arr(source); // array(array)
|
||||
static_assert(std::is_same_v<decltype(arr), decltype(source)>, "");
|
||||
static_assert(std::is_same_v<decltype(arr), std::array<double, 2>>, "");
|
||||
assert(arr[0] == 4.0);
|
||||
assert(arr[1] == 5.0);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
int main(int, char**)
|
||||
{
|
||||
tests();
|
||||
static_assert(tests(), "");
|
||||
return 0;
|
||||
}
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// <array>
|
||||
|
||||
// implicitly generated array assignment operators
|
||||
|
||||
// Validate whether the container can be copy-assigned with an ADL-hijacking operator&
|
||||
|
||||
#include <array>
|
||||
|
||||
#include "test_macros.h"
|
||||
#include "operator_hijacker.h"
|
||||
|
||||
void test() {
|
||||
std::array<operator_hijacker, 1> ao;
|
||||
std::array<operator_hijacker, 1> a;
|
||||
a = ao;
|
||||
}
|
||||
+119
@@ -0,0 +1,119 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// <array>
|
||||
|
||||
// implicitly generated array constructors / assignment operators
|
||||
|
||||
#include <array>
|
||||
#include <type_traits>
|
||||
#include <cassert>
|
||||
#include "test_macros.h"
|
||||
|
||||
// In C++03 the copy assignment operator is not deleted when the implicitly
|
||||
// generated operator would be ill-formed; like in the case of a struct with a
|
||||
// const member.
|
||||
#if TEST_STD_VER < 11
|
||||
# define TEST_NOT_COPY_ASSIGNABLE(T) ((void)0)
|
||||
#else
|
||||
# define TEST_NOT_COPY_ASSIGNABLE(T) static_assert(!std::is_copy_assignable<T>::value, "")
|
||||
#endif
|
||||
|
||||
struct NoDefault {
|
||||
TEST_CONSTEXPR NoDefault(int) { }
|
||||
};
|
||||
|
||||
struct NonTrivialCopy {
|
||||
TEST_CONSTEXPR NonTrivialCopy() { }
|
||||
TEST_CONSTEXPR NonTrivialCopy(NonTrivialCopy const&) { }
|
||||
TEST_CONSTEXPR_CXX14 NonTrivialCopy& operator=(NonTrivialCopy const&) { return *this; }
|
||||
};
|
||||
|
||||
TEST_CONSTEXPR_CXX14 bool tests()
|
||||
{
|
||||
{
|
||||
typedef std::array<double, 3> Array;
|
||||
Array array = {1.1, 2.2, 3.3};
|
||||
Array copy = array;
|
||||
copy = array;
|
||||
static_assert(std::is_copy_constructible<Array>::value, "");
|
||||
static_assert(std::is_copy_assignable<Array>::value, "");
|
||||
}
|
||||
{
|
||||
typedef std::array<double const, 3> Array;
|
||||
Array array = {1.1, 2.2, 3.3};
|
||||
Array copy = array; (void)copy;
|
||||
static_assert(std::is_copy_constructible<Array>::value, "");
|
||||
TEST_NOT_COPY_ASSIGNABLE(Array);
|
||||
}
|
||||
{
|
||||
typedef std::array<double, 0> Array;
|
||||
Array array = {};
|
||||
Array copy = array;
|
||||
copy = array;
|
||||
static_assert(std::is_copy_constructible<Array>::value, "");
|
||||
static_assert(std::is_copy_assignable<Array>::value, "");
|
||||
}
|
||||
{
|
||||
// const arrays of size 0 should disable the implicit copy assignment operator.
|
||||
typedef std::array<double const, 0> Array;
|
||||
Array array = {};
|
||||
Array copy = array; (void)copy;
|
||||
static_assert(std::is_copy_constructible<Array>::value, "");
|
||||
TEST_NOT_COPY_ASSIGNABLE(Array);
|
||||
}
|
||||
{
|
||||
typedef std::array<NoDefault, 0> Array;
|
||||
Array array = {};
|
||||
Array copy = array;
|
||||
copy = array;
|
||||
static_assert(std::is_copy_constructible<Array>::value, "");
|
||||
static_assert(std::is_copy_assignable<Array>::value, "");
|
||||
}
|
||||
{
|
||||
typedef std::array<NoDefault const, 0> Array;
|
||||
Array array = {};
|
||||
Array copy = array; (void)copy;
|
||||
static_assert(std::is_copy_constructible<Array>::value, "");
|
||||
TEST_NOT_COPY_ASSIGNABLE(Array);
|
||||
}
|
||||
|
||||
// Make sure we can implicitly copy a std::array of a non-trivially copyable type
|
||||
{
|
||||
typedef std::array<NonTrivialCopy, 0> Array;
|
||||
Array array = {};
|
||||
Array copy = array;
|
||||
copy = array;
|
||||
static_assert(std::is_copy_constructible<Array>::value, "");
|
||||
}
|
||||
{
|
||||
typedef std::array<NonTrivialCopy, 1> Array;
|
||||
Array array = {};
|
||||
Array copy = array;
|
||||
copy = array;
|
||||
static_assert(std::is_copy_constructible<Array>::value, "");
|
||||
}
|
||||
{
|
||||
typedef std::array<NonTrivialCopy, 2> Array;
|
||||
Array array = {};
|
||||
Array copy = array;
|
||||
copy = array;
|
||||
static_assert(std::is_copy_constructible<Array>::value, "");
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
int main(int, char**)
|
||||
{
|
||||
tests();
|
||||
#if TEST_STD_VER >= 14
|
||||
static_assert(tests(), "");
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
+188
@@ -0,0 +1,188 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// Test all the ways of initializing a std::array.
|
||||
|
||||
#include <array>
|
||||
#include <cassert>
|
||||
#include <type_traits>
|
||||
#include "test_macros.h"
|
||||
|
||||
|
||||
struct NoDefault {
|
||||
TEST_CONSTEXPR NoDefault(int) { }
|
||||
};
|
||||
|
||||
// Test default initialization
|
||||
// This one isn't constexpr because omitting to initialize fundamental types
|
||||
// isn't valid in a constexpr context.
|
||||
struct test_default_initialization {
|
||||
template <typename T>
|
||||
void operator()() const
|
||||
{
|
||||
std::array<T, 0> a0; (void)a0;
|
||||
std::array<T, 1> a1; (void)a1;
|
||||
std::array<T, 2> a2; (void)a2;
|
||||
std::array<T, 3> a3; (void)a3;
|
||||
|
||||
std::array<NoDefault, 0> nodefault; (void)nodefault;
|
||||
}
|
||||
};
|
||||
|
||||
struct test_nondefault_initialization {
|
||||
template <typename T>
|
||||
TEST_CONSTEXPR_CXX14 void operator()() const
|
||||
{
|
||||
// Check direct-list-initialization syntax (introduced in C++11)
|
||||
#if TEST_STD_VER >= 11
|
||||
{
|
||||
{
|
||||
std::array<T, 0> a0_0{}; (void)a0_0;
|
||||
}
|
||||
{
|
||||
std::array<T, 1> a1_0{}; (void)a1_0;
|
||||
std::array<T, 1> a1_1{T()}; (void)a1_1;
|
||||
}
|
||||
{
|
||||
std::array<T, 2> a2_0{}; (void)a2_0;
|
||||
std::array<T, 2> a2_1{T()}; (void)a2_1;
|
||||
std::array<T, 2> a2_2{T(), T()}; (void)a2_2;
|
||||
}
|
||||
{
|
||||
std::array<T, 3> a3_0{}; (void)a3_0;
|
||||
std::array<T, 3> a3_1{T()}; (void)a3_1;
|
||||
std::array<T, 3> a3_2{T(), T()}; (void)a3_2;
|
||||
std::array<T, 3> a3_3{T(), T(), T()}; (void)a3_3;
|
||||
}
|
||||
|
||||
std::array<NoDefault, 0> nodefault{}; (void)nodefault;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Check copy-list-initialization syntax
|
||||
{
|
||||
{
|
||||
std::array<T, 0> a0_0 = {}; (void)a0_0;
|
||||
}
|
||||
{
|
||||
std::array<T, 1> a1_0 = {}; (void)a1_0;
|
||||
std::array<T, 1> a1_1 = {T()}; (void)a1_1;
|
||||
}
|
||||
{
|
||||
std::array<T, 2> a2_0 = {}; (void)a2_0;
|
||||
std::array<T, 2> a2_1 = {T()}; (void)a2_1;
|
||||
std::array<T, 2> a2_2 = {T(), T()}; (void)a2_2;
|
||||
}
|
||||
{
|
||||
std::array<T, 3> a3_0 = {}; (void)a3_0;
|
||||
std::array<T, 3> a3_1 = {T()}; (void)a3_1;
|
||||
std::array<T, 3> a3_2 = {T(), T()}; (void)a3_2;
|
||||
std::array<T, 3> a3_3 = {T(), T(), T()}; (void)a3_3;
|
||||
}
|
||||
|
||||
std::array<NoDefault, 0> nodefault = {}; (void)nodefault;
|
||||
}
|
||||
|
||||
// Test aggregate initialization
|
||||
{
|
||||
{
|
||||
std::array<T, 0> a0_0 = {{}}; (void)a0_0;
|
||||
}
|
||||
{
|
||||
std::array<T, 1> a1_0 = {{}}; (void)a1_0;
|
||||
std::array<T, 1> a1_1 = {{T()}}; (void)a1_1;
|
||||
}
|
||||
{
|
||||
std::array<T, 2> a2_0 = {{}}; (void)a2_0;
|
||||
std::array<T, 2> a2_1 = {{T()}}; (void)a2_1;
|
||||
std::array<T, 2> a2_2 = {{T(), T()}}; (void)a2_2;
|
||||
}
|
||||
{
|
||||
std::array<T, 3> a3_0 = {{}}; (void)a3_0;
|
||||
std::array<T, 3> a3_1 = {{T()}}; (void)a3_1;
|
||||
std::array<T, 3> a3_2 = {{T(), T()}}; (void)a3_2;
|
||||
std::array<T, 3> a3_3 = {{T(), T(), T()}}; (void)a3_3;
|
||||
}
|
||||
|
||||
// See http://wg21.link/LWG2157
|
||||
std::array<NoDefault, 0> nodefault = {{}}; (void)nodefault;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Test construction from an initializer-list
|
||||
TEST_CONSTEXPR_CXX14 bool test_initializer_list()
|
||||
{
|
||||
{
|
||||
std::array<double, 3> const a3_0 = {};
|
||||
assert(a3_0[0] == double());
|
||||
assert(a3_0[1] == double());
|
||||
assert(a3_0[2] == double());
|
||||
}
|
||||
{
|
||||
std::array<double, 3> const a3_1 = {1};
|
||||
assert(a3_1[0] == double(1));
|
||||
assert(a3_1[1] == double());
|
||||
assert(a3_1[2] == double());
|
||||
}
|
||||
{
|
||||
std::array<double, 3> const a3_2 = {1, 2.2};
|
||||
assert(a3_2[0] == double(1));
|
||||
assert(a3_2[1] == 2.2);
|
||||
assert(a3_2[2] == double());
|
||||
}
|
||||
{
|
||||
std::array<double, 3> const a3_3 = {1, 2, 3.5};
|
||||
assert(a3_3[0] == double(1));
|
||||
assert(a3_3[1] == double(2));
|
||||
assert(a3_3[2] == 3.5);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
struct Empty { };
|
||||
struct Trivial { int i; int j; };
|
||||
struct NonTrivial {
|
||||
TEST_CONSTEXPR NonTrivial() { }
|
||||
TEST_CONSTEXPR NonTrivial(NonTrivial const&) { }
|
||||
};
|
||||
struct NonEmptyNonTrivial {
|
||||
int i; int j;
|
||||
TEST_CONSTEXPR NonEmptyNonTrivial() : i(22), j(33) { }
|
||||
TEST_CONSTEXPR NonEmptyNonTrivial(NonEmptyNonTrivial const&) : i(22), j(33) { }
|
||||
};
|
||||
|
||||
template <typename F>
|
||||
TEST_CONSTEXPR_CXX14 bool with_all_types()
|
||||
{
|
||||
F().template operator()<char>();
|
||||
F().template operator()<int>();
|
||||
F().template operator()<long>();
|
||||
F().template operator()<float>();
|
||||
F().template operator()<double>();
|
||||
F().template operator()<long double>();
|
||||
F().template operator()<Empty>();
|
||||
F().template operator()<Trivial>();
|
||||
F().template operator()<NonTrivial>();
|
||||
F().template operator()<NonEmptyNonTrivial>();
|
||||
return true;
|
||||
}
|
||||
|
||||
int main(int, char**)
|
||||
{
|
||||
with_all_types<test_nondefault_initialization>();
|
||||
with_all_types<test_default_initialization>(); // not constexpr
|
||||
test_initializer_list();
|
||||
#if TEST_STD_VER >= 14
|
||||
static_assert(with_all_types<test_nondefault_initialization>(), "");
|
||||
static_assert(test_initializer_list(), "");
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user