1 // { dg-do compile }
2 // { dg-options "-Wunused -W" }
3 // Suppress a warning that is irrelevant to the purpose of this test.
4 // { dg-options "-Wunused -W -Wno-abi" { target arm_eabi } }
5 
6 #include <stdarg.h>
7 
8 struct A
9 {
10   long a;
AA11   A () : a (0) { }
AA12   A (long x) : a (x) { }
13   operator long () const { return a; }
14   long operator- (const A& x) const { return a - x.a; }
15 };
16 
17 long
fn1(A a)18 fn1 (A a)
19 {
20   return a - A (0);
21 }
22 
23 struct B
24 {
operatorB25   bool operator() (const int x, const int y) const throw() { return x < y; }
26 };
27 
28 template <typename T>
29 bool
fn2(int x,int y,T z)30 fn2 (int x, int y, T z)
31 {
32   return z (x, y);
33 }
34 
35 bool
fn3(void)36 fn3 (void)
37 {
38   return fn2 (1, 2, B ());
39 }
40 
41 int
fn4(va_list ap)42 fn4 (va_list ap)
43 {
44   return va_arg (ap, int);
45 }
46 
47 template <typename T>
48 T
fn5(va_list ap)49 fn5 (va_list ap)
50 {
51   return va_arg (ap, T);
52 }
53 
54 int
fn6(va_list ap)55 fn6 (va_list ap)
56 {
57   return fn5 <int> (ap);
58 }
59 
60 template <typename T>
61 int
fn7(T ap)62 fn7 (T ap)
63 {
64   return va_arg (ap, int);
65 }
66 
67 int
fn8(va_list ap)68 fn8 (va_list ap)
69 {
70   return fn7 (ap);
71 }
72