https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101107
Bug ID: 101107 Summary: Misleading error message in aggregate initialization in CRTP base class Product: gcc Version: 11.1.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: btzy1996 at gmail dot com Target Milestone: --- The following code gives a compile error: ``` template <typename Prev, typename Next> struct Combiner; template <typename T> struct Base { template <typename Next> auto dostuff(Next next) { return Combiner<T, Next>{Base<Combiner<T, Next>>{}, *this, next}; } }; template <typename Prev, typename Next> struct Combiner : public Base<Combiner<Prev, Next>> { Prev prev; Next next; }; struct A : public Base<A> { int stuff; }; struct B : public Base<B> { int stuff; }; int main(){ A{{}, 1}.dostuff(B{{}, 2}); } ``` Error message: ``` <source>: In instantiation of 'auto Base<T>::dostuff(Next) [with Next = B; T = A]': <source>:27:21: required from here <source>:8:68: error: cannot convert 'B' to 'int' in initialization 8 | return Combiner<T, Next>{Base<Combiner<T, Next>>{}, *this, next}; | ^~~~ | | | B Compiler returned: 1 ``` However, the error message is misleading - it seems clear that the programmer forgot to cast `*this` to the derived type (i.e. change `*this` to `static_cast<const T&>(*this)`), but the error message is about something totally different.