On Tue, 3 Feb 2026 at 15:10, Jonathan Wakely <[email protected]> wrote:
>
> 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,
Oh right, it's because the new constructor is defined unconditionally,
rather than only when contracts are enabled. Making that constructor
depend on -fcontracts wouldn't help, because the problem would still
exist with -fcontracts.
Making it explicit is better anyway, even if it wasn't needed to fix this.
> 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