From 83c9ff0291e88d5940ec0962f386b57705ede648 Mon Sep 17 00:00:00 2001 From: Fritz Reese Date: Mon, 6 Apr 2020 16:14:29 -0400 Subject: [PATCH] Fix fortran/93686 -- ICE matching data statements with derived-type pointers. gcc/fortran/ChangeLog: 2020-04-06 Fritz Reese Backport from master Steven G. Kargl PR fortran/93686 * decl.c (gfc_match_data): Handle data matching for derived type pointers. gcc/testsuite/ChangeLog: 2020-04-06 Fritz Reese Backport from master. Steven G. Kargl PR fortran/93686 * gfortran.dg/pr93686_1.f90: New test. * gfortran.dg/pr93686_2.f90: Likewise. * gfortran.dg/pr93686_3.f90: Likewise. * gfortran.dg/pr93686_4.f90: Likewise. --- gcc/fortran/ChangeLog | 9 +++++++++ gcc/fortran/decl.c | 4 ++++ gcc/testsuite/ChangeLog | 11 +++++++++++ gcc/testsuite/gfortran.dg/pr93686_1.f90 | 10 ++++++++++ gcc/testsuite/gfortran.dg/pr93686_2.f90 | 10 ++++++++++ gcc/testsuite/gfortran.dg/pr93686_3.f90 | 9 +++++++++ gcc/testsuite/gfortran.dg/pr93686_4.f90 | 8 ++++++++ 7 files changed, 61 insertions(+) create mode 100644 gcc/testsuite/gfortran.dg/pr93686_1.f90 create mode 100644 gcc/testsuite/gfortran.dg/pr93686_2.f90 create mode 100644 gcc/testsuite/gfortran.dg/pr93686_3.f90 create mode 100644 gcc/testsuite/gfortran.dg/pr93686_4.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 744511a5cb8e..68a85ed026c0 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,12 @@ +2020-04-06 Fritz Reese + + Backport from master + Steven G. Kargl + + PR fortran/93686 + * decl.c (gfc_match_data): Handle data matching for derived type + pointers. + 2020-04-02 Mark Eggleston Backport from master diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index 78ea32a37709..86226b63ecc5 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -668,6 +668,10 @@ gfc_match_data (void) /* F2008:C567 (R536) A data-i-do-object or a variable that appears as a data-stmt-object shall not be an object designator in which a pointer appears other than as the entire rightmost part-ref. */ + if (!e->ref && e->ts.type == BT_DERIVED + && e->symtree->n.sym->attr.pointer) + goto partref; + ref = e->ref; if (e->symtree->n.sym->ts.type == BT_DERIVED && e->symtree->n.sym->attr.pointer diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ab5f3b167755..cb98ddd10b20 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2020-04-06 Fritz Reese + + Backport from master. + Steven G. Kargl + + PR fortran/93686 + * gfortran.dg/pr93686_1.f90: New test. + * gfortran.dg/pr93686_2.f90: Likewise. + * gfortran.dg/pr93686_3.f90: Likewise. + * gfortran.dg/pr93686_4.f90: Likewise. + 2020-04-05 Marek Polacek 2020-02-06 Marek Polacek diff --git a/gcc/testsuite/gfortran.dg/pr93686_1.f90 b/gcc/testsuite/gfortran.dg/pr93686_1.f90 new file mode 100644 index 000000000000..0e7560a5c17a --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr93686_1.f90 @@ -0,0 +1,10 @@ +! { dg-do compile } +! PR fortran/93686 + +program p + type t + integer :: a + end type + type(t), pointer :: x + data x /t(2)/ ! { dg-error "part-ref with pointer attribute near ... is not rightmost part-ref of data-stmt-object" } +end diff --git a/gcc/testsuite/gfortran.dg/pr93686_2.f90 b/gcc/testsuite/gfortran.dg/pr93686_2.f90 new file mode 100644 index 000000000000..aac4d9138ee5 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr93686_2.f90 @@ -0,0 +1,10 @@ +! { dg-do compile } +! PR fortran/93686 + +program p + type t + integer :: a = 1 + end type + type(t), pointer :: x + data x /t(2)/ ! { dg-error "part-ref with pointer attribute near ... is not rightmost part-ref of data-stmt-object" } +end diff --git a/gcc/testsuite/gfortran.dg/pr93686_3.f90 b/gcc/testsuite/gfortran.dg/pr93686_3.f90 new file mode 100644 index 000000000000..5b570407f8f2 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr93686_3.f90 @@ -0,0 +1,9 @@ +! { dg-do compile } +! PR fortran/93686 + +program p + type t + end type + type(t), pointer :: x + data x /t()/ ! { dg-error "part-ref with pointer attribute near ... is not rightmost part-ref of data-stmt-object" } +end diff --git a/gcc/testsuite/gfortran.dg/pr93686_4.f90 b/gcc/testsuite/gfortran.dg/pr93686_4.f90 new file mode 100644 index 000000000000..ff3ae764ab77 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr93686_4.f90 @@ -0,0 +1,8 @@ +! { dg-do compile } +! PR fortran/93686 + +type t +end type +type(t), pointer :: x +data x / ! { dg-error "part-ref with pointer attribute near ... is not rightmost part-ref of data-stmt-object" } +end -- 2.47.3