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