summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/decl.c10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/pr77632_1.f907
4 files changed, 29 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 7b71ee43e0b..56aca1f9b1e 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,12 @@
2019-06-20 Steven G. Kargl <kargl@gcc.gnu.org>
+ PR fortran/77632
+ * /decl.c (variable_decl): Mark a variable that is a target in pointer
+ initialization when in PROGRAM, MODULE, or SUBMODULE scope with an
+ implicit save.
+
+2019-06-20 Steven G. Kargl <kargl@gcc.gnu.org>
+
PR fortran/86587
* symbol.c (verify_bind_c_derived_type): Remove erroneous error
checking for BIND(C) and PRIVATE attributes.
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index 7fcb60ab7ab..f5517f0d75f 100644
--- a/gcc/fortran/decl.c
+++ b/gcc/fortran/decl.c
@@ -2779,6 +2779,16 @@ variable_decl (int elem)
m = match_pointer_init (&initializer, 0);
if (m != MATCH_YES)
goto cleanup;
+
+ /* The target of a pointer initialization must have the SAVE
+ attribute. A variable in PROGRAM, MODULE, or SUBMODULE scope
+ is implicit SAVEd. Explicitly, set the SAVE_IMPLICIT value. */
+ if (initializer->expr_type == EXPR_VARIABLE
+ && initializer->symtree->n.sym->attr.save == SAVE_NONE
+ && (gfc_current_state () == COMP_PROGRAM
+ || gfc_current_state () == COMP_MODULE
+ || gfc_current_state () == COMP_SUBMODULE))
+ initializer->symtree->n.sym->attr.save = SAVE_IMPLICIT;
}
else if (gfc_match_char ('=') == MATCH_YES)
{
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 48ca72f0e53..440284de43f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-06-20 Steven G. Kargl <kargl@gcc.gnu.org>
+
+ PR fortran/77632
+ * gfortran.dg/pr77632_1.f90: New test.
+
2019-06-20 Marek Polacek <polacek@redhat.com>
PR c++/68265
diff --git a/gcc/testsuite/gfortran.dg/pr77632_1.f90 b/gcc/testsuite/gfortran.dg/pr77632_1.f90
new file mode 100644
index 00000000000..13fed5991a6
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr77632_1.f90
@@ -0,0 +1,7 @@
+! { dg-do run }
+program foo
+ implicit none
+ real, target :: a
+ real, pointer :: b => a
+ if (associated(b, a) .eqv. .false.) stop 1
+end program foo