aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/resolve.c6
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/implicit-save.f9011
2 files changed, 15 insertions, 2 deletions
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 5a81387..83b41a3 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 0000000..2af9647
--- /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