diff options
Diffstat (limited to 'gcc/testsuite/gcc.dg/torture/pr47677.c')
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr47677.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/torture/pr47677.c b/gcc/testsuite/gcc.dg/torture/pr47677.c new file mode 100644 index 000000000..bd9077863 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr47677.c @@ -0,0 +1,34 @@ +/* { dg-do compile } */ + +struct S { int s; int u; }; +extern int bar (void); +extern struct S *baz (void); + +void +foo (int x, struct S *y, char z, int *v, struct S *s) +{ + int c, d; + if (x & 2) + d = 1; + else + { + d = (x & 1) ? 11 : 0; + while ((c = (s->s != (s->u & 1) ? s->s : bar ())) != '\0'); + c = (s->s != '\\' && (s->u & 4) ? s->s : bar ()); + if (c == '<') + goto lab; + } + while ((c = ((s->u & 1) ? s->s : bar ())) != 0 + && ((d != 11 && d != 17) || (v[c] & 1) == 0)) + { + lab:; + switch (d) + { + case 14: + if (c == '}') + y = baz (); + d = y->s = z == '<' ? 17 : 11; + } + } +} + |