mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			88 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
| // 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;
 | |
| }
 |