1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 20fd228d48bbf05d08d9b408023d7c8ddb681bc91Douglas Gregor 30fd228d48bbf05d08d9b408023d7c8ddb681bc91Douglas Gregorstruct X1 { 40fd228d48bbf05d08d9b408023d7c8ddb681bc91Douglas Gregor X1(); 50fd228d48bbf05d08d9b408023d7c8ddb681bc91Douglas Gregor}; 60fd228d48bbf05d08d9b408023d7c8ddb681bc91Douglas Gregor 70fd228d48bbf05d08d9b408023d7c8ddb681bc91Douglas Gregorstruct X2 { 80fd228d48bbf05d08d9b408023d7c8ddb681bc91Douglas Gregor X2(); 90fd228d48bbf05d08d9b408023d7c8ddb681bc91Douglas Gregor ~X2(); 100fd228d48bbf05d08d9b408023d7c8ddb681bc91Douglas Gregor}; 110fd228d48bbf05d08d9b408023d7c8ddb681bc91Douglas Gregor 121a6c43a9d215697dbe0418c145a6bd1c85ec654dRichard Smithstruct X3 { 131a6c43a9d215697dbe0418c145a6bd1c85ec654dRichard Smith X3(const X3&) = default; 141a6c43a9d215697dbe0418c145a6bd1c85ec654dRichard Smith}; 151a6c43a9d215697dbe0418c145a6bd1c85ec654dRichard Smith 161a6c43a9d215697dbe0418c145a6bd1c85ec654dRichard Smithstruct X4 { 171a6c43a9d215697dbe0418c145a6bd1c85ec654dRichard Smith X4(const X4&) = default; 181a6c43a9d215697dbe0418c145a6bd1c85ec654dRichard Smith X4(X4&); 191a6c43a9d215697dbe0418c145a6bd1c85ec654dRichard Smith}; 201a6c43a9d215697dbe0418c145a6bd1c85ec654dRichard Smith 210fd228d48bbf05d08d9b408023d7c8ddb681bc91Douglas Gregorvoid vararg(...); 220fd228d48bbf05d08d9b408023d7c8ddb681bc91Douglas Gregor 230e2189791acf7fcec4f1b32af24efb2d363f30c1Richard Smithvoid g(); 240e2189791acf7fcec4f1b32af24efb2d363f30c1Richard Smith 251a6c43a9d215697dbe0418c145a6bd1c85ec654dRichard Smithvoid f(X1 x1, X2 x2, X3 x3, X4 x4) { 261a6c43a9d215697dbe0418c145a6bd1c85ec654dRichard Smith vararg(x1); // OK 270fd228d48bbf05d08d9b408023d7c8ddb681bc91Douglas Gregor vararg(x2); // expected-error{{cannot pass object of non-trivial type 'X2' through variadic function; call will abort at runtime}} 281a6c43a9d215697dbe0418c145a6bd1c85ec654dRichard Smith vararg(x3); // OK 291a6c43a9d215697dbe0418c145a6bd1c85ec654dRichard Smith vararg(x4); // expected-error{{cannot pass object of non-trivial type 'X4' through variadic function; call will abort at runtime}} 300e2189791acf7fcec4f1b32af24efb2d363f30c1Richard Smith 310e2189791acf7fcec4f1b32af24efb2d363f30c1Richard Smith vararg(g()); // expected-error{{cannot pass expression of type 'void' to variadic function}} 320e2189791acf7fcec4f1b32af24efb2d363f30c1Richard Smith vararg({1, 2, 3}); // expected-error{{cannot pass initializer list to variadic function}} 330fd228d48bbf05d08d9b408023d7c8ddb681bc91Douglas Gregor} 34b8e778da8545624826440366a709d555332ffc73Douglas Gregor 35b8e778da8545624826440366a709d555332ffc73Douglas Gregor 36b8e778da8545624826440366a709d555332ffc73Douglas Gregornamespace PR11131 { 37b8e778da8545624826440366a709d555332ffc73Douglas Gregor struct S; 38b8e778da8545624826440366a709d555332ffc73Douglas Gregor 39b8e778da8545624826440366a709d555332ffc73Douglas Gregor S &getS(); 40b8e778da8545624826440366a709d555332ffc73Douglas Gregor 41c99b90edb85ea0a5be6ce567a8c0147b76534e15Eli Friedman int f(...); 42b8e778da8545624826440366a709d555332ffc73Douglas Gregor 43b8e778da8545624826440366a709d555332ffc73Douglas Gregor void g() { 44b8e778da8545624826440366a709d555332ffc73Douglas Gregor (void)sizeof(f(getS())); 45b8e778da8545624826440366a709d555332ffc73Douglas Gregor } 46b8e778da8545624826440366a709d555332ffc73Douglas Gregor} 47