gcc/libgomp/testsuite/libgomp.c/pr61200.c
Jakub Jelinek 5771c3915b re PR libgomp/61200 (internal compiler error: Segmentation fault, assert & openmp)
PR libgomp/61200
	* omp-low.c (taskreg_contexts): New variable.
	(scan_omp_parallel): Push newly created context into taskreg_contexts
	vector and move record layout code to finish_taskreg_scan.
	(scan_omp_task): Likewise.
	(finish_taskreg_scan): New function.
	(execute_lower_omp): Call finish_taskreg_scan on all taskreg_contexts
	vector elements and release it.

	* c-c++-common/gomp/pr61200.c: New test.

	* testsuite/libgomp.c/pr61200.c: New test.

From-SVN: r215835
2014-10-03 09:29:42 +02:00

88 lines
1.0 KiB
C

/* PR libgomp/61200 */
/* { dg-do run } */
#include <omp.h>
#include <stdlib.h>
#include <unistd.h>
volatile int x;
void
foo ()
{
int var = 1;
int i;
for (i = 0; i < 2; i++)
{
if (i == 1)
{
#pragma omp parallel num_threads(2)
if (x)
var++;
else
{
#pragma omp single
sleep (2);
}
}
else
{
#pragma omp task shared(var)
{
sleep (1);
var = 2;
}
}
}
#pragma omp taskwait
if (var != 2)
abort ();
}
void
bar ()
{
int var = 1;
int i;
for (i = 0; i < 2; i++)
{
if (i == 0)
{
#pragma omp task shared(var)
{
sleep (1);
var = 2;
}
}
else
{
#pragma omp parallel num_threads(2)
if (x)
var++;
else
{
#pragma omp single
sleep (2);
}
}
}
#pragma omp taskwait
if (var != 2)
abort ();
}
int
main ()
{
omp_set_nested (1);
#pragma omp parallel num_threads(2)
#pragma omp single
foo ();
#pragma omp parallel num_threads(2)
#pragma omp single
bar ();
return 0;
}