Imported Upstream version 2.9.0
[debian/cc1111] / support / regression / tests / vaargs.c
1 /** Tests argument passing to functions via va_args.
2     Assumes that up to the first two arguments can be passed in registers.
3
4     type1: va_char, int
5     type2: va_char, int
6     type3: va_char, int
7  */
8 #include <testfwk.h>
9 #include <stdarg.h>
10
11 /* gcc 3.3 throws a warning, if char is in '...' */
12 #if defined(PORT_HOST)
13 # define va_char int
14 #else
15 # define va_char char
16 #endif
17
18 static {type1}
19 returnFirstArg(int marker, ...)
20 {
21     va_list ap;
22     {type1} i;
23
24     va_start(ap, marker);
25     i = va_arg(ap, {type1});
26
27     va_end(ap);
28
29     LOG(("Returning %u\n", i));
30     return i;
31 }
32
33 static {type2}
34 returnSecondArg(int marker, ...)
35 {
36     va_list ap;
37     {type2} i;
38
39     va_start(ap, marker);
40     UNUSED(va_arg(ap, {type1}));
41     i = va_arg(ap, {type2});
42
43     va_end(ap);
44
45     LOG(("Returning %u\n", i));
46     return i;
47 }
48
49 static {type3}
50 returnThirdArg(int marker, ...)
51 {
52     va_list ap;
53     {type3} i;
54
55     va_start(ap, marker);
56     UNUSED(va_arg(ap, {type1}));
57     UNUSED(va_arg(ap, {type2}));
58     i = va_arg(ap, {type3});
59
60     va_end(ap);
61
62     LOG(("Returning %u\n", i));
63     return i;
64 }
65
66 void
67 testArgs(void)
68 {
69     int marker = 12;
70
71     LOG(("First arg: %u\n", returnFirstArg(marker, ({type1})123, ({type2})45, ({type3})67)));
72     ASSERT(returnFirstArg(marker, ({type1})123, ({type2})45, ({type3})67) == 123);
73     ASSERT(returnFirstArg(marker, ({type1})-123, ({type2})45, ({type3})67) == -123);
74
75     ASSERT(returnSecondArg(marker, ({type1})1, ({type2})-23, ({type3})64) == -23);
76     ASSERT(returnSecondArg(marker, ({type1})1, ({type2})8, ({type3})64) == 8);
77
78     ASSERT(returnThirdArg(marker, ({type1})-33, ({type2})-34, ({type3})-35) == -35);
79     ASSERT(returnThirdArg(marker, ({type1})-33, ({type2})-34, ({type3})35) == 35);
80 }