| /* PR rtl-optimization/21330 */ |
| |
| extern void abort (void); |
| extern int strcmp (const char *, const char *); |
| |
| int |
| __attribute__((noinline)) |
| bar (const char **x) |
| { |
| return *(*x)++; |
| } |
| |
| int |
| __attribute__((noinline)) |
| baz (int c) |
| { |
| return c != '@'; |
| } |
| |
| void |
| __attribute__((noinline)) |
| foo (const char **w, char *x, _Bool y, _Bool z) |
| { |
| char c = bar (w); |
| int i = 0; |
| |
| while (1) |
| { |
| x[i++] = c; |
| c = bar (w); |
| if (y && c == '\'') |
| break; |
| if (z && c == '\"') |
| break; |
| if (!y && !z && !baz (c)) |
| break; |
| } |
| x[i] = 0; |
| } |
| |
| int |
| main (void) |
| { |
| char buf[64]; |
| const char *p; |
| p = "abcde'fgh"; |
| foo (&p, buf, 1, 0); |
| if (strcmp (p, "fgh") != 0 || strcmp (buf, "abcde") != 0) |
| abort (); |
| p = "ABCDEFG\"HI"; |
| foo (&p, buf, 0, 1); |
| if (strcmp (p, "HI") != 0 || strcmp (buf, "ABCDEFG") != 0) |
| abort (); |
| p = "abcd\"e'fgh"; |
| foo (&p, buf, 1, 1); |
| if (strcmp (p, "e'fgh") != 0 || strcmp (buf, "abcd") != 0) |
| abort (); |
| p = "ABCDEF'G\"HI"; |
| foo (&p, buf, 1, 1); |
| if (strcmp (p, "G\"HI") != 0 || strcmp (buf, "ABCDEF") != 0) |
| abort (); |
| p = "abcdef@gh"; |
| foo (&p, buf, 0, 0); |
| if (strcmp (p, "gh") != 0 || strcmp (buf, "abcdef") != 0) |
| abort (); |
| return 0; |
| } |