From 310e44721056e49ef306847d4dc128cd9b736077 Mon Sep 17 00:00:00 2001
From: Jakub Jelinek <jakub@redhat.com>
Date: Mon, 19 Apr 2010 23:51:28 +0200
Subject: [PATCH] re PR fortran/43339 (Incorrect output for pgm checking data
 sharing attributes)

	PR fortran/43339
	* openmp.c (gfc_resolve_do_iterator): Only make iteration vars for
	sequential loops private in the innermost containing task region.

	* gfortran.dg/gomp/sharing-2.f90: Adjust for iteration vars
	of sequential loops being private only in the innermost containing
	task region.

From-SVN: r158528
---
 gcc/fortran/ChangeLog                        |  6 ++++
 gcc/fortran/openmp.c                         | 29 ++++++++++----------
 gcc/testsuite/ChangeLog                      |  5 ++++
 gcc/testsuite/gfortran.dg/gomp/sharing-2.f90 | 12 ++++----
 4 files changed, 31 insertions(+), 21 deletions(-)

diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 61297f9f12c4..b9a4ebbcbd0e 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2010-04-19  Jakub Jelinek  <jakub@redhat.com>
+
+	PR fortran/43339
+	* openmp.c (gfc_resolve_do_iterator): Only make iteration vars for
+	sequential loops private in the innermost containing task region.
+
 2010-04-18  Eric Botcazou  <ebotcazou@adacore.com>
 
 	* f95-lang.c (gfc_init_decl_processing): Remove second argument in call
diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c
index d60121c59291..c00e1b41e28c 100644
--- a/gcc/fortran/openmp.c
+++ b/gcc/fortran/openmp.c
@@ -1,5 +1,5 @@
 /* OpenMP directive matching and resolving.
-   Copyright (C) 2005, 2006, 2007, 2008
+   Copyright (C) 2005, 2006, 2007, 2008, 2010
    Free Software Foundation, Inc.
    Contributed by Jakub Jelinek
 
@@ -1367,7 +1367,6 @@ gfc_resolve_omp_parallel_blocks (gfc_code *code, gfc_namespace *ns)
 void
 gfc_resolve_do_iterator (gfc_code *code, gfc_symbol *sym)
 {
-  struct omp_context *ctx;
   int i = omp_current_do_collapse;
   gfc_code *c = omp_current_do_code;
 
@@ -1386,21 +1385,21 @@ gfc_resolve_do_iterator (gfc_code *code, gfc_symbol *sym)
       c = c->block->next;
     }
 
-  for (ctx = omp_current_ctx; ctx; ctx = ctx->previous)
-    {
-      if (pointer_set_contains (ctx->sharing_clauses, sym))
-	continue;
+  if (omp_current_ctx == NULL)
+    return;
 
-      if (! pointer_set_insert (ctx->private_iterators, sym))
-	{
-	  gfc_omp_clauses *omp_clauses = ctx->code->ext.omp_clauses;
-	  gfc_namelist *p;
+  if (pointer_set_contains (omp_current_ctx->sharing_clauses, sym))
+    return;
 
-	  p = gfc_get_namelist ();
-	  p->sym = sym;
-	  p->next = omp_clauses->lists[OMP_LIST_PRIVATE];
-	  omp_clauses->lists[OMP_LIST_PRIVATE] = p;
-	}
+  if (! pointer_set_insert (omp_current_ctx->private_iterators, sym))
+    {
+      gfc_omp_clauses *omp_clauses = omp_current_ctx->code->ext.omp_clauses;
+      gfc_namelist *p;
+
+      p = gfc_get_namelist ();
+      p->sym = sym;
+      p->next = omp_clauses->lists[OMP_LIST_PRIVATE];
+      omp_clauses->lists[OMP_LIST_PRIVATE] = p;
     }
 }
 
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d29867544e43..dbde6351fac0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
 2010-04-19  Jakub Jelinek  <jakub@redhat.com>
 
+	PR fortran/43339
+	* gfortran.dg/gomp/sharing-2.f90: Adjust for iteration vars
+	of sequential loops being private only in the innermost containing
+	task region.
+
 	PR middle-end/43337
 	* gfortran.dg/gomp/pr43337.f90: New test.
 
diff --git a/gcc/testsuite/gfortran.dg/gomp/sharing-2.f90 b/gcc/testsuite/gfortran.dg/gomp/sharing-2.f90
index aede06c9c0ff..b7d7e0729754 100644
--- a/gcc/testsuite/gfortran.dg/gomp/sharing-2.f90
+++ b/gcc/testsuite/gfortran.dg/gomp/sharing-2.f90
@@ -28,10 +28,10 @@
   end do
 !$omp end single
 !$omp end parallel
-!$omp parallel default (none) shared (a)
-  i = 1
-  j = 1
-  k = 1
+!$omp parallel default (none) shared (a) ! { dg-error "enclosing parallel" }
+  i = 1		! { dg-error "not specified in" }
+  j = 1		! { dg-error "not specified in" }
+  k = 1		! { dg-error "not specified in" }
 !$omp parallel default (none) shared (a)
   i = 1
   j = 1
@@ -68,8 +68,8 @@
     a(i, 1) = i + 1
   end do
 !$omp end parallel
-!$omp parallel default (none) shared (a)
-  i = 1
+!$omp parallel default (none) shared (a) ! { dg-error "enclosing parallel" }
+  i = 1		! { dg-error "not specified in" }
 !$omp parallel default (none) shared (a, i)
   i = 2
 !$omp parallel default (none) shared (a)
-- 
GitLab