1 /* Test to verify that a MAX_EXPR and MIN_EXPR in a return statement
2 is handled correctly and that all local variables whose address
3 is or may be returned are identified.
4 { dg-do compile }
5 { dg-options "-O2 -Wall" } */
6
7 char* sink (char*, ...);
8
9 void* test_max_2 (void)
10 {
11 char c; /* { dg-message "declared here" } */
12
13 char *p = sink (&c);
14
15 void *q = p > &c ? p : &c; /* MAX_EXPR */
16 return q; /* { dg-warning "\\\[-Wreturn-local-addr" } */
17 }
18
19 void* test_max_3 (void)
20 {
21 char c; /* { dg-message "declared here" } */
22 char d; /* { dg-message "declared here" } */
23
24 char *p = sink (&c, &d);
25
26 void *q = p < &c ? &c < &d ? &d : &c : p;
27 return q; /* { dg-warning "\\\[-Wreturn-local-addr" } */
28 }
29
30 void* test_min_2 (void)
31 {
32 char c; /* { dg-message "declared here" } */
33
34 char *p = sink (&c);
35
36 void *q = p < &c ? p : &c; /* MIN_EXPR" */
37 return q; /* { dg-warning "\\\[-Wreturn-local-addr" } */
38 }
39
40 void* test_min_3 (void)
41 {
42 char c; /* { dg-message "declared here" } */
43 char d; /* { dg-message "declared here" } */
44
45 char *p = sink (&c, &d);
46
47 void *q = p > &c ? &c > &d ? &d : &c : p;
48 return q; /* { dg-warning "\\\[-Wreturn-local-addr" } */
49 }
50
51 void* test_min_2_phi (int i)
52 {
53 char a; /* { dg-message "declared here" } */
54
55 char *p = &a;
56 char *q = sink (&a);
57 p = p < q ? p : q;
58 if (i == 1)
59 return p;
60 /* { dg-warning "may return address of local variable" "missing location" { xfail *-*-* } } */
61 else
62 return q;
63 }
64
65 void* test_min_3_phi (int i)
66 {
67 char a; /* { dg-message "declared here" } */
68 char b; /* { dg-message "declared here" } */
69
70 char *p0 = &a;
71 char *p1 = &b;
72 char *p2 = sink (&a, &b);
73 char *p3 = sink (&a, &b);
74
75 char *p4 = p2 < p0 ? p2 : p0;
76 char *p5 = p3 < p1 ? p3 : p1;
77
78 if (i == 1)
79 /* { dg-warning "may return address of local variable" "missing location" { xfail *-*-* } } */
80 return p4;
81 else
82 /* { dg-warning "may return address of local variable" "missing location" { xfail *-*-* } } */
83 return p5;
84 }
85
86 /* The directive below "swallows" warnings for both test_min_2_phi
87 and test_min_3_phi.
88 { dg-warning "may return address of local variable" "pr90735" { target *-*-* } 0 } */