File: udr-6.C

package info (click to toggle)
gcc-avr 1%3A5.4.0%2BAtmel3.6.1-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 589,832 kB
  • sloc: ansic: 2,775,567; ada: 756,757; cpp: 723,977; f90: 117,673; asm: 66,896; makefile: 62,755; xml: 44,466; sh: 29,549; exp: 23,315; objc: 15,216; fortran: 10,901; pascal: 4,185; python: 4,093; perl: 2,969; awk: 2,811; ml: 2,385; cs: 879; yacc: 316; lex: 198; haskell: 112; lisp: 8
file content (68 lines) | stat: -rw-r--r-- 1,211 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// { dg-do run }

extern "C" void abort ();

struct A { int a; A () : a (6) {} };
struct B { int b; B () : b (5) {} };
struct C { int c; C () : c (4) {} };
struct D { int d; D () : d (3) {} };
struct E : A, B {};
struct F : C, D {};
struct G : E, F {};
void foo (B &);
void foo (F &);
#pragma omp declare reduction (+:B:omp_out.b += omp_in.b) \
		    initializer(foo (omp_priv))

void
foo (B &x)
{
  if (x.b != 5)
    abort ();
  x.b = 9;
}

template <typename T>
void bar (T &x, T &y, int z)
{
  if (z)
    abort ();
  x.a += y.a;
}

namespace N1
{
  struct A { int a; A () : a (0) {} };
  #pragma omp declare reduction (+:A:bar (omp_out, omp_in, 0))
};
namespace N2
{
  struct B : N1::A { };
  #pragma omp declare reduction (+:N1::A:bar (omp_out, omp_in, 1))
};

int
main ()
{
  G g;
  int i = 0;
  #pragma omp parallel reduction(+:g, i)
    {
      if (g.a != 6 || g.b != 9 || g.c != 4 || g.d != 3)
	abort ();
      g.a = 1, g.b = 2, g.c = 3, g.d = 4, i = 1;
    }
  if (g.a != 6 || g.b != 5 + 2 * i || g.c != 4 || g.d != 3)
    abort ();
  N2::B b;
  i = 0;
  #pragma omp parallel reduction (+:b, i)
    {
      if (b.a != 0)
	abort ();
      b.a = 4;
      i = 1;
    }
  if (b.a != 4 * i)
    abort ();
}