modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/compile/20070129.c (about)

     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  }