xref: /aosp_15_r20/external/clang/test/Sema/builtin-assume-aligned.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s
2*67e74705SXin Li 
test1(int * a)3*67e74705SXin Li int test1(int *a) {
4*67e74705SXin Li   a = __builtin_assume_aligned(a, 32, 0ull);
5*67e74705SXin Li   return a[0];
6*67e74705SXin Li }
7*67e74705SXin Li 
test2(int * a)8*67e74705SXin Li int test2(int *a) {
9*67e74705SXin Li   a = __builtin_assume_aligned(a, 32, 0);
10*67e74705SXin Li   return a[0];
11*67e74705SXin Li }
12*67e74705SXin Li 
test3(int * a)13*67e74705SXin Li int test3(int *a) {
14*67e74705SXin Li   a = __builtin_assume_aligned(a, 32);
15*67e74705SXin Li   return a[0];
16*67e74705SXin Li }
17*67e74705SXin Li 
test4(int * a)18*67e74705SXin Li int test4(int *a) {
19*67e74705SXin Li   a = __builtin_assume_aligned(a, -32); // expected-error {{requested alignment is not a power of 2}}
20*67e74705SXin Li   // FIXME: The line below produces {{requested alignment is not a power of 2}}
21*67e74705SXin Li   // on i386-freebsd, but not on x86_64-linux (for example).
22*67e74705SXin Li   // a = __builtin_assume_aligned(a, 1ULL << 63);
23*67e74705SXin Li   return a[0];
24*67e74705SXin Li }
25*67e74705SXin Li 
test5(int * a,unsigned * b)26*67e74705SXin Li int test5(int *a, unsigned *b) {
27*67e74705SXin Li   a = __builtin_assume_aligned(a, 32, b); // expected-warning {{incompatible pointer to integer conversion passing 'unsigned int *' to parameter of type}}
28*67e74705SXin Li   return a[0];
29*67e74705SXin Li }
30*67e74705SXin Li 
test6(int * a)31*67e74705SXin Li int test6(int *a) {
32*67e74705SXin Li   a = __builtin_assume_aligned(a, 32, 0, 0); // expected-error {{too many arguments to function call, expected at most 3, have 4}}
33*67e74705SXin Li   return a[0];
34*67e74705SXin Li }
35*67e74705SXin Li 
test7(int * a)36*67e74705SXin Li int test7(int *a) {
37*67e74705SXin Li   a = __builtin_assume_aligned(a, 31); // expected-error {{requested alignment is not a power of 2}}
38*67e74705SXin Li   return a[0];
39*67e74705SXin Li }
40*67e74705SXin Li 
test8(int * a,int j)41*67e74705SXin Li int test8(int *a, int j) {
42*67e74705SXin Li   a = __builtin_assume_aligned(a, j); // expected-error {{must be a constant integer}}
43*67e74705SXin Li   return a[0];
44*67e74705SXin Li }
45*67e74705SXin Li 
46*67e74705SXin Li void test_void_assume_aligned(void) __attribute__((assume_aligned(32))); // expected-warning {{'assume_aligned' attribute only applies to return values that are pointers}}
47*67e74705SXin Li int test_int_assume_aligned(void) __attribute__((assume_aligned(16))); // expected-warning {{'assume_aligned' attribute only applies to return values that are pointers}}
48*67e74705SXin Li void *test_ptr_assume_aligned(void) __attribute__((assume_aligned(64))); // no-warning
49*67e74705SXin Li 
50*67e74705SXin Li int j __attribute__((assume_aligned(8))); // expected-warning {{'assume_aligned' attribute only applies to functions and methods}}
51*67e74705SXin Li void *test_no_fn_proto() __attribute__((assume_aligned(32))); // no-warning
52*67e74705SXin Li void *test_with_fn_proto(void) __attribute__((assume_aligned(128))); // no-warning
53*67e74705SXin Li 
54*67e74705SXin Li void *test_no_fn_proto() __attribute__((assume_aligned(31))); // expected-error {{requested alignment is not a power of 2}}
55*67e74705SXin Li void *test_no_fn_proto() __attribute__((assume_aligned(32, 73))); // no-warning
56*67e74705SXin Li 
57*67e74705SXin Li void *test_no_fn_proto() __attribute__((assume_aligned)); // expected-error {{'assume_aligned' attribute takes at least 1 argument}}
58*67e74705SXin Li void *test_no_fn_proto() __attribute__((assume_aligned())); // expected-error {{'assume_aligned' attribute takes at least 1 argument}}
59*67e74705SXin Li void *test_no_fn_proto() __attribute__((assume_aligned(32, 45, 37))); // expected-error {{'assume_aligned' attribute takes no more than 2 arguments}}
60*67e74705SXin Li 
61