diff mbox series

Fortran/OpenMP: Handle implicit SAVE for variables in main

Message ID def712d3-e0b6-7ad2-2557-08341caa4b62@codesourcery.com
State New
Headers show
Series Fortran/OpenMP: Handle implicit SAVE for variables in main | expand

Commit Message

Tobias Burnus May 14, 2021, 4:13 p.m. UTC
Found when working on another patch. Variables in the specification
part of a module – but also in a main program are implicitly SAVE.

Likewise for variables with initialization - but that was already
handled.

OK for mainline and GCC 11?

Tobias

-----------------
Mentor Graphics (Deutschland) GmbH, Arnulfstrasse 201, 80634 München Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Frank Thürauf

Comments

Jakub Jelinek May 14, 2021, 4:46 p.m. UTC | #1
On Fri, May 14, 2021 at 06:13:55PM +0200, Tobias Burnus wrote:
> Found when working on another patch. Variables in the specification
> part of a module – but also in a main program are implicitly SAVE.
> 
> Likewise for variables with initialization - but that was already
> handled.
> 
> OK for mainline and GCC 11?

Ok, thanks.

	Jakub
diff mbox series

Patch

Fortran/OpenMP: Handle implicit SAVE for variables in main

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.

diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 5a81387e277..c02bbed8739 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -16039,7 +16039,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.  */
@@ -16050,7 +16051,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
index 00000000000..2af9647490e
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/gomp/implicit-save.f90
@@ -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