| /* PR c/88363 - alloc_align attribute doesn't accept enumerated arguments |
| Verify that attribute positional arguments can refer to all C integer |
| types except _Bool in both C and C++. |
| { dg-do compile } |
| { dg-options "-Wall" } |
| { dg-options "-Wall -Wno-c++-compat" { target c } } */ |
| |
| #define ATTR(...) __attribute__ ((__VA_ARGS__)) |
| |
| #if __cplusplus == 199711L |
| typedef __CHAR16_TYPE__ char16_t; |
| typedef __CHAR32_TYPE__ char32_t; |
| #elif !__cplusplus |
| typedef _Bool bool; |
| typedef __CHAR16_TYPE__ char16_t; |
| typedef __CHAR32_TYPE__ char32_t; |
| typedef __WCHAR_TYPE__ wchar_t; |
| #endif |
| |
| enum A { A0 }; |
| |
| ATTR (alloc_align (1)) void* falloc_align_char (char); |
| ATTR (alloc_align (1)) void* falloc_align_char16 (char16_t); |
| ATTR (alloc_align (1)) void* falloc_align_char32 (char32_t); |
| ATTR (alloc_align (1)) void* falloc_align_wchar (wchar_t); |
| /* Using an enum might make sense in an API that limits the alignments |
| it accepts to just the set of the defined enumerators. */ |
| ATTR (alloc_align (1)) void* falloc_align_enum (enum A); |
| #ifdef __SIZEOF_INT128__ |
| ATTR (alloc_align (1)) void* falloc_align_int128 (__int128_t); |
| #endif |
| |
| |
| ATTR (alloc_align (1)) void* falloc_size_char (char); |
| ATTR (alloc_size (1)) void* falloc_size_char16 (char16_t); |
| ATTR (alloc_size (1)) void* falloc_size_char32 (char32_t); |
| ATTR (alloc_size (1)) void* falloc_size_wchar (wchar_t); |
| ATTR (alloc_size (1)) void* falloc_size_enum (enum A); |
| #ifdef __SIZEOF_INT128__ |
| ATTR (alloc_align (1)) void* falloc_size_int128 (__int128_t); |
| #endif |
| |
| |
| typedef struct { int i; } S; |
| |
| /* Using bool is most likely a bug and so diagnosed even though |
| it could be accepted. None of the other types makes sense. */ |
| ATTR (alloc_align (1)) void* falloc_align_bool (bool); /* { dg-warning "attribute argument value .1. refers to parameter type .\(_Bool|bool\)" } */ |
| ATTR (alloc_align (1)) void* falloc_align_float (float); /* { dg-warning "attribute argument value .1. refers to parameter type .float" } */ |
| ATTR (alloc_align (1)) void* falloc_align_voidp (void*); /* { dg-warning "attribute argument value .1. refers to parameter type .void ?\\\*" } */ |
| ATTR (alloc_align (1)) void* falloc_align_struct (S); /* { dg-warning "attribute argument value .1. refers to parameter type .S" } */ |