diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog
index 171b5c7f177c..7ce0cdb42e14 100644
--- a/libgomp/ChangeLog
+++ b/libgomp/ChangeLog
@@ -1,3 +1,13 @@
+2018-12-08  Jakub Jelinek  <jakub@redhat.com>
+
+	PR libgomp/87995
+	* testsuite/libgomp.c-c++-common/cancel-taskgroup-3.c: Require
+	tls_runtime effective target.
+	(t): New threadprivate variable.
+	(main): Set t in threads which execute iterations of the worksharing
+	loop.  Propagate that to the task after the loop and don't abort
+	if the current taskgroup hasn't been cancelled.
+
 2018-12-02  Jakub Jelinek  <jakub@redhat.com>
 
 	* testsuite/libgomp.c/task-reduction-3.c: New test.
diff --git a/libgomp/testsuite/libgomp.c-c++-common/cancel-taskgroup-3.c b/libgomp/testsuite/libgomp.c-c++-common/cancel-taskgroup-3.c
index b9af83595b0e..9e07cc10b656 100644
--- a/libgomp/testsuite/libgomp.c-c++-common/cancel-taskgroup-3.c
+++ b/libgomp/testsuite/libgomp.c-c++-common/cancel-taskgroup-3.c
@@ -1,9 +1,12 @@
-/* { dg-do run } */
+/* { dg-do run { target tls_runtime } } */
 /* { dg-set-target-env-var OMP_CANCELLATION "true" } */
 
 #include <stdlib.h>
 #include <omp.h>
 
+int t;
+#pragma omp threadprivate (t)
+
 int
 main ()
 {
@@ -42,11 +45,12 @@ main ()
   #pragma omp parallel
   #pragma omp taskgroup
   {
-    #pragma omp taskwait
+    int p;
     #pragma omp for reduction (task, +: a)
     for (i = 0; i < 64; ++i)
       {
 	a++;
+	t = 1;
 	#pragma omp task in_reduction (+: a)
 	{
 	  volatile int zero = 0;
@@ -58,9 +62,10 @@ main ()
       }
     if (a != 64)
       abort ();
-    #pragma omp task
+    p = t;
+    #pragma omp task firstprivate (p)
     {
-      if (omp_get_cancellation ())
+      if (p && omp_get_cancellation ())
 	abort ();
     }
   }