blob: 98a3805b5f01c0d895c7898e10eb42117aad9128 [file] [log] [blame]
/* Test to verify that a MAX_EXPR and MIN_EXPR in a return statement
is handled correctly and that all local variables whose address
is or may be returned are identified.
{ dg-do compile }
{ dg-options "-O2 -Wall" } */
char* sink (char*, ...);
void* test_max_2 (void)
{
char c; /* { dg-message "declared here" } */
char *p = sink (&c);
void *q = p > &c ? p : &c; /* MAX_EXPR */
return q; /* { dg-warning "\\\[-Wreturn-local-addr" } */
}
void* test_max_3 (void)
{
char c; /* { dg-message "declared here" } */
char d; /* { dg-message "declared here" } */
char *p = sink (&c, &d);
void *q = p < &c ? &c < &d ? &d : &c : p;
return q; /* { dg-warning "\\\[-Wreturn-local-addr" } */
}
void* test_min_2 (void)
{
char c; /* { dg-message "declared here" } */
char *p = sink (&c);
void *q = p < &c ? p : &c; /* MIN_EXPR" */
return q; /* { dg-warning "\\\[-Wreturn-local-addr" } */
}
void* test_min_3 (void)
{
char c; /* { dg-message "declared here" } */
char d; /* { dg-message "declared here" } */
char *p = sink (&c, &d);
void *q = p > &c ? &c > &d ? &d : &c : p;
return q; /* { dg-warning "\\\[-Wreturn-local-addr" } */
}
void* test_min_2_phi (int i)
{
char a; /* { dg-message "declared here" } */
char *p = &a;
char *q = sink (&a);
p = p < q ? p : q;
if (i == 1)
return p;
/* { dg-warning "may return address of local variable" "missing location" { xfail *-*-* } } */
else
return q;
}
void* test_min_3_phi (int i)
{
char a; /* { dg-message "declared here" } */
char b; /* { dg-message "declared here" } */
char *p0 = &a;
char *p1 = &b;
char *p2 = sink (&a, &b);
char *p3 = sink (&a, &b);
char *p4 = p2 < p0 ? p2 : p0;
char *p5 = p3 < p1 ? p3 : p1;
if (i == 1)
/* { dg-warning "may return address of local variable" "missing location" { xfail *-*-* } } */
return p4;
else
/* { dg-warning "may return address of local variable" "missing location" { xfail *-*-* } } */
return p5;
}
/* The directive below "swallows" warnings for both test_min_2_phi
and test_min_3_phi.
{ dg-warning "may return address of local variable" "pr90735" { target *-*-* } 0 } */