aboutsummaryrefslogtreecommitdiff
path: root/gcc/f/com.c
diff options
context:
space:
mode:
authorRoger Sayle <roger@eyesopen.com>2003-05-08 13:13:59 +0000
committerRoger Sayle <sayle@gcc.gnu.org>2003-05-08 13:13:59 +0000
commit53415fa1a1f7b3c13dde3aa0a73f35ae4dcc335b (patch)
tree3fb5f2cf3b52eb73fc88051ccaecab5bf4d526f2 /gcc/f/com.c
parentdb7948c2d8dc5ac573bfb3516fa34c2ba086dabc (diff)
downloadgcc-53415fa1a1f7b3c13dde3aa0a73f35ae4dcc335b.zip
gcc-53415fa1a1f7b3c13dde3aa0a73f35ae4dcc335b.tar.gz
gcc-53415fa1a1f7b3c13dde3aa0a73f35ae4dcc335b.tar.bz2
re PR fortran/8485 (g77 doesn't accept INTEGER*8 constant in PARAMETER multiplication)
PR fortran/8485 * target.h (FFETARGET_REAL_VALUE_FROM_INT_): Cast to HOST_WIDE_INT instead of long. (FFETARGET_REAL_VALUE_FROM_LONGLONG_): New macro. (FFETARGET_LONGLONG_FROM_INTS_): New macro. (ffetarget_convert_complex1_integer4): Implement. (ffetarget_convert_complex2_integer4): Implement. (ffetarget_convert_integer4_complex1): Implement. (ffetarget_convert_integer4_complex2): Implement. (ffetarget_convert_integer4_real1): Implement. (ffetarget_convert_integer4_real2): Implement. (ffetarget_convert_real1_integer4): Implement. (ffetarget_convert_real2_integer4): Implement. * com.c (ffecom_constantunion): Handle INTEGER*8. (ffecom_constantunion_with_type): Likewise. * g77.f-torture/compile/8485.f: New test case. From-SVN: r66596
Diffstat (limited to 'gcc/f/com.c')
-rw-r--r--gcc/f/com.c33
1 files changed, 27 insertions, 6 deletions
diff --git a/gcc/f/com.c b/gcc/f/com.c
index 36658f2..7ec1813 100644
--- a/gcc/f/com.c
+++ b/gcc/f/com.c
@@ -10325,31 +10325,43 @@ ffecom_constantunion (ffebldConstantUnion *cu, ffeinfoBasictype bt,
{
case FFEINFO_basictypeINTEGER:
{
- int val;
+ HOST_WIDE_INT hi, lo;
switch (kt)
{
#if FFETARGET_okINTEGER1
case FFEINFO_kindtypeINTEGER1:
- val = ffebld_cu_val_integer1 (*cu);
+ lo = ffebld_cu_val_integer1 (*cu);
+ hi = (lo < 0) ? -1 : 0;
break;
#endif
#if FFETARGET_okINTEGER2
case FFEINFO_kindtypeINTEGER2:
- val = ffebld_cu_val_integer2 (*cu);
+ lo = ffebld_cu_val_integer2 (*cu);
+ hi = (lo < 0) ? -1 : 0;
break;
#endif
#if FFETARGET_okINTEGER3
case FFEINFO_kindtypeINTEGER3:
- val = ffebld_cu_val_integer3 (*cu);
+ lo = ffebld_cu_val_integer3 (*cu);
+ hi = (lo < 0) ? -1 : 0;
break;
#endif
#if FFETARGET_okINTEGER4
case FFEINFO_kindtypeINTEGER4:
- val = ffebld_cu_val_integer4 (*cu);
+#if HOST_BITS_PER_LONGLONG > HOST_BITS_PER_WIDE_INT
+ {
+ long long int big = ffebld_cu_val_integer4 (*cu);
+ hi = (HOST_WIDE_INT) (big >> HOST_BITS_PER_WIDE_INT);
+ lo = (HOST_WIDE_INT) big;
+ }
+#else
+ lo = ffebld_cu_val_integer4 (*cu);
+ hi = (lo < 0) ? -1 : 0;
+#endif
break;
#endif
@@ -10359,7 +10371,7 @@ ffecom_constantunion (ffebldConstantUnion *cu, ffeinfoBasictype bt,
case FFEINFO_kindtypeANY:
return error_mark_node;
}
- item = build_int_2 (val, (val < 0) ? -1 : 0);
+ item = build_int_2 (lo, hi);
TREE_TYPE (item) = tree_type;
}
break;
@@ -10614,8 +10626,17 @@ ffecom_constantunion_with_type (ffebldConstantUnion *cu,
#endif
#if FFETARGET_okINTEGER4
case FFEBLD_constINTEGER4:
+#if HOST_BITS_PER_LONGLONG > HOST_BITS_PER_WIDE_INT
+ {
+ long long int big = ffebld_cu_val_integer4 (*cu);
+ item = build_int_2 ((HOST_WIDE_INT) big,
+ (HOST_WIDE_INT)
+ (big >> HOST_BITS_PER_WIDE_INT));
+ }
+#else
val = ffebld_cu_val_integer4 (*cu);
item = build_int_2 (val, (val < 0) ? -1 : 0);
+#endif
break;
#endif
#if FFETARGET_okLOGICAL1