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 Smithvoid 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