1 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -verify -fopenmp \ 2 // RUN: -fopenmp-version=51 -Wuninitialized %s 3 4 void 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 barrier 22 } 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 any 35 // clause or with the threads or depend clause may not be closely nested 36 // 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 ordered 42 { } 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 threads 49 { } 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 clause 59 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 clause 71 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 clause 85 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 clause 92 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 // lastprivate 99 100 // A list item may not appear in a lastprivate clause unless it is the loop 101 // 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 // reduction 117 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_threads 124 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_bind 131 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 138 template <typename T, int C> 139 void 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 155 void bar() 156 { 157 templ_test<int, 2>(16); // expected-note {{in instantiation of function template specialization 'templ_test<int, 2>' requested here}} 158 } 159