From b6e841a699fe43ddf632dd79e0002dd51c8bf864 Mon Sep 17 00:00:00 2001 From: "Steven G. Kargl" Date: Sun, 27 May 2018 17:31:26 +0000 Subject: [PATCH] decl.c (match_data_constant): Fortran 2018 allows pointer initialization in a data statement. 2018-05-27 Steven G. Kargl * decl.c (match_data_constant): Fortran 2018 allows pointer initialization in a data statement. 2018-05-27 Steven G. Kargl * gfortran.dg/data_stmt_pointer.f90: new test. From-SVN: r260808 --- gcc/fortran/ChangeLog | 5 +++++ gcc/fortran/decl.c | 15 ++++++++++++++- gcc/testsuite/ChangeLog | 4 ++++ .../gfortran.dg/data_stmt_pointer.f90 | 19 +++++++++++++++++++ 4 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/data_stmt_pointer.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 63d42976676..95914aea938 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2018-05-27 Steven G. Kargl + + * decl.c (match_data_constant): Fortran 2018 allows pointer + initialization in a data statement. + 2018-05-25 Janus Weil PR fortran/85839 diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index bd343b2b163..2fca8ad1f5d 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -387,7 +387,20 @@ match_data_constant (gfc_expr **result) return m; } else if (m == MATCH_YES) - gfc_free_expr (*result); + { + /* F2018:R845 data-stmt-constant is initial-data-target. + A data-stmt-constant shall be ... initial-data-target if and + only if the corresponding data-stmt-object has the POINTER + attribute. ... If data-stmt-constant is initial-data-target + the corresponding data statement object shall be + data-pointer-initialization compatible (7.5.4.6) with the initial + data target; the data statement object is initially associated + with the target. */ + if ((*result)->symtree->n.sym->attr.save + && (*result)->symtree->n.sym->attr.target) + return m; + gfc_free_expr (*result); + } gfc_current_locus = old_loc; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a897b47cb13..0ec5cee07ae 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2018-05-27 Steven G. Kargl + + * gfortran.dg/data_stmt_pointer.f90: new test. + 2018-05-27 Jakub Jelinek PR target/85918 diff --git a/gcc/testsuite/gfortran.dg/data_stmt_pointer.f90 b/gcc/testsuite/gfortran.dg/data_stmt_pointer.f90 new file mode 100644 index 00000000000..923860e0b84 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/data_stmt_pointer.f90 @@ -0,0 +1,19 @@ +! { dg-do run } +program foo + real, pointer :: p + real, save, target :: x = 42 + data p / x / + if (p /= 42) stop 1 + call bar +end program foo + +subroutine bar + type bah + integer, pointer :: p + end type bah + type(bah) a + integer, save, target :: i = 42 + data a%p / i / + if (a%p /= 42) stop 2 +end subroutine + -- 2.30.2