Hal Finkel | bcc0608 | 2014-09-07 22:58:14 +0000 | [diff] [blame] | 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}} |
Hal Finkel | e65e0a1 | 2014-09-08 00:09:15 +0000 | [diff] [blame] | 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); |
Hal Finkel | bcc0608 | 2014-09-07 22:58:14 +0000 | [diff] [blame] | 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 | |
Hal Finkel | ee90a22 | 2014-09-26 05:04:30 +0000 | [diff] [blame] | 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 functions and methods}} |
| 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 | |