aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorTobias Burnus <tobias@codesourcery.com>2020-03-12 10:57:56 +0100
committerTobias Burnus <tobias@codesourcery.com>2020-03-12 10:57:56 +0100
commit98aeb1ef510204bf90e94b6cc85e5ba68df93d00 (patch)
treef675ed9667ba2f57a66de5d29906bc84fe26a6d7 /gcc/fortran
parentb73f69020f08208d2d969fcf8879bd294a6e3596 (diff)
downloadgcc-98aeb1ef510204bf90e94b6cc85e5ba68df93d00.zip
gcc-98aeb1ef510204bf90e94b6cc85e5ba68df93d00.tar.gz
gcc-98aeb1ef510204bf90e94b6cc85e5ba68df93d00.tar.bz2
[Fortran, OpenACC] Reject vars of different scope in $acc declare (PR94120)
2020-03-12 Tobias Burnus <tobias@codesourcery.com> PR middle-end/94120 * openmp.c (gfc_match_oacc_declare): Accept function-result variables; reject variables declared in a different scoping unit. 2020-03-12 Tobias Burnus <tobias@codesourcery.com> PR middle-end/94120 * gfortran.dg/goacc/pr78260-2.f90: Correct scan-tree-dump-times. Extend test case to result variables. * gfortran.dg/goacc/declare-2.f95: Actually check module-declaration restriction of OpenACC. * gfortran.dg/goacc/declare-3.f95: Remove case where this restriction is violated. * gfortran.dg/goacc/pr94120-1.f90: New. * gfortran.dg/goacc/pr94120-2.f90: New. * gfortran.dg/goacc/pr94120-3.f90: New.
Diffstat (limited to 'gcc/fortran')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/openmp.c12
2 files changed, 17 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index b3ff063..661e4ce 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2020-03-12 Tobias Burnus <tobias@codesourcery.com>
+
+ PR middle-end/94120
+ * openmp.c (gfc_match_oacc_declare): Accept function-result
+ variables; reject variables declared in a different scoping unit.
+
2020-03-08 Paul Thomas <pault@gcc.gnu.org>
PR fortran/93581
diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c
index 35f6b2f..930bca5 100644
--- a/gcc/fortran/openmp.c
+++ b/gcc/fortran/openmp.c
@@ -2155,7 +2155,8 @@ gfc_match_oacc_declare (void)
{
gfc_symbol *s = n->sym;
- if (s->ns->proc_name && s->ns->proc_name->attr.proc == PROC_MODULE)
+ if (gfc_current_ns->proc_name
+ && gfc_current_ns->proc_name->attr.flavor == FL_MODULE)
{
if (n->u.map_op != OMP_MAP_ALLOC && n->u.map_op != OMP_MAP_TO)
{
@@ -2174,6 +2175,15 @@ gfc_match_oacc_declare (void)
return MATCH_ERROR;
}
+ if ((s->result == s && s->ns->contained != gfc_current_ns)
+ || ((s->attr.flavor == FL_UNKNOWN || s->attr.flavor == FL_VARIABLE)
+ && s->ns != gfc_current_ns))
+ {
+ gfc_error ("Variable %qs shall be declared in the same scoping unit "
+ "as !$ACC DECLARE at %L", s->name, &where);
+ return MATCH_ERROR;
+ }
+
if ((s->attr.dimension || s->attr.codimension)
&& s->attr.dummy && s->as->type != AS_EXPLICIT)
{