This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[patch] Fix PR c++/28052: ICE on invalid bitfield
- From: Volker Reichelt <reichelt at igpm dot rwth-aachen dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Mon, 19 Jun 2006 09:58:35 +0200 (CEST)
- Subject: [patch] Fix PR c++/28052: ICE on invalid bitfield
Mainline's C++ frontend crashes on the following code snippets
struct A
{
double d : 2;
A() {}
};
bug.cc:3: error: bit-field 'double A::d' with non-integral type
bug.cc: In constructor 'A::A()':
bug.cc:4: internal compiler error: tree check: expected class 'type', have 'exceptional' (error_mark) in perform_member_init, at cp/init.c:350
Please submit a full bug report, [etc.]
struct A
{
double d : 2;
~A() {}
};
bug.cc:3: error: bit-field 'double A::d' with non-integral type
bug.cc: In destructor 'A::~A()':
bug.cc:4: internal compiler error: tree check: expected class 'type', have 'exceptional' (error_mark) in push_base_cleanups, at cp/init.c:2903
Please submit a full bug report, [etc.]
The following patch fixes the first problem by checking for invalid
members in build_class_member_access_expr more carefully.
The second problem is fixed by skipping invalid members in
push_base_cleanups.
Bootstrapped and regtested on x86_64-unknown-linux-gnu.
Ok for mainline?
Regards,
Volker
:ADDPATCH C++:
2006-06-16 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/28052
* init.c (push_base_cleanups): Skip members with invalid types.
* typeck.c (build_class_member_access_expr): Robustify.
===================================================================
--- gcc/gcc/cp/init.c (revision 114700)
+++ gcc/gcc/cp/init.c (working copy)
@@ -2898,7 +2898,9 @@ push_base_cleanups (void)
for (member = TYPE_FIELDS (current_class_type); member;
member = TREE_CHAIN (member))
{
- if (TREE_CODE (member) != FIELD_DECL || DECL_ARTIFICIAL (member))
+ if (TREE_TYPE (member) == error_mark_node
+ || TREE_CODE (member) != FIELD_DECL
+ || DECL_ARTIFICIAL (member))
continue;
if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (member)))
{
===================================================================
--- gcc/gcc/cp/typeck.c (revision 114700)
+++ gcc/gcc/cp/typeck.c (working copy)
@@ -1723,7 +1723,7 @@ build_class_member_access_expr (tree object,
tree member_scope;
tree result = NULL_TREE;
- if (object == error_mark_node || member == error_mark_node)
+ if (object == error_mark_node || error_operand_p (member))
return error_mark_node;
gcc_assert (DECL_P (member) || BASELINK_P (member));
===================================================================
2006-06-16 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/28052
* g++.dg/other/bitfield2.C: New test.
===================================================================
--- gcc/gcc/testsuite/g++.dg/other/bitfield2.C 2005-08-29 00:25:44 +0200
+++ gcc/gcc/testsuite/g++.dg/other/bitfield2.C 2006-06-16 19:16:30 +0200
@@ -0,0 +1,9 @@
+// PR c++/28052
+// { dg-do compile }
+
+struct A
+{
+ double d : 2; // { dg-error "non-integral" }
+ A() {}
+ ~A() {}
+};
===================================================================