https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78908
--- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> --- struct A { int a : 1; }; struct F { int foo (A const &); }; template <typename> struct O : F { int foo (A const &); }; struct S {} b; template <typename L, typename T> int operator<< (L, T) { return (T) 123; } template <class = int> struct V; template <> struct V<> : O<long> { V () {} }; template <typename T> int O<T>::foo (A const &x) { return b << x.a; } int main () { A a = { 0 }; O<int> o; if (o.foo (a) != 123) __builtin_abort (); } is smaller testcase that doesn't ICE, but results in wrong-code (T is signed char : 1 rather than int as happens with G++ 5.x and earlier or current clang++). Or: struct A { int a : 1; }; struct F { int foo (A const &); }; template <typename> struct O : F { int foo (A const &); }; struct S {} b; template <typename L, typename T> int operator<< (L, T) { return (T) 123; } template <class = int> struct V; template <> struct V<> : O<long> { V () {} }; template <typename T> int O<T>::foo (A const &x) { return b << x.a; } int main () { A a = { 0 }; O<int> o; if (o.foo (a) != 123) __builtin_abort (); signed char d = 2; if ((b << d) != 123) __builtin_abort (); } is another testcase that ICEs with the same error as the #c1 testcase.