[PATCH] Fix C FE ICE with vector comparison (PR c/84999)
Jakub Jelinek
jakub@redhat.com
Wed Mar 21 20:35:00 GMT 2018
Hi!
On ia32, we don't support __int128, nor mode (TI) integers, but we do
support 128-bit __float128 and (generic) vectors containing it. The result
of a comparison of such vectors is supposed to be integral vector with the
same element size, but we really don't want to allow one in this case,
it would be a loophole for full support of __int128/mode(TI), just do:
typedef __float128 V __attribute__ ((__vector_size__ (2 * sizeof (__float128))));
extern V v;
typedef typeof ((v != 0)[0]) my_int128;
and suddenly you have __int128.
The C++ errors out in this case, you can use such floating point vectors,
but can't use them in comparisons, the C FE instead just segfaulted.
Fixed thusly, making the C FE consistent with what C++ FE does,
bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
2018-03-21 Jakub Jelinek <jakub@redhat.com>
PR c/84999
* c-typeck.c (build_binary_op): If c_common_type_for_size fails when
building vector comparison, diagnose it and return error_mark_node.
* c-c++-common/pr84999.c: New test.
--- gcc/c/c-typeck.c.jj 2018-03-15 08:37:11.640779243 +0100
+++ gcc/c/c-typeck.c 2018-03-21 14:01:25.088183657 +0100
@@ -11504,6 +11504,13 @@ build_binary_op (location_t location, en
intt = c_common_type_for_size (GET_MODE_BITSIZE
(SCALAR_TYPE_MODE
(TREE_TYPE (type0))), 0);
+ if (!intt)
+ {
+ error_at (location, "could not find an integer type "
+ "of the same size as %qT",
+ TREE_TYPE (type0));
+ return error_mark_node;
+ }
result_type = build_opaque_vector_type (intt,
TYPE_VECTOR_SUBPARTS (type0));
converted = 1;
@@ -11665,6 +11672,13 @@ build_binary_op (location_t location, en
intt = c_common_type_for_size (GET_MODE_BITSIZE
(SCALAR_TYPE_MODE
(TREE_TYPE (type0))), 0);
+ if (!intt)
+ {
+ error_at (location, "could not find an integer type "
+ "of the same size as %qT",
+ TREE_TYPE (type0));
+ return error_mark_node;
+ }
result_type = build_opaque_vector_type (intt,
TYPE_VECTOR_SUBPARTS (type0));
converted = 1;
--- gcc/testsuite/c-c++-common/pr84999.c.jj 2018-03-21 14:34:12.819329771 +0100
+++ gcc/testsuite/c-c++-common/pr84999.c 2018-03-21 14:32:37.816361905 +0100
@@ -0,0 +1,12 @@
+/* PR c/84999 */
+/* { dg-do compile { target { i?86-*-* x86_64-*-* } } } */
+/* { dg-options "" } */
+
+typedef __float128 V __attribute__ ((__vector_size__ (2 * sizeof (__float128))));
+V a;
+typeof (a != 0) b; /* { dg-error "could not find an integer type of the same size as" "" { target ia32 } } */
+typeof (a == 0) c; /* { dg-error "could not find an integer type of the same size as" "" { target ia32 } } */
+typeof (a < 0) d; /* { dg-error "could not find an integer type of the same size as" "" { target ia32 } } */
+typeof (a <= 0) e; /* { dg-error "could not find an integer type of the same size as" "" { target ia32 } } */
+typeof (a > 0) f; /* { dg-error "could not find an integer type of the same size as" "" { target ia32 } } */
+typeof (a >= 0) g; /* { dg-error "could not find an integer type of the same size as" "" { target ia32 } } */
Jakub
More information about the Gcc-patches
mailing list