summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.c-torture/compile/980329-1.c
blob: 3b3fe27cf714ad18e6b0caf8577a4eaf723fa9f6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
typedef __SIZE_TYPE__ size_t;
struct re_pattern_buffer
  {
    unsigned char *buffer;
    unsigned long int used;
  };
struct re_registers
  {
    int *start;
  };

static const char **regstart, **regend;
static const char **old_regend;

static int
re_match_2_internal (struct re_pattern_buffer *bufp,
		     struct re_registers *regs)
{
  unsigned char *p = bufp->buffer;
  unsigned char *pend = p + bufp->used;

  for (;;)
    {
      int highest_active_reg = 1;
      if (bufp)
	{
	  int i;
	  for (i = 1;; i++)
	    regs->start[i] = 0;
	}

      switch ((unsigned int) *p++)
	{
	case 1:
	  {
	    unsigned char r = *p;
	    if (r)
	      highest_active_reg = r;
	  }
	  if (p + 2 == pend)
	    {
	      char is_a_jump_n = 0;
	      int mcnt = 0;
	      unsigned char *p1;

	      p1 = p + 2;
	      switch (*p1++)
		{
		case 2:
		  is_a_jump_n = 1;
		case 1:
		  do { do { mcnt = *p1; } while (0); p1 += 2; } while (0);
		  if (is_a_jump_n)
		    p1 = 0;
		}

	      if (mcnt && *p1 == 0)
		{
		  unsigned r;
		  for (r = 0; r < (unsigned) *p + (unsigned) *(p + 1); r++)
		    {
		      if (regend[0] >= regstart[r])
			regend[r] = old_regend[r];
		    }
		  do { while (0 < highest_active_reg + 1) { } } while (0);
		}
	    }
	}
    }

  return -1;
}