343 lines · cpp
1// RUN: %clang_cc1 %s -fopenacc -verify2 3struct S{};4struct Converts{5 operator int();6};7 8template<typename T, unsigned Zero, unsigned Two, unsigned Four>9void ParallelOrOrphanTempl() {10 T i;11 // expected-error@+1{{'num' argument on 'gang' clause is not permitted on an orphaned 'loop' construct}}12#pragma acc loop gang(i)13 for(int i = 0; i < 5; ++i);14 // expected-error@+1{{'num' argument on 'gang' clause is not permitted on an orphaned 'loop' construct}}15#pragma acc loop gang(num:i)16 for(int i = 0; i < 5; ++i);17 18 // expected-error@+2{{'num' argument on 'gang' clause is not permitted on a 'loop' construct associated with a 'parallel' compute construct}}19#pragma acc parallel20#pragma acc loop gang(i)21 for(int i = 0; i < 5; ++i);22 23 // expected-error@+2{{'num' argument on 'gang' clause is not permitted on a 'loop' construct associated with a 'parallel' compute construct}}24#pragma acc parallel25#pragma acc loop gang(num:i)26 for(int i = 0; i < 5; ++i);27 28 // expected-error@+1{{argument to 'gang' clause dimension must be a constant expression}}29#pragma acc loop gang(dim:i)30 for(int i = 0; i < 5; ++i);31 32 // expected-error@+2{{argument to 'gang' clause dimension must be a constant expression}}33#pragma acc parallel34#pragma acc loop gang(dim:i)35 for(int i = 0; i < 5; ++i);36 37 // expected-error@+1{{argument to 'gang' clause dimension must be 1, 2, or 3: evaluated to 0}}38#pragma acc loop gang(dim:Zero)39 for(int i = 0; i < 5; ++i);40 41 // expected-error@+2{{argument to 'gang' clause dimension must be 1, 2, or 3: evaluated to 0}}42#pragma acc parallel43#pragma acc loop gang(dim:Zero)44 for(int i = 0; i < 5; ++i);45 46 // expected-error@+1{{argument to 'gang' clause dimension must be 1, 2, or 3: evaluated to 4}}47#pragma acc loop gang(dim:Four)48 for(int i = 0; i < 5; ++i);49 50 // expected-error@+2{{argument to 'gang' clause dimension must be 1, 2, or 3: evaluated to 4}}51#pragma acc parallel52#pragma acc loop gang(dim:Four)53 for(int i = 0; i < 5; ++i);54 55#pragma acc loop gang(static:i) gang(dim:Two)56 for(int i = 0; i < 5; ++i);57 58#pragma acc parallel59#pragma acc loop gang(dim:Two) gang(static:*)60 for(int i = 0; i < 5; ++i);61 62#pragma acc parallel63#pragma acc loop gang(dim:Two, static:i)64 for(int i = 0; i < 5; ++i);65 66 // expected-error@+4{{OpenACC 'gang' clause may have at most one 'static' argument}}67 // expected-note@+3{{previous expression is here}}68 // expected-error@+2{{OpenACC 'gang' clause may have at most one 'dim' argument}}69 // expected-note@+1{{previous expression is here}}70#pragma acc loop gang(static:i, static:i, dim:Two, dim:1)71 for(int i = 0; i < 5; ++i);72}73 74void ParallelOrOrphan() {75 ParallelOrOrphanTempl<int, 0, 2, 4>(); // expected-note{{in instantiation of function template}}76 77 int i;78 // expected-error@+1{{'num' argument on 'gang' clause is not permitted on an orphaned 'loop' construct}}79#pragma acc loop gang(i)80 for(int i = 0; i < 5; ++i);81 // expected-error@+1{{'num' argument on 'gang' clause is not permitted on an orphaned 'loop' construct}}82#pragma acc loop gang(num:i)83 for(int i = 0; i < 5; ++i);84 85 // expected-error@+2{{'num' argument on 'gang' clause is not permitted on a 'loop' construct associated with a 'parallel' compute construct}}86#pragma acc parallel87#pragma acc loop gang(i)88 for(int i = 0; i < 5; ++i);89 90 // expected-error@+2{{'num' argument on 'gang' clause is not permitted on a 'loop' construct associated with a 'parallel' compute construct}}91#pragma acc parallel92#pragma acc loop gang(num:i)93 for(int i = 0; i < 5; ++i);94 95 // expected-error@+1{{argument to 'gang' clause dimension must be a constant expression}}96#pragma acc loop gang(dim:i)97 for(int i = 0; i < 5; ++i);98 99 // expected-error@+2{{argument to 'gang' clause dimension must be a constant expression}}100#pragma acc parallel101#pragma acc loop gang(dim:i)102 for(int i = 0; i < 5; ++i);103 104 // expected-error@+1{{argument to 'gang' clause dimension must be 1, 2, or 3: evaluated to 0}}105#pragma acc loop gang(dim:0)106 for(int i = 0; i < 5; ++i);107 108 // expected-error@+2{{argument to 'gang' clause dimension must be 1, 2, or 3: evaluated to 0}}109#pragma acc parallel110#pragma acc loop gang(dim:0)111 for(int i = 0; i < 5; ++i);112 113 // expected-error@+1{{argument to 'gang' clause dimension must be 1, 2, or 3: evaluated to 4}}114#pragma acc loop gang(dim:4)115 for(int i = 0; i < 5; ++i);116 117 // expected-error@+2{{argument to 'gang' clause dimension must be 1, 2, or 3: evaluated to 4}}118#pragma acc parallel119#pragma acc loop gang(dim:4)120 for(int i = 0; i < 5; ++i);121 122#pragma acc loop gang(static:i) gang(dim:2)123 for(int i = 0; i < 5; ++i);124 125#pragma acc parallel126#pragma acc loop gang(dim:2) gang(static:i)127 for(int i = 0; i < 5; ++i);128 129 S s;130 // expected-error@+2{{OpenACC clause 'gang' requires expression of integer type ('S' invalid)}}131#pragma acc parallel132#pragma acc loop gang(dim:2) gang(static:s)133 for(int i = 0; i < 5; ++i);134 135 Converts C;136#pragma acc parallel137#pragma acc loop gang(dim:2) gang(static:C)138 for(int i = 0; i < 5; ++i);139}140 141template<typename SomeS, typename SomeC, typename Int>142void StaticIsIntegralTempl() {143 SomeS s;144 // expected-error@+2{{OpenACC clause 'gang' requires expression of integer type ('S' invalid)}}145#pragma acc parallel146#pragma acc loop gang(dim:2) gang(static:s)147 for(int i = 0; i < 5; ++i);148 149 SomeC C;150#pragma acc parallel151#pragma acc loop gang(dim:2) gang(static:C)152 for(int i = 0; i < 5; ++i);153 Int i;154#pragma acc parallel155#pragma acc loop gang(dim:2) gang(static:i)156 for(int i = 0; i < 5; ++i);157 158#pragma acc parallel159#pragma acc loop gang(dim:2) gang(static:*)160 for(int i = 0; i < 5; ++i);161}162 163void StaticIsIntegral() {164 StaticIsIntegralTempl<S, Converts, int>();// expected-note{{in instantiation of function template}}165 166 S s;167 // expected-error@+2{{OpenACC clause 'gang' requires expression of integer type ('S' invalid)}}168#pragma acc parallel169#pragma acc loop gang(dim:2) gang(static:s)170 for(int i = 0; i < 5; ++i);171 172 Converts C;173#pragma acc parallel174#pragma acc loop gang(dim:2) gang(static:C)175 for(int i = 0; i < 5; ++i);176}177 178template<unsigned I>179void SerialTempl() {180 // expected-error@+2{{'num' argument on 'gang' clause is not permitted on a 'loop' construct associated with a 'serial' compute construct}}181#pragma acc serial182#pragma acc loop gang(I)183 for(int i = 0; i < 5; ++i);184 185 // expected-error@+2{{'num' argument on 'gang' clause is not permitted on a 'loop' construct associated with a 'serial' compute construct}}186#pragma acc serial187#pragma acc loop gang(num:I)188 for(int i = 0; i < 5; ++i);189 190 // expected-error@+2{{'dim' argument on 'gang' clause is not permitted on a 'loop' construct associated with a 'serial' compute construct}}191#pragma acc serial192#pragma acc loop gang(dim:I)193 for(int i = 0; i < 5; ++i);194 195#pragma acc serial196#pragma acc loop gang(static:I)197 for(int i = 0; i < 5; ++i);198}199 200void Serial() {201 SerialTempl<2>();202 203 // expected-error@+2{{'num' argument on 'gang' clause is not permitted on a 'loop' construct associated with a 'serial' compute construct}}204#pragma acc serial205#pragma acc loop gang(1)206 for(int i = 0; i < 5; ++i);207 208 // expected-error@+2{{'num' argument on 'gang' clause is not permitted on a 'loop' construct associated with a 'serial' compute construct}}209#pragma acc serial210#pragma acc loop gang(num:1)211 for(int i = 0; i < 5; ++i);212 213 // expected-error@+2{{'dim' argument on 'gang' clause is not permitted on a 'loop' construct associated with a 'serial' compute construct}}214#pragma acc serial215#pragma acc loop gang(dim:1)216 for(int i = 0; i < 5; ++i);217 218#pragma acc serial219#pragma acc loop gang(static:1)220 for(int i = 0; i < 5; ++i);221 222 int i;223 224#pragma acc serial225#pragma acc loop gang(static:i)226 for(int i = 0; i < 5; ++i);227}228 229template<typename T>230void KernelsTempl() {231 T t;232 // expected-error@+2{{'dim' argument on 'gang' clause is not permitted on a 'loop' construct associated with a 'kernels' compute construct}}233#pragma acc kernels234#pragma acc loop gang(dim:t)235 for(int i = 0; i < 5; ++i);236 237#pragma acc kernels238#pragma acc loop gang(static:t)239 for(int i = 0; i < 5; ++i);240 241 // expected-error@+3{{'num' argument to 'gang' clause not allowed on a 'loop' construct associated with a 'kernels' construct that has a 'num_gangs' clause}}242 // expected-note@+1{{previous 'num_gangs' clause is here}}243#pragma acc kernels num_gangs(t)244#pragma acc loop gang(t)245 for(int i = 0; i < 5; ++i);246 247 // expected-error@+3{{'num' argument to 'gang' clause not allowed on a 'loop' construct associated with a 'kernels' construct that has a 'num_gangs' clause}}248 // expected-note@+1{{previous 'num_gangs' clause is here}}249#pragma acc kernels num_gangs(t)250#pragma acc loop gang(num:t)251 for(int i = 0; i < 5; ++i);252}253 254void Kernels() {255 KernelsTempl<unsigned>();256 257 // expected-error@+2{{'dim' argument on 'gang' clause is not permitted on a 'loop' construct associated with a 'kernels' compute construct}}258#pragma acc kernels259#pragma acc loop gang(dim:1)260 for(int i = 0; i < 5; ++i);261 unsigned t;262#pragma acc kernels263#pragma acc loop gang(static:t)264 for(int i = 0; i < 5; ++i);265 266 // expected-error@+3{{'num' argument to 'gang' clause not allowed on a 'loop' construct associated with a 'kernels' construct that has a 'num_gangs' clause}}267 // expected-note@+1{{previous 'num_gangs' clause is here}}268#pragma acc kernels num_gangs(1)269#pragma acc loop gang(1)270 for(int i = 0; i < 5; ++i);271 272 // expected-error@+3{{'num' argument to 'gang' clause not allowed on a 'loop' construct associated with a 'kernels' construct that has a 'num_gangs' clause}}273 // expected-note@+1{{previous 'num_gangs' clause is here}}274#pragma acc kernels num_gangs(1)275#pragma acc loop gang(num:1)276 for(int i = 0; i < 5; ++i);277 278#pragma acc kernels279#pragma acc loop gang(num:1)280 for(int j = 0; j < 5; ++j) {281 // expected-error@+2{{loop with a 'gang' clause may not exist in the region of a 'gang' clause on a 'kernels' construct}}282 // expected-note@-3{{previous 'gang' clause is here}}283#pragma acc loop gang(static:1)284 for(int i = 0; i < 5; ++i);285 }286 287#pragma acc kernels288#pragma acc loop gang(num:1)289 for(int j = 0; j < 5; ++j) {290#pragma acc loop worker(1) vector(1)291 for(int i = 0; i < 5; ++i);292 }293 294#pragma acc kernels295#pragma acc loop gang(num:1)296 for(int j = 0; j < 5; ++j) {297 // allowed, intervening compute construct298#pragma acc serial299#pragma acc loop gang(static:1)300 for(int i = 0; i < 5; ++i);301 }302 303#pragma acc kernels304#pragma acc loop gang(num:1)305 for(int i = 0; i < 5; ++i);306 307 // OK, on a different 'loop', not in the assoc statement.308#pragma acc loop gang(static:1)309 for(int i = 0; i < 5; ++i);310 311 // expected-error@+3{{OpenACC 'gang' clause may have at most one unnamed or 'num' argument}}312 // expected-note@+2{{previous expression is here}}313#pragma acc kernels314#pragma acc loop gang(5, num:1)315 for(int i = 0; i < 5; ++i);316 317 // expected-error@+3{{OpenACC 'gang' clause may have at most one unnamed or 'num' argument}}318 // expected-note@+2{{previous expression is here}}319#pragma acc kernels320#pragma acc loop gang(num:5, 1)321 for(int i = 0; i < 5; ++i);322 323 // expected-error@+3{{OpenACC 'gang' clause may have at most one unnamed or 'num' argument}}324 // expected-note@+2{{previous expression is here}}325#pragma acc kernels326#pragma acc loop gang(num:5, num:1)327 for(int i = 0; i < 5; ++i);328}329 330void MaxOneEntry() {331 // expected-error@+3{{OpenACC 'gang' clause may have at most one 'static' argument}}332 // expected-note@+2{{previous expression is here}}333#pragma acc kernels334#pragma acc loop gang(static: 1, static:1)335 for(int i = 0; i < 5; ++i);336 337#pragma acc kernels338#pragma acc loop gang gang(static:1)339 for(int i = 0; i < 5; ++i);340}341 342 343