]> gcc.gnu.org Git - gcc.git/commitdiff
Fortran/OpenMP: Handle implicit SAVE for variables in main
authorTobias Burnus <tobias@codesourcery.com>
Fri, 14 May 2021 17:19:26 +0000 (19:19 +0200)
committerTobias Burnus <tobias@codesourcery.com>
Mon, 17 May 2021 08:52:00 +0000 (10:52 +0200)
gcc/fortran/ChangeLog:

* resolve.c (resolve_symbol): Handle implicit SAVE of main-program
for vars in 'omp threadprivate' and 'omp declare target'.

gcc/testsuite/ChangeLog:

* gfortran.dg/gomp/implicit-save.f90: New test.

(cherry picked from commit 62e1bd651f60cfe3daaad91b41b7612bc7fa7460)

gcc/fortran/resolve.c
gcc/testsuite/gfortran.dg/gomp/implicit-save.f90 [new file with mode: 0644]

index dd4b26680e04f30324493a40803151b4aa360946..fac24560c11fb7efa7c87a077fdb833f32c227e6 100644 (file)
@@ -16038,7 +16038,8 @@ resolve_symbol (gfc_symbol *sym)
       && !(sym->ns->save_all && !sym->attr.automatic)
       && sym->module == NULL
       && (sym->ns->proc_name == NULL
-         || sym->ns->proc_name->attr.flavor != FL_MODULE))
+         || (sym->ns->proc_name->attr.flavor != FL_MODULE
+             && !sym->ns->proc_name->attr.is_main_program)))
     gfc_error ("Threadprivate at %L isn't SAVEd", &sym->declared_at);
 
   /* Check omp declare target restrictions.  */
@@ -16049,7 +16050,8 @@ resolve_symbol (gfc_symbol *sym)
       && (!sym->attr.in_common
          && sym->module == NULL
          && (sym->ns->proc_name == NULL
-             || sym->ns->proc_name->attr.flavor != FL_MODULE)))
+             || (sym->ns->proc_name->attr.flavor != FL_MODULE
+                 && !sym->ns->proc_name->attr.is_main_program))))
     gfc_error ("!$OMP DECLARE TARGET variable %qs at %L isn't SAVEd",
               sym->name, &sym->declared_at);
 
diff --git a/gcc/testsuite/gfortran.dg/gomp/implicit-save.f90 b/gcc/testsuite/gfortran.dg/gomp/implicit-save.f90
new file mode 100644 (file)
index 0000000..2af9647
--- /dev/null
@@ -0,0 +1,11 @@
+subroutine foo
+  integer :: n = 5, m = 7
+  !$omp declare target to(n)
+  !$omp threadprivate (m)
+end
+
+program main
+  integer :: i, j
+  !$omp declare target to(i)
+  !$omp threadprivate (j)
+end
This page took 0.09236 seconds and 5 git commands to generate.