Commit 2b45bf21 by Jakub Jelinek Committed by Jakub Jelinek

re PR fortran/44036 (I can't declare an external function in an OMP shared statement.)

	PR fortran/44036
	* openmp.c (resolve_omp_clauses): Allow procedure pointers in clause
	variable lists.
	* trans-openmp.c (gfc_omp_privatize_by_reference): Don't privatize
	by reference dummy procedures or non-dummy procedure pointers.
	(gfc_omp_predetermined_sharing): Return
	OMP_CLAUSE_DEFAULT_FIRSTPRIVATE for dummy procedures.

	* gfortran.dg/gomp/pr44036-1.f90: New test.
	* gfortran.dg/gomp/pr44036-2.f90: New test.
	* gfortran.dg/gomp/pr44036-3.f90: New test.

From-SVN: r159361
parent 78c7cabb
2010-05-13 Jakub Jelinek <jakub@redhat.com>
PR fortran/44036
* openmp.c (resolve_omp_clauses): Allow procedure pointers in clause
variable lists.
* trans-openmp.c (gfc_omp_privatize_by_reference): Don't privatize
by reference dummy procedures or non-dummy procedure pointers.
(gfc_omp_predetermined_sharing): Return
OMP_CLAUSE_DEFAULT_FIRSTPRIVATE for dummy procedures.
2010-05-11 Daniel Franke <franke.daniel@gmail.com> 2010-05-11 Daniel Franke <franke.daniel@gmail.com>
PR fortran/43711 PR fortran/43711
......
...@@ -837,6 +837,8 @@ resolve_omp_clauses (gfc_code *code) ...@@ -837,6 +837,8 @@ resolve_omp_clauses (gfc_code *code)
if (el) if (el)
continue; continue;
} }
if (n->sym->attr.proc_pointer)
continue;
} }
gfc_error ("Object '%s' is not a variable at %L", n->sym->name, gfc_error ("Object '%s' is not a variable at %L", n->sym->name,
&code->loc); &code->loc);
......
/* OpenMP directive translation -- generate GCC trees from gfc_code. /* OpenMP directive translation -- generate GCC trees from gfc_code.
Copyright (C) 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
Free Software Foundation, Inc.
Contributed by Jakub Jelinek <jakub@redhat.com> Contributed by Jakub Jelinek <jakub@redhat.com>
This file is part of GCC. This file is part of GCC.
...@@ -57,7 +58,8 @@ gfc_omp_privatize_by_reference (const_tree decl) ...@@ -57,7 +58,8 @@ gfc_omp_privatize_by_reference (const_tree decl)
if (GFC_POINTER_TYPE_P (type)) if (GFC_POINTER_TYPE_P (type))
return false; return false;
if (!DECL_ARTIFICIAL (decl)) if (!DECL_ARTIFICIAL (decl)
&& TREE_CODE (TREE_TYPE (type)) != FUNCTION_TYPE)
return true; return true;
/* Some arrays are expanded as DECL_ARTIFICIAL pointers /* Some arrays are expanded as DECL_ARTIFICIAL pointers
...@@ -96,6 +98,15 @@ gfc_omp_predetermined_sharing (tree decl) ...@@ -96,6 +98,15 @@ gfc_omp_predetermined_sharing (tree decl)
== NULL) == NULL)
return OMP_CLAUSE_DEFAULT_SHARED; return OMP_CLAUSE_DEFAULT_SHARED;
/* Dummy procedures aren't considered variables by OpenMP, thus are
disallowed in OpenMP clauses. They are represented as PARM_DECLs
in the middle-end, so return OMP_CLAUSE_DEFAULT_FIRSTPRIVATE here
to avoid complaining about their uses with default(none). */
if (TREE_CODE (decl) == PARM_DECL
&& TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE
&& TREE_CODE (TREE_TYPE (TREE_TYPE (decl))) == FUNCTION_TYPE)
return OMP_CLAUSE_DEFAULT_FIRSTPRIVATE;
/* COMMON and EQUIVALENCE decls are shared. They /* COMMON and EQUIVALENCE decls are shared. They
are only referenced through DECL_VALUE_EXPR of the variables are only referenced through DECL_VALUE_EXPR of the variables
contained in them. If those are privatized, they will not be contained in them. If those are privatized, they will not be
......
2010-05-13 Jakub Jelinek <jakub@redhat.com> 2010-05-13 Jakub Jelinek <jakub@redhat.com>
PR fortran/44036
* gfortran.dg/gomp/pr44036-1.f90: New test.
* gfortran.dg/gomp/pr44036-2.f90: New test.
* gfortran.dg/gomp/pr44036-3.f90: New test.
PR debug/43983 PR debug/43983
* gcc.dg/guality/sra-1.c: New test. * gcc.dg/guality/sra-1.c: New test.
......
! PR fortran/44036
! { dg-do compile }
! { dg-options "-fopenmp" }
subroutine foo(a, b)
integer, external :: a
integer, external, pointer :: b
integer, external :: c
integer, external, pointer :: d
integer :: x
x = 6
!$omp parallel default(none) private (x)
x = a(4)
!$omp end parallel
!$omp parallel default(none) private (x) ! { dg-error "enclosing parallel" }
x = b(5) ! { dg-error "not specified in" "" { target *-*-* } 11 }
!$omp end parallel
!$omp parallel default(none) private (x)
x = c(6)
!$omp end parallel
d => a
!$omp parallel default(none) private (x) ! { dg-error "enclosing parallel" }
x = d(7) ! { dg-error "not specified in" }
!$omp end parallel
end
! PR fortran/44036
! { dg-do compile }
! { dg-options "-fopenmp" }
subroutine foo(a, b)
integer, external :: a
integer, external, pointer :: b
integer, external :: c
integer, external, pointer :: d
integer :: x
d => a
!$omp parallel default(none) private (x) firstprivate (b, d)
x = a(4)
x = b(5)
x = c(6)
x = d(7)
!$omp end parallel
end
! PR fortran/44036
! { dg-do compile }
! { dg-options "-fopenmp" }
subroutine foo(a)
integer, external :: a, c
integer :: x
!$omp parallel default(none) private (x) shared (a) ! { dg-error "is not a variable" }
x = a(6)
!$omp end parallel
!$omp parallel default(none) private (x) shared (c) ! { dg-error "is not a variable" }
x = c(6)
!$omp end parallel
end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment