1 /* PR tree-optimization/88372 - alloc_size attribute is ignored
2 on function pointers
3 Verify that calls via function pointers declared alloc_size
4 with zero or excessive size trigger either -Walloc-zero or
5 -Walloc-size-larger-than warnings.
6 { dg-do compile }
7 { dg-require-effective-target indirect_calls }
8 { dg-options "-O2 -Wall -Walloc-zero -ftrack-macro-expansion=0" } */
9
10 #define ATTR(...) __attribute__ ((__VA_ARGS__))
11
12 typedef __SIZE_TYPE__ size_t;
13
14
15 void sink (void*);
16
17 #define T(call) sink (call)
18
19 ATTR (alloc_size (1)) void* (*ai1)(int, int);
20 ATTR (alloc_size (2)) void* (*ai2)(int, int);
21 ATTR (alloc_size (1, 2)) void* (*ai1_2)(int, int);
22
23 ATTR (alloc_size (1)) void* (*asz1)(size_t, size_t);
24 ATTR (alloc_size (2)) void* (*asz2)(size_t, size_t);
25 ATTR (alloc_size (1, 2)) void* (*asz1_2)(size_t, size_t);
26
27
test_alloc_ptr_zero(void)28 void test_alloc_ptr_zero (void)
29 {
30 T (asz1 (0, 0)); /* { dg-warning "argument 1 value is zero" } */
31 T (asz1 (0, 1)); /* { dg-warning "argument 1 value is zero" } */
32 T (asz1 (1, 0));
33 T (asz1 (1, 1));
34
35 T (asz2 (0, 0)); /* { dg-warning "argument 2 value is zero" } */
36 T (asz2 (0, 1));
37 T (asz2 (1, 0)); /* { dg-warning "argument 2 value is zero" } */
38 T (asz2 (1, 1));
39
40 T (asz1_2 (0, 0)); /* { dg-warning "argument \[12\] value is zero" } */
41 T (asz1_2 (1, 0)); /* { dg-warning "argument 2 value is zero" } */
42 T (asz1_2 (0, 1)); /* { dg-warning "argument 1 value is zero" } */
43 T (asz1_2 (1, 1));
44 }
45
46
test_alloc_ptr_negative(int n)47 void test_alloc_ptr_negative (int n)
48 {
49 T (ai1 (-1, -1)); /* { dg-warning "argument 1 value .-1. is negative" } */
50 T (ai1 (-2, 1)); /* { dg-warning "argument 1 value .-2. is negative" } */
51 T (ai1 ( 1, -1));
52 T (ai1 ( 1, 1));
53
54 T (ai2 (-1, -3)); /* { dg-warning "argument 2 value .-3. is negative" } */
55 T (ai2 (-1, 1));
56 T (ai2 ( 1, -4)); /* { dg-warning "argument 2 value .-4. is negative" } */
57 T (ai2 ( 1, 1));
58
59 T (ai1_2 (-5, -6)); /* { dg-warning "argument \[12\] value .-\[56\]. is negative" } */
60 T (ai1_2 ( 1, -7)); /* { dg-warning "argument 2 value .-7. is negative" } */
61 T (ai1_2 (-8, 1)); /* { dg-warning "argument 1 value .-8. is negative" } */
62 T (ai1_2 ( 1, 1));
63
64 if (n > -1)
65 n = -1;
66
67 /* Also verify a simple range. */
68 T (ai1_2 ( 1, n)); /* { dg-warning "argument 2 range \\\[-\[0-9\]+, -1] is negative" } */
69 T (ai1_2 ( n, 1)); /* { dg-warning "argument 1 range \\\[-\[0-9\]+, -1] is negative" } */
70 }
71
test_alloc_ptr_too_big(void)72 void test_alloc_ptr_too_big (void)
73 {
74 size_t x = (__SIZE_MAX__ >> 1) + 1;
75 size_t y = __SIZE_MAX__ / 5;
76
77 T (asz1 (x, x)); /* { dg-warning "argument 1 value .\[0-9\]+. exceeds" } */
78 T (asz1 (x, 1)); /* { dg-warning "argument 1 value .\[0-9\]+. exceeds" } */
79 T (asz1 (1, x));
80 T (asz1 (1, 1));
81
82 T (asz2 (x, x)); /* { dg-warning "argument 2 value .\[0-9\]+. exceeds" } */
83 T (asz2 (x, 1));
84 T (asz2 (1, x)); /* { dg-warning "argument 2 value .\[0-9\]+. exceeds" } */
85 T (asz2 (1, 1));
86
87 T (asz1_2 (x, x)); /* { dg-warning "argument \[12\] value .\[0-9\]+. exceeds" } */
88 T (asz1_2 (y, 3)); /* { dg-warning "product .\[0-9\]+ \\\* 3. of arguments 1 and 2 exceeds" } */
89 T (asz1_2 (y, y)); /* { dg-warning "product .\[0-9\]+ \\\* \[0-9\]+. of arguments 1 and 2 exceeds" } */
90 T (asz1_2 (1, x)); /* { dg-warning "argument 2 value .\[0-9\]+. exceeds" } */
91 T (asz1_2 (x, 1)); /* { dg-warning "argument 1 value .\[0-9\]+. exceeds" } */
92 T (asz1_2 (1, 1));
93
94 }
95