| /* Verify __builtin_has_attribute error handling. |
| { dg-do compile } |
| { dg-options "-Wall -ftrack-macro-expansion=0" } */ |
| |
| #define ATTR(list) __attribute__ (list) |
| |
| void fnone (void); |
| |
| ATTR ((aligned)) void faligned (void); |
| ATTR ((aligned (8))) void faligned_8 (void); |
| |
| #define has_attr(x, attr) __builtin_has_attribute (x, attr) |
| |
| #define A(expect, sym, attr) \ |
| typedef int Assert [1 - 2 * !(has_attr (sym, attr) == expect)] |
| |
| |
| int b; |
| |
| /* Exercise syntactically invalid arguments. */ |
| |
| void test_bad_arguments (void) |
| { |
| b = __builtin_has_attribute (); /* { dg-error "expected \(primary-\)?expression|expected .,." } */ |
| b = __builtin_has_attribute (1); /* { dg-error "expected .,." } */ |
| b = __builtin_has_attribute (void); /* { dg-error "expected .,." } */ |
| b = __builtin_has_attribute (foo); /* { dg-error ".foo. \(undeclared|was not declared\)" } */ |
| /* { dg-error "expected .,." "missing comma" { target *-*-* } .-1 } */ |
| |
| /* Verify the implementationm doesn't ICE. */ |
| b = __builtin_has_attribute (foobar, aligned); /* { dg-error ".foobar. \(undeclared|was not declared\)" } */ |
| |
| b = __builtin_has_attribute (1, 2, 3); /* { dg-error "expected identifier" } */ |
| b = __builtin_has_attribute (int, 1 + 2); /* { dg-error "expected identifier" } */ |
| b = __builtin_has_attribute (2, "aligned"); /* { dg-error "expected identifier" } */ |
| } |
| |
| /* Exercise syntactically valid arguments applied in invalid ways. */ |
| |
| void test_invalid_arguments (void) |
| { |
| b = has_attr (fnone, align); /* { dg-error "unknown attribute .align." } */ |
| b = has_attr (b, aligned__); /* { dg-error "unknown attribute .aligned__." } */ |
| b = has_attr (fnone, aligned (3)); /* { dg-error "alignment .3. is not a positive power of 2" } */ |
| |
| /* Verify the out-of-bounds arguments are diagnosed and the result |
| of the built-in is false. */ |
| A (0, fnone, alloc_size (1)); /* { dg-warning "\\\[-Wattributes]" } */ |
| A (0, fnone, alloc_size (2)); /* { dg-warning "\\\[-Wattributes]" } */ |
| |
| A (0, int, alloc_size (1)); /* { dg-warning ".alloc_size. attribute only applies to function types" } */ |
| |
| int i = 1; |
| A (0, i, alloc_size (1)); /* { dg-warning ".alloc_size. attribute only applies to function types" } */ |
| |
| A (0, faligned_8, aligned (i)); /* { dg-error "alignment is not an integer constant" } */ |
| |
| typedef ATTR ((aligned (2))) char CA2; |
| b = has_attr (CA2[2], aligned); /* { dg-error "alignment of array elements is greater than element size" } */ |
| } |