1/* PR libgomp/32468 */
2/* { dg-do compile } */
3/* { dg-options "-O2 -fopenmp -fdump-tree-ompexp" } */
4
5extern int printf (const char *, ...);
6extern int omp_get_thread_num (void), omp_get_num_threads (void);
7extern int bar (void);
8extern int baz (const char *, ...);
9
10void
11f1 (void)
12{
13#pragma omp parallel
14  {
15    baz ("%d/%d\n", omp_get_thread_num (), omp_get_num_threads ());
16    #pragma omp sections
17      {
18	#pragma omp section
19	printf ("section1 %d/%d\n", omp_get_thread_num (), omp_get_num_threads ());
20	#pragma omp section
21	printf ("section2 %d/%d\n", omp_get_thread_num (), omp_get_num_threads ());
22      }
23  }
24}
25
26void
27f2 (void)
28{
29#pragma omp parallel
30  {
31    #pragma omp sections
32      {
33	#pragma omp section
34	printf ("section1 %d/%d\n", omp_get_thread_num (), omp_get_num_threads ());
35	#pragma omp section
36	printf ("section2 %d/%d\n", omp_get_thread_num (), omp_get_num_threads ());
37      }
38    baz ("%d/%d\n", omp_get_thread_num (), omp_get_num_threads ());
39  }
40}
41
42void
43f3 (void)
44{
45#pragma omp parallel
46  {
47    int bb = bar ();
48    #pragma omp sections
49      {
50	#pragma omp section
51	printf ("section1 %d/%d\n", omp_get_thread_num (), omp_get_num_threads ());
52	#pragma omp section
53	printf ("section2 %d/%d\n", omp_get_thread_num (), omp_get_num_threads ());
54      }
55  }
56}
57
58void
59f4 (void)
60{
61  int i;
62#pragma omp parallel
63  {
64    baz ("%d/%d\n", omp_get_thread_num (), omp_get_num_threads ());
65    #pragma omp for schedule (dynamic, 15)
66    for (i = 0; i < 10000; i++)
67      printf ("section1 %d/%d\n", omp_get_thread_num (), omp_get_num_threads ());
68  }
69}
70
71void
72f5 (void)
73{
74  int i;
75#pragma omp parallel
76  {
77    #pragma omp for schedule (dynamic, 15)
78    for (i = 0; i < 10000; i++)
79      printf ("section1 %d/%d\n", omp_get_thread_num (), omp_get_num_threads ());
80    baz ("%d/%d\n", omp_get_thread_num (), omp_get_num_threads ());
81  }
82}
83
84void
85f6 (void)
86{
87  int i;
88#pragma omp parallel
89  {
90    int bb = bar ();
91    #pragma omp for schedule (runtime)
92    for (i = 0; i < 10000; i++)
93      printf ("section1 %d/%d\n", omp_get_thread_num (), omp_get_num_threads ());
94  }
95}
96
97/* There should not be a GOMP_parallel_{loop,sections}* call.  */
98/* { dg-final { scan-tree-dump-times "GOMP_parallel_loop" 0 "ompexp"} } */
99/* { dg-final { scan-tree-dump-times "GOMP_parallel_sections" 0 "ompexp"} } */
100/* { dg-final { cleanup-tree-dump "ompexp" } } */
101