1 //===----------------------------------------------------------------------===// 2 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 3 // See https://llvm.org/LICENSE.txt for license information. 4 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 5 // 6 //===----------------------------------------------------------------------===// 7 8 // UNSUPPORTED: c++03, c++11, c++14, c++17 9 // UNSUPPORTED: no-localization 10 // UNSUPPORTED: libcpp-has-no-incomplete-format 11 // TODO FMT Evaluate gcc-11 status 12 // UNSUPPORTED: gcc-11 13 14 // Basic test to validate ill-formed code is properly detected. 15 16 // <format> 17 18 // template<class... Args> 19 // string format(const locale& loc, format-string<Args...> fmt, const Args&... args); 20 // template<class... Args> 21 // wstring format(const locale& loc, wformat-string<Args...> fmt, const Args&... args); 22 23 #include <format> 24 #include <locale> 25 26 #include "test_macros.h" 27 28 // clang-format off 29 30 void f() { 31 std::format(std::locale(), "{"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}} 32 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}} 33 34 std::format(std::locale(), "}"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}} 35 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}} 36 37 std::format(std::locale(), "{}"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}} 38 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}} 39 40 std::format(std::locale(), "{0}"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}} 41 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}} 42 43 std::format(std::locale(), "{:-}", "Forty-two"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}} 44 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}} 45 46 std::format(std::locale(), "{:#}", "Forty-two"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}} 47 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}} 48 49 std::format(std::locale(), "{:L}", "Forty-two"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}} 50 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}} 51 52 std::format(std::locale(), "{0:{0}}", "Forty-two"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}} 53 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}} 54 55 std::format(std::locale(), "{:.42d}", "Forty-two"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}} 56 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}} 57 58 std::format(std::locale(), "{:d}", "Forty-two"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}} 59 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}} 60 61 #ifndef TEST_HAS_NO_WIDE_CHARACTERS 62 std::format(std::locale(), L"{"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}} 63 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}} 64 65 std::format(std::locale(), L"}"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}} 66 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}} 67 68 std::format(std::locale(), L"{}"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}} 69 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}} 70 71 std::format(std::locale(), L"{0}"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}} 72 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}} 73 74 std::format(std::locale(), L"{:-}", L"Forty-two"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}} 75 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}} 76 77 std::format(std::locale(), L"{:#}", L"Forty-two"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}} 78 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}} 79 80 std::format(std::locale(), L"{:L}", L"Forty-two"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}} 81 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}} 82 83 std::format(std::locale(), L"{0:{0}}", L"Forty-two"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}} 84 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}} 85 86 std::format(std::locale(), L"{:.42d}", L"Forty-two"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}} 87 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}} 88 89 std::format(std::locale(), L"{:d}", L"Forty-two"); // expected-error-re{{call to consteval function '{{.*}}' is not a constant expression}} 90 // expected-note@*:* {{non-constexpr function '__throw_format_error' cannot be used in a constant expression}} 91 #endif 92 } 93