re PR fortran/52016 ([OOP] Polymorphism and elemental: missing diagnostic)

2012-01-27  Tobias Burnus  <burnus@net-b.de>

        PR fortran/52016
        * resolve.c (resolve_formal_arglist): Fix elemental
        constraint checks for polymorphic dummies.

2012-01-27  Tobias Burnus  <burnus@net-b.de>

        PR fortran/52016
        * gfortran.dg/elemental_args_check_5.f90: New.

From-SVN: r183620
This commit is contained in:
Tobias Burnus 2012-01-27 14:02:54 +01:00 committed by Tobias Burnus
parent 45c8342998
commit 9775a921e0
4 changed files with 64 additions and 4 deletions

View File

@ -1,3 +1,9 @@
2012-01-27 Tobias Burnus <burnus@net-b.de>
PR fortran/52016
* resolve.c (resolve_formal_arglist): Fix elemental
constraint checks for polymorphic dummies.
2012-01-27 Paul Thomas <pault@gcc.gnu.org>
Tobias Burnus <burnus@gcc.gnu.org>
@ -24,7 +30,11 @@
gfc_copy_class_to_clasfc_cs, to copy to the allocated data.
* trans.h : Prototypes for gfc_get_class_array_ref,
gfc_copy_class_to_class and gfc_conv_class_to_class.
2012-01-25 Tobias Burnus <burnus@net-b.de>
* resolve.c (symbol_as): Check also for attr.class_ok.
2012-01-25 Tobias Burnus <burnus@net-b.de>
PR fortran/51995

View File

@ -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,
@ -1575,6 +1580,16 @@ resolve_procedure_expression (gfc_expr* expr)
}
gfc_array_spec *
symbol_as (gfc_symbol *sym)
{
if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
return CLASS_DATA (sym)->as;
else
return sym->as;
}
/* Resolve an actual argument list. Most of the time, this is just
resolving the expressions in the list.
The exception is that we sometimes have to decide whether arguments

View File

@ -1,3 +1,8 @@
2012-01-27 Tobias Burnus <burnus@net-b.de>
PR fortran/52016
* gfortran.dg/elemental_args_check_5.f90: New.
2012-01-27 Richard Guenther <rguenther@suse.de>
PR middle-end/51959

View File

@ -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