1 // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -o - %s 2 3 int foo(); 4 5 template <class T> 6 T foo() { 7 #pragma omp for ordered 8 for (int i = 0; i < 10; ++i) { 9 L1: 10 foo(); 11 #pragma omp ordered 12 { 13 foo(); 14 goto L1; // expected-error {{use of undeclared label 'L1'}} 15 } 16 } 17 #pragma omp for ordered 18 for (int i = 0; i < 10; ++i) { 19 foo(); 20 goto L2; // expected-error {{use of undeclared label 'L2'}} 21 #pragma omp ordered 22 { 23 L2: 24 foo(); 25 } 26 } 27 #pragma omp for ordered 28 for (int i = 0; i < 10; ++i) { 29 #pragma omp ordered threads threads // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'threads' clause}} 30 { 31 foo(); 32 } 33 } 34 #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}} 35 for (int i = 0; i < 10; ++i) { 36 #pragma omp ordered // expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} 37 { 38 foo(); 39 } 40 } 41 #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}} 42 for (int i = 0; i < 10; ++i) { 43 #pragma omp ordered threads // expected-error {{'ordered' directive with 'threads' clause cannot be closely nested inside ordered region with specified parameter}} 44 { 45 foo(); 46 } 47 } 48 #pragma omp ordered simd simd // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'simd' clause}} 49 { 50 foo(); 51 } 52 #pragma omp simd 53 for (int i = 0; i < 10; ++i) { 54 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 55 { 56 foo(); 57 } 58 } 59 #pragma omp simd 60 for (int i = 0; i < 10; ++i) { 61 #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}} 62 { 63 foo(); 64 } 65 } 66 #pragma omp for simd 67 for (int i = 0; i < 10; ++i) { 68 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 69 { 70 foo(); 71 } 72 } 73 #pragma omp for simd 74 for (int i = 0; i < 10; ++i) { 75 #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}} 76 { 77 foo(); 78 } 79 } 80 #pragma omp parallel for simd 81 for (int i = 0; i < 10; ++i) { 82 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 83 { 84 foo(); 85 } 86 } 87 #pragma omp parallel for simd 88 for (int i = 0; i < 10; ++i) { 89 #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}} 90 { 91 foo(); 92 } 93 } 94 95 return T(); 96 } 97 98 int foo() { 99 #pragma omp for ordered 100 for (int i = 0; i < 10; ++i) { 101 L1: 102 foo(); 103 #pragma omp ordered 104 { 105 foo(); 106 goto L1; // expected-error {{use of undeclared label 'L1'}} 107 } 108 } 109 #pragma omp for ordered 110 for (int i = 0; i < 10; ++i) { 111 foo(); 112 goto L2; // expected-error {{use of undeclared label 'L2'}} 113 #pragma omp ordered 114 { 115 L2: 116 foo(); 117 } 118 } 119 #pragma omp for ordered 120 for (int i = 0; i < 10; ++i) { 121 #pragma omp ordered threads threads // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'threads' clause}} 122 { 123 foo(); 124 } 125 } 126 #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}} 127 for (int i = 0; i < 10; ++i) { 128 #pragma omp ordered // expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} 129 { 130 foo(); 131 } 132 } 133 #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}} 134 for (int i = 0; i < 10; ++i) { 135 #pragma omp ordered threads // expected-error {{'ordered' directive with 'threads' clause cannot be closely nested inside ordered region with specified parameter}} 136 { 137 foo(); 138 } 139 } 140 #pragma omp ordered simd simd // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'simd' clause}} 141 { 142 foo(); 143 } 144 #pragma omp simd 145 for (int i = 0; i < 10; ++i) { 146 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 147 { 148 foo(); 149 } 150 } 151 #pragma omp simd 152 for (int i = 0; i < 10; ++i) { 153 #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}} 154 { 155 foo(); 156 } 157 } 158 #pragma omp for simd 159 for (int i = 0; i < 10; ++i) { 160 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 161 { 162 foo(); 163 } 164 } 165 #pragma omp for simd 166 for (int i = 0; i < 10; ++i) { 167 #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}} 168 { 169 foo(); 170 } 171 } 172 #pragma omp parallel for simd 173 for (int i = 0; i < 10; ++i) { 174 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 175 { 176 foo(); 177 } 178 } 179 #pragma omp parallel for simd 180 for (int i = 0; i < 10; ++i) { 181 #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}} 182 { 183 foo(); 184 } 185 } 186 187 return foo<int>(); 188 } 189