1! { dg-do compile } 2! { dg-additional-options "-fdump-tree-original" } 3! 4! (in_)reduction clause 5! Test all in-principle valid combinations, even if 6! not valid in this context (some fail at ME level) 7! 8implicit none 9integer :: a, b, i 10a = 0 11 12! ------------ parallel ------------ 13!$omp parallel reduction(+:a) 14do i=1,10 15 a = a + 1 16end do 17!$omp end parallel 18 19!$omp parallel reduction(default,+:a) 20do i=1,10 21 a = a + 1 22end do 23!$omp end parallel 24 25!$omp parallel reduction(task,+:a) 26do i=1,10 27 a = a + 1 28end do 29!$omp end parallel 30 31 32! ------------ simd ------------ 33!$omp simd reduction(+:a) 34do i=1,10 35 a = a + 1 36end do 37 38!$omp simd reduction(default,+:a) 39do i=1,10 40 a = a + 1 41end do 42 43!$omp simd reduction(task,+:a) ! { dg-error "invalid 'task' reduction modifier on construct other than 'parallel', 'do' or 'sections'" } 44do i=1,10 45 a = a + 1 46end do 47 48! ------------ do ------------ 49!$omp parallel 50!$omp do reduction(+:a) 51do i=1,10 52 a = a + 1 53end do 54!$omp end parallel 55 56!$omp parallel 57!$omp do reduction(default,+:a) 58do i=1,10 59 a = a + 1 60end do 61!$omp end parallel 62 63!$omp parallel 64!$omp do reduction(task,+:a) 65do i=1,10 66 a = a + 1 67end do 68!$omp end parallel 69 70! ------------ section ------------ 71!$omp parallel 72!$omp sections reduction(+:a) 73 !$omp section 74 a = a + 1 75!$omp end sections 76!$omp end parallel 77 78!$omp parallel 79!$omp sections reduction(default,+:a) 80 !$omp section 81 a = a + 1 82!$omp end sections 83!$omp end parallel 84 85!$omp parallel 86!$omp sections reduction(task,+:a) 87 !$omp section 88 a = a + 1 89!$omp end sections 90!$omp end parallel 91 92! ------------ task ------------ 93!$omp task in_reduction(+:a) 94 a = a + 1 95!$omp end task 96 97! ------------ taskloop ------------ 98!$omp taskloop reduction(+:a) in_reduction(+:b) 99do i=1,10 100 a = a + 1 101end do 102 103!$omp taskloop reduction(default,+:a) in_reduction(+:b) 104do i=1,10 105 a = a + 1 106end do 107 108! ------------ target ------------ 109!$omp target in_reduction(+:b) 110 a = a + 1 111!$omp end target 112 113! ------------ teams ------------ 114!$omp teams reduction(+:b) 115 a = a + 1 116!$omp end teams 117 118!$omp teams reduction(default, +:b) 119 a = a + 1 120!$omp end teams 121 122! ------------ taskgroup -------- 123 124!$omp taskgroup task_reduction(+:b) 125 a = a + 1 126!$omp end taskgroup 127 128end 129 130! { dg-final { scan-tree-dump-times "#pragma omp for reduction\\(\\\+:a\\)" 2 "original" } } 131! { dg-final { scan-tree-dump-times "#pragma omp for reduction\\(task,\\\+:a\\)" 1 "original" } } 132! { dg-final { scan-tree-dump-times "#pragma omp parallel\[\n\r\]" 6 "original" } } 133! { dg-final { scan-tree-dump-times "#pragma omp parallel private\\(i\\) reduction\\(\\\+:a\\)" 2 "original" } } 134! { dg-final { scan-tree-dump-times "#pragma omp parallel private\\(i\\) reduction\\(task,\\\+:a\\)" 1 "original" } } 135! { dg-final { scan-tree-dump-times "#pragma omp section\[\n\r\]" 3 "original" } } 136! { dg-final { scan-tree-dump-times "#pragma omp sections reduction\\(\\\+:a\\)" 2 "original" } } 137! { dg-final { scan-tree-dump-times "#pragma omp sections reduction\\(task,\\\+:a\\)" 1 "original" } } 138! { dg-final { scan-tree-dump-times "#pragma omp simd linear\\(i:1\\) reduction\\(\\\+:a\\)" 2 "original" } } 139! { dg-final { scan-tree-dump-times "#pragma omp simd linear\\(i:1\\) reduction\\(task,\\\+:a\\)" 1 "original" } } 140! { dg-final { scan-tree-dump-times "#pragma omp target in_reduction\\(\\\+:b\\)" 1 "original" } } 141! { dg-final { scan-tree-dump-times "#pragma omp task in_reduction\\(\\\+:a\\)" 1 "original" } } 142! { dg-final { scan-tree-dump-times "#pragma omp teams reduction\\(\\\+:b\\)" 2 "original" } } 143! { dg-final { scan-tree-dump-times "#pragma omp taskloop reduction\\(\\\+:a\\) in_reduction\\(\\\+:b\\)" 2 "original" } } 144