diff options
author | Steven G. Kargl <kargl@gcc.gnu.org> | 2018-12-22 19:37:06 +0000 |
---|---|---|
committer | Steven G. Kargl <kargl@gcc.gnu.org> | 2018-12-22 19:37:06 +0000 |
commit | 02543f02639c5fd0bd2755699f6d19c0043801ce (patch) | |
tree | 0d8fc7f8171c7f0f7a6d3bd5bcc20654e93780f2 /gcc | |
parent | 73f5d219bb59d2930010220d144bbff22031fb90 (diff) | |
download | gcc-02543f02639c5fd0bd2755699f6d19c0043801ce.zip gcc-02543f02639c5fd0bd2755699f6d19c0043801ce.tar.gz gcc-02543f02639c5fd0bd2755699f6d19c0043801ce.tar.bz2 |
re PR fortran/85798 (ICE in get_array_index, at fortran/data.c:69)
2018-12-22 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-22 Steven G . Kargl <kargl@gcc.gnu.org>
PR fortran/85798
* gfortran.dg/pr85798.f90: New test.
From-SVN: r267356
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fortran/decl.c | 25 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr85798.f90 | 14 |
4 files changed, 51 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 6f37f09..276aad9 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2018-12-22 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-22 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/88169 diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index 83d9ac6..51c19c1 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -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. */ @@ -632,6 +633,30 @@ gfc_match_data (void) 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); if (m != MATCH_YES) goto cleanup; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d358d2d..8549514 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-12-26 Steven G . Kargl <kargl@gcc.gnu.org> + + PR fortran/85798 + * gfortran.dg/pr85798.f90: New test. + 2018-12-21 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/88169 diff --git a/gcc/testsuite/gfortran.dg/pr85798.f90 b/gcc/testsuite/gfortran.dg/pr85798.f90 new file mode 100644 index 0000000..1cc224d --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr85798.f90 @@ -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 |