Commit 26349ecf by Steven G. Kargl

trans-types.c (gfc_get_int_kind_from_width_isofortranen): Choose REAL type with…

trans-types.c (gfc_get_int_kind_from_width_isofortranen): Choose REAL type with the widest precision if...

2017-02-04  Steven G. Kargl  <kargl@gcc.gnu.org>

	* trans-types.c	(gfc_get_int_kind_from_width_isofortranen):  Choose
	REAL type with the widest precision if two (or more) have the same
	storage size.

From-SVN: r245255
parent 2ad31830
2017-02-07 Steven G. Kargl <kargl@gcc.gnu.org>
* trans-types.c (gfc_get_int_kind_from_width_isofortranen): Choose
REAL type with the widest precision if two (or more) have the same
storage size.
2017-02-05 Andre Vehreschild <vehre@gcc.gnu.org> 2017-02-05 Andre Vehreschild <vehre@gcc.gnu.org>
PR fortran/79344 PR fortran/79344
......
...@@ -234,27 +234,42 @@ gfc_get_int_kind_from_width_isofortranenv (int size) ...@@ -234,27 +234,42 @@ gfc_get_int_kind_from_width_isofortranenv (int size)
return -1; return -1;
} }
/* Get the kind number corresponding to a real of given storage size,
following the required return values for ISO_FORTRAN_ENV REAL* constants: /* Get the kind number corresponding to a real of a given storage size.
-2 is returned if we support a kind of larger size, -1 otherwise. */ If two real's have the same storage size, then choose the real with
the largest precision. If a kind type is unavailable and a real
exists with wider storage, then return -2; otherwise, return -1. */
int int
gfc_get_real_kind_from_width_isofortranenv (int size) gfc_get_real_kind_from_width_isofortranenv (int size)
{ {
int i; int digits, i, kind;
size /= 8; size /= 8;
kind = -1;
digits = 0;
/* Look for a kind with matching storage size. */ /* Look for a kind with matching storage size. */
for (i = 0; gfc_real_kinds[i].kind != 0; i++) for (i = 0; gfc_real_kinds[i].kind != 0; i++)
if (int_size_in_bytes (gfc_get_real_type (gfc_real_kinds[i].kind)) == size) if (int_size_in_bytes (gfc_get_real_type (gfc_real_kinds[i].kind)) == size)
return gfc_real_kinds[i].kind; {
if (gfc_real_kinds[i].digits > digits)
{
digits = gfc_real_kinds[i].digits;
kind = gfc_real_kinds[i].kind;
}
}
if (kind != -1)
return kind;
/* Look for a kind with larger storage size. */ /* Look for a kind with larger storage size. */
for (i = 0; gfc_real_kinds[i].kind != 0; i++) for (i = 0; gfc_real_kinds[i].kind != 0; i++)
if (int_size_in_bytes (gfc_get_real_type (gfc_real_kinds[i].kind)) > size) if (int_size_in_bytes (gfc_get_real_type (gfc_real_kinds[i].kind)) > size)
return -2; kind = -2;
return -1; return kind;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment