308 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 ParallelTempl() {10 T i;11 12 // expected-error@+1{{'num' argument on 'gang' clause is not permitted on a 'parallel loop' construct}}13#pragma acc parallel loop gang(i)14 for(int i = 0; i < 5; ++i);15 16 // expected-error@+1{{'num' argument on 'gang' clause is not permitted on a 'parallel loop' construct}}17#pragma acc parallel loop gang(num:i)18 for(int i = 0; i < 5; ++i);19 20 // expected-error@+1{{argument to 'gang' clause dimension must be a constant expression}}21#pragma acc parallel loop gang(dim:i)22 for(int i = 0; i < 5; ++i);23 24 // expected-error@+1{{argument to 'gang' clause dimension must be 1, 2, or 3: evaluated to 0}}25#pragma acc parallel loop gang(dim:Zero)26 for(int i = 0; i < 5; ++i);27 28#pragma acc parallel loop gang(dim:Two)29 for(int i = 0; i < 5; ++i);30 31 // expected-error@+1{{argument to 'gang' clause dimension must be 1, 2, or 3: evaluated to 4}}32#pragma acc parallel loop gang(dim:Four)33 for(int i = 0; i < 5; ++i);34 35#pragma acc parallel loop gang(static:i) gang(dim:Two)36 for(int i = 0; i < 5; ++i);37 38#pragma acc parallel loop gang(static:i, dim:Two)39 for(int i = 0; i < 5; ++i);40 41#pragma acc parallel loop gang(dim:Two) gang(static:*)42 for(int i = 0; i < 5; ++i);43 44#pragma acc parallel loop gang(dim:Two, static:*)45 for(int i = 0; i < 5; ++i);46 47 // expected-error@+4{{OpenACC 'gang' clause may have at most one 'static' argument}}48 // expected-note@+3{{previous expression is here}}49 // expected-error@+2{{OpenACC 'gang' clause may have at most one 'dim' argument}}50 // expected-note@+1{{previous expression is here}}51#pragma acc parallel loop gang(dim:Two, static:*, dim:1, static:i)52 for(int i = 0; i < 5; ++i);53}54 55void Parallel() {56 ParallelTempl<int, 0, 2, 4>(); // expected-note{{in instantiation of function template}}57 int i;58 59 // expected-error@+1{{'num' argument on 'gang' clause is not permitted on a 'parallel loop' construct}}60#pragma acc parallel loop gang(i)61 for(int i = 0; i < 5; ++i);62 63 // expected-error@+1{{'num' argument on 'gang' clause is not permitted on a 'parallel loop' construct}}64#pragma acc parallel loop gang(num:i)65 for(int i = 0; i < 5; ++i);66 67 // expected-error@+1{{argument to 'gang' clause dimension must be a constant expression}}68#pragma acc parallel loop gang(dim:i)69 for(int i = 0; i < 5; ++i);70 71 // expected-error@+1{{argument to 'gang' clause dimension must be 1, 2, or 3: evaluated to 0}}72#pragma acc parallel loop gang(dim:0)73 for(int i = 0; i < 5; ++i);74 75#pragma acc parallel loop gang(dim:2)76 for(int i = 0; i < 5; ++i);77 78 // expected-error@+1{{argument to 'gang' clause dimension must be 1, 2, or 3: evaluated to 4}}79#pragma acc parallel loop gang(dim:4)80 for(int i = 0; i < 5; ++i);81 82#pragma acc parallel loop gang(static:i) gang(dim:2)83 for(int i = 0; i < 5; ++i);84 85#pragma acc parallel loop gang(static:i, dim:2)86 for(int i = 0; i < 5; ++i);87 88#pragma acc parallel loop gang(dim:2) gang(static:*)89 for(int i = 0; i < 5; ++i);90 91#pragma acc parallel loop gang(dim:2, static:*)92 for(int i = 0; i < 5; ++i);93 94 // expected-error@+4{{OpenACC 'gang' clause may have at most one 'static' argument}}95 // expected-note@+3{{previous expression is here}}96 // expected-error@+2{{OpenACC 'gang' clause may have at most one 'dim' argument}}97 // expected-note@+1{{previous expression is here}}98#pragma acc parallel loop gang(dim:2, static:*, dim:1, static:i)99 for(int i = 0; i < 5; ++i);100}101 102template<typename SomeS, typename SomeC, typename Int>103void StaticIsIntegralTempl() {104 SomeS s;105 // expected-error@+1{{OpenACC clause 'gang' requires expression of integer type ('S' invalid)}}106#pragma acc parallel loop gang(dim:2) gang(static:s)107 for(int i = 0; i < 5; ++i);108 109 SomeC C;110#pragma acc parallel loop gang(dim:2) gang(static:C)111 for(int i = 0; i < 5; ++i);112 Int i;113#pragma acc parallel loop gang(dim:2) gang(static:i)114 for(int i = 0; i < 5; ++i);115 116#pragma acc parallel loop gang(dim:2) gang(static:*)117 for(int i = 0; i < 5; ++i);118}119 120void StaticIsIntegral() {121 StaticIsIntegralTempl<S, Converts, int>();// expected-note{{in instantiation of function template}}122 123 S s;124 // expected-error@+1{{OpenACC clause 'gang' requires expression of integer type ('S' invalid)}}125#pragma acc parallel loop gang(dim:2) gang(static:s)126 for(int i = 0; i < 5; ++i);127 128 Converts C;129#pragma acc parallel loop gang(dim:2) gang(static:C)130 for(int i = 0; i < 5; ++i);131}132 133template<unsigned I>134void SerialTempl() {135 // expected-error@+1{{'num' argument on 'gang' clause is not permitted on a 'serial loop'}}136#pragma acc serial loop gang(I)137 for(int i = 0; i < 5; ++i);138 139 // expected-error@+1{{'num' argument on 'gang' clause is not permitted on a 'serial loop'}}140#pragma acc serial loop gang(num:I)141 for(int i = 0; i < 5; ++i);142 143 // expected-error@+1{{'dim' argument on 'gang' clause is not permitted on a 'serial loop'}}144#pragma acc serial loop gang(dim:I)145 for(int i = 0; i < 5; ++i);146 147#pragma acc serial loop gang(static:I)148 for(int i = 0; i < 5; ++i);149}150 151void Serial() {152 SerialTempl<2>();153 154 // expected-error@+1{{'num' argument on 'gang' clause is not permitted on a 'serial loop'}}155#pragma acc serial loop gang(1)156 for(int i = 0; i < 5; ++i);157 158 // expected-error@+1{{'num' argument on 'gang' clause is not permitted on a 'serial loop'}}159#pragma acc serial loop gang(num:1)160 for(int i = 0; i < 5; ++i);161 162 // expected-error@+1{{'dim' argument on 'gang' clause is not permitted on a 'serial loop'}}163#pragma acc serial loop gang(dim:1)164 for(int i = 0; i < 5; ++i);165 166#pragma acc serial loop gang(static:1)167 for(int i = 0; i < 5; ++i);168 169 int i;170#pragma acc serial loop gang(static:i)171 for(int i = 0; i < 5; ++i);172}173 174template<typename T>175void KernelsTempl() {176 T t;177 // expected-error@+1{{'dim' argument on 'gang' clause is not permitted on a 'kernels loop'}}178#pragma acc kernels loop gang(dim:t)179 for(int i = 0; i < 5; ++i);180 181#pragma acc kernels loop gang(static:t)182 for(int i = 0; i < 5; ++i);183 184 // expected-error@+2{{'num_gangs' clause not allowed on a 'kernels loop' construct that has a 'gang' clause with a 'num' argument}}185 // expected-note@+1{{previous 'gang' clause is here}}186#pragma acc kernels loop gang(t) num_gangs(t)187 for(int i = 0; i < 5; ++i);188 189 // OK, kernels loop should block this.190#pragma acc kernels num_gangs(t)191#pragma acc kernels loop gang(static:t)192 for(int i = 0; i < 5; ++i);193 194 // expected-error@+2{{'num' argument to 'gang' clause not allowed on a 'kernels loop' construct that has a 'num_gangs' clause}}195 // expected-note@+1{{previous 'num_gangs' clause is here}}196#pragma acc kernels loop num_gangs(t) gang(t)197 for(int i = 0; i < 5; ++i);198 199 // expected-error@+2{{'num_gangs' clause not allowed on a 'kernels loop' construct that has a 'gang' clause with a 'num' argument}}200 // expected-note@+1{{previous 'gang' clause is here}}201#pragma acc kernels loop gang(num:t) num_gangs(t)202 for(int i = 0; i < 5; ++i);203 204 // expected-error@+2{{'num' argument to 'gang' clause not allowed on a 'kernels loop' construct that has a 'num_gangs' clause}}205 // expected-note@+1{{previous 'num_gangs' clause is here}}206#pragma acc kernels loop num_gangs(t) gang(num:t)207 for(int i = 0; i < 5; ++i);208}209 210void Kernels() {211 KernelsTempl<unsigned>();212 213 // expected-error@+1{{'dim' argument on 'gang' clause is not permitted on a 'kernels loop'}}214#pragma acc kernels loop gang(dim:1)215 for(int i = 0; i < 5; ++i);216 217 unsigned t;218#pragma acc kernels loop gang(static:t)219 for(int i = 0; i < 5; ++i);220 221 // expected-error@+2{{'num_gangs' clause not allowed on a 'kernels loop' construct that has a 'gang' clause with a 'num' argument}}222 // expected-note@+1{{previous 'gang' clause is here}}223#pragma acc kernels loop gang(t) num_gangs(t)224 for(int i = 0; i < 5; ++i);225 226 // expected-error@+2{{'num' argument to 'gang' clause not allowed on a 'kernels loop' construct that has a 'num_gangs' clause}}227 // expected-note@+1{{previous 'num_gangs' clause is here}}228#pragma acc kernels loop num_gangs(t) gang(t)229 for(int i = 0; i < 5; ++i);230 231 // expected-error@+2{{'num_gangs' clause not allowed on a 'kernels loop' construct that has a 'gang' clause with a 'num' argument}}232 // expected-note@+1{{previous 'gang' clause is here}}233#pragma acc kernels loop gang(num:t) num_gangs(t)234 for(int i = 0; i < 5; ++i);235 236 // expected-error@+2{{'num' argument to 'gang' clause not allowed on a 'kernels loop' construct that has a 'num_gangs' clause}}237 // expected-note@+1{{previous 'num_gangs' clause is here}}238#pragma acc kernels loop num_gangs(t) gang(num:t)239 for(int i = 0; i < 5; ++i);240 241 // OK, intervening compute/combined construct.242#pragma acc kernels loop gang(num:1)243 for(int i = 0; i < 5; ++i) {244#pragma acc serial loop gang(static:1)245 for(int i = 0; i < 5; ++i);246 }247#pragma acc kernels loop gang(num:1)248 for(int i = 0; i < 5; ++i) {249#pragma acc serial250#pragma acc loop gang(static:1)251 for(int i = 0; i < 5; ++i);252 }253#pragma acc kernels254#pragma acc loop gang(num:1)255 for(int i = 0; i < 5; ++i) {256#pragma acc serial loop gang(static:1)257 for(int i = 0; i < 5; ++i);258 }259 260#pragma acc kernels loop gang(num:1)261 for(int i = 0; i < 5; ++i) {262 // expected-error@+2{{loop with a 'gang' clause may not exist in the region of a 'gang' clause on a 'kernels loop' construct}}263 // expected-note@-3{{previous 'gang' clause is here}}264#pragma acc loop gang(static:1)265 for(int i = 0; i < 5; ++i);266 }267 268 // OK, on a different 'loop', not in the associated stmt.269#pragma acc kernels loop gang(num:1)270 for(int i = 0; i < 5; ++i);271#pragma acc loop gang(static:1)272 for(int i = 0; i < 5; ++i);273 274 // OK, on a different 'loop', not in the associated stmt.275#pragma acc kernels loop gang(num:1)276 for(int i = 0; i < 5; ++i);277#pragma acc kernels loop gang(static:1)278 for(int i = 0; i < 5; ++i);279 280 // expected-error@+2{{OpenACC 'gang' clause may have at most one unnamed or 'num' argument}}281 // expected-note@+1{{previous expression is here}}282#pragma acc kernels loop gang(5, num:1)283 for(int i = 0; i < 5; ++i);284 285 // expected-error@+2{{OpenACC 'gang' clause may have at most one unnamed or 'num' argument}}286 // expected-note@+1{{previous expression is here}}287#pragma acc kernels loop gang(num:5, 1)288 for(int i = 0; i < 5; ++i);289 290 // expected-error@+3{{OpenACC 'gang' clause may have at most one unnamed or 'num' argument}}291 // expected-note@+2{{previous expression is here}}292#pragma acc kernels293#pragma acc kernels loop gang(num:5, num:1)294 for(int i = 0; i < 5; ++i);295}296 297void MaxOneEntry() {298 // expected-error@+2{{OpenACC 'gang' clause may have at most one 'static' argument}}299 // expected-note@+1{{previous expression is here}}300#pragma acc kernels loop gang(static: 1, static:1)301 for(int i = 0; i < 5; ++i);302 303#pragma acc kernels loop gang gang(static:1)304 for(int i = 0; i < 5; ++i);305}306 307 308