brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.6 KiB · ba4e85b Raw
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