Message ID | 20181216190444.GA59279@troutmask.apl.washington.edu |
---|---|
State | New |
Headers | show |
Series | PR fortran/85798 -- Check for allocatable components in data statement | expand |
On Sun, Dec 16, 2018 at 11:04:44AM -0800, Steve Kargl wrote: > The attached patch has been tested on i586-*-freebsd and x86_64-*-freebsd. > If a data-statement-object is a component of a derived type, it checks if > that component is allocatable. > > 2018-12-16 Steven G . Kargl <kargl@gcc.gnu.org> > > PR fortran/85798 > * decl.c (gfc_match_data): If a component of a derived type entity > appears in data statement, check that does not have the allocatable > attribute. > > 2018-12-16 Steven G . Kargl <kargl@gcc.gnu.org> > > PR fortran/85798 > * gfortran.dg/pr85798.f90: New test. > Ping.
On Thu, Dec 20, 2018 at 05:00:19PM -0800, Steve Kargl wrote: > On Sun, Dec 16, 2018 at 11:04:44AM -0800, Steve Kargl wrote: > > The attached patch has been tested on i586-*-freebsd and x86_64-*-freebsd. > > If a data-statement-object is a component of a derived type, it checks if > > that component is allocatable. > > > > 2018-12-16 Steven G . Kargl <kargl@gcc.gnu.org> > > > > PR fortran/85798 > > * decl.c (gfc_match_data): If a component of a derived type entity > > appears in data statement, check that does not have the allocatable > > attribute. > > > > 2018-12-16 Steven G . Kargl <kargl@gcc.gnu.org> > > > > PR fortran/85798 > > * gfortran.dg/pr85798.f90: New test. > > > > Ping. > Committed.
Index: gcc/fortran/decl.c =================================================================== --- gcc/fortran/decl.c (revision 267189) +++ gcc/fortran/decl.c (working copy) @@ -596,6 +596,7 @@ match gfc_match_data (void) { gfc_data *new_data; + gfc_expr *e; match m; /* Before parsing the rest of a DATA statement, check F2008:c1206. */ @@ -630,6 +631,30 @@ gfc_match_data (void) gfc_error ("Invalid substring in data-implied-do at %L in DATA " "statement", &new_data->var->list->expr->where); goto cleanup; + } + + /* Check for an entity with an allocatable component, which is not + allowed. */ + e = new_data->var->expr; + if (e) + { + bool invalid; + + invalid = false; + for (gfc_ref *ref = e->ref; ref; ref = ref->next) + if ((ref->type == REF_COMPONENT + && ref->u.c.component->attr.allocatable) + || (ref->type == REF_ARRAY + && e->symtree->n.sym->attr.pointer != 1 + && ref->u.ar.as && ref->u.ar.as->type == AS_DEFERRED)) + invalid = true; + + if (invalid) + { + gfc_error ("Allocatable component or deferred-shaped array " + "near %C in DATA statement"); + goto cleanup; + } } m = top_val_list (new_data); Index: gcc/testsuite/gfortran.dg/pr85798.f90 =================================================================== --- gcc/testsuite/gfortran.dg/pr85798.f90 (nonexistent) +++ gcc/testsuite/gfortran.dg/pr85798.f90 (working copy) @@ -0,0 +1,14 @@ +! { dg-do compile } +program p + type t + integer, allocatable :: a(:) + end type + type u + real x + type(t) y + end type + type(t) :: z + type(u) :: q + data z%a(1) / 789 / ! { dg-error "Allocatable component" } + data q%y%a(1) / 789 / ! { dg-error "Allocatable component" } +end