Message ID | 20170421062234.GY1809@tucnak |
---|---|
State | New |
Headers | show |
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
--- 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; +}