Hi,

This patch fixes a segmentation fault in the D front-end when handling
built-in types that are PSImode.

D does not have the notion of integer types to be of any size other
than the fixed-sized byte, short, int, long, and cent types, however
integer types with non-standard sizes are still matched to D types by
comparing TYPE_SIZE_UNIT, and internally casted as appropriate.

Bootstrapped and regression tested the D testsuite on
x86_64-linux-gnu, with further checking done on cross-compiler targets
mips64vr-elf, msp430-elf, pdp11-aout, and visium-elf to verify the ICE
no longer persists.

Committed to trunk as r274767.

--
Iain
---
gcc/d/ChangeLog:

        PR d/90446
        * d-lang.cc (d_type_for_mode): Check for all internal __intN types.
        (d_type_for_size): Likewise.
---
diff --git a/gcc/d/d-lang.cc b/gcc/d/d-lang.cc
index f23f719a2c3..db0db0e71dc 100644
--- a/gcc/d/d-lang.cc
+++ b/gcc/d/d-lang.cc
@@ -1360,6 +1360,17 @@ d_type_for_mode (machine_mode mode, int unsignedp)
   if (mode == TYPE_MODE (build_pointer_type (d_int_type)))
     return build_pointer_type (d_int_type);
 
+  for (int i = 0; i < NUM_INT_N_ENTS; i ++)
+    {
+      if (int_n_enabled_p[i] && mode == int_n_data[i].m)
+	{
+	  if (unsignedp)
+	    return int_n_trees[i].unsigned_type;
+	  else
+	    return int_n_trees[i].signed_type;
+	}
+    }
+
   if (COMPLEX_MODE_P (mode))
     {
       machine_mode inner_mode;
@@ -1408,6 +1419,17 @@ d_type_for_size (unsigned bits, int unsignedp)
   if (bits <= TYPE_PRECISION (d_cent_type))
     return unsignedp ? d_ucent_type : d_cent_type;
 
+  for (int i = 0; i < NUM_INT_N_ENTS; i ++)
+    {
+      if (int_n_enabled_p[i] && bits == int_n_data[i].bitsize)
+	{
+	  if (unsignedp)
+	    return int_n_trees[i].unsigned_type;
+	  else
+	    return int_n_trees[i].signed_type;
+	}
+    }
+
   return 0;
 }
 

Reply via email to