aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20010915-1.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20010915-1.c')
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20010915-1.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20010915-1.c b/gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20010915-1.c
new file mode 100644
index 000000000..5a04bf58f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20010915-1.c
@@ -0,0 +1,71 @@
+/* Bug in reorg.c, deleting the "++" in the last loop in main.
+ Origin: <hp@axis.com>. */
+
+extern void f (void);
+extern int x (int, char **);
+extern int r (const char *);
+extern char *s (char *, char **);
+extern char *m (char *);
+char *u;
+char *h;
+int check = 0;
+int o = 0;
+
+int main (int argc, char **argv)
+{
+ char *args[] = {"a", "b", "c", "d", "e"};
+ if (x (5, args) != 0 || check != 2 || o != 5)
+ abort ();
+ exit (0);
+}
+
+int x (int argc, char **argv)
+{
+ int opt = 0;
+ char *g = 0;
+ char *p = 0;
+
+ if (argc > o && argc > 2 && argv[o])
+ {
+ g = s (argv[o], &p);
+ if (g)
+ {
+ *g++ = '\0';
+ h = s (g, &p);
+ if (g == p)
+ h = m (g);
+ }
+ u = s (argv[o], &p);
+ if (argv[o] == p)
+ u = m (argv[o]);
+ }
+ else
+ abort ();
+
+ while (++o < argc)
+ if (r (argv[o]) == 0)
+ return 1;
+
+ return 0;
+}
+
+char *m (char *x) { abort (); }
+char *s (char *v, char **pp)
+{
+ if (strcmp (v, "a") != 0 || check++ > 1)
+ abort ();
+ *pp = v+1;
+ return 0;
+}
+
+int r (const char *f)
+{
+ static char c[2] = "b";
+ static int cnt = 0;
+
+ if (*f != *c || f[1] != c[1] || cnt > 3)
+ abort ();
+ c[0]++;
+ cnt++;
+ return 1;
+}