blob: 0b242e8562d31f3e5bf8bd44121fc9c109aab71b [file] [log] [blame]
/* Verify warnings and notes for MIN_EXPRs involving either pointers
to distinct objects or one to a known object and the other to
an unknown one. The relational expressions are strictly invalid
but that should be diagnosed by a separate warning.
{ dg-do compile }
{ dg-options "-O2 -Wno-array-bounds" } */
/* Verify the note points to the larger of the two objects and mentions
the offset into it (although the offset might be better included in
the warning). */
extern char a3[3];
extern char a5[5]; // { dg-message "at offset 5 into destination object 'a5' of size 5" "note" }
void min_a3_a5 (int i)
{
char *p = a3 + i;
char *q = a5 + i;
/* The relational expression below is invalid and should be diagnosed
by its own warning independently of -Wstringop-overflow. */
char *d = p < q ? p : q;
d[4] = 0;
d[5] = 0; // { dg-warning "writing 1 byte into a region of size 0" }
}
// Same as above but with the larger array as the first MIN_EXPR operand.
extern char b4[4];
extern char b6[6]; // { dg-message "at offset 6 into destination object 'b6' of size 6" "note" }
void min_b6_b4 (int i)
{
char *p = b6 + i;
char *q = b4 + i;
char *d = p < q ? p : q;
d[5] = 0;
d[6] = 0; // { dg-warning "writing 1 byte into a region of size 0" }
}
/* Same as above but with the first MIN_EXPR operand pointing to an unknown
object. */
extern char c7[7]; // { dg-message "at offset 7 into destination object 'c7' of size 7" "note" }
void min_p_c7 (char *p, int i)
{
char *q = c7 + i;
char *d = p < q ? p : q;
d[6] = 0;
d[7] = 0; // { dg-warning "writing 1 byte into a region of size 0" }
}
/* Same as above but with the second MIN_EXPR operand pointing to an unknown
object. */
extern char d8[8]; // { dg-message "at offset 8 into destination object 'd8' of size 8" "note" }
void min_d8_p (char *q, int i)
{
char *p = d8 + i;
char *d = p < q ? p : q;
d[7] = 0;
d[8] = 0; // { dg-warning "writing 1 byte into a region of size 0" }
}
struct A3_5
{
char a3[3];
char a5[5]; // { dg-message "at offset 5 into destination object 'a5' of size 5" "note" }
};
void min_A3_A5 (int i, struct A3_5 *pa3_5)
{
char *p = pa3_5->a3 + i;
char *q = pa3_5->a5 + i;
char *d = p < q ? p : q;
// d[4] = 0;
d[5] = 0; // { dg-warning "writing 1 byte into a region of size 0" }
}
struct B4_B6
{
char b4[4];
char b6[6]; // { dg-message "at offset 6 into destination object 'b6' of size 6" "note" }
};
void min_B6_B4 (int i, struct B4_B6 *pb4_b6)
{
char *p = pb4_b6->b6 + i;
char *q = pb4_b6->b4 + i;
char *d = p < q ? p : q;
d[5] = 0;
d[6] = 0; // { dg-warning "writing 1 byte into a region of size 0" }
}
struct C7
{
char c7[7]; // { dg-message "at offset 7 into destination object 'c7' of size 7" "note" }
};
void min_p_C7 (char *p, int i, struct C7 *pc7)
{
char *q = pc7->c7 + i;
char *d = p < q ? p : q;
d[6] = 0;
d[7] = 0; // { dg-warning "writing 1 byte into a region of size 0" }
}
struct D8
{
char d8[8]; // { dg-message "at offset 8 into destination object 'd8' of size 8" "note" }
};
void min_D8_p (char *q, int i, struct D8 *pd8)
{
char *p = pd8->d8 + i;
char *d = p < q ? p : q;
d[7] = 0;
d[8] = 0; // { dg-warning "writing 1 byte into a region of size 0" }
}