1 /* { dg-require-effective-target indirect_jumps } */
2
3 typedef long unsigned int size_t;
4 extern void abort (void);
5 extern char *strcpy (char *, const char *);
6 extern int strcmp (const char *, const char *);
7 typedef __builtin_va_list va_list;
8 static const char null[] = "(null)";
g(char * s,const char * format,va_list ap)9 int g (char *s, const char *format, va_list ap)
10 {
11 const char *f;
12 const char *string;
13 char spec;
14 static const void *step0_jumps[] = {
15 &&do_precision,
16 &&do_form_integer,
17 &&do_form_string,
18 };
19 f = format;
20 if (*f == '\0')
21 goto all_done;
22 do
23 {
24 spec = (*++f);
25 goto *(step0_jumps[2]);
26
27 /* begin switch table. */
28 do_precision:
29 ++f;
30 __builtin_va_arg (ap, int);
31 spec = *f;
32 goto *(step0_jumps[2]);
33
34 do_form_integer:
35 __builtin_va_arg (ap, unsigned long int);
36 goto end;
37
38 do_form_string:
39 string = __builtin_va_arg (ap, const char *);
40 strcpy (s, string);
41
42 /* End of switch table. */
43 end:
44 ++f;
45 }
46 while (*f != '\0');
47
48 all_done:
49 return 0;
50 }
51
52 void
f(char * s,const char * f,...)53 f (char *s, const char *f, ...)
54 {
55 va_list ap;
56 __builtin_va_start (ap, f);
57 g (s, f, ap);
58 __builtin_va_end (ap);
59 }
60
61 int
main(void)62 main (void)
63 {
64 char buf[10];
65 f (buf, "%s", "asdf", 0);
66 if (strcmp (buf, "asdf"))
67 abort ();
68 return 0;
69 }
70
71