summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>2007-09-18 06:34:30 +0000
committerburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>2007-09-18 06:34:30 +0000
commitf6c9396c3cbca6b6c1050d5027019ebb2c21461c (patch)
tree20cf832532f35a69f339af7e05cd88816ef6b9fb /gcc
parent0ebbfc91181f798bda447719827bc20988e73757 (diff)
downloadgcc-f6c9396c3cbca6b6c1050d5027019ebb2c21461c.tar.gz
2007-09-18 Tobias Burnus <burnus@net-b.de>
PR fortran/33231 * resolve.c (resolve_elemental_actual): Check for conformance of intent out/inout dummies. 2007-09-18 Tobias Burnus <burnus@net-b.de> PR fortran/33231 * gfortran.dg/elemental_optional_args_1.f90: Make valid Fortran. * gfortran.dg/elemental_subroutine_1.f90: Ditto. * gfortran.dg/elemental_subroutine_5.f90: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@128570 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/resolve.c16
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gfortran.dg/elemental_optional_args_1.f908
-rw-r--r--gcc/testsuite/gfortran.dg/elemental_subroutine_1.f906
-rw-r--r--gcc/testsuite/gfortran.dg/elemental_subroutine_5.f9027
6 files changed, 64 insertions, 6 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 24ba2ecf16e..ad04007c119 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2007-09-18 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/33231
+ * resolve.c (resolve_elemental_actual): Check for conformance
+ of intent out/inout dummies.
+
2007-09-17 Tobias Burnus <burnus@net-b.de>
PR fortran/33106
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 40c476a56f0..5d1c1160de2 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -1286,6 +1286,22 @@ resolve_elemental_actual (gfc_expr *expr, gfc_code *c)
e = arg->expr;
}
+ /* INTENT(OUT) is only allowed for subroutines; if any actual argument
+ is an array, the intent inout/out variable needs to be also an array. */
+ if (rank > 0 && esym && expr == NULL)
+ for (eformal = esym->formal, arg = arg0; arg && eformal;
+ arg = arg->next, eformal = eformal->next)
+ if ((eformal->sym->attr.intent == INTENT_OUT
+ || eformal->sym->attr.intent == INTENT_INOUT)
+ && arg->expr && arg->expr->rank == 0)
+ {
+ gfc_error ("Actual argument at %L for INTENT(%s) dummy '%s' of "
+ "ELEMENTAL subroutine '%s' is a scalar, but another "
+ "actual argument is an array", &arg->expr->where,
+ (eformal->sym->attr.intent == INTENT_OUT) ? "OUT"
+ : "INOUT", eformal->sym->name, esym->name);
+ return FAILURE;
+ }
return SUCCESS;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 86d1b8e1970..a07270af87d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2007-09-18 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/33231
+ * gfortran.dg/elemental_optional_args_1.f90: Make valid Fortran.
+ * gfortran.dg/elemental_subroutine_1.f90: Ditto.
+ * gfortran.dg/elemental_subroutine_5.f90: New.
+
2007-09-18 Richard Sandiford <rsandifo@nildram.co.uk>
* lib/target-supports.exp (check_profiling_available): Extend
diff --git a/gcc/testsuite/gfortran.dg/elemental_optional_args_1.f90 b/gcc/testsuite/gfortran.dg/elemental_optional_args_1.f90
index 4f274baa20b..aed6cadc350 100644
--- a/gcc/testsuite/gfortran.dg/elemental_optional_args_1.f90
+++ b/gcc/testsuite/gfortran.dg/elemental_optional_args_1.f90
@@ -11,7 +11,7 @@
CALL T1(1,2)
CONTAINS
SUBROUTINE T1(A1,A2,A3)
- INTEGER :: A1,A2, A4(2)
+ INTEGER :: A1,A2, A4(2), A5(2)
INTEGER, OPTIONAL :: A3(2)
interface
elemental function efoo (B1,B2,B3) result(bar)
@@ -34,9 +34,9 @@ CONTAINS
write(6,*) efoo(A1,A3,A2)
write(6,*) efoo(A1,A4,A3)
! check an elemental subroutine
- call foobar (A1,A2,A3) ! { dg-warning "array and OPTIONAL" }
- call foobar (A1,A2,A4)
- call foobar (A1,A4,A4)
+ call foobar (A5,A2,A3) ! { dg-warning "array and OPTIONAL" }
+ call foobar (A5,A2,A4)
+ call foobar (A5,A4,A4)
END SUBROUTINE
elemental function foo (B1,B2,B3) result(bar)
INTEGER, intent(in) :: B1, B2
diff --git a/gcc/testsuite/gfortran.dg/elemental_subroutine_1.f90 b/gcc/testsuite/gfortran.dg/elemental_subroutine_1.f90
index 85ba3f9e73e..298b54eee3d 100644
--- a/gcc/testsuite/gfortran.dg/elemental_subroutine_1.f90
+++ b/gcc/testsuite/gfortran.dg/elemental_subroutine_1.f90
@@ -41,10 +41,12 @@ end module pr22146
call foobar (u, v)
if (v.ne.-42.0) call abort ()
- call foobar (x, v)
- if (v.ne.-2.0) call abort ()
+ v = 2.0
+ call foobar (v, x)
+ if (any(x /= -2.0)) call abort ()
! Test an expression in the INTENT(IN) argument
+ x = (/1.0, 2.0/)
call foobar (cos (x) + u, y)
if (any(abs (y + cos (x) + u) .gt. 2.0e-6)) call abort ()
diff --git a/gcc/testsuite/gfortran.dg/elemental_subroutine_5.f90 b/gcc/testsuite/gfortran.dg/elemental_subroutine_5.f90
new file mode 100644
index 00000000000..efadb6d1439
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/elemental_subroutine_5.f90
@@ -0,0 +1,27 @@
+! { dg-do compile }
+!
+! PR fortran/33231
+!
+! Elemental function:
+! Intent OUT/INOUT dummy: Actual needs to be an array
+! if any actual is an array
+!
+program prog
+implicit none
+integer :: i, j(2)
+call sub(i,1,2) ! OK, only scalar
+call sub(j,1,2) ! OK, scalar IN, array OUT
+call sub(j,[1,2],3) ! OK, scalar & array IN, array OUT
+call sub(j,[1,2],[1,2]) ! OK, all arrays
+
+call sub(i,1,2) ! OK, only scalar
+call sub(i,[1,2],3) ! { dg-error "is a scalar" }
+call sub(i,[1,2],[1,2]) ! { dg-error "is a scalar" }
+contains
+elemental subroutine sub(a,b,c)
+ integer :: func, a, b, c
+ intent(in) :: b,c
+ intent(out) :: a
+ a = b +c
+end subroutine sub
+end program prog