1  /* { dg-additional-options "-Wno-deprecated-declarations" } */
       2  
       3  #include <omp.h>
       4  #include <stdlib.h>
       5  #include <string.h>
       6  
       7  int
       8  main (void)
       9  {
      10    int e[3];
      11  
      12    memset (e, '\0', sizeof (e));
      13    omp_set_nested (1);
      14    omp_set_dynamic (0);
      15    if (omp_in_parallel ()
      16        || omp_get_level () != 0
      17        || omp_get_ancestor_thread_num (0) != 0
      18        || omp_get_ancestor_thread_num (-1) != -1
      19        || omp_get_ancestor_thread_num (1) != -1
      20        || omp_get_team_size (0) != 1
      21        || omp_get_team_size (-1) != -1
      22        || omp_get_team_size (1) != -1
      23        || omp_get_active_level () != 0)
      24      abort ();
      25  #pragma omp parallel num_threads (4)
      26    {
      27      int tn1 = omp_get_thread_num ();
      28      if (omp_in_parallel () != 1
      29  	|| omp_get_num_threads () != 4
      30  	|| tn1 >= 4 || tn1 < 0
      31  	|| omp_get_level () != 1
      32  	|| omp_get_ancestor_thread_num (0) != 0
      33  	|| omp_get_ancestor_thread_num (1) != tn1
      34  	|| omp_get_ancestor_thread_num (-1) != -1
      35  	|| omp_get_ancestor_thread_num (2) != -1
      36  	|| omp_get_team_size (0) != 1
      37  	|| omp_get_team_size (1) != omp_get_num_threads ()
      38  	|| omp_get_team_size (-1) != -1
      39  	|| omp_get_team_size (2) != -1
      40  	|| omp_get_active_level () != 1)
      41        #pragma omp atomic
      42  	e[0] += 1;
      43      #pragma omp parallel if (0) num_threads(5) firstprivate(tn1)
      44      {
      45        int tn2 = omp_get_thread_num ();
      46        if (omp_in_parallel () != 1
      47  	  || omp_get_num_threads () != 1
      48  	  || tn2 != 0
      49  	  || omp_get_level () != 2
      50  	  || omp_get_ancestor_thread_num (0) != 0
      51  	  || omp_get_ancestor_thread_num (1) != tn1
      52  	  || omp_get_ancestor_thread_num (2) != tn2
      53  	  || omp_get_ancestor_thread_num (-1) != -1
      54  	  || omp_get_ancestor_thread_num (3) != -1
      55  	  || omp_get_team_size (0) != 1
      56  	  || omp_get_team_size (1) != 4
      57  	  || omp_get_team_size (2) != 1
      58  	  || omp_get_team_size (-1) != -1
      59  	  || omp_get_team_size (3) != -1
      60  	  || omp_get_active_level () != 1)
      61  	#pragma omp atomic
      62  	  e[1] += 1;
      63        #pragma omp parallel num_threads(2) firstprivate(tn1, tn2)
      64        {
      65  	int tn3 = omp_get_thread_num ();
      66  	if (omp_in_parallel () != 1
      67  	    || omp_get_num_threads () != 2
      68  	    || tn3 > 1 || tn3 < 0
      69  	    || omp_get_level () != 3
      70  	    || omp_get_ancestor_thread_num (0) != 0
      71  	    || omp_get_ancestor_thread_num (1) != tn1
      72  	    || omp_get_ancestor_thread_num (2) != tn2
      73  	    || omp_get_ancestor_thread_num (3) != tn3
      74  	    || omp_get_ancestor_thread_num (-1) != -1
      75  	    || omp_get_ancestor_thread_num (4) != -1
      76  	    || omp_get_team_size (0) != 1
      77  	    || omp_get_team_size (1) != 4
      78  	    || omp_get_team_size (2) != 1
      79  	    || omp_get_team_size (3) != 2
      80  	    || omp_get_team_size (-1) != -1
      81  	    || omp_get_team_size (4) != -1
      82  	    || omp_get_active_level () != 2)
      83  	  #pragma omp atomic
      84  	    e[2] += 1;
      85        }
      86      }
      87    }
      88    if (e[0] || e[1] || e[2])
      89      abort ();
      90    return 0;
      91  }