https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101872
--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Original testcase (since we won't know if godbolt will be around in 10-20 years ...): #include <tuple> template <template <typename> typename ContainerImpl, typename Policy> struct BaseContainer { using Impl = ContainerImpl<Policy>; // this isn't our actual Impl (missing Handlers template args...)... Impl & impl() { return static_cast<Impl&>(*this); } // this shouldn't compile int start() { return impl().on_start(); // ... so impl() casts this to incorrect value } }; template <typename Policy, typename ...Handlers> struct BaseUiContainer : BaseContainer<BaseUiContainer, Policy> { int on_start() { return m_x * 2; // ... and because of the wrong cast this->m_x is pointing elsewhere } private: std::tuple<Handlers...> m_handlers; // comment this out to get the correct output of 4 int m_x = 2; }; struct Handler { char a[128]; }; template <typename Policy> struct MyUiContainer : BaseUiContainer<Policy, Handler> { }; int main() { struct P {}; MyUiContainer<P> container; return container.start(); }