]> oss.titaniummirror.com Git - msp430-gcc.git/blobdiff - libgomp/testsuite/libgomp.c++/pr27337.C
Imported gcc-4.4.3
[msp430-gcc.git] / libgomp / testsuite / libgomp.c++ / pr27337.C
diff --git a/libgomp/testsuite/libgomp.c++/pr27337.C b/libgomp/testsuite/libgomp.c++/pr27337.C
new file mode 100644 (file)
index 0000000..6db2465
--- /dev/null
@@ -0,0 +1,87 @@
+// PR middle-end/27337
+// { dg-do run }
+
+#include <omp.h>
+
+extern "C" void abort (void);
+
+struct S
+{
+  S ();
+  ~S ();
+  S (const S &);
+  int i;
+};
+
+int n[3];
+
+S::S () : i(18)
+{
+  if (omp_get_thread_num () != 0)
+#pragma omp atomic
+    n[0]++;
+}
+
+S::~S ()
+{
+  if (omp_get_thread_num () != 0)
+#pragma omp atomic
+    n[1]++;
+}
+
+S::S (const S &x)
+{
+  if (x.i != 18)
+    abort ();
+  i = 118;
+  if (omp_get_thread_num () != 0)
+#pragma omp atomic
+    n[2]++;
+}
+
+S
+foo ()
+{
+  int i;
+  S ret;
+
+#pragma omp parallel for firstprivate (ret) lastprivate (ret) \
+                        schedule (static, 1) num_threads (4)
+  for (i = 0; i < 4; i++)
+    ret.i += omp_get_thread_num ();
+
+  return ret;
+}
+
+S
+bar ()
+{
+  int i;
+  S ret;
+
+#pragma omp parallel for num_threads (4)
+  for (i = 0; i < 4; i++)
+#pragma omp atomic
+    ret.i += omp_get_thread_num () + 1;
+
+  return ret;
+}
+
+S x;
+
+int
+main (void)
+{
+  omp_set_dynamic (false);
+  x = foo ();
+  if (n[0] != 0 || n[1] != 3 || n[2] != 3)
+    abort ();
+  if (x.i != 118 + 3)
+    abort ();
+  x = bar ();
+  if (n[0] != 0 || n[1] != 3 || n[2] != 3)
+    abort ();
+  if (x.i != 18 + 0 + 1 + 2 + 3 + 4)
+    abort ();
+  return 0;
+}