diff options
author | Lee Millward <lee.millward@codesourcery.com> | 2006-10-20 20:13:42 +0000 |
---|---|---|
committer | Lee Millward <lmillward@gcc.gnu.org> | 2006-10-20 20:13:42 +0000 |
commit | 4c9fb8704ae3893ac39729e9713f8046fac6e1d7 (patch) | |
tree | c490295d80e90317c5432e6da339f8379c7bf200 /gcc | |
parent | 5d7adf7a1573b3ab23d9a2d70fbf30a8ef0c4958 (diff) | |
download | gcc-4c9fb8704ae3893ac39729e9713f8046fac6e1d7.zip gcc-4c9fb8704ae3893ac39729e9713f8046fac6e1d7.tar.gz gcc-4c9fb8704ae3893ac39729e9713f8046fac6e1d7.tar.bz2 |
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 <mark@codesourcery.com>
From-SVN: r117910
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/decl2.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/bitfield1.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/bitfield2.C | 34 |
5 files changed, 56 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 356bc25..a0cfbc0 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2006-10-20 Lee Millward <lee.millward@codesourcery.com> + Mark Mitchell <mark@codesourcery.com> + + PR c++/28053 + * decl2.c (grokbitfield): Detect invalid non-integral + types earlier when possible. + 2006-10-18 Mark Shinwell <shinwell@codesourcery.com> PR c++/26884 diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 42e9240..3b23638 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 701c2e7..8634b8e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2006-10-20 Lee Millward <lee.millward@codesourcery.com> + + PR c++/28053 + * g++.dg/parse/bitfield1.C: Adjust error markers. + * g++.dg/parse/bitfield2.C: New test. + 2006-10-20 Adam Nemet <anemet@caviumnetworks.com> * 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 70fe5cb..2e07605 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 0000000..49aace1 --- /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 <typename T> +struct C +{ + T t : 3; +}; + +C<int> c; + +template <typename T> +struct D +{ + T t : 3; // { dg-error "non-integral type" } +}; + +D<double> d; // { dg-error "instantiated" } + +template <typename T> +struct E +{ + typedef T* U; + U t : 3; // { dg-error "non-integral type" } +}; + +E<double> e; |