Woops, I forgot to attach the patch.
Thanks,
Andrew Pinski
On Wed, Nov 30, 2011 at 11:23 AM, Andrew Pinski
<[email protected]> wrote:
> Hi,
> The problem here is that right after groktypename we take the
> TYPE_MAIN_VARIANT of the result which is incorrect. There needs a
> check for error_mark_node. This adds the obvious check and fixes the
> ICE.
>
> OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.
>
> Thanks,
> Andrew Pinski
>
> ChangeLog:
> * c-parser.c (c_parser_postfix_expression): Check groktypename results
> before looking at the main variant.
>
> testsuite/ChangeLog:
> * testsuite/gcc.dg/pr51321.c: New testcase
Index: testsuite/gcc.dg/pr51321.c
===================================================================
--- testsuite/gcc.dg/pr51321.c (revision 0)
+++ testsuite/gcc.dg/pr51321.c (revision 0)
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+int main ()
+{
+ return (__builtin_types_compatible_p (char[1][], char[1][1])); /* { dg-error
"array type has incomplete element type" } */
+}
+
+
Index: c-parser.c
===================================================================
--- c-parser.c (revision 181823)
+++ c-parser.c (working copy)
@@ -6568,9 +6568,16 @@ c_parser_postfix_expression (c_parser *p
"expected %<)%>");
{
tree e1, e2;
+ e1 = groktypename (t1, NULL, NULL);
+ e2 = groktypename (t2, NULL, NULL);
+ if (e1 == error_mark_node || e2 == error_mark_node)
+ {
+ expr.value = error_mark_node;
+ break;
+ }
- e1 = TYPE_MAIN_VARIANT (groktypename (t1, NULL, NULL));
- e2 = TYPE_MAIN_VARIANT (groktypename (t2, NULL, NULL));
+ e1 = TYPE_MAIN_VARIANT (e1);
+ e2 = TYPE_MAIN_VARIANT (e2);
expr.value
= comptypes (e1, e2) ? integer_one_node : integer_zero_node;