159 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 parallel loop' must be a for loop}}10 #pragma omp parallel 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 'parallel loop' region}}19 #pragma omp parallel 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 'parallel loop' region}}28 #pragma omp parallel 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 'parallel loop' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}39 #pragma omp parallel 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 'parallel loop' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}46 #pragma omp parallel 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 'parallel loop' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}53 #pragma omp parallel 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 parallel loop' cannot contain more than one 'bind' clause}}61 #pragma omp parallel loop bind(thread) bind(thread)62 for (i=0; i<1000; ++i) {63 }64 65 // expected-error@+1 {{expected 'teams', 'parallel' or 'thread' in OpenMP clause 'bind'}}66 #pragma omp parallel loop bind(other)67 for (i=0; i<1000; ++i) {68 }69 70 // collapse clause71 72 // expected-error@+4 {{expected 2 for loops after '#pragma omp parallel loop', but found only 1}}73 // expected-note@+1 {{as specified in 'collapse' clause}}74 #pragma omp parallel loop collapse(2) bind(thread)75 for (i=0; i<1000; ++i)76 z = i+11;77 78 // expected-error@+1 {{directive '#pragma omp parallel loop' cannot contain more than one 'collapse' clause}}79 #pragma omp parallel loop collapse(2) collapse(2) bind(thread)80 for (i=0; i<1000; ++i)81 for (j=0; j<1000; ++j)82 z = i+j+11;83 84 // order clause85 86 // expected-error@+1 {{expected 'concurrent' in OpenMP clause 'order'}}87 #pragma omp parallel loop order(foo) bind(thread)88 for (i=0; i<1000; ++i)89 z = i+11;90 91 // private clause92 93 // expected-error@+1 {{use of undeclared identifier 'undef_var'}}94 #pragma omp parallel loop private(undef_var) bind(thread)95 for (i=0; i<1000; ++i)96 z = i+11;97 98 // lastprivate99 100 // A list item may not appear in a lastprivate clause unless it is the loop101 // iteration variable of a loop that is associated with the construct.102 103 // expected-error@+1 {{only loop iteration variables are allowed in 'lastprivate' clause in 'omp parallel loop' directives}}104 #pragma omp parallel loop lastprivate(z) bind(thread)105 for (i=0; i<1000; ++i) {106 z = i+11;107 }108 109 // expected-error@+1 {{only loop iteration variables are allowed in 'lastprivate' clause in 'omp parallel loop' directives}}110 #pragma omp parallel loop lastprivate(k) collapse(2) bind(thread)111 for (i=0; i<1000; ++i)112 for (j=0; j<1000; ++j)113 for (k=0; k<1000; ++k)114 z = i+j+k+11;115 116 // reduction117 118 // expected-error@+1 {{use of undeclared identifier 'undef_var'}}119 #pragma omp parallel loop reduction(+:undef_var) bind(thread)120 for (i=0; i<1000; ++i)121 z = i+11;122 123 // num_threads124 125 // expected-error@+1 {{directive '#pragma omp parallel loop' cannot contain more than one 'num_threads' clause}}126 #pragma omp parallel loop num_threads(4) num_threads(4)127 for (i=0; i<1000; ++i)128 z = i+11;129 130 // proc_bind131 132 // expected-error@+1 {{directive '#pragma omp parallel loop' cannot contain more than one 'proc_bind' clause}}133 #pragma omp parallel loop proc_bind(close) proc_bind(primary)134 for (i=0; i<1000; ++i)135 z = i+11;136}137 138template <typename T, int C>139void templ_test(T t) {140 T i,z;141 142 // expected-error@+4 {{expected 2 for loops after '#pragma omp parallel loop', but found only 1}}143 // expected-note@+1 {{as specified in 'collapse' clause}}144 #pragma omp parallel loop collapse(C) bind(thread)145 for (i=0; i<1000; ++i)146 z = i+11;147 148 // expected-error@+1 {{only loop iteration variables are allowed in 'lastprivate' clause in 'omp parallel loop' directives}}149 #pragma omp parallel loop lastprivate(z) bind(thread)150 for (i=0; i<1000; ++i) {151 z = i+11;152 }153}154 155void bar()156{157 templ_test<int, 2>(16); // expected-note {{in instantiation of function template specialization 'templ_test<int, 2>' requested here}}158}159