https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95004
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Summary|Static array of base |using the wrong pointer to |classes member pointers |member for base classes | |with two bases Ever confirmed|0 |1 Status|UNCONFIRMED |NEW Last reconfirmed| |2021-08-01 Known to fail| |6.4.0 --- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Confirmed. To show it is not a problem with templates and just pointer to members and not using aliases either. Take: struct base { int value1; }; struct base0 { int value; }; struct derived: base0, base { typedef int derived::* pointer_type ; static constexpr pointer_type m = &base0::value; static constexpr pointer_type m1 = &base::value1; }; static_assert(derived::m == &base0::value,""); static_assert(derived::m != &base::value1,""); static_assert(derived::m1 != &base0::value,""); static_assert(derived::m1 == &base::value1,""); Basically the conversion from "int derived::*" to "int *base::" (or "int *base0") is going wrong.