1 /* PR middle-end/81871 - bogus attribute alloc_align accepted 2 Test exercising the problem with attribute alloc_size. 3 { dg-do compile } 4 { dg-options "-Wall" } */ 5 6 #define ASIZE(...) __attribute__ ((alloc_size (__VA_ARGS__))) 7 #define SIZE_MAX __SIZE_MAX__ 8 9 ASIZE (-1) void fvv_m1 (void); /* { dg-warning ".alloc_size. attribute ignored on a function returning .void." } */ 10 11 ASIZE (1) int fiv_1 (void); /* { dg-warning ".alloc_size. attribute ignored on a function returning .int." } */ 12 13 ASIZE (1, 2) int fiv_1_2 (void); /* { dg-warning ".alloc_size. attribute ignored on a function returning .int." } */ 14 15 ASIZE (0) void* fpvv_0 (void); /* { dg-warning ".alloc_size. attribute argument value .0. does not refer to a function parameter" } */ 16 17 ASIZE (1, 0) void* 18 fpvv_1_0 (int); /* { dg-warning ".alloc_size. attribute argument 2 value .0. does not refer to a function parameter" } */ 19 20 ASIZE (1) void* fpvv_1 (void); /* { dg-warning ".alloc_size. attribute argument value .1. exceeds the number of function parameters 0" } */ 21 22 ASIZE (1, 9) void* 23 fpvv_1_9 (int); /* { dg-warning ".alloc_size. attribute argument 2 value .9. exceeds the number of function parameters 1" } */ 24 25 ASIZE (2) void* fii_2 (int); /* { dg-warning ".alloc_size. attribute argument value .2. exceeds the number of function parameters 1" } */ 26 27 ASIZE (1) void fvi_1 (int); /* { dg-warning ".alloc_size. attribute ignored on a function returning .void." } */ 28 29 /* Using alloc_size with a function returning a pointer to a function 30 should perhaps trigger a warning. */ 31 typedef void (F)(void); 32 ASIZE (1) F* fpF_i_1 (int); 33 34 ASIZE (SIZE_MAX) void* 35 fpvi_szmax (int); /* { dg-warning ".alloc_size. attribute argument value .\[0-9\]+. exceeds the number of function parameters 1" } */ 36 37 ASIZE ("12") void* 38 fpvi_str_1 (int); /* { dg-warning ".alloc_size. attribute argument has type .char\\\[3]." } */ 39 40 ASIZE (1, "123") void* 41 fpvi_str_2 (int, int); /* { dg-warning ".alloc_size. attribute argument 2 has type .char\\\[4]." } */ 42 43 ASIZE ((void*)0) void* 44 fpvi_pv0 (int); /* { dg-warning ".alloc_size. attribute argument has type .void \\\*." } */ 45 46 ASIZE ((double*)sizeof (double)) void* 47 fpvi_pd1 (int); /* { dg-warning ".alloc_size. attribute argument has type .double \\\*." } */ 48 49 ASIZE (1) void* 50 fpvi_pv_1 (void*); /* { dg-warning ".alloc_size. attribute argument value .1. refers to parameter type .void \\\*." } */ 51 52 struct S { int i; }; 53 ASIZE (2) void* 54 fpvi_S_2 (int, struct S); /* { dg-warning ".alloc_size. attribute argument value .2. refers to parameter type .struct S." } */ 55 56 ASIZE ((struct S){ 1 }) void* 57 fpvi_S (int); /* { dg-warning ".alloc_size. attribute argument has type .struct S." } */ 58 59 ASIZE (1, (struct S){ 1 }) void* 60 fpvi_1_S (int); /* { dg-warning ".alloc_size. attribute argument 2 has type .struct S." } */ 61