brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.9 KiB · e0affd9 Raw
154 lines · cpp
1// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -verify -fopenmp \2// RUN:  -Wuninitialized %s3 4void foo()5{6  int i,j,k;7  int z;8 9  // expected-error@+2 {{statement after '#pragma omp loop' must be a for loop}}10  #pragma omp loop bind(thread)11  i = 0;12 13  // OpenMP 5.1 [2.22 Nesting of regions]14  //15  // A barrier region may not be closely nested inside a worksharing, loop,16  // task, taskloop, critical, ordered, atomic, or masked region.17 18  // expected-error@+3 {{region cannot be closely nested inside 'loop' region}}19  #pragma omp loop bind(thread)20  for (i=0; i<1000; ++i) {21    #pragma omp barrier22  }23 24  // A masked region may not be closely nested inside a worksharing, loop,25  // atomic, task, or taskloop region.26 27  // expected-error@+3 {{region cannot be closely nested inside 'loop' region}}28  #pragma omp loop bind(thread)29  for (i=0; i<1000; ++i) {30    #pragma omp masked filter(2)31    { }32  }33 34  // An ordered region that corresponds to an ordered construct without any35  // clause or with the threads or depend clause may not be closely nested36  // inside a critical, ordered, loop, atomic, task, or taskloop region.37 38  // expected-error@+3 {{region cannot be closely nested inside 'loop' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}39  #pragma omp loop bind(thread)40  for (i=0; i<1000; ++i) {41    #pragma omp ordered42    { }43  }44 45  // expected-error@+3 {{region cannot be closely nested inside 'loop' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}46  #pragma omp loop bind(thread)47  for (i=0; i<1000; ++i) {48    #pragma omp ordered threads49    { }50  }51 52  // expected-error@+3 {{region cannot be closely nested inside 'loop' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}53  #pragma omp loop bind(thread)54  for (i=0; i<1000; ++i) {55    #pragma omp ordered depend(source)56  }57 58  // bind clause59 60  // expected-error@+1 {{directive '#pragma omp loop' cannot contain more than one 'bind' clause}}61  #pragma omp loop bind(thread) bind(thread)62  for (i=0; i<1000; ++i) {63  }64 65  // expected-error@+2 {{expected 'teams', 'parallel' or 'thread' in OpenMP clause 'bind'}}66  #pragma omp parallel67  #pragma omp loop bind(other)68  for (i=0; i<1000; ++i) {69  }70 71  #pragma omp target72  {73    // expected-error@+1 {{region cannot be closely nested inside 'target' region; perhaps you forget to enclose 'omp loop' directive into a teams region?}}74    #pragma omp loop bind(teams)75    for (i=0; i<10; ++i) {76    }77  }78 79  // collapse clause80 81  // expected-error@+4 {{expected 2 for loops after '#pragma omp loop', but found only 1}}82  // expected-note@+1 {{as specified in 'collapse' clause}}83  #pragma omp loop collapse(2) bind(thread)84  for (i=0; i<1000; ++i)85    z = i+11;86 87  // expected-error@+1 {{directive '#pragma omp loop' cannot contain more than one 'collapse' clause}}88  #pragma omp loop collapse(2) collapse(2) bind(thread)89  for (i=0; i<1000; ++i)90    for (j=0; j<1000; ++j)91      z = i+j+11;92 93  // order clause94 95  // expected-error@+1 {{expected 'concurrent' in OpenMP clause 'order'}}96  #pragma omp loop order(foo) bind(thread)97  for (i=0; i<1000; ++i)98    z = i+11;99 100  // private clause101 102  // expected-error@+1 {{use of undeclared identifier 'undef_var'}}103  #pragma omp loop private(undef_var) bind(thread)104  for (i=0; i<1000; ++i)105    z = i+11;106 107  // lastprivate108 109  // A list item may not appear in a lastprivate clause unless it is the loop110  // iteration variable of a loop that is associated with the construct.111 112  // expected-error@+1 {{only loop iteration variables are allowed in 'lastprivate' clause in 'omp loop' directives}}113  #pragma omp loop lastprivate(z) bind(thread)114  for (i=0; i<1000; ++i) {115    z = i+11;116  }117 118  // expected-error@+1 {{only loop iteration variables are allowed in 'lastprivate' clause in 'omp loop' directives}}119  #pragma omp loop lastprivate(k) collapse(2) bind(thread)120  for (i=0; i<1000; ++i)121    for (j=0; j<1000; ++j)122      for (k=0; k<1000; ++k)123        z = i+j+k+11;124 125  // reduction126 127  // expected-error@+1 {{use of undeclared identifier 'undef_var'}}128  #pragma omp loop reduction(+:undef_var) bind(thread)129  for (i=0; i<1000; ++i)130    z = i+11;131}132 133template <typename T, int C>134void templ_test(T t) {135  T i,z;136 137  // expected-error@+4 {{expected 2 for loops after '#pragma omp loop', but found only 1}}138  // expected-note@+1 {{as specified in 'collapse' clause}}139  #pragma omp loop collapse(C) bind(thread)140  for (i=0; i<1000; ++i)141    z = i+11;142 143  // expected-error@+1 {{only loop iteration variables are allowed in 'lastprivate' clause in 'omp loop' directives}}144  #pragma omp loop lastprivate(z) bind(thread)145  for (i=0; i<1000; ++i) {146    z = i+11;147  }148}149 150void bar()151{152  templ_test<int, 2>(16); // expected-note {{in instantiation of function template specialization 'templ_test<int, 2>' requested here}}153}154