]> oss.titaniummirror.com Git - msp430-gcc.git/blobdiff - libgomp/testsuite/libgomp.c++/pr30703.C
Imported gcc-4.4.3
[msp430-gcc.git] / libgomp / testsuite / libgomp.c++ / pr30703.C
diff --git a/libgomp/testsuite/libgomp.c++/pr30703.C b/libgomp/testsuite/libgomp.c++/pr30703.C
new file mode 100644 (file)
index 0000000..d48efd9
--- /dev/null
@@ -0,0 +1,73 @@
+// PR c++/30703
+// { dg-do run }
+
+#include <omp.h>
+
+extern "C" void abort ();
+
+int ctor, cctor, dtor;
+
+struct A
+{
+  A();
+  A(const A &);
+  ~A();
+  int i;
+};
+
+A::A()
+{
+#pragma omp atomic
+  ctor++;
+}
+
+A::A(const A &r)
+{
+  i = r.i;
+#pragma omp atomic
+  cctor++;
+}
+
+A::~A()
+{
+#pragma omp atomic
+  dtor++;
+}
+
+void
+foo (A a, A b)
+{
+  int i, j = 0;
+#pragma omp parallel for firstprivate (a) lastprivate (a) private (b) schedule (static, 1) num_threads (5)
+  for (i = 0; i < 5; i++)
+    {
+      b.i = 5;
+      if (a.i != 6)
+       #pragma omp atomic
+         j += 1;
+      a.i = b.i + i + 6;
+    }
+
+  if (j || a.i != 15)
+    abort ();
+}
+
+void
+bar ()
+{
+  A a, b;
+  a.i = 6;
+  b.i = 7;
+  foo (a, b);
+}
+
+int
+main ()
+{
+  omp_set_dynamic (false);
+  if (ctor || cctor || dtor)
+    abort ();
+  bar ();
+  if (ctor + cctor != dtor)
+    abort ();
+}