diff options
author | Tobias Burnus <tobias@codesourcery.com> | 2020-03-12 10:57:56 +0100 |
---|---|---|
committer | Tobias Burnus <tobias@codesourcery.com> | 2020-03-12 10:57:56 +0100 |
commit | 98aeb1ef510204bf90e94b6cc85e5ba68df93d00 (patch) | |
tree | f675ed9667ba2f57a66de5d29906bc84fe26a6d7 /gcc/fortran | |
parent | b73f69020f08208d2d969fcf8879bd294a6e3596 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/openmp.c | 12 |
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) { |