aboutsummaryrefslogtreecommitdiff
path: root/gcc/d
diff options
context:
space:
mode:
authorIain Buclaw <ibuclaw@gdcproject.org>2019-08-21 07:53:25 +0000
committerIain Buclaw <ibuclaw@gcc.gnu.org>2019-08-21 07:53:25 +0000
commitedf095929fdec6a0c183ab5fd119f26dfd406b13 (patch)
treee3615caa158373330d19c3628c3ea9267cd540aa /gcc/d
parent7610ae806e4f611379766c1dca98e360b206665c (diff)
downloadgcc-edf095929fdec6a0c183ab5fd119f26dfd406b13.zip
gcc-edf095929fdec6a0c183ab5fd119f26dfd406b13.tar.gz
gcc-edf095929fdec6a0c183ab5fd119f26dfd406b13.tar.bz2
d: Fix ICE: Segmentation fault in build_function_type at gcc/tree.c:8539
gcc/d/ChangeLog: PR d/90446 * d-lang.cc (d_type_for_mode): Check for all internal __intN types. (d_type_for_size): Likewise. From-SVN: r274767
Diffstat (limited to 'gcc/d')
-rw-r--r--gcc/d/ChangeLog6
-rw-r--r--gcc/d/d-lang.cc22
2 files changed, 28 insertions, 0 deletions
diff --git a/gcc/d/ChangeLog b/gcc/d/ChangeLog
index 6b692f5..41ea48e 100644
--- a/gcc/d/ChangeLog
+++ b/gcc/d/ChangeLog
@@ -1,5 +1,11 @@
2019-08-20 Iain Buclaw <ibuclaw@gdcproject.org>
+ PR d/90446
+ * d-lang.cc (d_type_for_mode): Check for all internal __intN types.
+ (d_type_for_size): Likewise.
+
+2019-08-20 Iain Buclaw <ibuclaw@gdcproject.org>
+
PR d/90445
* d-builtins.cc (d_build_c_type_nodes): Test UINTMAX_TYPE for setting
uintmax_type_node. Set signed_size_type_node as the signed_type_for
diff --git a/gcc/d/d-lang.cc b/gcc/d/d-lang.cc
index f23f719..db0db0e 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;
}