LWG 3956 (approved in Hagenberg, February 2025) decided that from_stream
should be found *only* by ADL, not ordinary unqualified lookup. Add a
poison pill overload to chrono::__detail where the __parsable and
operator>>(basic_istream&, _Parser) are defined. This ensures that when
they use from_stream unqualified ordinary lookup finds the poison pill,
which is deleted, so a usable overload resolution result can only be
found by ADL.

We already have the std/time/parse/parse.cc test checking that ADL
works, so this doesn't add a new test.

libstdc++-v3/ChangeLog:

        * include/bits/chrono_io.h (chrono::__detail::from_stream): Add
        deleted function as poison pill for unqualified lookup.
---

Tested x86_64-linux.

Also available at
https://forge.sourceware.org/gcc/gcc-TEST/pulls/40

 libstdc++-v3/include/bits/chrono_io.h | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/libstdc++-v3/include/bits/chrono_io.h 
b/libstdc++-v3/include/bits/chrono_io.h
index 8c026586d4c..c16b555df29 100644
--- a/libstdc++-v3/include/bits/chrono_io.h
+++ b/libstdc++-v3/include/bits/chrono_io.h
@@ -3115,6 +3115,10 @@ namespace __detail
 
 namespace __detail
 {
+  // _GLIBCXX_RESOLVE_LIB_DEFECTS
+  // 3956. chrono::parse uses from_stream as a customization point
+  void from_stream() = delete;
+
   template<typename _Parsable, typename _CharT,
           typename _Traits = std::char_traits<_CharT>,
           typename... _OptArgs>
-- 
2.48.1

Reply via email to