https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92400
Bug ID: 92400
Summary: Incorrect selection of constructor overload for brace
list
Product: gcc
Version: 10.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: thiago at kde dot org
Target Milestone: ---
Godbolt link: https://gcc.godbolt.org/z/bckr_n
Testcase:
#include <initializer_list>
struct A;
struct V
{
V() = default;
V(const A &);
A make_a() const;
};
struct A
{
A();
A(const A &);
A(A &&);
A(std::initializer_list<V>);
};
void sink(A &);
void f()
{
A a{ V().make_a() };
sink(a);
}
When compiled, GCC generates a call to A::A(std::initializer_list<V>). The
three other compilers in the test do not -- ICC has a call to A::A(A&&) and
Clang can be made to have that call with -std=c++14 -fno-elide-constructors.
See
https://wg21.link/cwg1631 - CWG1631: Incorrect overload resolution for
single-element initializer-list
https://wg21.link/cwg1467 - CWG1467: List-initialization of aggregate from
same-type object
https://wg21.link/cwg2137 - CWG2137: List-initialization from object of same
type