diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 73dcbf87d8e94c2a058ec12e256b9ec5b782b25a..04844601fe13acd2dcdea96ea92bc5d44a85e895 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2007-09-13 Tobias Burnus <burnus@net-b.de> + + PR fortran/33343 + * expr.c (gfc_check_conformance): Print ranks in the error message. + * resolve.c (resolve_elemental_actual): Check also conformance of + the actual arguments for elemental functions. + 2007-09-13 Tobias Burnus <burnus@net-b.de> * symbol.c (gfc_add_elemental,gfc_add_pure,gfc_add_recursive): diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index ebed1f2283286066397e9c5770b8ca6579e67e06..6ffcf7ef63b721a1f1bb77729777f47aefcab9e4 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -2513,8 +2513,8 @@ gfc_check_conformance (const char *optype_msgid, gfc_expr *op1, gfc_expr *op2) if (op1->rank != op2->rank) { - gfc_error ("Incompatible ranks in %s at %L", _(optype_msgid), - &op1->where); + gfc_error ("Incompatible ranks in %s (%d and %d) at %L", _(optype_msgid), + op1->rank, op2->rank, &op1->where); return FAILURE; } @@ -2527,7 +2527,7 @@ gfc_check_conformance (const char *optype_msgid, gfc_expr *op1, gfc_expr *op2) if (op1_flag && op2_flag && mpz_cmp (op1_size, op2_size) != 0) { - gfc_error ("different shape for %s at %L on dimension %d (%d/%d)", + gfc_error ("different shape for %s at %L on dimension %d (%d and %d)", _(optype_msgid), &op1->where, d + 1, (int) mpz_get_si (op1_size), (int) mpz_get_si (op2_size)); diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 76a20a4cb5b4cf67faf472e6fd8e23069e6d3b95..55d087ff0892d921959c3f1b11519373238ed49f 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -1275,13 +1275,10 @@ resolve_elemental_actual (gfc_expr *expr, gfc_code *c) if (resolve_assumed_size_actual (arg->expr)) return FAILURE; - if (expr) - continue; - - /* Elemental subroutine array actual arguments must conform. */ + /* Elemental procedure's array actual arguments must conform. */ if (e != NULL) { - if (gfc_check_conformance ("elemental subroutine", arg->expr, e) + if (gfc_check_conformance ("elemental procedure", arg->expr, e) == FAILURE) return FAILURE; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9df45f8f49da86faa0c61185adabdb0bee6edbc2..90cbdad574b1bb52eac716e485e23632818a9fc4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2007-09-13 Tobias Burnus <burnus@net-b.de> + + PR fortran/33343 + * gfortran.dg/elemental_args_check_1.f90: New. + * gfortran.dg/assumed_size_refs_1.f90: Update error message. + * gfortran.dg/elemental_subroutine_4.f90: Ditto. + 2007-09-13 Tobias Burnus <burnus@net-b.de> * gfortran.dg/recursive_check_3.f90: New. diff --git a/gcc/testsuite/gfortran.dg/assumed_size_refs_1.f90 b/gcc/testsuite/gfortran.dg/assumed_size_refs_1.f90 index 1590ec5c697c7b2393b01be56907d60b2170837e..1adfd3d5cc7488b0d5ab81174f54658c6b1b51e6 100644 --- a/gcc/testsuite/gfortran.dg/assumed_size_refs_1.f90 +++ b/gcc/testsuite/gfortran.dg/assumed_size_refs_1.f90 @@ -35,7 +35,7 @@ contains x = fcn (m) ! { dg-error "upper bound in the last dimension" } m(:, 1:2) = fcn (q) call sub (m, x) ! { dg-error "upper bound in the last dimension" } - call sub (m(1:2, 1:2), x) ! { dg-error "Incompatible ranks in elemental subroutine" } + call sub (m(1:2, 1:2), x) ! { dg-error "Incompatible ranks in elemental procedure" } print *, p call DHSEQR(x) diff --git a/gcc/testsuite/gfortran.dg/elemental_args_check_1.f90 b/gcc/testsuite/gfortran.dg/elemental_args_check_1.f90 new file mode 100644 index 0000000000000000000000000000000000000000..caf4d177e5c9b674a5a967725d19c40702eeabba --- /dev/null +++ b/gcc/testsuite/gfortran.dg/elemental_args_check_1.f90 @@ -0,0 +1,31 @@ +! { dg-do compile } +! PR fortran/33343 +! +! Check conformance of array actual arguments to +! elemental function. +! +! Contributed by Mikael Morin <mikael.morin@tele2.fr> +! + module geometry + implicit none + integer, parameter :: prec = 8 + integer, parameter :: length = 10 + contains + elemental function Mul(a, b) + real(kind=prec) :: a + real(kind=prec) :: b, Mul + intent(in) :: a, b + Mul = a * b + end function Mul + + pure subroutine calcdAcc2(vectors, angles) + real(kind=prec), dimension(:) :: vectors + real(kind=prec), dimension(size(vectors),2) :: angles + intent(in) :: vectors, angles + real(kind=prec), dimension(size(vectors)) :: ax + real(kind=prec), dimension(size(vectors),2) :: tmpAcc + tmpAcc(1,:) = Mul(angles(1,1:2),ax(1)) ! Ok + tmpAcc(:,1) = Mul(angles(:,1),ax) ! OK + tmpAcc(:,:) = Mul(angles(:,:),ax) ! { dg-error "Incompatible ranks in elemental procedure" } + end subroutine calcdAcc2 + end module geometry diff --git a/gcc/testsuite/gfortran.dg/elemental_subroutine_4.f90 b/gcc/testsuite/gfortran.dg/elemental_subroutine_4.f90 index 1a3446264cf42b30d465d88d5be28a3da7225613..1c5b1f7060a1648777888fd2c43fb88f4674cbc8 100644 --- a/gcc/testsuite/gfortran.dg/elemental_subroutine_4.f90 +++ b/gcc/testsuite/gfortran.dg/elemental_subroutine_4.f90 @@ -24,10 +24,10 @@ end module elem_assign integer :: I(2,2),J(2) type (mytype) :: w(2,2), x(4), y(5), z(4) ! The original PR - CALL S(I,J) ! { dg-error "Incompatible ranks in elemental subroutine" } + CALL S(I,J) ! { dg-error "Incompatible ranks in elemental procedure" } ! Check interface assignments - x = w ! { dg-error "Incompatible ranks in elemental subroutine" } - x = y ! { dg-error "different shape for elemental subroutine" } + x = w ! { dg-error "Incompatible ranks in elemental procedure" } + x = y ! { dg-error "different shape for elemental procedure" } x = z CONTAINS ELEMENTAL SUBROUTINE S(I,J)