| // RUN: %clang_cc1 -emit-pch -o %t.a %s | 
 | // RUN: %clang_cc1 -include-pch %t.a %s -ast-print -o - | FileCheck %s | 
 |  | 
 | // FIXME: A bug in ParsedAttributes causes the order of the attributes to be | 
 | // reversed. The checks are consequently in the reverse order below. | 
 |  | 
 | // CHECK: #pragma clang loop unroll_count(16) | 
 | // CHECK: #pragma clang loop interleave_count(8) | 
 | // CHECK: #pragma clang loop vectorize_width(4) | 
 | // CHECK: #pragma clang loop distribute(enable) | 
 | // CHECK: #pragma clang loop unroll(disable) | 
 | // CHECK: #pragma clang loop interleave(disable) | 
 | // CHECK: #pragma clang loop vectorize(enable) | 
 | // CHECK: #pragma clang loop distribute(disable) | 
 | // CHECK: #pragma clang loop unroll(full) | 
 | // CHECK: #pragma clang loop interleave(enable) | 
 | // CHECK: #pragma clang loop vectorize(disable) | 
 | // CHECK: #pragma unroll | 
 | // CHECK: #pragma unroll (32) | 
 | // CHECK: #pragma nounroll | 
 | // CHECK: #pragma clang loop interleave_count(I) | 
 | // CHECK: #pragma clang loop vectorize_width(V) | 
 |  | 
 | #ifndef HEADER | 
 | #define HEADER | 
 |  | 
 | class pragma_test { | 
 | public: | 
 |   inline void run1(int *List, int Length) { | 
 |     int i = 0; | 
 | #pragma clang loop vectorize_width(4) | 
 | #pragma clang loop interleave_count(8) | 
 | #pragma clang loop unroll_count(16) | 
 |     while (i < Length) { | 
 |       List[i] = i; | 
 |       i++; | 
 |     } | 
 |   } | 
 |  | 
 |   inline void run2(int *List, int Length) { | 
 |     int i = 0; | 
 | #pragma clang loop vectorize(enable) | 
 | #pragma clang loop interleave(disable) | 
 | #pragma clang loop unroll(disable) | 
 | #pragma clang loop distribute(enable) | 
 |     while (i - 1 < Length) { | 
 |       List[i] = i; | 
 |       i++; | 
 |     } | 
 |   } | 
 |  | 
 |   inline void run3(int *List, int Length) { | 
 |     int i = 0; | 
 | #pragma clang loop vectorize(disable) | 
 | #pragma clang loop interleave(enable) | 
 | #pragma clang loop unroll(full) | 
 | #pragma clang loop distribute(disable) | 
 |     while (i - 3 < Length) { | 
 |       List[i] = i; | 
 |       i++; | 
 |     } | 
 |   } | 
 |  | 
 |   inline void run4(int *List, int Length) { | 
 |     int i = 0; | 
 | #pragma unroll | 
 |     while (i - 3 < Length) { | 
 |       List[i] = i; | 
 |       i++; | 
 |     } | 
 |   } | 
 |  | 
 |   inline void run5(int *List, int Length) { | 
 |     int i = 0; | 
 | #pragma unroll 32 | 
 |     while (i - 3 < Length) { | 
 |       List[i] = i; | 
 |       i++; | 
 |     } | 
 |   } | 
 |  | 
 |   inline void run6(int *List, int Length) { | 
 |     int i = 0; | 
 | #pragma nounroll | 
 |     while (i - 3 < Length) { | 
 |       List[i] = i; | 
 |       i++; | 
 |     } | 
 |   } | 
 |  | 
 |   template <int V, int I> | 
 |   inline void run7(int *List, int Length) { | 
 | #pragma clang loop vectorize_width(V) | 
 | #pragma clang loop interleave_count(I) | 
 |     for (int i = 0; i < Length; i++) { | 
 |       List[i] = i; | 
 |     } | 
 |   } | 
 | }; | 
 | #else | 
 |  | 
 | void test() { | 
 |   int List[100]; | 
 |  | 
 |   pragma_test pt; | 
 |  | 
 |   pt.run1(List, 100); | 
 |   pt.run2(List, 100); | 
 |   pt.run3(List, 100); | 
 |   pt.run4(List, 100); | 
 |   pt.run5(List, 100); | 
 |   pt.run6(List, 100); | 
 |   pt.run7<2, 4>(List, 100); | 
 | } | 
 |  | 
 | #endif |