blob: 80e45c5024b2cb6467f979e0fa44d7e8890ea18e [file] [log] [blame]
//===----------------------------------------------------------------------===//
// 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
//
//===----------------------------------------------------------------------===//
#ifndef _LIBCPP_TEST_STD_UTILITIES_FORMAT_FORMAT_STRING_FORMAT_STRING_STD_TEST_EXCEPTION_H
#define _LIBCPP_TEST_STD_UTILITIES_FORMAT_FORMAT_STRING_FORMAT_STRING_STD_TEST_EXCEPTION_H
#include <format>
#include <string_view>
namespace detail {
#ifndef TEST_HAS_NO_EXCEPTIONS
template <class Parser, class CharT>
void test_exception(std::string_view what, const CharT* fmt) {
try {
std::basic_format_parse_context<CharT> parse_ctx(fmt);
(void)Parser{}.parse(parse_ctx);
assert(false);
} catch (std::format_error& e) {
LIBCPP_ASSERT(e.what() == what);
return;
}
assert(false);
}
#endif
} // namespace detail
/**
* Wrapper for the exception tests.
*
* When using the real function directly during in a constexpr test and add
* the `std::is_constant_evaluated()` test there the compilation fails. This
* happens since assert calls the non-constexpr function '__assert_fail'.
* Solve this issue with an layer of indirection.
*/
template <class Parser, class CharT>
constexpr void test_exception(std::string_view what, const CharT* fmt) {
#ifndef TEST_HAS_NO_EXCEPTIONS
if (!std::is_constant_evaluated())
detail::test_exception<Parser>(what, fmt);
#else
(void)what;
(void)fmt;
#endif
}
#endif // _LIBCPP_TEST_STD_UTILITIES_FORMAT_FORMAT_STRING_FORMAT_STRING_STD_TEST_EXCEPTION_H