Commit 9775a921 by Tobias Burnus Committed by Tobias Burnus

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
parent 45c83429
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> 2012-01-27 Paul Thomas <pault@gcc.gnu.org>
Tobias Burnus <burnus@gcc.gnu.org> Tobias Burnus <burnus@gcc.gnu.org>
...@@ -24,7 +30,11 @@ ...@@ -24,7 +30,11 @@
gfc_copy_class_to_clasfc_cs, to copy to the allocated data. gfc_copy_class_to_clasfc_cs, to copy to the allocated data.
* trans.h : Prototypes for gfc_get_class_array_ref, * trans.h : Prototypes for gfc_get_class_array_ref,
gfc_copy_class_to_class and gfc_conv_class_to_class. 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> 2012-01-25 Tobias Burnus <burnus@net-b.de>
PR fortran/51995 PR fortran/51995
......
...@@ -374,21 +374,26 @@ resolve_formal_arglist (gfc_symbol *proc) ...@@ -374,21 +374,26 @@ resolve_formal_arglist (gfc_symbol *proc)
if (gfc_elemental (proc)) if (gfc_elemental (proc))
{ {
/* F08:C1289. */ /* 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 " gfc_error ("Coarray dummy argument '%s' at %L to elemental "
"procedure", sym->name, &sym->declared_at); "procedure", sym->name, &sym->declared_at);
continue; 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 " gfc_error ("Argument '%s' of elemental procedure at %L must "
"be scalar", sym->name, &sym->declared_at); "be scalar", sym->name, &sym->declared_at);
continue; 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 " gfc_error ("Argument '%s' of elemental procedure at %L cannot "
"have the ALLOCATABLE attribute", sym->name, "have the ALLOCATABLE attribute", sym->name,
...@@ -1575,6 +1580,16 @@ resolve_procedure_expression (gfc_expr* expr) ...@@ -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 /* Resolve an actual argument list. Most of the time, this is just
resolving the expressions in the list. resolving the expressions in the list.
The exception is that we sometimes have to decide whether arguments The exception is that we sometimes have to decide whether arguments
......
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> 2012-01-27 Richard Guenther <rguenther@suse.de>
PR middle-end/51959 PR middle-end/51959
......
! { 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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment