OpenACC declare is implemented somewhat special in the Fortran FE in that it preforms its own data clause error handling. As PR85701 demonstrated, one situation that lacked test coverage was passing in function and subroutine identifiers as data clause arguments to acc declare. This patch rectifies that issue by checking for the function and subroutine symbol attribute and issuing an error when it detects such a symbol. The Fortran FE also has attributes for other types of functions, but gfc_match_omp_variable_list already handle those. However, as GCC gains support for derived-type objects, this may have to be revisited.
I tested this patch on x86_64 with nvptx offloading. Is it OK for trunk and the stable branches? Thanks, Cesar
2018-06-05 Cesar Philippidis <ce...@codesourcery.com> PR fortran/85701 gcc/fortran/ * openmp.c (gfc_resolve_oacc_declare): Error on functions and subroutine data clause arguments. gcc/testsuite/ * gfortran.dg/goacc/pr85701.f90: New test. diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c index be80f8dea24..5c13312585a 100644 --- a/gcc/fortran/openmp.c +++ b/gcc/fortran/openmp.c @@ -5994,6 +5994,12 @@ gfc_resolve_oacc_declare (gfc_namespace *ns) for (n = oc->clauses->lists[list]; n; n = n->next) { n->sym->mark = 0; + if (n->sym->attr.function || n->sym->attr.subroutine) + { + gfc_error ("Object %qs is not a variable at %L", + n->sym->name, &oc->loc); + continue; + } if (n->sym->attr.flavor == FL_PARAMETER) { gfc_error ("PARAMETER object %qs is not allowed at %L", diff --git a/gcc/testsuite/gfortran.dg/goacc/pr85701.f90 b/gcc/testsuite/gfortran.dg/goacc/pr85701.f90 new file mode 100644 index 00000000000..9c201b865b2 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/goacc/pr85701.f90 @@ -0,0 +1,23 @@ +! PR fortran/85701 +! { dg-do compile } + +subroutine s1 + !$acc declare copy(s1) ! { dg-error "is not a variable" } +end + +subroutine s2 + !$acc declare present(s2) ! { dg-error "is not a variable" } +end + +function f1 () + !$acc declare copy(f1) ! { dg-error "is not a variable" } +end + +function f2 () + !$acc declare present(f2) ! { dg-error "is not a variable" } +end + +program p + !$acc declare copy(p) ! { dg-error "is not a variable" } +end +