172 lines · cpp
1// RUN: %clang_cc1 %s -fopenacc -verify2 3template<typename T, unsigned I>4void TemplUses(T t) {5 6#pragma acc parallel loop vector7 for(int j = 0; j < 5; ++j);8 9#pragma acc parallel loop vector(I)10 for(int j = 0; j < 5; ++j);11 12#pragma acc parallel loop vector(length:I)13 for(int j = 0; j < 5; ++j);14 15#pragma acc serial loop vector16 for(int j = 0; j < 5; ++j);17 18 // expected-error@+1{{'length' argument on 'vector' clause is not permitted on a 'serial loop' construct}}19#pragma acc serial loop vector(I)20 for(int j = 0; j < 5; ++j);21 22 // expected-error@+1{{'length' argument on 'vector' clause is not permitted on a 'serial loop' construct}}23#pragma acc serial loop vector(length:I)24 for(int j = 0; j < 5; ++j);25 26#pragma acc kernels loop vector27 for(int j = 0; j < 5; ++j);28 29#pragma acc kernels loop vector(I)30 for(int j = 0; j < 5; ++j);31 32#pragma acc kernels loop vector(length:I)33 for(int j = 0; j < 5; ++j);34 35#pragma acc kernels loop vector vector_length(t)36 for(int j = 0; j < 5; ++j);37 38#pragma acc kernels loop vector_length(t) vector39 for(int j = 0; j < 5; ++j);40 41 // expected-error@+2{{'vector_length' clause not allowed on a 'kernels loop' construct that has a 'vector' clause with an argument}}42 // expected-note@+1{{previous 'vector' clause is here}}43#pragma acc kernels loop vector(I) vector_length(t)44 for(int j = 0; j < 5; ++j);45 46 // expected-error@+2{{'length' argument to 'vector' clause not allowed on a 'kernels loop' construct that has a 'vector_length' clause}}47 // expected-note@+1{{previous 'vector_length' clause is here}}48#pragma acc kernels loop vector_length(t) vector(I)49 for(int j = 0; j < 5; ++j);50 51#pragma acc parallel loop vector52 for(int j = 0; j < 5; ++j) {53 // expected-error@+4{{loop with a 'vector' clause may not exist in the region of a 'vector' clause}}54 // expected-error@+3{{loop with a 'worker' clause may not exist in the region of a 'vector' clause}}55 // expected-error@+2{{loop with a 'gang' clause may not exist in the region of a 'vector' clause}}56 // expected-note@-5 3{{previous 'vector' clause is here}}57#pragma acc loop vector worker, gang58 for(int j = 0; j < 5; ++j);59 }60#pragma acc parallel loop vector61 for(int j = 0; j < 5; ++j) {62#pragma acc serial loop vector worker, gang63 for(int j = 0; j < 5; ++j);64 }65 66#pragma acc loop vector67 for(int j = 0; j < 5; ++j) {68#pragma acc serial loop vector worker, gang69 for(int j = 0; j < 5; ++j);70 }71 72#pragma acc kernels vector_length(t)73 for(int j = 0; j < 5; ++j) {74 // expected-error@+1{{'length' argument on 'vector' clause is not permitted on a 'serial loop' construct}}75#pragma acc serial loop vector(I)76 for(int j = 0; j < 5; ++j);77 }78 79#pragma acc kernels vector_length(t)80 for(int j = 0; j < 5; ++j) {81#pragma acc parallel loop vector(I)82 for(int j = 0; j < 5; ++j);83 }84}85 86void uses() {87 TemplUses<int, 5>(5);88 89 unsigned I;90 int t;91 92#pragma acc parallel loop vector93 for(int j = 0; j < 5; ++j);94 95#pragma acc parallel loop vector(I)96 for(int j = 0; j < 5; ++j);97 98#pragma acc parallel loop vector(length:I)99 for(int j = 0; j < 5; ++j);100 101#pragma acc serial loop vector102 for(int j = 0; j < 5; ++j);103 104 // expected-error@+1{{'length' argument on 'vector' clause is not permitted on a 'serial loop' construct}}105#pragma acc serial loop vector(I)106 for(int j = 0; j < 5; ++j);107 108 // expected-error@+1{{'length' argument on 'vector' clause is not permitted on a 'serial loop' construct}}109#pragma acc serial loop vector(length:I)110 for(int j = 0; j < 5; ++j);111 112#pragma acc kernels loop vector113 for(int j = 0; j < 5; ++j);114 115#pragma acc kernels loop vector(I)116 for(int j = 0; j < 5; ++j);117 118#pragma acc kernels loop vector(length:I)119 for(int j = 0; j < 5; ++j);120 121#pragma acc kernels loop vector vector_length(t)122 for(int j = 0; j < 5; ++j);123 124#pragma acc kernels loop vector_length(t) vector125 for(int j = 0; j < 5; ++j);126 127 // expected-error@+2{{'vector_length' clause not allowed on a 'kernels loop' construct that has a 'vector' clause with an argument}}128 // expected-note@+1{{previous 'vector' clause is here}}129#pragma acc kernels loop vector(I) vector_length(t)130 for(int j = 0; j < 5; ++j);131 132 // expected-error@+2{{'length' argument to 'vector' clause not allowed on a 'kernels loop' construct that has a 'vector_length' clause}}133 // expected-note@+1{{previous 'vector_length' clause is here}}134#pragma acc kernels loop vector_length(t) vector(I)135 for(int j = 0; j < 5; ++j);136 137#pragma acc parallel loop vector138 for(int j = 0; j < 5; ++j) {139 // expected-error@+4{{loop with a 'vector' clause may not exist in the region of a 'vector' clause}}140 // expected-error@+3{{loop with a 'worker' clause may not exist in the region of a 'vector' clause}}141 // expected-error@+2{{loop with a 'gang' clause may not exist in the region of a 'vector' clause}}142 // expected-note@-5 3{{previous 'vector' clause is here}}143#pragma acc loop vector worker, gang144 for(int j = 0; j < 5; ++j);145 }146#pragma acc parallel loop vector147 for(int j = 0; j < 5; ++j) {148#pragma acc serial loop vector worker, gang149 for(int j = 0; j < 5; ++j);150 }151 152#pragma acc loop vector153 for(int j = 0; j < 5; ++j) {154#pragma acc serial loop vector worker, gang155 for(int j = 0; j < 5; ++j);156 }157 158#pragma acc kernels vector_length(t)159 for(int j = 0; j < 5; ++j) {160#pragma acc parallel loop vector(I)161 for(int j = 0; j < 5; ++j);162 }163 164#pragma acc kernels vector_length(t)165 for(int j = 0; j < 5; ++j) {166 // expected-error@+1{{'length' argument on 'vector' clause is not permitted on a 'serial loop' construct}}167#pragma acc serial loop vector(I)168 for(int j = 0; j < 5; ++j);169 }170}171 172