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()848ff3541Ssmanna12void 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()6248ff3541Ssmanna12void 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()8548ff3541Ssmanna12int main() { 8648ff3541Ssmanna12 code_align_cpp<32, 4>(); 8748ff3541Ssmanna12 return 0; 8848ff3541Ssmanna12 } 8948ff3541Ssmanna12 #endif 90