[PATCH] Fix PR c/35748: ICE with cast to unions with invalid fields
Volker Reichelt
v.reichelt@netcologne.de
Sun Mar 30 13:32:00 GMT 2008
The following patch fixes an ICE with casting to unions with invalid
fields. When casting to a union, build_c_cast iterates over all fields
of the union to find a suitable one for the cast.
However, this test crashes if a field with invalid type is encountered.
Fixed by skipping these invalid fields.
Bootstrapped and regtested on i686-pc-linux-gnu.
Ok for mainline?
Regards,
Volker
:ADDPATCH C:
2008-03-30 Volker Reichelt <v.reichelt@netcologne.de>
PR c/35748
* c-typeck.c (build_c_cast): Skip invalid fields in unions.
===================================================================
--- gcc/c-typeck.c 2008-03-20 17:13:55 +0100
+++ gcc/c-typeck.c 2008-03-29 20:45:36 +0100
@@ -3628,8 +3628,9 @@ build_c_cast (tree type, tree expr)
tree field;
for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
- if (comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (field)),
- TYPE_MAIN_VARIANT (TREE_TYPE (value))))
+ if (TREE_TYPE (field) != error_mark_node
+ && comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (field)),
+ TYPE_MAIN_VARIANT (TREE_TYPE (value))))
break;
if (field)
===================================================================
2008-03-30 Volker Reichelt <v.reichelt@netcologne.de>
PR c/35748
* gcc.dg/union-cast-4.c: New test.
===================================================================
--- gcc/testsuite/gcc.dg/union-cast-4.c 2003-09-23 19:59:22 +0200
+++ gcc/testsuite/gcc.dg/union-cast-4.c 2008-03-29 21:11:39 +0100
@@ -0,0 +1,8 @@
+/* PR c/35748 */
+
+union U { void x[1]; }; /* { dg-error "array of voids" } */
+
+void foo()
+{
+ (union U)0; /* { dg-error "type not present" } */
+}
===================================================================
More information about the Gcc-patches
mailing list