1// { dg-do run { xfail rs6000-*-* powerpc-*-eabi m68k-*-coff mn10300-*-* v850-*-* sh-*-* sh64-*-* h8*-*-* xtensa-*-* m32r*-*-* } }
2// Test that variadic function calls using thunks work right.
3// Note that this will break on any target that uses the generic thunk
4//  support, because it doesn't support variadic functions.
5
6
7#include <stdarg.h>
8
9struct A {
10  void* p;
11  A (void* q): p (q) { }
12  A (const A& a): p (a.p) { }
13};
14
15class CBase {
16public:
17   virtual void BaseFunc();
18};
19
20class MMixin {
21public:
22   virtual A MixinFunc(int arg, ...) = 0;
23};
24
25class CExample : public CBase, public MMixin {
26public:
27   A MixinFunc(int arg, ...);
28};
29
30void CBase::BaseFunc()
31{
32}
33
34A CExample::MixinFunc(int arg, ...)
35{
36  va_list ap;
37  va_start (ap, arg);
38
39  if (arg != 1 || va_arg (ap, int) != 2 || va_arg (ap, int) != 3
40      || va_arg (ap, int) != 4 || va_arg (ap, int) != 5
41      || va_arg (ap, int) != 6 || va_arg (ap, int) != 7
42      || va_arg (ap, int) != 8 || va_arg (ap, int) != 9)
43    return 0;
44  return this;
45}
46
47void* test(MMixin& anExample)
48{
49  return anExample.MixinFunc(1,2,3,4,5,6,7,8,9).p;
50}
51
52int main ()
53{
54  CExample c;
55
56  if (test(c) != &c)
57    return 1;
58}
59