From: Iain Buclaw Date: Wed, 28 Jun 2023 15:38:16 +0000 (+0200) Subject: d: Fix d_signed_or_unsigned_type is invoked for vector types (PR110193) X-Git-Tag: basepoints/gcc-15~7971 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9757e4440bd8755d327601a60a73d57d712583ed;p=thirdparty%2Fgcc.git d: Fix d_signed_or_unsigned_type is invoked for vector types (PR110193) This function can be invoked on VECTOR_TYPE, but the implementation assumes it works on integer types only. To fix, added a check whether the type passed is any `__vector(T)' or non-integral type, and return early by calling `signed_or_unsigned_type_for()' instead. Problem was found by instrumenting TYPE_PRECISION and ICEing when applied on VECTOR_TYPEs. PR d/110193 gcc/d/ChangeLog: * types.cc (d_signed_or_unsigned_type): Handle being called with any vector or non-integral type. --- diff --git a/gcc/d/types.cc b/gcc/d/types.cc index a4c05bfb75f0..bdf07f83d4b0 100644 --- a/gcc/d/types.cc +++ b/gcc/d/types.cc @@ -49,8 +49,8 @@ along with GCC; see the file COPYING3. If not see static tree d_signed_or_unsigned_type (int unsignedp, tree type) { - if (TYPE_UNSIGNED (type) == (unsigned) unsignedp) - return type; + if (VECTOR_TYPE_P (type) || !ANY_INTEGRAL_TYPE_P (type)) + return signed_or_unsigned_type_for (unsignedp, type); if (TYPE_PRECISION (type) == TYPE_PRECISION (d_cent_type)) return unsignedp ? d_ucent_type : d_cent_type;