diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b530d25614a20c85b91f76465eefdf5dde5e03de..ed541f12220cc13fd899642a46fca916fcbc4ac5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2008-12-08  Jakub Jelinek  <jakub@redhat.com>
+
+	PR middle-end/36802
+	* omp-low.c (use_pointer_for_field): Only call maybe_lookup_decl
+	on parallel and task contexts.
+
 2008-12-07  Eric Botcazou  <ebotcazou@adacore.com>
 
 	* gimple.c (recalculate_side_effects) <tcc_constant>: New case.
diff --git a/gcc/omp-low.c b/gcc/omp-low.c
index 8781418bd82007df4efb6cb9525c1fb2eaab047f..b7885e6cf3c12a841fda77a1003278a0214a90ad 100644
--- a/gcc/omp-low.c
+++ b/gcc/omp-low.c
@@ -760,10 +760,10 @@ use_pointer_for_field (tree decl, omp_context *shared_ctx)
 	  omp_context *up;
 
 	  for (up = shared_ctx->outer; up; up = up->outer)
-	    if (maybe_lookup_decl (decl, up))
+	    if (is_taskreg_ctx (up) && maybe_lookup_decl (decl, up))
 	      break;
 
-	  if (up && is_taskreg_ctx (up))
+	  if (up)
 	    {
 	      tree c;
 
diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog
index 46536c8838176009e5770c867032118cb629fef6..98a307314a9c0a52749ed7e1b0bfbca1a9dfc0d6 100644
--- a/libgomp/ChangeLog
+++ b/libgomp/ChangeLog
@@ -1,3 +1,10 @@
+2008-12-08  Jakub Jelinek  <jakub@redhat.com>
+
+	PR middle-end/36802
+	* testsuite/libgomp.c/pr36802-1.c: New test.
+	* testsuite/libgomp.c/pr36802-2.c: New test.
+	* testsuite/libgomp.c/pr36802-3.c: New test.
+
 2008-12-01  Janis Johnson  <janis187@us.ibm.com>
 
 	PR libgomp/38270
diff --git a/libgomp/testsuite/libgomp.c/pr36802-1.c b/libgomp/testsuite/libgomp.c/pr36802-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..4ed5e12769b14980c171c5ccf874f4350ea7ec5a
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c/pr36802-1.c
@@ -0,0 +1,34 @@
+/* PR middle-end/36802 */
+
+extern void abort (void);
+
+int
+foo (int k)
+{
+  int i = 0;
+#pragma omp parallel
+  #pragma omp single
+    {
+      if (!k)
+	{
+	  int j;
+	  for (j = 0; j < 10; j++)
+	  #pragma omp task
+	    if (j == 4)  
+	      i++;
+	}
+      else
+	i++;
+    }
+  return i;
+}
+
+int
+main (void)
+{
+  if (foo (0) != 1)
+    abort ();
+  if (foo (1) != 1)
+    abort ();
+  return 0;
+}
diff --git a/libgomp/testsuite/libgomp.c/pr36802-2.c b/libgomp/testsuite/libgomp.c/pr36802-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..06e792f0f14da3ec63ba37d91338f9cc8bc80d62
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c/pr36802-2.c
@@ -0,0 +1,46 @@
+/* PR middle-end/36802 */
+
+extern void abort (void);
+
+int q;
+
+int
+foo (int k)
+{
+  int i = 6, n = 0;
+  omp_set_dynamic (0);
+  omp_set_nested (1);
+#pragma omp parallel shared (i) num_threads (3)
+  {
+    int l;
+
+    if (omp_get_num_threads () != 3)
+    #pragma omp atomic
+      n += 1;
+    else
+    #pragma omp for
+      for (l = 0; l < 3; l++)
+	if (k)
+	#pragma omp atomic
+	  q += i;
+	else
+	#pragma omp parallel shared (i) num_threads (4)
+	  {
+	    if (omp_get_num_threads () != 4)
+	    #pragma omp atomic
+	      n += 1;
+	    #pragma omp critical
+	      i += 1;
+	  }
+  }
+  if (n == 0 && i != 6 + 3 * 4)
+    abort ();
+  return 0;
+}
+
+int
+main (void)
+{
+  foo (0);
+  return 0;
+}
diff --git a/libgomp/testsuite/libgomp.c/pr36802-3.c b/libgomp/testsuite/libgomp.c/pr36802-3.c
new file mode 100644
index 0000000000000000000000000000000000000000..f11baa09f57c791950e564baad387520e13d6f64
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c/pr36802-3.c
@@ -0,0 +1,46 @@
+/* PR middle-end/36802 */
+
+extern void abort (void);
+
+int q;
+
+int
+foo (int k)
+{
+  int i = 6, n = 0;
+  omp_set_dynamic (0);
+  omp_set_nested (1);
+#pragma omp parallel shared (i) num_threads (3)
+  {
+    int l;
+
+    if (omp_get_num_threads () != 3)
+    #pragma omp atomic
+      n += 1;
+    else
+    #pragma omp for
+      for (l = 0; l < 3; l++)
+	if (!k)
+	#pragma omp parallel shared (i) num_threads (4)
+	  {
+	    if (omp_get_num_threads () != 4)
+	    #pragma omp atomic
+	      n += 1;
+	    #pragma omp critical
+	      i += 1;
+	  }
+	else
+	#pragma omp atomic
+	  q += i;
+  }
+  if (n == 0 && i != 6 + 3 * 4)
+    abort ();
+  return 0;
+}
+
+int
+main (void)
+{
+  foo (0);
+  return 0;
+}