/* This testcase violates the OpenMP requirements, as nested functions
|
/* This testcase violates the OpenMP requirements, as nested functions
|
access the original variables.
|
access the original variables.
|
We test it just to make sure we don't ICE on it. */
|
We test it just to make sure we don't ICE on it. */
|
/* { dg-do compile } */
|
/* { dg-do compile } */
|
/* { dg-options "-O2 -fopenmp" } */
|
/* { dg-options "-O2 -fopenmp" } */
|
|
|
extern void abort (void);
|
extern void abort (void);
|
extern int omp_get_thread_num ();
|
extern int omp_get_thread_num ();
|
extern void omp_set_dynamic (int);
|
extern void omp_set_dynamic (int);
|
|
|
int
|
int
|
main (void)
|
main (void)
|
{
|
{
|
int j = 0, k = 6, l = 7, m = 8;
|
int j = 0, k = 6, l = 7, m = 8;
|
void foo (void)
|
void foo (void)
|
{
|
{
|
int i = 5;
|
int i = 5;
|
int bar (void)
|
int bar (void)
|
{
|
{
|
return i + 1 + (j > 100 ? 10000 : 0);
|
return i + 1 + (j > 100 ? 10000 : 0);
|
}
|
}
|
#pragma omp sections private (i)
|
#pragma omp sections private (i)
|
{
|
{
|
#pragma omp section
|
#pragma omp section
|
{
|
{
|
i = 6;
|
i = 6;
|
if (bar () != 6)
|
if (bar () != 6)
|
#pragma omp atomic
|
#pragma omp atomic
|
++j;
|
++j;
|
}
|
}
|
#pragma omp section
|
#pragma omp section
|
{
|
{
|
if (bar () != 6)
|
if (bar () != 6)
|
#pragma omp atomic
|
#pragma omp atomic
|
++j;
|
++j;
|
}
|
}
|
}
|
}
|
if (k != 6 || l != 7 || m != 8)
|
if (k != 6 || l != 7 || m != 8)
|
#pragma omp atomic
|
#pragma omp atomic
|
++j;
|
++j;
|
}
|
}
|
omp_set_dynamic (0);
|
omp_set_dynamic (0);
|
#pragma omp parallel num_threads (2) firstprivate (k) shared (l) private (m)
|
#pragma omp parallel num_threads (2) firstprivate (k) shared (l) private (m)
|
{
|
{
|
if (omp_get_thread_num () != 0)
|
if (omp_get_thread_num () != 0)
|
k += omp_get_thread_num ();
|
k += omp_get_thread_num ();
|
m = 9;
|
m = 9;
|
foo ();
|
foo ();
|
}
|
}
|
if (j)
|
if (j)
|
abort ();
|
abort ();
|
return 0;
|
return 0;
|
}
|
}
|
|
|