From 4c9fb8704ae3893ac39729e9713f8046fac6e1d7 Mon Sep 17 00:00:00 2001 From: Lee Millward Date: Fri, 20 Oct 2006 20:13:42 +0000 Subject: [PATCH] re PR c++/28053 (ICE deriving from class with invalid bitfield) PR c++/28053 * decl2.c (grokbitfield): Detect invalid non-integral types earlier when possible. * g++.dg/parse/bitfield1.C: Adjust error markers. * g++.dg/parse/bitfield2.C: New test. Co-Authored-By: Mark Mitchell From-SVN: r117910 --- gcc/cp/ChangeLog | 7 ++++++ gcc/cp/decl2.c | 8 ++++++ gcc/testsuite/ChangeLog | 6 +++++ gcc/testsuite/g++.dg/parse/bitfield1.C | 2 +- gcc/testsuite/g++.dg/parse/bitfield2.C | 34 ++++++++++++++++++++++++++ 5 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/parse/bitfield2.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 356bc25d451..a0cfbc0bf39 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2006-10-20 Lee Millward + Mark Mitchell + + PR c++/28053 + * decl2.c (grokbitfield): Detect invalid non-integral + types earlier when possible. + 2006-10-18 Mark Shinwell PR c++/26884 diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 42e924000f8..3b23638e71a 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -946,6 +946,14 @@ grokbitfield (const cp_declarator *declarator, 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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 701c2e7ed5e..8634b8e41ec 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2006-10-20 Lee Millward + + PR c++/28053 + * g++.dg/parse/bitfield1.C: Adjust error markers. + * g++.dg/parse/bitfield2.C: New test. + 2006-10-20 Adam Nemet * gcc.dg/tree-ssa/ivopts-2.c: Match final candidates line only. diff --git a/gcc/testsuite/g++.dg/parse/bitfield1.C b/gcc/testsuite/g++.dg/parse/bitfield1.C index 70fe5cbd714..2e076058508 100644 --- a/gcc/testsuite/g++.dg/parse/bitfield1.C +++ b/gcc/testsuite/g++.dg/parse/bitfield1.C @@ -7,5 +7,5 @@ struct A void foo(A& a) { - (char)a.i; + (char)a.i; // { dg-error "no member" } } diff --git a/gcc/testsuite/g++.dg/parse/bitfield2.C b/gcc/testsuite/g++.dg/parse/bitfield2.C new file mode 100644 index 00000000000..49aace1dc76 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/bitfield2.C @@ -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 +{ + typedef T* U; + U t : 3; // { dg-error "non-integral type" } +}; + +E e;