xref: /llvm-project/clang/test/Sema/code_align_ast.c (revision 7c1d9b15eee3a34678addab2bab66f3020ac0753)
1*7c1d9b15SFangrui Song // RUN: %clang_cc1 -ast-dump -verify -x c %s | FileCheck -check-prefix=CHECK-C %s
2*7c1d9b15SFangrui Song // RUN: %clang_cc1 -ast-dump -x c++ -std=c++11 %s | FileCheck %s --check-prefixes CHECK-C,CHECK-CPP
348ff3541Ssmanna12 
448ff3541Ssmanna12 // expected-no-diagnostics
548ff3541Ssmanna12 
648ff3541Ssmanna12 void bar(int);
748ff3541Ssmanna12 // CHECK-C: FunctionDecl{{.*}}code_align 'void ()'
code_align()848ff3541Ssmanna12 void code_align() {
948ff3541Ssmanna12   int a1[10], a2[10];
1048ff3541Ssmanna12   // CHECK-C: AttributedStmt
1148ff3541Ssmanna12   // CHECK-C-NEXT: CodeAlignAttr
1248ff3541Ssmanna12   // CHECK-C-NEXT:  ConstantExpr{{.*}}'int'
1348ff3541Ssmanna12   // CHECK-C-NEXT:  value: Int 16
1448ff3541Ssmanna12   // CHECK-C-NEXT:  IntegerLiteral{{.*}}16{{$}}
1548ff3541Ssmanna12   [[clang::code_align(16)]] for (int p = 0; p < 128; ++p) {
1648ff3541Ssmanna12     a1[p] = a2[p] = 0;
1748ff3541Ssmanna12   }
1848ff3541Ssmanna12 
1948ff3541Ssmanna12   // CHECK-C: AttributedStmt
2048ff3541Ssmanna12   // CHECK-C-NEXT:  CodeAlignAttr
2148ff3541Ssmanna12   // CHECK-C-NEXT:  ConstantExpr{{.*}}'int'
2248ff3541Ssmanna12   // CHECK-C-NEXT:  value: Int 4
2348ff3541Ssmanna12   // CHECK-C-NEXT:  IntegerLiteral{{.*}}4{{$}}
2448ff3541Ssmanna12   int i = 0;
2548ff3541Ssmanna12   [[clang::code_align(4)]] while (i < 30) {
2648ff3541Ssmanna12     a1[i] += 3;
2748ff3541Ssmanna12   }
2848ff3541Ssmanna12 
2948ff3541Ssmanna12   // CHECK-C: AttributedStmt
3048ff3541Ssmanna12   // CHECK-C-NEXT:  CodeAlignAttr
3148ff3541Ssmanna12   // CHECK-C-NEXT:  ConstantExpr{{.*}}'int'
3248ff3541Ssmanna12   // CHECK-C-NEXT:  value: Int 32
3348ff3541Ssmanna12   // CHECK-C-NEXT:  IntegerLiteral{{.*}}32{{$}}
3448ff3541Ssmanna12   for (int i = 0; i < 128; ++i) {
3548ff3541Ssmanna12     [[clang::code_align(32)]]  for (int j = 0; j < 128; ++j) {
3648ff3541Ssmanna12       a1[i] += a1[j];
3748ff3541Ssmanna12     }
3848ff3541Ssmanna12   }
3948ff3541Ssmanna12 
4048ff3541Ssmanna12   // CHECK-C: AttributedStmt
4148ff3541Ssmanna12   // CHECK-C-NEXT:  CodeAlignAttr
4248ff3541Ssmanna12   // CHECK-C-NEXT:  ConstantExpr{{.*}}'int'
4348ff3541Ssmanna12   // CHECK-C-NEXT:  value: Int 64
4448ff3541Ssmanna12   // CHECK-C-NEXT:  IntegerLiteral{{.*}}64{{$}}
4548ff3541Ssmanna12   [[clang::code_align(64)]]
4648ff3541Ssmanna12   for(int I=0; I<128; ++I) { bar(I); }
4748ff3541Ssmanna12 
4848ff3541Ssmanna12   // CHECK-C: AttributedStmt
4948ff3541Ssmanna12   // CHECK-C-NEXT: CodeAlignAttr
5048ff3541Ssmanna12   // CHECK-C-NEXT:  ConstantExpr{{.*}}'int'
5148ff3541Ssmanna12   // CHECK-C-NEXT:  value: Int 4
5248ff3541Ssmanna12   // CHECK-C-NEXT:  IntegerLiteral{{.*}}4{{$}}
5348ff3541Ssmanna12   int b = 10;
5448ff3541Ssmanna12   [[clang::code_align(4)]] do {
5548ff3541Ssmanna12     b = b + 1;
5648ff3541Ssmanna12   } while (b < 20);
5748ff3541Ssmanna12 }
5848ff3541Ssmanna12 
5948ff3541Ssmanna12 #if __cplusplus >= 201103L
6048ff3541Ssmanna12 //CHECK-CPP: FunctionDecl{{.*}}used code_align_cpp 'void ()' implicit_instantiation
6148ff3541Ssmanna12 template <int A, int B>
code_align_cpp()6248ff3541Ssmanna12 void code_align_cpp() {
6348ff3541Ssmanna12   int a[10];
6448ff3541Ssmanna12   // CHECK-CPP: AttributedStmt
6548ff3541Ssmanna12   // CHECK-CPP-NEXT:  CodeAlignAttr
6648ff3541Ssmanna12   // CHECK-CPP-NEXT:  ConstantExpr{{.*}}'int'
6748ff3541Ssmanna12   // CHECK-CPP-NEXT:  value: Int 32
6848ff3541Ssmanna12   // CHECK-CPP-NEXT:  SubstNonTypeTemplateParmExpr{{.*}}'int'
6948ff3541Ssmanna12   // CHECK-CPP-NEXT:  NonTypeTemplateParmDecl{{.*}}referenced 'int' depth 0 index 0 A
7048ff3541Ssmanna12   // CHECK-CPP-NEXT:  IntegerLiteral{{.*}}32{{$}}
7148ff3541Ssmanna12   [[clang::code_align(A)]] for (int i = 0; i != 10; ++i)
7248ff3541Ssmanna12     a[i] = 0;
7348ff3541Ssmanna12 
7448ff3541Ssmanna12   // CHECK-CPP: AttributedStmt
7548ff3541Ssmanna12   // CHECK-CPP-NEXT:  CodeAlignAttr
7648ff3541Ssmanna12   // CHECK-CPP-NEXT:  ConstantExpr{{.*}}'int'
7748ff3541Ssmanna12   // CHECK-CPP-NEXT:  value: Int 4
7848ff3541Ssmanna12   // CHECK-CPP-NEXT:  SubstNonTypeTemplateParmExpr{{.*}}'int'
7948ff3541Ssmanna12   // CHECK-CPP-NEXT:  NonTypeTemplateParmDecl{{.*}}referenced 'int' depth 0 index 1 B
8048ff3541Ssmanna12   // CHECK-CPP-NEXT:  IntegerLiteral{{.*}}4{{$}}
8148ff3541Ssmanna12   int c[] = {0, 1, 2, 3, 4, 5};
8248ff3541Ssmanna12   [[clang::code_align(B)]] for (int n : c) { n *= 2; }
8348ff3541Ssmanna12 }
8448ff3541Ssmanna12 
main()8548ff3541Ssmanna12 int main() {
8648ff3541Ssmanna12   code_align_cpp<32, 4>();
8748ff3541Ssmanna12   return 0;
8848ff3541Ssmanna12 }
8948ff3541Ssmanna12 #endif
90