testsuite/libgomp.c++/pr27337.C

Go to the documentation of this file.
00001 // PR middle-end/27337
00002 // { dg-do run }
00003 
00004 #include <omp.h>
00005 
00006 extern "C" void abort (void);
00007 
00008 struct S
00009 {
00010   S ();
00011   ~S ();
00012   S (const S &);
00013   int i;
00014 };
00015 
00016 int n[3];
00017 
00018 S::S () : i(18)
00019 {
00020   if (omp_get_thread_num () != 0)
00021 #pragma omp atomic
00022     n[0]++;
00023 }
00024 
00025 S::~S ()
00026 {
00027   if (omp_get_thread_num () != 0)
00028 #pragma omp atomic
00029     n[1]++;
00030 }
00031 
00032 S::S (const S &x)
00033 {
00034   if (x.i != 18)
00035     abort ();
00036   i = 118;
00037   if (omp_get_thread_num () != 0)
00038 #pragma omp atomic
00039     n[2]++;
00040 }
00041 
00042 S
00043 foo ()
00044 {
00045   int i;
00046   S ret;
00047 
00048 #pragma omp parallel for firstprivate (ret) lastprivate (ret) \
00049              schedule (static, 1) num_threads (4)
00050   for (i = 0; i < 4; i++)
00051     ret.i += omp_get_thread_num ();
00052 
00053   return ret;
00054 }
00055 
00056 S
00057 bar ()
00058 {
00059   int i;
00060   S ret;
00061 
00062 #pragma omp parallel for num_threads (4)
00063   for (i = 0; i < 4; i++)
00064 #pragma omp atomic
00065     ret.i += omp_get_thread_num () + 1;
00066 
00067   return ret;
00068 }
00069 
00070 S x;
00071 
00072 int
00073 main (void)
00074 {
00075   omp_set_dynamic (false);
00076   x = foo ();
00077   if (n[0] != 0 || n[1] != 3 || n[2] != 3)
00078     abort ();
00079   if (x.i != 118 + 3)
00080     abort ();
00081   x = bar ();
00082   if (n[0] != 0 || n[1] != 3 || n[2] != 3)
00083     abort ();
00084   if (x.i != 18 + 0 + 1 + 2 + 3 + 4)
00085     abort ();
00086   return 0;
00087 }

Generated on Fri Apr 5 05:38:10 2013 for Libgomp by  doxygen 1.4.7