gcc/libgomp/testsuite/libgomp.c++/pr69555-1.C
Jakub Jelinek da3d46cba8 re PR libgomp/69555 (libgomp.c++/target-6.C fails because of undefined behaviour)
PR libgomp/69555
	* gimplify.c (gimplify_decl_expr): For decls with REFERENCE_TYPE, also
	gimplify_type_sizes the type they refer to.
	(omp_notice_variable): Handle reference vars to VLAs.
	* omp-low.c (lower_omp_target): Emit setup of OMP_CLAUSE_PRIVATE reference
	to VLA decls in the second pass instead of first pass.

	* testsuite/libgomp.c++/pr69555-1.C: New test.
	* testsuite/libgomp.c++/pr69555-2.C: New test.

From-SVN: r233913
2016-03-02 20:16:14 +01:00

115 lines
2.1 KiB
C

// PR libgomp/69555
// { dg-do run }
#include <omp.h>
__attribute__((noinline, noclone)) void
f1 (int y)
{
int a[y - 2];
int (&c)[y - 2] = a;
c[0] = 111;
int e = 0;
#pragma omp parallel private (c) num_threads (4) reduction (+:e)
{
int v = omp_get_thread_num ();
for (int i = 0; i < y - 2; i++)
c[i] = i + v;
#pragma omp barrier
for (int i = 0; i < y - 2; i++)
if (c[i] != i + v)
e++;
}
if (c[0] != 111 || e)
__builtin_abort ();
}
__attribute__((noinline, noclone)) void
f2 (int y)
{
int a[y - 2];
int (&c)[y - 2] = a;
c[0] = 111;
#pragma omp task private (c)
{
int v = omp_get_thread_num ();
for (int i = 0; i < y - 2; i++)
c[i] = i + v;
asm volatile ("" : : "r" (&c[0]) : "memory");
for (int i = 0; i < y - 2; i++)
if (c[i] != i + v)
__builtin_abort ();
}
if (c[0] != 111)
__builtin_abort ();
}
__attribute__((noinline, noclone)) void
f3 (int y)
{
int a[y - 2];
int (&c)[y - 2] = a;
for (int i = 0; i < y - 2; i++)
c[i] = i + 4;
#pragma omp parallel firstprivate (c) num_threads (4)
{
int v = omp_get_thread_num ();
for (int i = 0; i < y - 2; i++)
{
if (c[i] != i + 4)
__builtin_abort ();
c[i] = i + v;
}
#pragma omp barrier
for (int i = 0; i < y - 2; i++)
if (c[i] != i + v)
__builtin_abort ();
}
for (int i = 0; i < y - 2; i++)
if (c[i] != i + 4)
__builtin_abort ();
}
__attribute__((noinline, noclone)) void
f4 (int y)
{
int a[y - 2];
int (&c)[y - 2] = a;
for (int i = 0; i < y - 2; i++)
c[i] = i + 4;
#pragma omp task firstprivate (c)
{
int v = omp_get_thread_num ();
for (int i = 0; i < y - 2; i++)
{
if (c[i] != i + 4)
__builtin_abort ();
c[i] = i + v;
}
asm volatile ("" : : "r" (&c[0]) : "memory");
for (int i = 0; i < y - 2; i++)
if (c[i] != i + v)
__builtin_abort ();
}
for (int i = 0; i < y - 2; i++)
if (c[i] != i + 4)
__builtin_abort ();
}
int
main ()
{
f1 (6);
f3 (6);
#pragma omp parallel num_threads (4)
{
f2 (6);
f4 (6);
}
return 0;
}