x86 regex.c failure from Jim Meyering.
authorJim Wilson <wilson@cygnus.com>
Fri, 3 Apr 1998 12:29:04 +0000 (12:29 +0000)
committerJim Wilson <wilson@gcc.gnu.org>
Fri, 3 Apr 1998 12:29:04 +0000 (04:29 -0800)
* compile/980329-1.c: New test.

From-SVN: r18975

gcc/testsuite/gcc.c-torture/ChangeLog
gcc/testsuite/gcc.c-torture/compile/980329-1.c [new file with mode: 0644]

index 7a01b5f52d3bb07f085536d3c4dfa492593fd7d2..c73d2613fd57eb3bea5f571e119ae6a3185ea430 100644 (file)
@@ -1,3 +1,6 @@
+Fri Apr  3 12:27:49 1998  Jim Wilson  <wilson@cygnus.com>
+
+       * compile/980329-1.c: New test.
 
 Mon Feb 23 15:16:53 1998  Robert Lipe <robertl@dgii.com>
        From Bruno Haible <haible@ilog.fr>:
diff --git a/gcc/testsuite/gcc.c-torture/compile/980329-1.c b/gcc/testsuite/gcc.c-torture/compile/980329-1.c
new file mode 100644 (file)
index 0000000..d11b49b
--- /dev/null
@@ -0,0 +1,72 @@
+typedef unsigned long int 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;
+}