diff options
author | Tobias Schlüter <tobias.schlueter@physik.uni-muenchen.de> | 2004-12-11 12:06:31 +0100 |
---|---|---|
committer | Tobias Schlüter <tobi@gcc.gnu.org> | 2004-12-11 12:06:31 +0100 |
commit | 49e4d5803eefeeb9d791af1900877831ce94481a (patch) | |
tree | 06e507cae1c1f5c6549e5c76d66fd6602bf4dc1e /gcc | |
parent | b990f4bcb845926f6723af08e660170906b443f3 (diff) | |
download | gcc-49e4d5803eefeeb9d791af1900877831ce94481a.zip gcc-49e4d5803eefeeb9d791af1900877831ce94481a.tar.gz gcc-49e4d5803eefeeb9d791af1900877831ce94481a.tar.bz2 |
re PR fortran/17175 (set_exponent breaks with integer*8 exponent)
fortran/
PR fortran/17175
* iresolve.c (gfc_resolve_scale): Convert 'I' argument if not of
same kind as C's 'int'.
(gfc_resolve_set_eponent): Convert 'I' argument if not of kind 4.
testsuite/
PR fortran/17175
* gfortran.dg/scale_1.f90: New test.
From-SVN: r92029
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fortran/iresolve.c | 36 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/scale_1.f90 | 35 |
4 files changed, 77 insertions, 6 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 052e7bf..8fbd01a 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2004-12-10 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de> + + PR fortran/17175 + * iresolve.c (gfc_resolve_scale): Convert 'I' argument if not of + same kind as C's 'int'. + (gfc_resolve_set_eponent): Convert 'I' argument if not of kind 4. + 2004-12-08 Richard Henderson <rth@redhat.com> * intrinsic.c (gfc_convert_type_warn): Propagate the input shape diff --git a/gcc/fortran/iresolve.c b/gcc/fortran/iresolve.c index 687421b..7a46028 100644 --- a/gcc/fortran/iresolve.c +++ b/gcc/fortran/iresolve.c @@ -1196,13 +1196,24 @@ gfc_resolve_rrspacing (gfc_expr * f, gfc_expr * x) void -gfc_resolve_scale (gfc_expr * f, gfc_expr * x, - gfc_expr * y ATTRIBUTE_UNUSED) +gfc_resolve_scale (gfc_expr * f, gfc_expr * x, gfc_expr * i) { f->ts = x->ts; - f->value.function.name = gfc_get_string ("__scale_%d_%d", x->ts.kind, - x->ts.kind); + + /* The implementation calls scalbn which takes an int as the + second argument. */ + if (i->ts.kind != gfc_c_int_kind) + { + gfc_typespec ts; + + ts.type = BT_INTEGER; + ts.kind = gfc_default_integer_kind; + + gfc_convert_type_warn (i, &ts, 2, 0); + } + + f->value.function.name = gfc_get_string ("__scale_%d", x->ts.kind); } @@ -1223,8 +1234,21 @@ gfc_resolve_set_exponent (gfc_expr * f, gfc_expr * x, gfc_expr * i) { f->ts = x->ts; - f->value.function.name = - gfc_get_string ("__set_exponent_%d_%d", x->ts.kind, i->ts.kind); + + /* The library implementation uses GFC_INTEGER_4 unconditionally, + convert type so we don't have to implment all possible + permutations. */ + if (i->ts.kind != 4) + { + gfc_typespec ts; + + ts.type = BT_INTEGER; + ts.kind = gfc_default_integer_kind; + + gfc_convert_type_warn (i, &ts, 2, 0); + } + + f->value.function.name = gfc_get_string ("__set_exponent_%d", x->ts.kind); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c4d3759..5fb65ed 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-12-11 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de> + + PR fortran/17175 + * gfortran.dg/scale_1.f90: New test. + 2004-12-10 Andrew Pinski <pinskia@physics.uc.edu> PR middle-end/18903 diff --git a/gcc/testsuite/gfortran.dg/scale_1.f90 b/gcc/testsuite/gfortran.dg/scale_1.f90 new file mode 100644 index 0000000..498c858 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/scale_1.f90 @@ -0,0 +1,35 @@ +! { dg-do run } +! inspired by PR17175 +REAL X +DOUBLE PRECISION Y + +INTEGER, PARAMETER :: DP = KIND(Y) + +INTEGER*1 I1 +INTEGER*2 I2 +INTEGER*4 I4 +INTEGER*8 I8 + +X = 1. +Y = 1._DP + +I1 = 10 +I2 = -10 +I4 = 20 +I8 = -20 + +X = SCALE (X, I1) +X = SCALE (X, I2) +IF (X.NE.1.) CALL ABORT() +X = SCALE (X, I4) +X = SCALE (X, I8) +IF (X.NE.1.) CALL ABORT() + +Y = SCALE (Y, I1) +Y = SCALE (Y, I2) +IF (Y.NE.1._DP) CALL ABORT() +Y = SCALE (Y, I4) +Y = SCALE (Y, I8) +IF (Y.NE.1._DP) CALL ABORT() + +END |