https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92662
--- Comment #1 from Michael Matz <matz at gcc dot gnu.org> ---
I _think_ a reduced program would be this:
-----------------------------------------
template<typename _Tp> struct remove_ref { typedef _Tp type; };
template<typename _Tp> struct remove_ref<_Tp&> { typedef _Tp type; };
template<typename _Tp> struct remove_ref<_Tp&&> { typedef _Tp type; };
template<typename _Tp>
typename remove_ref<_Tp>::type&&
moveme(_Tp&& __t) noexcept;
struct S
{
S();
};
struct Test
{
S const& str() const&;
S && str() && ;
operator S const&() const&;
operator S && () && ;
};
int main()
{
Test t;
S a { moveme(t).str() };
S b { moveme(t) };
return 0;
}
-----------------------------------------
at least it gives same behaviour and captures the structure of the involved
move() functions.
% gcc-8 -c xreduced.cc
% gcc-9 -c xreduced.cc
x.cc: In function ‘int main()’:
x.cc:27:19: error: call of overloaded ‘S(<brace-enclosed initializer list>)’ is
ambiguous
27 | S b { moveme(t) };
| ^
x.cc:9:8: note: candidate: ‘constexpr S::S(const S&)’
9 | struct S
| ^
x.cc:9:8: note: candidate: ‘constexpr S::S(S&&)’