1  /* { dg-do run } */
       2  
       3  #include <omp.h>
       4  #include <stdlib.h>
       5  
       6  int serr;
       7  
       8  int
       9  main ()
      10  {
      11    int e;
      12  #pragma omp parallel shared(serr)
      13    {
      14      if (omp_in_final ())
      15        #pragma omp atomic write
      16  	serr = 1;
      17      #pragma omp task if (0) shared(serr)
      18        {
      19  	if (omp_in_final ())
      20  	  #pragma omp atomic write
      21  	    serr = 1;
      22  	#pragma omp task if (0) shared(serr)
      23  	  if (omp_in_final ())
      24  	    #pragma omp atomic write
      25  	      serr = 1;
      26        }
      27      #pragma omp task final (1) shared(serr)
      28        {
      29  	if (!omp_in_final ())
      30  	  #pragma omp atomic write
      31  	    serr = 1;
      32  	#pragma omp taskyield
      33  	#pragma omp taskwait
      34  	#pragma omp task shared(serr)
      35  	  if (!omp_in_final ())
      36  	    #pragma omp atomic write
      37  	      serr = 1;
      38        }
      39    }
      40    #pragma omp atomic read
      41      e = serr;
      42    if (e)
      43      abort ();
      44    return 0;
      45  }