1 // RUN: %clang_cc1 -std=c++11 -verify %s 2 3 // Note that this puts the expected lines before the directives to work around 4 // limitations in the -verify mode. 5 6 void test(int *List, int Length) { 7 int i = 0; 8 9 #pragma clang loop vectorize(enable) 10 #pragma clang loop interleave(enable) 11 while (i + 1 < Length) { 12 List[i] = i; 13 } 14 15 #pragma clang loop vectorize_width(4) 16 #pragma clang loop interleave_count(8) 17 while (i < Length) { 18 List[i] = i; 19 } 20 21 #pragma clang loop vectorize(disable) 22 #pragma clang loop interleave(disable) 23 while (i - 1 < Length) { 24 List[i] = i; 25 } 26 27 #pragma clang loop vectorize_width(4) interleave_count(8) 28 while (i - 2 < Length) { 29 List[i] = i; 30 } 31 32 #pragma clang loop interleave_count(16) 33 while (i - 3 < Length) { 34 List[i] = i; 35 } 36 37 int VList[Length]; 38 #pragma clang loop vectorize(disable) interleave(disable) 39 for (int j : VList) { 40 VList[j] = List[j]; 41 } 42 43 /* expected-error {{expected '('}} */ #pragma clang loop vectorize 44 /* expected-error {{expected '('}} */ #pragma clang loop interleave 45 46 /* expected-error {{expected ')'}} */ #pragma clang loop vectorize(enable 47 /* expected-error {{expected ')'}} */ #pragma clang loop interleave(enable 48 49 /* expected-error {{expected ')'}} */ #pragma clang loop vectorize_width(4 50 /* expected-error {{expected ')'}} */ #pragma clang loop interleave_count(4 51 52 /* expected-error {{missing option}} */ #pragma clang loop 53 /* expected-error {{invalid option 'badkeyword'}} */ #pragma clang loop badkeyword 54 /* expected-error {{invalid option 'badkeyword'}} */ #pragma clang loop badkeyword(enable) 55 /* expected-error {{invalid option 'badkeyword'}} */ #pragma clang loop vectorize(enable) badkeyword(4) 56 /* expected-warning {{extra tokens at end of '#pragma clang loop'}} */ #pragma clang loop vectorize(enable) , 57 58 while (i-4 < Length) { 59 List[i] = i; 60 } 61 62 /* expected-error {{invalid value 0; expected a positive integer value}} */ #pragma clang loop vectorize_width(0) 63 /* expected-error {{invalid value 0; expected a positive integer value}} */ #pragma clang loop interleave_count(0) 64 while (i-5 < Length) { 65 List[i] = i; 66 } 67 68 /* expected-error {{invalid value -1294967296; expected a positive integer value}} */ #pragma clang loop vectorize_width(3000000000) 69 /* expected-error {{invalid value -1294967296; expected a positive integer value}} */ #pragma clang loop interleave_count(3000000000) 70 while (i-6 < Length) { 71 List[i] = i; 72 } 73 74 /* expected-error {{missing value; expected a positive integer value}} */ #pragma clang loop vectorize_width(badvalue) 75 /* expected-error {{missing value; expected a positive integer value}} */ #pragma clang loop interleave_count(badvalue) 76 while (i-6 < Length) { 77 List[i] = i; 78 } 79 80 /* expected-error {{invalid keyword 'badidentifier'; expected 'enable' or 'disable'}} */ #pragma clang loop vectorize(badidentifier) 81 /* expected-error {{invalid keyword 'badidentifier'; expected 'enable' or 'disable'}} */ #pragma clang loop interleave(badidentifier) 82 while (i-7 < Length) { 83 List[i] = i; 84 } 85 86 #pragma clang loop vectorize(enable) 87 /* expected-error {{expected a for, while, or do-while loop to follow the '#pragma clang loop' directive}} */ int j = Length; 88 List[0] = List[1]; 89 90 while (j-1 < Length) { 91 List[j] = j; 92 } 93 94 // FIXME: A bug in ParsedAttributes causes the order of the attributes to be 95 // processed in reverse. Consequently, the errors occur on the first of pragma 96 // of the next three tests rather than the last, and the order of the kinds 97 // is also reversed. 98 99 /* expected-error {{incompatible directives 'vectorize(disable)' and 'vectorize_width(4)'}} */ #pragma clang loop vectorize_width(4) 100 #pragma clang loop vectorize(disable) 101 /* expected-error {{incompatible directives 'interleave(disable)' and 'interleave_count(4)'}} */ #pragma clang loop interleave_count(4) 102 #pragma clang loop interleave(disable) 103 while (i-8 < Length) { 104 List[i] = i; 105 } 106 107 /* expected-error {{duplicate directives 'vectorize(disable)' and 'vectorize(enable)'}} */ #pragma clang loop vectorize(enable) 108 #pragma clang loop vectorize(disable) 109 /* expected-error {{duplicate directives 'interleave(disable)' and 'interleave(enable)'}} */ #pragma clang loop interleave(enable) 110 #pragma clang loop interleave(disable) 111 while (i-9 < Length) { 112 List[i] = i; 113 } 114 115 /* expected-error {{incompatible directives 'vectorize_width(4)' and 'vectorize(disable)'}} */ #pragma clang loop vectorize(disable) 116 #pragma clang loop vectorize_width(4) 117 /* expected-error {{incompatible directives 'interleave_count(4)' and 'interleave(disable)'}} */ #pragma clang loop interleave(disable) 118 #pragma clang loop interleave_count(4) 119 while (i-10 < Length) { 120 List[i] = i; 121 } 122 123 /* expected-error {{duplicate directives 'vectorize_width(4)' and 'vectorize_width(8)'}} */ #pragma clang loop vectorize_width(8) 124 #pragma clang loop vectorize_width(4) 125 /* expected-error {{duplicate directives 'interleave_count(4)' and 'interleave_count(8)'}} */ #pragma clang loop interleave_count(8) 126 #pragma clang loop interleave_count(4) 127 while (i-11 < Length) { 128 List[i] = i; 129 } 130 131 #pragma clang loop interleave(enable) 132 /* expected-error {{expected statement}} */ } 133