diff mbox

Fix C/51321, ICE With incomplete types with __builtin_types_compatible_p

Message ID CA+=Sn1mX=Bt1va08A8d+f_-izZhvPL634GPvK2M4OFQSqhoMkQ@mail.gmail.com
State New
Headers show

Commit Message

Andrew Pinski Nov. 30, 2011, 7:27 p.m. UTC
Woops, I forgot to attach the patch.

Thanks,
Andrew Pinski

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

Comments

Joseph Myers Nov. 30, 2011, 7:51 p.m. UTC | #1
On Wed, 30 Nov 2011, Andrew Pinski wrote:

> > 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

OK.
diff mbox

Patch

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;