From: Steven G. Kargl Date: Tue, 11 Oct 2005 23:58:17 +0000 (+0000) Subject: re PR fortran/20786 (Can't use AINT intrinsic with KIND parameter) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5dd17af5742b0774059332ae91579ad5ec19ef5f;p=gcc.git re PR fortran/20786 (Can't use AINT intrinsic with KIND parameter) PR fortran/20786 * iresolve.c (gfc_resolve_aint, gfc_resolve_anint ): Type conversion of the argument. gfortran.dg/aint_anint_1.f90: New test. From-SVN: r105276 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 9da5b9400ec..85b6ce8fafe 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2005-10-11 Steven G. Kargl + + PR fortran/20786 + *iresolve.c (gfc_resolve_aint, gfc_resolve_anint ): Type conversion + of the argument. + 2005-10-11 Jakub Jelinek * f95-lang.c (gfc_init_decl_processing): Initialize diff --git a/gcc/fortran/iresolve.c b/gcc/fortran/iresolve.c index 195f05ed990..6c23d4a2c74 100644 --- a/gcc/fortran/iresolve.c +++ b/gcc/fortran/iresolve.c @@ -105,9 +105,17 @@ gfc_resolve_aimag (gfc_expr * f, gfc_expr * x) void gfc_resolve_aint (gfc_expr * f, gfc_expr * a, gfc_expr * kind) { + gfc_typespec ts; + f->ts.type = a->ts.type; f->ts.kind = (kind == NULL) ? a->ts.kind : mpz_get_si (kind->value.integer); + if (a->ts.kind != f->ts.kind) + { + ts.type = f->ts.type; + ts.kind = f->ts.kind; + gfc_convert_type (a, &ts, 2); + } /* The resolved name is only used for specific intrinsics where the return kind is the same as the arg kind. */ f->value.function.name = @@ -143,9 +151,18 @@ gfc_resolve_all (gfc_expr * f, gfc_expr * mask, gfc_expr * dim) void gfc_resolve_anint (gfc_expr * f, gfc_expr * a, gfc_expr * kind) { + gfc_typespec ts; + f->ts.type = a->ts.type; f->ts.kind = (kind == NULL) ? a->ts.kind : mpz_get_si (kind->value.integer); + if (a->ts.kind != f->ts.kind) + { + ts.type = f->ts.type; + ts.kind = f->ts.kind; + gfc_convert_type (a, &ts, 2); + } + /* The resolved name is only used for specific intrinsics where the return kind is the same as the arg kind. */ f->value.function.name = diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d21780a7726..340cfa36958 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-10-11 Steven G. Kargl + + PR fortran/20786 + gfortran.dg/aint_anint_1.f90: New test. + 2005-10-11 Steven G. Kargl PR libgfortran/24313 diff --git a/gcc/testsuite/gfortran.dg/aint_anint_1.f90 b/gcc/testsuite/gfortran.dg/aint_anint_1.f90 new file mode 100644 index 00000000000..179748c1190 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/aint_anint_1.f90 @@ -0,0 +1,26 @@ +program aint_anint_1 + + implicit none + + real(4) :: r = 42.7, r1, r2 + real(8) :: s = 42.7D0, s1, s2 + + r1 = aint(r) + r2 = aint(r,kind=8) + if (abs(r1 - r2) > 0.1) call abort() + + r1 = anint(r) + r2 = anint(r,kind=8) + if (abs(r1 - r2) > 0.1) call abort() + + s1 = aint(s) + s2 = aint(s, kind=4) + if (abs(s1 - s2) > 0.1) call abort() + + s1 = anint(s) + s2 = anint(s, kind=4) + if (abs(s1 - s2) > 0.1) call abort() + + +end program aint_anint_1 +