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