232 lines · cpp
1// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -std=c++17 -fopenmp -fopenmp-version=60 -fsyntax-only -Wuninitialized -verify %s2 3void func() {4 5 // expected-error@+1 {{expected '('}}6 #pragma omp interchange permutation7 for (int i = 0; i < 7; ++i)8 for (int j = 0; j < 13; ++j)9 ;10 11 // expected-error@+2 {{expected expression}}12 // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}13 #pragma omp interchange permutation(14 for (int i = 0; i < 7; ++i)15 for (int j = 0; j < 13; ++j)16 ;17 18 // expected-error@+1 {{expected expression}}19 #pragma omp interchange permutation()20 for (int i = 0; i < 7; ++i)21 for (int j = 0; j < 13; ++j)22 ;23 24 // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}25 #pragma omp interchange permutation(126 for (int i = 0; i < 7; ++i)27 for (int j = 0; j < 13; ++j)28 ;29 30 // expected-error@+2 {{expected expression}}31 // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}32 #pragma omp interchange permutation(1,33 for (int i = 0; i < 7; ++i)34 for (int j = 0; j < 13; ++j)35 ;36 37 // expected-error@+1 {{expected expression}}38 #pragma omp interchange permutation(1,)39 for (int i = 0; i < 7; ++i)40 for (int j = 0; j < 13; ++j)41 ;42 43 // expected-error@+2 {{expected expression}}44 // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}45 #pragma omp interchange permutation(5+46 for (int i = 0; i < 7; ++i)47 for (int j = 0; j < 13; ++j)48 ;49 50 // expected-error@+1 {{expected expression}}51 #pragma omp interchange permutation(5+)52 for (int i = 0; i < 7; ++i)53 for (int j = 0; j < 13; ++j)54 ;55 56 // expected-error@+1 {{expected expression}}57 #pragma omp interchange permutation(for)58 for (int i = 0; i < 7; ++i)59 for (int j = 0; j < 13; ++j)60 ;61 62 // expected-error@+1 {{permutation index must be at least 1 and at most 1}}63 #pragma omp interchange permutation(0)64 for (int i = 0; i < 7; ++i)65 for (int j = 0; j < 13; ++j)66 ;67 68 // expected-error@+1 {{permutation index must be at least 1 and at most 2}}69 #pragma omp interchange permutation(1,3)70 for (int i = 0; i < 7; ++i)71 for (int j = 0; j < 13; ++j)72 ;73 74 // expected-error@+1 {{index 1 must appear exactly once in the permutation clause}}75 #pragma omp interchange permutation(1,1)76 for (int i = 0; i < 7; ++i)77 for (int j = 0; j < 13; ++j)78 ;79 80 // expected-error@+4 {{expression is not an integral constant expression}}81 // expected-note@+3 {{read of non-const variable 'a' is not allowed in a constant expression}}82 // expected-note@+1 {{declared here}}83 int a;84 #pragma omp interchange permutation(a)85 for (int i = 0; i < 7; ++i)86 for (int j = 0; j < 13; ++j)87 ;88 89 // expected-warning@+1 {{extra tokens at the end of '#pragma omp interchange' are ignored}}90 #pragma omp interchange foo91 for (int i = 0; i < 7; ++i)92 for (int j = 0; j < 13; ++j)93 ;94 95 // expected-error@+1 {{directive '#pragma omp interchange' cannot contain more than one 'permutation' clause}}96 #pragma omp interchange permutation(2,1) permutation(2,1)97 for (int i = 0; i < 7; ++i)98 for (int j = 0; j < 13; ++j)99 ;100 101 // expected-error@+1 {{unexpected OpenMP clause 'collapse' in directive '#pragma omp interchange'}}102 #pragma omp interchange collapse(2)103 for (int i = 0; i < 7; ++i)104 for (int j = 0; j < 13; ++j)105 ;106 107 {108 // expected-error@+2 {{expected statement}}109 #pragma omp interchange110 }111 112 // expected-error@+2 {{statement after '#pragma omp interchange' must be a for loop}}113 #pragma omp interchange114 int b = 0;115 116 // expected-error@+3 {{statement after '#pragma omp interchange' must be a for loop}}117 #pragma omp interchange118 for (int i = 0; i < 7; ++i)119 ;120 121 // expected-error@+2 {{statement after '#pragma omp interchange' must be a for loop}}122 #pragma omp interchange123 for (int i = 0; i < 7; ++i) {124 int k = 3;125 for (int j = 0; j < 7; ++j)126 ;127 }128 129 // expected-error@+3 {{expected loop invariant expression}}130 #pragma omp interchange131 for (int i = 0; i < 7; ++i)132 for (int j = i; j < 7; ++j)133 ;134 135 // expected-error@+3 {{expected loop invariant expression}}136 #pragma omp interchange137 for (int i = 0; i < 7; ++i)138 for (int j = 0; j < i; ++j)139 ;140 141 // expected-error@+3 {{expected loop invariant expression}}142 #pragma omp interchange143 for (int i = 0; i < 7; ++i)144 for (int j = 0; j < i; ++j)145 ;146 147 // expected-error@+6 {{expected 3 for loops after '#pragma omp for', but found only 2}}148 // expected-note@+1 {{as specified in 'collapse' clause}}149 #pragma omp for collapse(3)150 #pragma omp interchange 151 for (int i = 0; i < 7; ++i)152 for (int j = 0; j < 13; ++j)153 ;154 155 // expected-error@+2 {{statement after '#pragma omp interchange' must be a for loop}}156 #pragma omp interchange157 #pragma omp for158 for (int i = 0; i < 7; ++i)159 ;160 161 // expected-error@+3 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'j'}}162 #pragma omp interchange 163 for (int i = 0; i < 7; ++i)164 for (int j = 0; j/3<7; ++j)165 ;166}167 168 169 170template <typename T>171static void templated_func() {172 // In a template context, but expression itself not instantiation-dependent173 174 // expected-error@+1 {{permutation index must be at least 1 and at most 2}}175 #pragma omp interchange permutation(0,1)176 for (int i = 0; i < 7; ++i)177 for (int j = 0; j<7; ++j)178 ;179 180 // expected-error@+1 {{index 1 must appear exactly once in the permutation clause}}181 #pragma omp interchange permutation(1,1)182 for (int i = 0; i < 7; ++i)183 for (int j = 0; j<7; ++j)184 ;185}186 187 188 189template <int S>190static void templated_func_value_dependent() {191 // expected-error@+1 {{permutation index must be at least 1 and at most 2}}192 #pragma omp interchange permutation(S,S+1)193 for (int i = 0; i < 7; ++i)194 for (int j = 0; j<7; ++j)195 ;196 197 // expected-error@+1 {{index 1 must appear exactly once in the permutation clause}}198 #pragma omp interchange permutation(S+1,S+1)199 for (int i = 0; i < 7; ++i)200 for (int j = 0; j<7; ++j)201 ;202}203 204 205template <typename T>206static void templated_func_type_dependent() {207 constexpr T s = 0;208 209 // expected-error@+1 {{permutation index must be at least 1 and at most 2}}210 #pragma omp interchange permutation(s,s+1)211 for (int i = 0; i < 7; ++i)212 for (int j = 0; j<7; ++j)213 ;214 215 // expected-error@+1 {{index 1 must appear exactly once in the permutation clause}}216 #pragma omp interchange permutation(s+1,s+1)217 for (int i = 0; i < 7; ++i)218 for (int j = 0; j<7; ++j)219 ;220}221 222 223void template_inst() {224 // expected-note@+1 {{in instantiation of function template specialization 'templated_func<int>' requested here}}225 templated_func<int>();226 // expected-note@+1 {{in instantiation of function template specialization 'templated_func_value_dependent<0>' requested here}}227 templated_func_value_dependent<0>();228 // expected-note@+1 {{in instantiation of function template specialization 'templated_func_type_dependent<int>' requested here}}229 templated_func_type_dependent<int>();230}231 232