xref: /llvm-project/clang/test/CXX/expr/expr.post/expr.call/p7-0x.cpp (revision 4e28b26589016fa9b8f94224af7b7c108447017f)
19ca5c425SRichard Smith // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
2253cadfeSDouglas Gregor 
3253cadfeSDouglas Gregor struct X1 {
4253cadfeSDouglas Gregor   X1();
5253cadfeSDouglas Gregor };
6253cadfeSDouglas Gregor 
7253cadfeSDouglas Gregor struct X2 {
8253cadfeSDouglas Gregor   X2();
9253cadfeSDouglas Gregor   ~X2();
10253cadfeSDouglas Gregor };
11253cadfeSDouglas Gregor 
1256cb16ddSRichard Smith struct X3 {
1356cb16ddSRichard Smith   X3(const X3&) = default;
1456cb16ddSRichard Smith };
1556cb16ddSRichard Smith 
1656cb16ddSRichard Smith struct X4 {
1756cb16ddSRichard Smith   X4(const X4&) = default;
1856cb16ddSRichard Smith   X4(X4&);
1956cb16ddSRichard Smith };
2056cb16ddSRichard Smith 
21253cadfeSDouglas Gregor void vararg(...);
22253cadfeSDouglas Gregor 
23d7293d7fSRichard Smith void g();
24d7293d7fSRichard Smith 
f(X1 x1,X2 x2,X3 x3,X4 x4)2556cb16ddSRichard Smith void f(X1 x1, X2 x2, X3 x3, X4 x4) {
2656cb16ddSRichard Smith   vararg(x1); // OK
27253cadfeSDouglas Gregor   vararg(x2); // expected-error{{cannot pass object of non-trivial type 'X2' through variadic function; call will abort at runtime}}
2856cb16ddSRichard Smith   vararg(x3); // OK
2956cb16ddSRichard Smith   vararg(x4); // expected-error{{cannot pass object of non-trivial type 'X4' through variadic function; call will abort at runtime}}
30d7293d7fSRichard Smith 
31d7293d7fSRichard Smith   vararg(g()); // expected-error{{cannot pass expression of type 'void' to variadic function}}
32d7293d7fSRichard Smith   vararg({1, 2, 3}); // expected-error{{cannot pass initializer list to variadic function}}
33253cadfeSDouglas Gregor }
347e1aa5b7SDouglas Gregor 
357e1aa5b7SDouglas Gregor 
367e1aa5b7SDouglas Gregor namespace PR11131 {
377e1aa5b7SDouglas Gregor   struct S;
387e1aa5b7SDouglas Gregor 
397e1aa5b7SDouglas Gregor   S &getS();
407e1aa5b7SDouglas Gregor 
41*4e28b265SEli Friedman   int f(...);
427e1aa5b7SDouglas Gregor 
g()437e1aa5b7SDouglas Gregor   void g() {
447e1aa5b7SDouglas Gregor     (void)sizeof(f(getS()));
457e1aa5b7SDouglas Gregor   }
467e1aa5b7SDouglas Gregor }
47