On Tue, 3 Feb 2026 at 15:04, Stephan Bergmann <[email protected]> wrote:
>
> On 1/27/26 01:33, Iain Sandoe wrote:
> > From: Nina Ranns <[email protected]>
> >
> > Changes since v3
> >
> > - rebased onto r16-7033-gfb6a2e3f1fa842 (includes reflection changes).
> >
> > Changes since v2
> >
> > - rebased onto r16-6757-g460edeb8bea11e (includes new year (c) change).
> >
> > Changes since v1
> > - addressed Jonathan's review comments
> > - fixed a merge error in the removal of C++2a code.
> > - rebased onto r16-5785-g3b30d09ac7bbf8 (includes change to default to
> > C++20).
>
> This started to cause
>
> > $ cat test.cc
> > #include <source_location>
> > struct S { S(char const *); };
> > void f(S);
> > void f(std::source_location);
> > int main() { f(""); }
>
> to fail
>
> > $ g++ -std=c++20 -fsyntax-only test.cc
> > test.cc: In function ‘int main()’:
> > test.cc:5:15: error: call of overloaded ‘f(const char [1])’ is ambiguous
> > 5 | int main() { f(""); }
> > | ~^~~~
> > • there are 2 candidates
> > • candidate 1: ‘void f(S)’
> > test.cc:3:6:
> > 3 | void f(S);
> > | ^
> > • candidate 2: ‘void f(std::source_location)’
> > test.cc:4:6:
> > 4 | void f(std::source_location);
> > | ^
>
> which I assume is unintended?
I don't understand why, but we can fix it like this:
--- a/libstdc++-v3/include/std/source_location
+++ b/libstdc++-v3/include/std/source_location
@@ -89,7 +89,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
private:
const __impl* _M_impl = nullptr;
- constexpr source_location (const void *__t)
+ constexpr explicit source_location (const void *__t)
: _M_impl (static_cast <const __impl*>(__t)) {}
#ifdef __glibcxx_contracts