Fix warning with -Wsign-compare -Wsystem-headers
[official-gcc.git] / gcc / testsuite / gcc.dg / tree-ssa / stdarg-5.c
blobc8ad4fe320db9f8139aba22b9fb92f1d2a5d4b87
1 /* This test has architecture specific function passing details. */
2 /* { dg-do compile } */
3 /* { dg-options "-O2 -fdump-tree-stdarg" } */
5 #include <stdarg.h>
7 extern void foo (int, va_list);
8 extern void bar (int);
9 struct S1 { int i; double d; int j; double e; } s1;
10 struct S2 { double d; long i; } s2;
11 int y;
12 _Complex int ci;
13 _Complex double cd;
15 /* Here va_arg can be executed more than once for one va_start. */
16 void
17 f1 (int i, ...)
19 va_list ap;
20 va_start (ap, i);
21 while (i-- > 0)
22 s1 = va_arg (ap, struct S1);
23 va_end (ap);
25 /* { dg-final { scan-tree-dump "f1: va_list escapes 0, needs to save 0 GPR units and 0 FPR units" "stdarg" { target { { i?86-*-* x86_64-*-* } && { ! { ia32 || llp64 } } } } } } */
26 /* { dg-final { scan-tree-dump "f1: va_list escapes 0, needs to save all GPR units and 1" "stdarg" { target alpha*-*-linux* } } } */
27 /* { dg-final { scan-tree-dump "f1: va_list escapes 0, needs to save all GPR units and 0 FPR units" "stdarg" { target s390*-*-linux* } } } */
28 /* { dg-final { scan-tree-dump "f1: va_list escapes 0, needs to save all GPR units and 0 FPR units" "stdarg" { target aarch64*-*-* } } } */
30 void
31 f2 (int i, ...)
33 va_list ap;
34 va_start (ap, i);
35 while (i-- > 0)
36 s2 = va_arg (ap, struct S2);
37 va_end (ap);
39 /* { dg-final { scan-tree-dump "f2: va_list escapes 0, needs to save all GPR units and all FPR units" "stdarg" { target { { i?86-*-* x86_64-*-* } && { ! { ia32 || llp64 } } } } } } */
40 /* { dg-final { scan-tree-dump "f2: va_list escapes 0, needs to save all GPR units and 1" "stdarg" { target alpha*-*-linux* } } } */
41 /* { dg-final { scan-tree-dump "f2: va_list escapes 0, needs to save all GPR units and 0 FPR units" "stdarg" { target s390*-*-linux* } } } */
42 /* { dg-final { scan-tree-dump "f2: va_list escapes 0, needs to save all GPR units and 0 FPR units" "stdarg" { target aarch64*-*-* } } } */
44 /* Here va_arg can be executed at most as many times as va_start. */
45 void
46 f3 (int i, ...)
48 va_list ap;
49 int j = i;
50 while (j-- > 0)
52 va_start (ap, i);
53 s1 = va_arg (ap, struct S1);
54 va_end (ap);
55 bar (s1.i);
58 /* { dg-final { scan-tree-dump "f3: va_list escapes 0, needs to save 0 GPR units and 0 FPR units" "stdarg" { target { { i?86-*-* x86_64-*-* } && { ! { ia32 || llp64 } } } } } } */
59 /* { dg-final { scan-tree-dump "f3: va_list escapes 0, needs to save 32 GPR units and 1" "stdarg" { target alpha*-*-linux* } } } */
60 /* { dg-final { scan-tree-dump "f3: va_list escapes 0, needs to save 1 GPR units and 0 FPR units" "stdarg" { target s390*-*-linux* } } } */
61 /* { dg-final { scan-tree-dump "f3: va_list escapes 0, needs to save 8 GPR units and 0 FPR units" "stdarg" { target aarch64*-*-* } } } */
63 void
64 f4 (int i, ...)
66 va_list ap;
67 int j = i;
68 while (j-- > 0)
70 va_start (ap, i);
71 s2 = va_arg (ap, struct S2);
72 y = va_arg (ap, int);
73 va_end (ap);
74 bar (s2.i);
77 /* { dg-final { scan-tree-dump "f4: va_list escapes 0, needs to save 16 GPR units and 16 FPR units" "stdarg" { target { { i?86-*-* x86_64-*-* } && { ! { ia32 || llp64 } } } } } } */
78 /* { dg-final { scan-tree-dump "f4: va_list escapes 0, needs to save 24 GPR units and 1" "stdarg" { target alpha*-*-linux* } } } */
79 /* { dg-final { scan-tree-dump "f4: va_list escapes 0, needs to save 2 GPR units and 0 FPR units" "stdarg" { target s390*-*-linux* } } } */
80 /* { dg-final { scan-tree-dump "f4: va_list escapes 0, needs to save 24 GPR units and 0 FPR units" "stdarg" { target aarch64*-*-* } } } */
82 void
83 f5 (int i, ...)
85 va_list ap;
86 va_start (ap, i);
87 ci = va_arg (ap, _Complex int);
88 ci += va_arg (ap, _Complex int);
89 va_end (ap);
90 bar (__real__ ci + __imag__ ci);
92 /* { dg-final { scan-tree-dump "f5: va_list escapes 0, needs to save 16 GPR units and 0 FPR units" "stdarg" { target { { i?86-*-* x86_64-*-* } && { ! { ia32 || llp64 } } } } } } */
93 /* { dg-final { scan-tree-dump "f5: va_list escapes 0, needs to save 32 GPR units and 1" "stdarg" { target alpha*-*-linux* } } } */
94 /* { dg-final { scan-tree-dump "f5: va_list escapes 0, needs to save (4|2) GPR units and 0 FPR units" "stdarg" { target s390*-*-linux* } } } */
95 /* { dg-final { scan-tree-dump "f5: va_list escapes 0, needs to save 16 GPR units and 0 FPR units" "stdarg" { target aarch64*-*-* } } } */
97 void
98 f6 (int i, ...)
100 va_list ap;
101 va_start (ap, i);
102 ci = va_arg (ap, _Complex int);
103 cd = va_arg (ap, _Complex double);
104 va_end (ap);
105 bar (__real__ ci + __imag__ cd);
107 /* { dg-final { scan-tree-dump "f6: va_list escapes 0, needs to save 8 GPR units and 32 FPR units" "stdarg" { target { { i?86-*-* x86_64-*-* } && { ! { ia32 || llp64 } } } } } } */
108 /* { dg-final { scan-tree-dump "f6: va_list escapes 0, needs to save 32 GPR units and 3" "stdarg" { target alpha*-*-linux* } } } */
109 /* { dg-final { scan-tree-dump "f6: va_list escapes 0, needs to save (3|2) GPR units and 0 FPR units" "stdarg" { target s390*-*-linux* } } } */
110 /* { dg-final { scan-tree-dump "f6: va_list escapes 0, needs to save 8 GPR units and 32 FPR units" "stdarg" { target aarch64*-*-* } } } */
112 void
113 f7 (int i, ...)
115 va_list ap;
116 va_start (ap, i);
117 cd = va_arg (ap, _Complex double);
118 cd += va_arg (ap, _Complex double);
119 va_end (ap);
120 bar (__real__ cd + __imag__ cd);
122 /* { dg-final { scan-tree-dump "f7: va_list escapes 0, needs to save 0 GPR units and 64 FPR units" "stdarg" { target { { i?86-*-* x86_64-*-* } && { ! { ia32 || llp64 } } } } } } */
123 /* { dg-final { scan-tree-dump "f7: va_list escapes 0, needs to save 32 GPR units and 2" "stdarg" { target alpha*-*-linux* } } } */
124 /* { dg-final { scan-tree-dump "f7: va_list escapes 0, needs to save 2 GPR units and 0 FPR units" "stdarg" { target s390*-*-linux* } } } */
125 /* { dg-final { scan-tree-dump "f7: va_list escapes 0, needs to save 0 GPR units and 64 FPR units" "stdarg" { target aarch64*-*-* } } } */