[C] Fix error-recovery with unsupported __intNNN types (PR c/80468)

Message ID 20170421062234.GY1809@tucnak
State New
Headers show

Commit Message

Jakub Jelinek April 21, 2017, 6:22 a.m.
Hi!

finish_declspecs when an error has been reported earlier when parsing
declspecs sets specs->type = integer_type_node; for easier error recovery,
e.g.:
    case cts_floatn_nx:
      gcc_assert (!specs->long_p && !specs->short_p
                  && !specs->signed_p && !specs->unsigned_p);
      if (FLOATN_NX_TYPE_NODE (specs->floatn_nx_idx) == NULL_TREE)
        specs->type = integer_type_node;
...
or
    case cts_fract:
      gcc_assert (!specs->complex_p);
      if (!targetm.fixed_point_supported_p ())
        specs->type = integer_type_node;
...
But we don't do this for unsupported __intNNN types, happily keep e.g.
__int128 type in the IL even when it is not supported.  E.g. on the
following testcase that results in ICE though, because for the vector
comparison we want to look up corresponding integer type and don't find
any.

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux,
ok for trunk and 7.2?

2017-04-20  Jakub Jelinek  <jakub@redhat.com>

	PR c/80468
	* c-decl.c (finish_declspecs) <case cts_int_n>: If int_n_idx is not
	enabled, set specs->type to integer_type_node.

	* gcc.dg/pr80468.c: New test.



	Jakub

Comments

Marek Polacek April 21, 2017, 7:55 a.m. | #1
On Fri, Apr 21, 2017 at 08:22:34AM +0200, Jakub Jelinek wrote:
> Hi!
> 
> finish_declspecs when an error has been reported earlier when parsing
> declspecs sets specs->type = integer_type_node; for easier error recovery,
> e.g.:
>     case cts_floatn_nx:
>       gcc_assert (!specs->long_p && !specs->short_p
>                   && !specs->signed_p && !specs->unsigned_p);
>       if (FLOATN_NX_TYPE_NODE (specs->floatn_nx_idx) == NULL_TREE)
>         specs->type = integer_type_node;
> ...
> or
>     case cts_fract:
>       gcc_assert (!specs->complex_p);
>       if (!targetm.fixed_point_supported_p ())
>         specs->type = integer_type_node;
> ...
> But we don't do this for unsupported __intNNN types, happily keep e.g.
> __int128 type in the IL even when it is not supported.  E.g. on the
> following testcase that results in ICE though, because for the vector
> comparison we want to look up corresponding integer type and don't find
> any.
> 
> Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux,
> ok for trunk and 7.2?
> 
> 2017-04-20  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR c/80468
> 	* c-decl.c (finish_declspecs) <case cts_int_n>: If int_n_idx is not
> 	enabled, set specs->type to integer_type_node.
> 
> 	* gcc.dg/pr80468.c: New test.

Ok.

	Marek

Patch

--- gcc/c/c-decl.c.jj	2017-03-30 15:24:22.000000000 +0200
+++ gcc/c/c-decl.c	2017-04-20 13:53:11.447417038 +0200
@@ -10929,9 +10929,12 @@  finish_declspecs (struct c_declspecs *sp
     case cts_int_n:
       gcc_assert (!specs->long_p && !specs->short_p && !specs->long_long_p);
       gcc_assert (!(specs->signed_p && specs->unsigned_p));
-      specs->type = (specs->unsigned_p
-		     ? int_n_trees[specs->int_n_idx].unsigned_type
-		     : int_n_trees[specs->int_n_idx].signed_type);
+      if (! int_n_enabled_p[specs->int_n_idx])
+	specs->type = integer_type_node;
+      else
+	specs->type = (specs->unsigned_p
+		       ? int_n_trees[specs->int_n_idx].unsigned_type
+		       : int_n_trees[specs->int_n_idx].signed_type);
       if (specs->complex_p)
 	{
 	  pedwarn (specs->locations[cdw_complex], OPT_Wpedantic,
--- gcc/testsuite/gcc.dg/pr80468.c.jj	2017-04-20 13:51:16.620957496 +0200
+++ gcc/testsuite/gcc.dg/pr80468.c	2017-04-20 13:52:07.955268819 +0200
@@ -0,0 +1,10 @@ 
+/* PR c/80468 */
+/* { dg-do compile { target { ! int128 } } } */
+/* { dg-options "" } */
+
+void
+foo (void)
+{
+  __attribute__ ((__vector_size__ (4 * sizeof (unsigned)))) __int128 b;	/* { dg-error "is not supported on this target" } */
+  0 != b;
+}