re PR c/84999 (ICE in make_vector_type, at tree.c:9561)
authorJakub Jelinek <jakub@redhat.com>
Wed, 21 Mar 2018 21:48:47 +0000 (22:48 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 21 Mar 2018 21:48:47 +0000 (22:48 +0100)
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.

From-SVN: r258747

gcc/c/ChangeLog
gcc/c/c-typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/pr84999.c [new file with mode: 0644]

index 37a4177ff194c634c298a471ac447c049e9b40d9..c1e204d1e1b0dd118183f700232ec9ace65261df 100644 (file)
@@ -1,3 +1,9 @@
+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.
+
 2018-03-15  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/84853
index 69ef470af2e232cd9e8d59fa8a4d1dd1634c089d..ffd06447f1b555ca84e00b40bce0d00ad0433bb1 100644 (file)
@@ -11504,6 +11504,13 @@ build_binary_op (location_t location, enum tree_code code,
           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, enum tree_code code,
           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;
index 4c88b114fb371b516632dd08dc0b39882582824e..93dc7a28c681ec33ce8f59eefa68e86594153d7c 100644 (file)
@@ -1,3 +1,8 @@
+2018-03-21  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c/84999
+       * c-c++-common/pr84999.c: New test.
+
 2018-03-21  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/84972
diff --git a/gcc/testsuite/c-c++-common/pr84999.c b/gcc/testsuite/c-c++-common/pr84999.c
new file mode 100644 (file)
index 0000000..42d5376
--- /dev/null
@@ -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 } } */