diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index e3f2dcdfdc6..0e64d91652b 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2008-09-06 Steven G. Kargl + + PR fortran/36153 + * fortran/resolve.c (resolve_function): Shortcircuit for SIZE and + UBOUND if 2nd argument is KIND. + 2008-09-06 Steven G. Kargl PR fortran/33229 diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 485d33186d2..05f2c14f4b3 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -2336,17 +2336,18 @@ resolve_function (gfc_expr *expr) assumed size array argument. UBOUND and SIZE have to be excluded from the check if the second argument is anything than a constant. */ - int inquiry; - inquiry = GENERIC_ID == GFC_ISYM_UBOUND - || GENERIC_ID == GFC_ISYM_SIZE; for (arg = expr->value.function.actual; arg; arg = arg->next) { - if (inquiry && arg->next != NULL && arg->next->expr) + if ((GENERIC_ID == GFC_ISYM_UBOUND || GENERIC_ID == GFC_ISYM_SIZE) + && arg->next != NULL && arg->next->expr) { if (arg->next->expr->expr_type != EXPR_CONSTANT) break; + if (arg->next->name && strncmp(arg->next->name, "kind", 4) == 0) + break; + if ((int)mpz_get_si (arg->next->expr->value.integer) < arg->expr->rank) break; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c09442521fa..aaeb46c1464 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-09-06 Tobias Burnus + + PR fortran/36153 + * gfortran.dg/size_kind.f90: New test. + 2008-09-06 Steven G. Kargl PR fortran/33229 diff --git a/gcc/testsuite/gfortran.dg/size_kind.f90 b/gcc/testsuite/gfortran.dg/size_kind.f90 new file mode 100644 index 00000000000..5ec6f7efe14 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/size_kind.f90 @@ -0,0 +1,25 @@ +! { dg-do compile } +! +! PR fortran/36153 +! Contributed by Jonathan Hogg +! +program test_64 + implicit none + + integer, parameter :: long = selected_int_kind(18) + integer, parameter :: short = kind(0) + + integer(long), parameter :: big_sz = huge(0_short)+1000_long + integer(long), parameter :: max_32 = huge(0_short) + integer, dimension(:), allocatable :: array + + integer(long) :: i + + print *, "2**31 = ", 2_long**31 + print *, "max_32 = ", max_32 + print *, "big_sz = ", big_sz + + allocate(array(big_sz)) + print *, "sz = ", size(array) + print *, "sz = ", size(array, kind=long) +end program