Dominique found out that there is no diagnostic for polymorphic arrays.
This patch adds it.
From the F2008 standard:
"C1289 All dummy arguments of an elemental procedure shall be scalar
noncoarray dummy data objects and shall not have the POINTER or
ALLOCATABLE attribute."
"An elemental subroutine has only scalar dummy arguments, but may have
array actual arguments. In a reference to an elemental subroutine,
either all actual arguments shall be scalar, or all actual arguments
corresponding to INTENT (OUT) and INTENT (INOUT) dummy arguments shall
be arrays of the same shape and the remaining actual arguments shall be
conformable with them."
Build and currently regtesting on x86-64-linux.
OK for the trunk?
Tobias
2012-01-27 Tobias Burnus <bur...@net-b.de>
* resolve.c (resolve_formal_arglist): Fix elemental
constraint checks for polymorphic dummies.
2012-01-27 Tobias Burnus <bur...@net-b.de>
* gfortran.dg/elemental_args_check_5.f90: New.
Index: gcc/fortran/resolve.c
===================================================================
--- gcc/fortran/resolve.c (Revision 183575)
+++ gcc/fortran/resolve.c (Arbeitskopie)
@@ -374,21 +374,26 @@ resolve_formal_arglist (gfc_symbol *proc)
if (gfc_elemental (proc))
{
/* F08:C1289. */
- if (sym->attr.codimension)
+ if (sym->attr.codimension
+ || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
+ && CLASS_DATA (sym)->attr.codimension))
{
gfc_error ("Coarray dummy argument '%s' at %L to elemental "
"procedure", sym->name, &sym->declared_at);
continue;
}
- if (sym->as != NULL)
+ if (sym->as || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
+ && CLASS_DATA (sym)->as))
{
gfc_error ("Argument '%s' of elemental procedure at %L must "
"be scalar", sym->name, &sym->declared_at);
continue;
}
- if (sym->attr.allocatable)
+ if (sym->attr.allocatable
+ || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
+ && CLASS_DATA (sym)->attr.allocatable))
{
gfc_error ("Argument '%s' of elemental procedure at %L cannot "
"have the ALLOCATABLE attribute", sym->name,
Index: gcc/testsuite/gfortran.dg/elemental_args_check_5.f90
===================================================================
--- gcc/testsuite/gfortran.dg/elemental_args_check_5.f90 (Revision 0)
+++ gcc/testsuite/gfortran.dg/elemental_args_check_5.f90 (Arbeitskopie)
@@ -0,0 +1,30 @@
+! { dg-do compile }
+! { dg-options "-fcoarray=single" }
+!
+!
+ type t
+ end type t
+ type t2
+ end type t2
+contains
+elemental subroutine foo0(v) ! OK
+ class(t), intent(in) :: v
+end subroutine
+
+elemental subroutine foo1(w) ! { dg-error "Argument 'w' of elemental procedure at .1. cannot have the ALLOCATABLE attribute" }
+ class(t), allocatable, intent(in) :: w
+end subroutine
+
+elemental subroutine foo2(x) ! { dg-error "Argument 'x' of elemental procedure at .1. cannot have the POINTER attribute" }
+ class(t), pointer, intent(in) :: x
+end subroutine
+
+elemental subroutine foo3(y) ! { dg-error "Coarray dummy argument 'y' at .1. to elemental procedure" }
+ class(t2), intent(in) :: y[*]
+end subroutine
+
+elemental subroutine foo4(z) ! { dg-error "Argument 'z' of elemental procedure at .1. must be scalar" }
+ class(t), intent(in) :: z(:)
+end subroutine
+
+end