//===----------------------------------------------------------------------===// // // 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, c++20 // To silence a GCC warning-turned-error re. `BadAlloc::value_type`. // ADDITIONAL_COMPILE_FLAGS(gcc-style-warnings): -Wno-unused-local-typedefs // template>> // basic_string(from_range_t, R&&, Allocator = Allocator()) // -> basic_string, char_traits>, // Allocator>; // C++23 // // The deduction guide shall not participate in overload resolution if Allocator // is a type that does not qualify as an allocator (in addition to the `input_range` concept being satisfied by `R`). #include #include #include "deduction_guides_sfinae_checks.h" #include "test_allocator.h" #include "asan_testing.h" int main(int, char**) { using Char = char16_t; { std::basic_string c(std::from_range, std::array()); static_assert(std::is_same_v>); LIBCPP_ASSERT(is_string_asan_correct(c)); } { using Alloc = test_allocator; std::basic_string c(std::from_range, std::array(), Alloc()); static_assert(std::is_same_v, Alloc>>); LIBCPP_ASSERT(is_string_asan_correct(c)); } // Note: defining `value_type` is a workaround because one of the deduction guides will end up instantiating // `basic_string`, and that would fail with a hard error if the given allocator doesn't define `value_type`. struct BadAlloc { using value_type = char; }; SequenceContainerDeductionGuidesSfinaeAway, BadAlloc>(); return 0; }