Woops, I forgot to attach the patch.

Thanks,
Andrew Pinski

On Wed, Nov 30, 2011 at 11:23 AM, Andrew Pinski
<andrew.pin...@caviumnetworks.com> 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;

Reply via email to