Index: gcc/testsuite/g++.dg/parse/bitfield1.C =================================================================== --- gcc/testsuite/g++.dg/parse/bitfield1.C (revision 117886) +++ gcc/testsuite/g++.dg/parse/bitfield1.C (working copy) @@ -7,5 +7,5 @@ struct A void foo(A& a) { - (char)a.i; + (char)a.i; // { dg-error "no member" } } Index: gcc/testsuite/g++.dg/parse/bitfield2.C =================================================================== --- gcc/testsuite/g++.dg/parse/bitfield2.C (revision 0) +++ gcc/testsuite/g++.dg/parse/bitfield2.C (revision 0) @@ -0,0 +1,34 @@ +//PR c++/28053 + +struct X {}; + +struct A +{ + X x : 2; // { dg-error "non-integral type" } +}; + +struct B : A {}; + +template +struct C +{ + T t : 3; +}; + +C c; + +template +struct D +{ + T t : 3; // { dg-error "non-integral type" } +}; + +D d; // { dg-error "instantiated" } + +template +struct E +{ + T* t : 3; // { dg-error "function" } +}; + +E e; Index: gcc/cp/decl2.c =================================================================== --- gcc/cp/decl2.c (revision 117886) +++ gcc/cp/decl2.c (working copy) @@ -946,6 +946,14 @@ grokbitfield (const cp_declarator *decla if (TREE_CODE (value) == VOID_TYPE) return void_type_node; + if (!INTEGRAL_TYPE_P (TREE_TYPE (value)) + && (POINTER_TYPE_P (value) + || !dependent_type_p (TREE_TYPE (value)))) + { + error ("bit-field %qD with non-integral type", value); + return error_mark_node; + } + if (TREE_CODE (value) == TYPE_DECL) { error ("cannot declare %qD to be a bit-field type", value);