aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20041214-1.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20041214-1.c')
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20041214-1.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20041214-1.c b/gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20041214-1.c
new file mode 100644
index 000000000..89df2be8e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20041214-1.c
@@ -0,0 +1,68 @@
+typedef long unsigned int size_t;
+extern void abort (void);
+extern char *strcpy (char *, const char *);
+extern int strcmp (const char *, const char *);
+typedef __builtin_va_list va_list;
+static const char null[] = "(null)";
+int g (char *s, const char *format, va_list ap)
+{
+ const char *f;
+ const char *string;
+ char spec;
+ static const void *step0_jumps[] = {
+ &&do_precision,
+ &&do_form_integer,
+ &&do_form_string,
+ };
+ f = format;
+ if (*f == '\0')
+ goto all_done;
+ do
+ {
+ spec = (*++f);
+ goto *(step0_jumps[2]);
+
+ /* begin switch table. */
+ do_precision:
+ ++f;
+ __builtin_va_arg (ap, int);
+ spec = *f;
+ goto *(step0_jumps[2]);
+
+ do_form_integer:
+ __builtin_va_arg (ap, unsigned long int);
+ goto end;
+
+ do_form_string:
+ string = __builtin_va_arg (ap, const char *);
+ strcpy (s, string);
+
+ /* End of switch table. */
+ end:
+ ++f;
+ }
+ while (*f != '\0');
+
+all_done:
+ return 0;
+}
+
+void
+f (char *s, const char *f, ...)
+{
+ va_list ap;
+ __builtin_va_start (ap, f);
+ g (s, f, ap);
+ __builtin_va_end (ap);
+}
+
+int
+main (void)
+{
+ char buf[10];
+ f (buf, "%s", "asdf", 0);
+ if (strcmp (buf, "asdf"))
+ abort ();
+ return 0;
+}
+