94 lines · cpp
1//===----------------------------------------------------------------------===//2//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-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++14, c++1710// UNSUPPORTED: no-localization11 12// TODO FMT This test should not require std::to_chars(floating-point)13// XFAIL: availability-fp_to_chars-missing14 15// Basic test to validate ill-formed code is properly detected.16 17// <format>18 19// template<class... Args>20// string format(const locale& loc, format-string<Args...> fmt, const Args&... args);21// template<class... Args>22// wstring format(const locale& loc, wformat-string<Args...> fmt, const Args&... args);23 24#include <format>25#include <locale>26 27#include "test_macros.h"28 29// clang-format off30 31void f() {32 TEST_IGNORE_NODISCARD std::format(std::locale(), "{"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}}33 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}}34 35 TEST_IGNORE_NODISCARD std::format(std::locale(), "}"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}}36 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}}37 38 TEST_IGNORE_NODISCARD std::format(std::locale(), "{}"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}}39 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}}40 41 TEST_IGNORE_NODISCARD std::format(std::locale(), "{0}"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}}42 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}}43 44 TEST_IGNORE_NODISCARD std::format(std::locale(), "{:-}", "Forty-two"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}}45 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}}46 47 TEST_IGNORE_NODISCARD std::format(std::locale(), "{:#}", "Forty-two"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}}48 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}}49 50 TEST_IGNORE_NODISCARD std::format(std::locale(), "{:L}", "Forty-two"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}}51 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}}52 53 TEST_IGNORE_NODISCARD std::format(std::locale(), "{0:{0}}", "Forty-two"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}}54 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}}55 56 TEST_IGNORE_NODISCARD std::format(std::locale(), "{:.42d}", "Forty-two"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}}57 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}}58 59 TEST_IGNORE_NODISCARD std::format(std::locale(), "{:d}", "Forty-two"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}}60 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}}61 62#ifndef TEST_HAS_NO_WIDE_CHARACTERS63 TEST_IGNORE_NODISCARD std::format(std::locale(), L"{"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}}64 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}}65 66 TEST_IGNORE_NODISCARD std::format(std::locale(), L"}"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}}67 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}}68 69 TEST_IGNORE_NODISCARD std::format(std::locale(), L"{}"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}}70 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}}71 72 TEST_IGNORE_NODISCARD std::format(std::locale(), L"{0}"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}}73 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}}74 75 TEST_IGNORE_NODISCARD std::format(std::locale(), L"{:-}", L"Forty-two"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}}76 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}}77 78 TEST_IGNORE_NODISCARD std::format(std::locale(), L"{:#}", L"Forty-two"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}}79 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}}80 81 TEST_IGNORE_NODISCARD std::format(std::locale(), L"{:L}", L"Forty-two"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}}82 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}}83 84 TEST_IGNORE_NODISCARD std::format(std::locale(), L"{0:{0}}", L"Forty-two"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}}85 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}}86 87 TEST_IGNORE_NODISCARD std::format(std::locale(), L"{:.42d}", L"Forty-two"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}}88 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}}89 90 TEST_IGNORE_NODISCARD std::format(std::locale(), L"{:d}", L"Forty-two"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}}91 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}}92#endif93}94