https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109937
Bug ID: 109937 Summary: Spurious ambiguous overload error when class with explicit template ctor is assigned to from an braced-init-list initializing an aggregate Product: gcc Version: 13.1.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: enolan at alumni dot cmu.edu Target Milestone: --- This example should invoke dummy's operator=(foo&&), but GCC 13 instead erroneously complains that it is ambiguous whether it should instead select dummy's automatically generated move assignment operator, which it cannot do because dummy's ctor is explicit. Compiler explorer link: https://godbolt.org/z/MsjsK1dav Minimal reproduction: struct foo { int x; }; struct dummy { template<typename U> explicit dummy(U&&); dummy() = default; dummy& operator=(foo&&); }; int main() { dummy bar; bar = {1}; } > The exact version of GCC gcc version 13.1.1 20230511 (Red Hat 13.1.1-2) (GCC) > The system type Fedora release 38 (Thirty Eight) > the options given when GCC was configured/built Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,fortran,objc,obj-c++,ada,go,d,m2,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only --enable-libstdcxx-backtrace --with-libstdcxx-zoneinfo=/usr/share/zoneinfo --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --with-isl=/builddir/build/BUILD/gcc-13.1.1-20230511/obj-x86_64-redhat-linux/isl-install --enable-offload-targets=nvptx-none --without-cuda-driver --enable-offload-defaulted --enable-gnu-indirect-function --enable-cet --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux --with-build-config=bootstrap-lto --enable-link-serialization=1 > the complete command line that triggers the bug g++ poc.cpp > the compiler output poc.cpp: In function 'int main()': poc.cpp:14:13: error: ambiguous overload for 'operator=' (operand types are 'dummy' and '<brace-enclosed initializer list>') 14 | bar = {1}; | ^ poc.cpp:9:12: note: candidate: 'dummy& dummy::operator=(foo&&)' 9 | dummy& operator=(foo&&); | ^~~~~~~~ poc.cpp:5:8: note: candidate: 'constexpr dummy& dummy::operator=(const dummy&)' 5 | struct dummy { | ^~~~~ poc.cpp:5:8: note: candidate: 'constexpr dummy& dummy::operator=(dummy&&)'