//===----------------------------------------------------------------------===// // // 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 // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14, c++17 // XFAIL: availability-fp_to_chars-missing // The sample code is based on the bug report // https://github.com/llvm/llvm-project/issues/81590 // // Tests whether this formatter does not fail to compile due to nested concept // evaluation. #include #include struct X : std::variant { X* p = nullptr; constexpr const std::variant& decay() const noexcept { return *this; } }; template <> struct std::formatter : std::formatter { static constexpr auto format(const X& x, auto& ctx) { if (!x.p) return ctx.out(); auto m = [&](const X* t) { return std::format_to(ctx.out(), "{}", *t); }; return std::visit(m, x.decay()); } }; void bug_81590() { (void)std::format("{}", X{}); }