1 /* PR rtl-optimization/41239 */
2 
3 struct S
4 {
5   short nargs;
6   unsigned long arg[2];
7 };
8 
9 extern void abort (void);
10 extern void exit (int);
11 extern char fn1 (int, const char *, int, const char *, const char *);
12 extern void fn2 (int, ...);
13 extern int fn3 (int);
14 extern int fn4 (const char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
15 
16 unsigned long
test(struct S * x)17 test (struct S *x)
18 {
19   signed int arg1 = x->arg[0];
20   long int arg2 = x->arg[1];
21 
22   if (arg2 == 0)
23     (fn1 (20, "foo", 924, __func__, ((void *) 0))
24      ? (fn2 (fn3 (0x2040082), fn4 ("division by zero")))
25      : (void) 0);
26 
27   return (long int) arg1 / arg2;
28 }
29 
30 int
main(void)31 main (void)
32 {
33   struct S s = { 2, { 5, 0 } };
34   test (&s);
35   abort ();
36 }
37 
38 __attribute__((noinline)) char
fn1(int x,const char * y,int z,const char * w,const char * v)39 fn1 (int x, const char *y, int z, const char *w, const char *v)
40 {
41   asm volatile ("" : : "r" (w), "r" (v) : "memory");
42   asm volatile ("" : "+r" (x) : "r" (y), "r" (z) : "memory");
43   return x;
44 }
45 
46 __attribute__((noinline)) int
fn3(int x)47 fn3 (int x)
48 {
49   asm volatile ("" : "+r" (x) : : "memory");
50   return x;
51 }
52 
53 __attribute__((noinline)) int
fn4(const char * x,...)54 fn4 (const char *x, ...)
55 {
56   asm volatile ("" : "+r" (x) : : "memory");
57   return *x;
58 }
59 
60 __attribute__((noinline)) void
fn2(int x,...)61 fn2 (int x, ...)
62 {
63   asm volatile ("" : "+r" (x) : : "memory");
64   if (x)
65     /* Could be a longjmp or throw too.  */
66     exit (0);
67 }
68