From 9757e4440bd8755d327601a60a73d57d712583ed Mon Sep 17 00:00:00 2001 From: Iain Buclaw Date: Wed, 28 Jun 2023 17:38:16 +0200 Subject: [PATCH] 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. --- gcc/d/types.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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; -- 2.47.3