diff options
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/decl.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr93686_1.f90 | 10 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr93686_2.f90 | 10 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr93686_3.f90 | 9 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr93686_4.f90 | 8 |
7 files changed, 55 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 8c4ace7..435f93d 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2020-04-06 Steven G. Kargl <kargl@gcc.gnu.org> + + PR fortran/93686 + * decl.c (gfc_match_data): Handle data matching for derived type + pointers. + 2020-04-02 Tobias Burnus <tobias@codesourcery.com> * gfortran.h (gfc_resolve_formal_arglist): Add prototype. diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index ea30908..b3ed63c 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -696,6 +696,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 2198e18..ef5e0cf 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2020-04-06 Steven G. Kargl <kargl@gcc.gnu.org> + + 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-06 Joel Brobecker <brobecker@adacore.com> * gcc.target/arm/div64-unwinding.c: Skip on vxworks_kernel targets. diff --git a/gcc/testsuite/gfortran.dg/pr93686_1.f90 b/gcc/testsuite/gfortran.dg/pr93686_1.f90 new file mode 100644 index 0000000..0e7560a --- /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 0000000..aac4d91 --- /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 0000000..5b57040 --- /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 0000000..ff3ae76 --- /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 |