Make sure the underlying allocation system can support an allocation request generated by the new operator which has stricter alignment requirements than the default. For G++, this ends up using the 'memalign' function which is not part of any C standard. Signed-off-by: Keith Packard <keithp@keithp.com>
117 lines
2.5 KiB
C++
117 lines
2.5 KiB
C++
/*
|
|
* Copyright (c) 2019 Nordic Semiconductor ASA
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <array>
|
|
#include <functional>
|
|
#include <memory>
|
|
#include <vector>
|
|
#include <zephyr/ztest.h>
|
|
#include <zephyr/kernel.h>
|
|
|
|
BUILD_ASSERT(__cplusplus == 201703);
|
|
|
|
std::array<int, 4> array = {1, 2, 3, 4};
|
|
std::vector<int> vector;
|
|
|
|
ZTEST(libcxx_tests, test_array)
|
|
{
|
|
zassert_equal(array.size(), 4, "unexpected size");
|
|
zassert_equal(array[0], 1, "array[0] wrong");
|
|
zassert_equal(array[3], 4, "array[3] wrong");
|
|
|
|
std::array<uint8_t, 2> local = {1, 2};
|
|
zassert_equal(local.size(), 2, "unexpected size");
|
|
zassert_equal(local[0], 1, "local[0] wrong");
|
|
zassert_equal(local[1], 2, "local[1] wrong");
|
|
}
|
|
|
|
ZTEST(libcxx_tests, test_vector)
|
|
{
|
|
zassert_equal(vector.size(), 0, "vector init nonzero");
|
|
for (auto v : array) {
|
|
vector.push_back(v);
|
|
}
|
|
zassert_equal(vector.size(), array.size(), "vector store failed");
|
|
}
|
|
|
|
struct make_unique_data {
|
|
static int ctors;
|
|
static int dtors;
|
|
int inst;
|
|
|
|
make_unique_data () :
|
|
inst{++ctors}
|
|
{ }
|
|
|
|
~make_unique_data ()
|
|
{
|
|
++dtors;
|
|
}
|
|
};
|
|
int make_unique_data::ctors;
|
|
int make_unique_data::dtors;
|
|
|
|
ZTEST(libcxx_tests, test_make_unique)
|
|
{
|
|
zassert_equal(make_unique_data::ctors, 0, "ctor count not initialized");
|
|
zassert_equal(make_unique_data::dtors, 0, "dtor count not initialized");
|
|
auto d = std::make_unique<make_unique_data>();
|
|
zassert_true(static_cast<bool>(d), "allocation failed");
|
|
zassert_equal(make_unique_data::ctors, 1, "ctr update failed");
|
|
zassert_equal(d->inst, 1, "instance init failed");
|
|
zassert_equal(make_unique_data::dtors, 0, "dtor count not zero");
|
|
d.reset();
|
|
zassert_false(d, "release failed");
|
|
zassert_equal(make_unique_data::dtors, 1, "dtor count not incremented");
|
|
}
|
|
|
|
#if defined(CONFIG_CPP_EXCEPTIONS) && !defined(CONFIG_BOARD_M2GL025_MIV)
|
|
static void throw_exception(void)
|
|
{
|
|
throw 42;
|
|
}
|
|
|
|
ZTEST(libcxx_tests, test_exception)
|
|
{
|
|
try
|
|
{
|
|
throw_exception();
|
|
}
|
|
catch (int i)
|
|
{
|
|
zassert_equal(i, 42, "Incorrect exception value");
|
|
return;
|
|
}
|
|
|
|
zassert_unreachable("Missing exception catch");
|
|
}
|
|
#else
|
|
|
|
ZTEST(libcxx_tests, test_exception)
|
|
{
|
|
ztest_test_skip();
|
|
}
|
|
#endif
|
|
|
|
struct ThreadStack
|
|
{
|
|
K_KERNEL_STACK_MEMBER(threadStack, 1024) {};
|
|
};
|
|
|
|
ZTEST(libcxx_tests, test_new_aligned)
|
|
{
|
|
auto test_aligned = std::make_unique<ThreadStack>();
|
|
zassert_not_null(test_aligned, "aligned allocation failed");
|
|
}
|
|
|
|
static void *libcxx_tests_setup(void)
|
|
{
|
|
TC_PRINT("version %u\n", (uint32_t)__cplusplus);
|
|
|
|
return NULL;
|
|
}
|
|
ZTEST_SUITE(libcxx_tests, NULL, libcxx_tests_setup, NULL, NULL, NULL);
|