text: // 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
  