This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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() {}
+};
===================================================================



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]