OSDN Git Service

* gcc.c-torture/compile/pr11832.c: XFAIL for mips and powerpc-linux,
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.c-torture / compile / 20070129.c
1 /* This testcase would cause a hang in PTA solving due to a complex copy
2    constraint and marking the wrong variable as changed.  */
3
4 typedef struct RExC_state_t
5 {
6  char *end;
7  char *parse;
8 } RExC_state_t;
9
10 struct regnode_string
11 {
12  unsigned char str_len;
13  char string[1];
14 };
15
16 static void *regatom (RExC_state_t * pRExC_state, int *flagp);
17
18 static void *
19 regpiece (RExC_state_t * pRExC_state, int *flagp)
20 {
21  return regatom (0, 0);
22 }
23
24 static void *
25 regbranch (RExC_state_t * pRExC_state, int *flagp, int first)
26 {
27  return regpiece (0, 0);
28 }
29
30 static void *
31 reg (RExC_state_t * pRExC_state, int paren, int *flagp)
32 {
33  return regbranch (0, 0, 1);
34 }
35
36 void *
37 Perl_pregcomp (char *exp, char *xend, void *pm)
38 {
39  return reg (0, 0, 0);
40 }
41
42 static void *
43 regatom (RExC_state_t * pRExC_state, int *flagp)
44 {
45  register void *ret = 0;
46  int flags;
47
48 tryagain:
49  switch (*(pRExC_state->parse))
50    {
51    case '(':
52      ret = reg (pRExC_state, 1, &flags);
53      if (flags & 0x8)
54        {
55          goto tryagain;
56        }
57      break;
58    default:
59  {
60        register unsigned long len;
61        register unsigned ender;
62        register char *p;
63        char *oldp, *s;
64        unsigned long numlen;
65        unsigned long foldlen;
66        unsigned char tmpbuf[6 + 1], *foldbuf;
67
68      defchar:
69        s = (((struct regnode_string *) ret)->string);
70        for (len = 0, p = (pRExC_state->parse) - 1;
71             len < 127 && p < (pRExC_state->end); len++)
72          {
73            if (((*p) == '*' || (*p) == '+' || (*p) == '?'
74                 || ((*p) == '{' && regcurly (p))))
75              {
76                unsigned long unilen;
77                for (foldbuf = tmpbuf; foldlen; foldlen -= numlen)
78                  {
79                    reguni (pRExC_state, ender, s, &unilen);
80                    s += unilen;
81                  }
82                break;
83              }
84            unsigned long unilen;
85
86            reguni (pRExC_state, ender, s, &unilen);
87            s += unilen;
88          }
89
90      };
91      break;
92    }
93  return (ret);
94 }