xref: /llvm-project/clang/test/Sema/code_align.c (revision 324436c29ffd14bcf96c94500d5e43391f2b1e51)
19cd617c5Ssmanna12 // RUN: %clang_cc1 -triple x86_64-pc-linux -fsyntax-only -verify=expected,c-local -x c %s
29cd617c5Ssmanna12 // RUN: %clang_cc1 -triple x86_64-pc-linux -fsyntax-only -verify=expected,cpp-local -pedantic -x c++ -std=c++11 %s
348ff3541Ssmanna12 
foo()448ff3541Ssmanna12 void foo() {
548ff3541Ssmanna12   int i;
648ff3541Ssmanna12   int a[10], b[10];
748ff3541Ssmanna12 
848ff3541Ssmanna12   [[clang::code_align(8)]]
948ff3541Ssmanna12   for (i = 0; i < 10; ++i) {  // this is OK
1048ff3541Ssmanna12     a[i] = b[i] = 0;
1148ff3541Ssmanna12   }
1248ff3541Ssmanna12   // expected-error@+1{{'code_align' attribute only applies to 'for', 'while', and 'do' statements}}
1348ff3541Ssmanna12   [[clang::code_align(4)]]
1448ff3541Ssmanna12   i = 7;
1548ff3541Ssmanna12   for (i = 0; i < 10; ++i) {
1648ff3541Ssmanna12     a[i] = b[i] = 0;
1748ff3541Ssmanna12   }
1848ff3541Ssmanna12 
1948ff3541Ssmanna12   // expected-error@+1{{'code_align' attribute cannot be applied to a declaration}}
2048ff3541Ssmanna12   [[clang::code_align(12)]] int n[10];
2148ff3541Ssmanna12 }
2248ff3541Ssmanna12 
2348ff3541Ssmanna12 void bar(int);
2448ff3541Ssmanna12 // cpp-local-note@+1{{declared here}}
foo1(int A)2548ff3541Ssmanna12 void foo1(int A)
2648ff3541Ssmanna12 {
2748ff3541Ssmanna12   // expected-error@+1{{'code_align' attribute requires an integer argument which is a constant power of two between 1 and 4096 inclusive; provided argument was 0}}
2848ff3541Ssmanna12   [[clang::code_align(0)]]
2948ff3541Ssmanna12   for(int I=0; I<128; ++I) { bar(I); }
3048ff3541Ssmanna12 
3148ff3541Ssmanna12   // expected-error@+1{{'code_align' attribute requires an integer argument which is a constant power of two between 1 and 4096 inclusive; provided argument was -4}}
3248ff3541Ssmanna12   [[clang::code_align(-4)]]
3348ff3541Ssmanna12   for(int I=0; I<128; ++I) { bar(I); }
3448ff3541Ssmanna12 
3548ff3541Ssmanna12     // cpp-local-error@+2{{integral constant expression must have integral or unscoped enumeration type, not 'double'}}
3648ff3541Ssmanna12     // c-local-error@+1{{integer constant expression must have integer type, not 'double'}}
3748ff3541Ssmanna12   [[clang::code_align(64.0)]]
3848ff3541Ssmanna12   for(int I=0; I<128; ++I) { bar(I); }
3948ff3541Ssmanna12 
4048ff3541Ssmanna12   // expected-error@+1{{'code_align' attribute takes one argument}}
4148ff3541Ssmanna12   [[clang::code_align()]]
4248ff3541Ssmanna12   for(int I=0; I<128; ++I) { bar(I); }
4348ff3541Ssmanna12 
4448ff3541Ssmanna12   // expected-error@+1{{'code_align' attribute takes one argument}}
4548ff3541Ssmanna12   [[clang::code_align(4,8)]]
4648ff3541Ssmanna12   for(int I=0; I<128; ++I) { bar(I); }
4748ff3541Ssmanna12 
4848ff3541Ssmanna12   // no diagnostic is expected
4948ff3541Ssmanna12   [[clang::code_align(32)]]
5048ff3541Ssmanna12   for(int I=0; I<128; ++I) { bar(I); }
5148ff3541Ssmanna12 
5248ff3541Ssmanna12   // cpp-local-error@+2{{integral constant expression must have integral or unscoped enumeration type, not 'const char[4]'}}
5348ff3541Ssmanna12   // c-local-error@+1{{integer constant expression must have integer type, not 'char[4]'}}
5448ff3541Ssmanna12   [[clang::code_align("abc")]]
5548ff3541Ssmanna12   for(int I=0; I<128; ++I) { bar(I); }
5648ff3541Ssmanna12 
5748ff3541Ssmanna12   [[clang::code_align(64)]] // OK
5848ff3541Ssmanna12   [[clang::code_align(64)]] // OK
5948ff3541Ssmanna12   for(int I=0; I<128; ++I) { bar(I); }
6048ff3541Ssmanna12 
6148ff3541Ssmanna12   [[clang::code_align(8)]]  // expected-note{{previous attribute is here}}
6248ff3541Ssmanna12   [[clang::code_align(64)]] // expected-error{{conflicting loop attribute 'code_align'}}
6348ff3541Ssmanna12   for(int I=0; I<128; ++I) { bar(I); }
6448ff3541Ssmanna12 
65*324436c2Ssmanna12   [[clang::code_align(4)]] // expected-note{{previous attribute is here}}
66*324436c2Ssmanna12   [[clang::code_align(4)]] // OK
67*324436c2Ssmanna12   [[clang::code_align(8)]] // expected-error{{conflicting loop attribute 'code_align'}}
68*324436c2Ssmanna12   for(int I=0; I<128; ++I) { bar(I); }
69*324436c2Ssmanna12 
70*324436c2Ssmanna12   [[clang::code_align(4)]]  // expected-note 2{{previous attribute is here}}
71*324436c2Ssmanna12   [[clang::code_align(4)]]  // OK
72*324436c2Ssmanna12   [[clang::code_align(8)]]  // expected-error{{conflicting loop attribute 'code_align'}}
73*324436c2Ssmanna12   [[clang::code_align(64)]] // expected-error{{conflicting loop attribute 'code_align'}}
74*324436c2Ssmanna12   for(int I=0; I<128; ++I) { bar(I); }
75*324436c2Ssmanna12 
7648ff3541Ssmanna12   // expected-error@+1{{'code_align' attribute requires an integer argument which is a constant power of two between 1 and 4096 inclusive; provided argument was 7}}
7748ff3541Ssmanna12   [[clang::code_align(7)]]
7848ff3541Ssmanna12   for(int I=0; I<128; ++I) { bar(I); }
7948ff3541Ssmanna12 
8048ff3541Ssmanna12   // expected-error@+1{{'code_align' attribute requires an integer argument which is a constant power of two between 1 and 4096 inclusive; provided argument was 5000}}
8148ff3541Ssmanna12   [[clang::code_align(5000)]]
8248ff3541Ssmanna12   for(int I=0; I<128; ++I) { bar(I); }
8348ff3541Ssmanna12 
8448ff3541Ssmanna12   // expected-warning@+2{{integer literal is too large to be represented in a signed integer type, interpreting as unsigned}}
8548ff3541Ssmanna12   // expected-error@+1{{'code_align' attribute requires an integer argument which is a constant power of two between 1 and 4096 inclusive; provided argument was -9223372036854775808}}
8648ff3541Ssmanna12   [[clang::code_align(9223372036854775808)]]
8748ff3541Ssmanna12   for(int I=0; I<256; ++I) { bar(I); }
8848ff3541Ssmanna12 
89ce800c27SMuhammad Omair Javaid #ifdef __SIZEOF_INT128__
9048ff3541Ssmanna12   // expected-error@+1{{'code_align' attribute requires an integer argument which is a constant power of two between 1 and 4096 inclusive; provided argument was (__int128_t)1311768467294899680ULL << 64}}
9148ff3541Ssmanna12   [[clang::code_align((__int128_t)0x1234567890abcde0ULL << 64)]]
9248ff3541Ssmanna12   for(int I=0; I<256; ++I) { bar(I); }
93ce800c27SMuhammad Omair Javaid #endif
9448ff3541Ssmanna12 
9548ff3541Ssmanna12   // expected-error@+1 {{'code_align' attribute requires an integer argument which is a constant power of two between 1 and 4096 inclusive; provided argument was -922337203685477}}
9648ff3541Ssmanna12   [[clang::code_align(-922337203685477)]]
9748ff3541Ssmanna12   for(int I=0; I<256; ++I) { bar(I); }
9848ff3541Ssmanna12 
99ce800c27SMuhammad Omair Javaid #ifdef __SIZEOF_INT128__
10048ff3541Ssmanna12   // cpp-local-error@+3{{expression is not an integral constant expression}}
10148ff3541Ssmanna12   // cpp-local-note@+2{{left shift of negative value -1311768467294899680}}
10248ff3541Ssmanna12   // c-local-error@+1{{'code_align' attribute requires an integer argument which is a constant power of two between 1 and 4096 inclusive; provided argument was -(__int128_t)1311768467294899680ULL << 64}}
10348ff3541Ssmanna12   [[clang::code_align(-(__int128_t)0x1234567890abcde0ULL << 64)]]
10448ff3541Ssmanna12   for(int I=0; I<256; ++I) { bar(I); }
105ce800c27SMuhammad Omair Javaid #endif
10648ff3541Ssmanna12 
10748ff3541Ssmanna12   // cpp-local-error@+3{{expression is not an integral constant expression}}
10848ff3541Ssmanna12   // cpp-local-note@+2{{function parameter 'A' with unknown value cannot be used in a constant expression}}
10948ff3541Ssmanna12   // c-local-error@+1{{expression is not an integer constant expression}}
11048ff3541Ssmanna12   [[clang::code_align(A)]]
11148ff3541Ssmanna12   for(int I=0; I<128; ++I) { bar(I); }
11248ff3541Ssmanna12 }
11348ff3541Ssmanna12 
check_code_align_expression()11448ff3541Ssmanna12 void check_code_align_expression() {
11548ff3541Ssmanna12   int a[10];
11648ff3541Ssmanna12 
11748ff3541Ssmanna12   // Test that checks expression is not a constant expression.
11848ff3541Ssmanna12   int foo2; // cpp-local-note {{declared here}}
11948ff3541Ssmanna12   // c-local-error@+3{{expression is not an integer constant expression}}
12048ff3541Ssmanna12   // cpp-local-error@+2{{expression is not an integral constant expression}}
12148ff3541Ssmanna12   // cpp-local-note@+1{{read of non-const variable 'foo2' is not allowed in a constant expression}}
12248ff3541Ssmanna12   [[clang::code_align(foo2 + 1)]]
12348ff3541Ssmanna12   for (int i = 0; i != 10; ++i)
12448ff3541Ssmanna12     a[i] = 0;
12548ff3541Ssmanna12 
12648ff3541Ssmanna12 #if __cplusplus >= 201103L
12748ff3541Ssmanna12   // Test that checks expression is a constant expression.
12848ff3541Ssmanna12   constexpr int bars = 0;
12948ff3541Ssmanna12   [[clang::code_align(bars + 1)]]
13048ff3541Ssmanna12   for (int i = 0; i != 10; ++i)
13148ff3541Ssmanna12     a[i] = 0;
13248ff3541Ssmanna12 #endif
13348ff3541Ssmanna12 }
13448ff3541Ssmanna12 
13548ff3541Ssmanna12 #if __cplusplus >= 201103L
13648ff3541Ssmanna12 template <int A, int B, int C, int D, int E>
code_align_dependent()13748ff3541Ssmanna12 void code_align_dependent() {
13848ff3541Ssmanna12   [[clang::code_align(C)]]
13948ff3541Ssmanna12   for(int I=0; I<128; ++I) { bar(I); }
14048ff3541Ssmanna12 
14148ff3541Ssmanna12   [[clang::code_align(A)]] // OK
14248ff3541Ssmanna12   [[clang::code_align(A)]] // OK
14348ff3541Ssmanna12   for(int I=0; I<128; ++I) { bar(I); }
14448ff3541Ssmanna12 
1459cd617c5Ssmanna12   [[clang::code_align(A)]] // cpp-local-note{{previous attribute is here}}
14648ff3541Ssmanna12   [[clang::code_align(E)]] // cpp-local-error{{conflicting loop attribute 'code_align'}}
14748ff3541Ssmanna12   for(int I=0; I<128; ++I) { bar(I); }
14848ff3541Ssmanna12 
149*324436c2Ssmanna12   [[clang::code_align(A)]] // cpp-local-note{{previous attribute is here}}
150*324436c2Ssmanna12   [[clang::code_align(A)]] // OK
151*324436c2Ssmanna12   [[clang::code_align(E)]] // cpp-local-error{{conflicting loop attribute 'code_align'}}
152*324436c2Ssmanna12   for(int I=0; I<128; ++I) { bar(I); }
153*324436c2Ssmanna12 
154*324436c2Ssmanna12   [[clang::code_align(A)]] // cpp-local-note 2{{previous attribute is here}}
155*324436c2Ssmanna12   [[clang::code_align(A)]] // OK
156*324436c2Ssmanna12   [[clang::code_align(C)]] // cpp-local-error{{conflicting loop attribute 'code_align'}}
157*324436c2Ssmanna12   [[clang::code_align(E)]] // cpp-local-error{{conflicting loop attribute 'code_align'}}
158*324436c2Ssmanna12   for(int I=0; I<128; ++I) { bar(I); }
159*324436c2Ssmanna12 
16048ff3541Ssmanna12   // cpp-local-error@+1{{'code_align' attribute requires an integer argument which is a constant power of two between 1 and 4096 inclusive; provided argument was 23}}
16148ff3541Ssmanna12   [[clang::code_align(B)]]
16248ff3541Ssmanna12   for(int I=0; I<128; ++I) { bar(I); }
16348ff3541Ssmanna12 
16448ff3541Ssmanna12   // cpp-local-error@+2{{'code_align' attribute requires an integer argument which is a constant power of two between 1 and 4096 inclusive; provided argument was -10}}
16548ff3541Ssmanna12   // cpp-local-note@#neg-instantiation{{in instantiation of function template specialization 'code_align_dependent<8, 23, 32, -10, 64>' requested here}}
16648ff3541Ssmanna12   [[clang::code_align(D)]]
16748ff3541Ssmanna12   for(int I=0; I<128; ++I) { bar(I); }
16848ff3541Ssmanna12 }
16948ff3541Ssmanna12 
17048ff3541Ssmanna12 template<int ITMPL>
bar3()17148ff3541Ssmanna12 void bar3() {
1729cd617c5Ssmanna12   [[clang::code_align(8)]]      // cpp-local-note{{previous attribute is here}}
17348ff3541Ssmanna12   [[clang::code_align(ITMPL)]] // cpp-local-error{{conflicting loop attribute 'code_align'}} \
17448ff3541Ssmanna12 	                       // cpp-local-note@#temp-instantiation{{in instantiation of function template specialization 'bar3<4>' requested here}}
17548ff3541Ssmanna12   for(int I=0; I<128; ++I) { bar(I); }
17648ff3541Ssmanna12 }
17748ff3541Ssmanna12 
17848ff3541Ssmanna12 template<int ITMPL1>
bar4()17948ff3541Ssmanna12 void bar4() {
1809cd617c5Ssmanna12   [[clang::code_align(ITMPL1)]] // cpp-local-note{{previous attribute is here}}
18148ff3541Ssmanna12   [[clang::code_align(32)]]    // cpp-local-error{{conflicting loop attribute 'code_align'}} \
18248ff3541Ssmanna12 	                       // cpp-local-note@#temp-instantiation1{{in instantiation of function template specialization 'bar4<64>' requested here}}
18348ff3541Ssmanna12   for(int I=0; I<128; ++I) { bar(I); }
18448ff3541Ssmanna12 }
18548ff3541Ssmanna12 
main()18648ff3541Ssmanna12 int main() {
18748ff3541Ssmanna12   code_align_dependent<8, 23, 32, -10, 64>(); // #neg-instantiation
18848ff3541Ssmanna12   bar3<4>();  // #temp-instantiation
18948ff3541Ssmanna12   bar4<64>(); // #temp-instantiation1
19048ff3541Ssmanna12   return 0;
19148ff3541Ssmanna12 }
19248ff3541Ssmanna12 #endif
193