diff --git a/libcxx/docs/Status/Cxx2cIssues.csv b/libcxx/docs/Status/Cxx2cIssues.csv index 8d312cd688daa..651b8c891ec00 100644 --- a/libcxx/docs/Status/Cxx2cIssues.csv +++ b/libcxx/docs/Status/Cxx2cIssues.csv @@ -179,7 +179,7 @@ "`LWG4294 `__","``bitset(const CharT*)`` constructor needs to be constrained","2025-11 (Kona)","","","`#171336 `__","" "`LWG4297 `__","Missing ``permutable`` constraint for iterator overloads in Parallel Range Algorithms","2025-11 (Kona)","","","`#171338 `__","" "`LWG4299 `__","Missing *Mandates:* part in ``optional::transform``","2025-11 (Kona)","","","`#171339 `__","" -"`LWG4300 `__","Missing *Returns:* element in ``optional::emplace``","2025-11 (Kona)","","","`#171340 `__","" +"`LWG4300 `__","Missing *Returns:* element in ``optional::emplace``","2025-11 (Kona)","|Complete|","22","`#171340 `__","" "`LWG4301 `__","``condition_variable{_any}::wait_{for, until}`` should take timeout by value","2025-11 (Kona)","","","`#171341 `__","" "`LWG4302 `__","Problematic ``vector_sum_of_squares`` wording","2025-11 (Kona)","","","`#171342 `__","" "`LWG4304 `__","``std::optional`` is ill-formed due to ``value_or``","2025-11 (Kona)","","","`#171343 `__","" @@ -237,7 +237,7 @@ "`LWG4434 `__","``meta::is_accessible`` does not need to consider incomplete *D*","2025-11 (Kona)","","","`#171399 `__","" "`LWG4435 `__","``meta::has_identifier`` doesn't handle all types","2025-11 (Kona)","","","`#171400 `__","" "`LWG4438 `__","Bad expression in [exec.when.all]","2025-11 (Kona)","","","`#171401 `__","" -"`LWG4439 `__","``std::optional::swap`` possibly selects ADL-found ``swap``","2025-11 (Kona)","","","`#171402 `__","" +"`LWG4439 `__","``std::optional::swap`` possibly selects ADL-found ``swap``","2025-11 (Kona)","|Complete|","22","`#171402 `__","" "`LWG4440 `__","Forward declarations of entities need also in entries","2025-11 (Kona)","","","`#171403 `__","" "`LWG4441 `__","``ranges::rotate`` do not handle sized-but-not-sized-sentinel ranges correctly","2025-11 (Kona)","","","`#171404 `__","" "`LWG4442 `__","Clarify ``expr`` and ``fn`` for ``meta::reflect_object`` and ``meta::reflect_function``","2025-11 (Kona)","","","`#171405 `__","" diff --git a/libcxx/test/std/utilities/optional/optional.specalg/swap.pass.cpp b/libcxx/test/std/utilities/optional/optional.specalg/swap.pass.cpp index c757120a1c146..7cf7a80f7d703 100644 --- a/libcxx/test/std/utilities/optional/optional.specalg/swap.pass.cpp +++ b/libcxx/test/std/utilities/optional/optional.specalg/swap.pass.cpp @@ -175,6 +175,43 @@ constexpr bool test_swap_ref() { } return true; } + +struct ADLSwap { + static inline bool called_adl_swap{false}; + + friend void swap(ADLSwap&, ADLSwap&) noexcept { called_adl_swap = true; } + friend void swap(ADLSwap*&, ADLSwap*&) noexcept { called_adl_swap = true; } +}; + +struct DelADLSwap { + static inline bool called_adl_swap{false}; + + friend void swap(DelADLSwap&, DelADLSwap&) noexcept = delete; + friend void swap(DelADLSwap*&, DelADLSwap*&) noexcept = delete; +}; + +// LWG4439: Verify that an ADL-found swap is not selected when calling optional::swap() +void test_ref_swap_adl() { + ADLSwap t1{}; + ADLSwap t2{}; + + std::optional o{t1}; + std::optional o2{t2}; + + o.swap(o2); + + assert(!ADLSwap::called_adl_swap); + + DelADLSwap td1{}; + DelADLSwap td2{}; + + std::optional od1{td1}; + std::optional od2{td2}; + + // Ensure that no ADL ever occurs, the following line will be invalid if it does + od1.swap(od2); +} + #endif int main(int, char**) @@ -185,6 +222,7 @@ int main(int, char**) static_assert(test_swap_ref()); test_swap_ref(); test_swap_ref(); + test_ref_swap_adl(); #endif { optional opt1;