mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			73 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
| // { dg-do run }
 | |
| 
 | |
| extern "C" void abort ();
 | |
| 
 | |
| struct S
 | |
| {
 | |
|   int s;
 | |
|   void foo (S &x) { s += x.s; }
 | |
|   S (const S &x) { s = x.s + 1; }
 | |
|   S () { s = 6; }
 | |
|   ~S () {}
 | |
| };
 | |
| 
 | |
| void
 | |
| bar (S &x, S &y)
 | |
| {
 | |
|   if (x.s != 6 || y.s != 6)
 | |
|     abort ();
 | |
|   x.s = 8;
 | |
| }
 | |
| 
 | |
| #pragma omp declare reduction (foo: S: omp_out.foo (omp_in)) \
 | |
| 	initializer (omp_priv (omp_orig))
 | |
| #pragma omp declare reduction (bar : S: omp_out.foo (omp_in)) \
 | |
| 	initializer (bar (omp_priv, omp_orig))
 | |
| 
 | |
| S
 | |
| baz (S x)
 | |
| {
 | |
|   S r;
 | |
|   int i = 0;
 | |
|   if (x.s != 7 || r.s != 6)
 | |
|     abort ();
 | |
|   #pragma omp parallel reduction (foo: x) reduction (bar: r) \
 | |
| 		       reduction (+: i)
 | |
|   {
 | |
|     if (x.s != 8 || r.s != 8)
 | |
|       abort ();
 | |
|     x.s = 12;
 | |
|     r.s = 14;
 | |
|     i = 1;
 | |
|   }
 | |
|   if (x.s != 7 + 12 * i || r.s != 6 + 14 * i)
 | |
|     abort ();
 | |
|   return r;
 | |
| }
 | |
| 
 | |
| void
 | |
| baz (S &x, S &y)
 | |
| {
 | |
|   int i = 0, &j = i;
 | |
|   #pragma omp parallel reduction (foo: x) reduction (bar: y) \
 | |
| 		       reduction (+: i)
 | |
|   {
 | |
|     if (x.s != 7 || y.s != 8)
 | |
|       abort ();
 | |
|     x.s = 12;
 | |
|     y.s = 14;
 | |
|     i = 1;
 | |
|   }
 | |
|   if (x.s != 6 + 12 * j || y.s != 6 + 14 * j)
 | |
|     abort ();
 | |
| }
 | |
| 
 | |
| int
 | |
| main ()
 | |
| {
 | |
|   S s;
 | |
|   baz (s);
 | |
|   S t, u;
 | |
|   baz (t, u);
 | |
| }
 |