| /* PR middle-end/89230 - Bogus uninited usage warning with printf |
| { dg-do compile } |
| { dg-options "-O2 -Wall" } */ |
| |
| typedef __SIZE_TYPE__ size_t; |
| |
| extern void* memset (void*, int, size_t); |
| extern int printf (const char*, ...); |
| extern int rand (void); |
| |
| struct S |
| { |
| int a; |
| int b; |
| }; |
| |
| struct H |
| { |
| int c; |
| int d; |
| }; |
| |
| void getblk (void* blk) |
| { |
| struct S* s = (struct S*) blk; |
| memset (blk, 0, 512); |
| s->a = rand () & 1; |
| } |
| |
| struct H* gethdr (void* blk) |
| { |
| memset (blk, 0, 512); |
| return rand () & 1 ? (struct H*) blk : 0; |
| } |
| |
| int main (void) |
| { |
| char blk[512], tmp[512]; |
| struct S *s = (struct S*) blk; |
| struct H *h; |
| |
| getblk (blk); |
| |
| if (s->a || !(h = gethdr (tmp)) || s->a != h->d) { |
| |
| printf ("%d\n", s->b); |
| if (s->a) |
| printf ("s->a = %d\n", s->a); |
| else if (!h) |
| printf ("!h\n"); |
| else |
| printf ("h->d = %d\n", h->d); |
| } |
| } |