1  /* { dg-additional-options "-Wno-deprecated-declarations" } */
       2  
       3  #include <omp.h>
       4  #include <stdlib.h>
       5  
       6  int
       7  main ()
       8  {
       9    omp_set_dynamic (0);
      10    omp_set_nested (1);
      11    if (omp_in_parallel ())
      12      abort ();
      13    #pragma omp parallel num_threads (3)
      14      if (omp_get_thread_num () == 2)
      15        {
      16  	if (!omp_in_parallel ())
      17  	  abort ();
      18  	#pragma omp parallel num_threads (3)
      19  	  if (omp_get_thread_num () == 1)
      20  	    {
      21  	      if (!omp_in_parallel ()
      22  		  || omp_get_level () != 2
      23  		  || omp_get_ancestor_thread_num (0) != 0
      24  		  || omp_get_ancestor_thread_num (1) != 2
      25  		  || omp_get_ancestor_thread_num (2) != 1
      26  		  || omp_get_ancestor_thread_num (3) != -1)
      27  		abort ();
      28  	      #pragma omp target if (0)
      29  		{
      30  		  if (omp_in_parallel ()
      31  		      || omp_get_level () != 0
      32  		      || omp_get_ancestor_thread_num (0) != 0
      33  		      || omp_get_ancestor_thread_num (1) != -1)
      34  		    abort ();
      35  		  #pragma omp parallel num_threads (2)
      36  		  {
      37  		    if (!omp_in_parallel ()
      38  			|| omp_get_level () != 1
      39  			|| omp_get_ancestor_thread_num (0) != 0
      40  			|| omp_get_ancestor_thread_num (1)
      41  			   != omp_get_thread_num ()
      42  			|| omp_get_ancestor_thread_num (2) != -1)
      43  		      abort ();
      44  		  }
      45  		}
      46  	      #pragma omp target if (0)
      47  		{
      48  		  #pragma omp teams thread_limit (2)
      49  		    {
      50  		      #pragma omp distribute dist_schedule(static,1)
      51  		      for (int i = 0; i < 1; ++i)
      52  			if (omp_in_parallel ()
      53  			    || omp_get_level () != 0
      54  			    || omp_get_ancestor_thread_num (0) != 0
      55  			    || omp_get_ancestor_thread_num (1) != -1)
      56  			  abort ();
      57  		      #pragma omp parallel num_threads (2)
      58  		      {
      59  			if (!omp_in_parallel ()
      60  			    || omp_get_level () != 1
      61  			    || omp_get_ancestor_thread_num (0) != 0
      62  			    || omp_get_ancestor_thread_num (1)
      63  			       != omp_get_thread_num ()
      64  			    || omp_get_ancestor_thread_num (2) != -1)
      65  			  abort ();
      66  		      }
      67  		    }
      68  		}
      69  	    }
      70        }
      71    return 0;
      72  }