aboutsummaryrefslogtreecommitdiff
path: root/clang/test/Sema/code_align_ast.c
blob: c9b6466f0ae94d81c6435e93e0e3b9fbd4f45b98 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
// RUN: %clang_cc1 -ast-dump -verify -x c %s | FileCheck -check-prefix=CHECK-C %s
// RUN: %clang_cc1 -ast-dump -x c++ -std=c++11 %s | FileCheck %s --check-prefixes CHECK-C,CHECK-CPP

// expected-no-diagnostics

void bar(int);
// CHECK-C: FunctionDecl{{.*}}code_align 'void ()'
void code_align() {
  int a1[10], a2[10];
  // CHECK-C: AttributedStmt
  // CHECK-C-NEXT: CodeAlignAttr
  // CHECK-C-NEXT:  ConstantExpr{{.*}}'int'
  // CHECK-C-NEXT:  value: Int 16
  // CHECK-C-NEXT:  IntegerLiteral{{.*}}16{{$}}
  [[clang::code_align(16)]] for (int p = 0; p < 128; ++p) {
    a1[p] = a2[p] = 0;
  }

  // CHECK-C: AttributedStmt
  // CHECK-C-NEXT:  CodeAlignAttr
  // CHECK-C-NEXT:  ConstantExpr{{.*}}'int'
  // CHECK-C-NEXT:  value: Int 4
  // CHECK-C-NEXT:  IntegerLiteral{{.*}}4{{$}}
  int i = 0;
  [[clang::code_align(4)]] while (i < 30) {
    a1[i] += 3;
  }

  // CHECK-C: AttributedStmt
  // CHECK-C-NEXT:  CodeAlignAttr
  // CHECK-C-NEXT:  ConstantExpr{{.*}}'int'
  // CHECK-C-NEXT:  value: Int 32
  // CHECK-C-NEXT:  IntegerLiteral{{.*}}32{{$}}
  for (int i = 0; i < 128; ++i) {
    [[clang::code_align(32)]]  for (int j = 0; j < 128; ++j) {
      a1[i] += a1[j];
    }
  }

  // CHECK-C: AttributedStmt
  // CHECK-C-NEXT:  CodeAlignAttr
  // CHECK-C-NEXT:  ConstantExpr{{.*}}'int'
  // CHECK-C-NEXT:  value: Int 64
  // CHECK-C-NEXT:  IntegerLiteral{{.*}}64{{$}}
  [[clang::code_align(64)]]
  for(int I=0; I<128; ++I) { bar(I); }

  // CHECK-C: AttributedStmt
  // CHECK-C-NEXT: CodeAlignAttr
  // CHECK-C-NEXT:  ConstantExpr{{.*}}'int'
  // CHECK-C-NEXT:  value: Int 4
  // CHECK-C-NEXT:  IntegerLiteral{{.*}}4{{$}}
  int b = 10;
  [[clang::code_align(4)]] do {
    b = b + 1;
  } while (b < 20);
}

#if __cplusplus >= 201103L
//CHECK-CPP: FunctionDecl{{.*}}used code_align_cpp 'void ()' implicit_instantiation
template <int A, int B>
void code_align_cpp() {
  int a[10];
  // CHECK-CPP: AttributedStmt
  // CHECK-CPP-NEXT:  CodeAlignAttr
  // CHECK-CPP-NEXT:  ConstantExpr{{.*}}'int'
  // CHECK-CPP-NEXT:  value: Int 32
  // CHECK-CPP-NEXT:  SubstNonTypeTemplateParmExpr{{.*}}'int'
  // CHECK-CPP-NEXT:  NonTypeTemplateParmDecl{{.*}}referenced 'int' depth 0 index 0 A
  // CHECK-CPP-NEXT:  IntegerLiteral{{.*}}32{{$}}
  [[clang::code_align(A)]] for (int i = 0; i != 10; ++i)
    a[i] = 0;

  // CHECK-CPP: AttributedStmt
  // CHECK-CPP-NEXT:  CodeAlignAttr
  // CHECK-CPP-NEXT:  ConstantExpr{{.*}}'int'
  // CHECK-CPP-NEXT:  value: Int 4
  // CHECK-CPP-NEXT:  SubstNonTypeTemplateParmExpr{{.*}}'int'
  // CHECK-CPP-NEXT:  NonTypeTemplateParmDecl{{.*}}referenced 'int' depth 0 index 1 B
  // CHECK-CPP-NEXT:  IntegerLiteral{{.*}}4{{$}}
  int c[] = {0, 1, 2, 3, 4, 5};
  [[clang::code_align(B)]] for (int n : c) { n *= 2; }
}

int main() {
  code_align_cpp<32, 4>();
  return 0;
}
#endif