From: Jakub Jelinek Date: Fri, 22 Jun 2018 20:55:40 +0000 (+0200) Subject: backport: re PR c/84999 (ICE in make_vector_type, at tree.c:9561) X-Git-Tag: releases/gcc-7.4.0~354 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b6abb1374dfe2f789e9eb37c9089c275e99c1459;p=thirdparty%2Fgcc.git backport: re PR c/84999 (ICE in make_vector_type, at tree.c:9561) Backported from mainline 2018-03-21 Jakub Jelinek 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: r261934 --- diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 866ad995ceb1..96b9effea121 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,6 +1,12 @@ 2018-06-22 Jakub Jelinek Backported from mainline + 2018-03-21 Jakub Jelinek + + 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 PR c/84853 diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c index c72932986fa0..363fa32d468d 100644 --- a/gcc/c/c-typeck.c +++ b/gcc/c/c-typeck.c @@ -11301,6 +11301,13 @@ build_binary_op (location_t location, enum tree_code code, /* Always construct signed integer vector type. */ intt = c_common_type_for_size (GET_MODE_BITSIZE (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; @@ -11460,6 +11467,13 @@ build_binary_op (location_t location, enum tree_code code, /* Always construct signed integer vector type. */ intt = c_common_type_for_size (GET_MODE_BITSIZE (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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index bfe4de9a591a..9b18005b0796 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -3,6 +3,9 @@ Backported from mainline 2018-03-21 Jakub Jelinek + PR c/84999 + * c-c++-common/pr84999.c: New test. + PR c++/84961 * c-c++-common/pr43690.c: Don't expect errors on "m" (--x) and "m" (++x) in C++. diff --git a/gcc/testsuite/c-c++-common/pr84999.c b/gcc/testsuite/c-c++-common/pr84999.c new file mode 100644 index 000000000000..42d53769a3b9 --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr84999.c @@ -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 } } */