17a0a31ce0cd38147bfe853f71a3f7261444ddf4cChad Rosier// RUN: %clang_cc1 -fsyntax-only -verify -fblocks %s -Wno-error=non-pod-varargs 2906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson 3dce5e2cabf07ff25eb4d9e1859c0a21c69f588d2Anders Carlssonextern char version[]; 4dce5e2cabf07ff25eb4d9e1859c0a21c69f588d2Anders Carlsson 5906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlssonclass C { 6906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlssonpublic: 7906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson C(int); 8906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson void g(int a, ...); 9906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson static void h(int a, ...); 10906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson}; 11906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson 12906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlssonvoid g(int a, ...); 13906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson 14906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlssonvoid t1() 15906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson{ 16906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson C c(10); 17906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson 187c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall g(10, c); // expected-warning{{cannot pass object of non-POD type 'C' through variadic function; call will abort at runtime}} 19dce5e2cabf07ff25eb4d9e1859c0a21c69f588d2Anders Carlsson g(10, version); 20f462b0152f10eed0b989b07bcf457b6fb0d83bdbRichard Trieu 21f462b0152f10eed0b989b07bcf457b6fb0d83bdbRichard Trieu void (*ptr)(int, ...) = g; 22f462b0152f10eed0b989b07bcf457b6fb0d83bdbRichard Trieu ptr(10, c); // expected-warning{{cannot pass object of non-POD type 'C' through variadic function; call will abort at runtime}} 23f462b0152f10eed0b989b07bcf457b6fb0d83bdbRichard Trieu ptr(10, version); 24906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson} 25906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson 26906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlssonvoid t2() 27906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson{ 28906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson C c(10); 29906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson 307c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall c.g(10, c); // expected-warning{{cannot pass object of non-POD type 'C' through variadic method; call will abort at runtime}} 31dce5e2cabf07ff25eb4d9e1859c0a21c69f588d2Anders Carlsson c.g(10, version); 32f462b0152f10eed0b989b07bcf457b6fb0d83bdbRichard Trieu 33f462b0152f10eed0b989b07bcf457b6fb0d83bdbRichard Trieu void (C::*ptr)(int, ...) = &C::g; 34e2a90b8bb054fc8de6c115a31bfadf7868bcf0c3Richard Trieu (c.*ptr)(10, c); // expected-warning{{cannot pass object of non-POD type 'C' through variadic method; call will abort at runtime}} 35f462b0152f10eed0b989b07bcf457b6fb0d83bdbRichard Trieu (c.*ptr)(10, version); 36f462b0152f10eed0b989b07bcf457b6fb0d83bdbRichard Trieu 377c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall C::h(10, c); // expected-warning{{cannot pass object of non-POD type 'C' through variadic function; call will abort at runtime}} 38dce5e2cabf07ff25eb4d9e1859c0a21c69f588d2Anders Carlsson C::h(10, version); 39f462b0152f10eed0b989b07bcf457b6fb0d83bdbRichard Trieu 40f462b0152f10eed0b989b07bcf457b6fb0d83bdbRichard Trieu void (*static_ptr)(int, ...) = &C::h; 41f462b0152f10eed0b989b07bcf457b6fb0d83bdbRichard Trieu static_ptr(10, c); // expected-warning{{cannot pass object of non-POD type 'C' through variadic function; call will abort at runtime}} 42f462b0152f10eed0b989b07bcf457b6fb0d83bdbRichard Trieu static_ptr(10, version); 43906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson} 44906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson 45906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlssonint (^block)(int, ...); 46906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson 47906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlssonvoid t3() 48906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson{ 49906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson C c(10); 50906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson 517c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall block(10, c); // expected-warning{{cannot pass object of non-POD type 'C' through variadic block; call will abort at runtime}} 52dce5e2cabf07ff25eb4d9e1859c0a21c69f588d2Anders Carlsson block(10, version); 53906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson} 54906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson 55906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlssonclass D { 56906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlssonpublic: 57906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson void operator() (int a, ...); 58906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson}; 59906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson 60906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlssonvoid t4() 61906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson{ 62906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson C c(10); 63906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson 64906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson D d; 65906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson 667c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall d(10, c); // expected-warning{{cannot pass object of non-POD type 'C' through variadic method; call will abort at runtime}} 67dce5e2cabf07ff25eb4d9e1859c0a21c69f588d2Anders Carlsson d(10, version); 68906fed0fb54a338961aba3aa54802b7d68de94c7Anders Carlsson} 69d74d4149f759b8abec15fb8163a4206e8c7068c8Anders Carlsson 70d74d4149f759b8abec15fb8163a4206e8c7068c8Anders Carlssonclass E { 71930a9abb7eb171d706c9e17a27bbcd267f0d9b3dDouglas Gregor E(int, ...); // expected-note 2{{implicitly declared private here}} 72d74d4149f759b8abec15fb8163a4206e8c7068c8Anders Carlsson}; 73d74d4149f759b8abec15fb8163a4206e8c7068c8Anders Carlsson 74d74d4149f759b8abec15fb8163a4206e8c7068c8Anders Carlssonvoid t5() 75d74d4149f759b8abec15fb8163a4206e8c7068c8Anders Carlsson{ 76d74d4149f759b8abec15fb8163a4206e8c7068c8Anders Carlsson C c(10); 77d74d4149f759b8abec15fb8163a4206e8c7068c8Anders Carlsson 78930a9abb7eb171d706c9e17a27bbcd267f0d9b3dDouglas Gregor E e(10, c); // expected-warning{{cannot pass object of non-POD type 'C' through variadic constructor; call will abort at runtime}} \ 79930a9abb7eb171d706c9e17a27bbcd267f0d9b3dDouglas Gregor // expected-error{{calling a private constructor of class 'E'}} 80930a9abb7eb171d706c9e17a27bbcd267f0d9b3dDouglas Gregor (void)E(10, c); // expected-warning{{cannot pass object of non-POD type 'C' through variadic constructor; call will abort at runtime}} \ 81930a9abb7eb171d706c9e17a27bbcd267f0d9b3dDouglas Gregor // expected-error{{calling a private constructor of class 'E'}} 82930a9abb7eb171d706c9e17a27bbcd267f0d9b3dDouglas Gregor 834fcfde4d5c8f25e40720972a5543d538a0dcb220Daniel Dunbar} 8475b699a883ed02e9183cb5f4ad7086f4e3c6adf1Douglas Gregor 8575b699a883ed02e9183cb5f4ad7086f4e3c6adf1Douglas Gregor// PR5761: unevaluated operands and the non-POD warning 8675b699a883ed02e9183cb5f4ad7086f4e3c6adf1Douglas Gregorclass Foo { 8775b699a883ed02e9183cb5f4ad7086f4e3c6adf1Douglas Gregor public: 8875b699a883ed02e9183cb5f4ad7086f4e3c6adf1Douglas Gregor Foo() {} 8975b699a883ed02e9183cb5f4ad7086f4e3c6adf1Douglas Gregor}; 9075b699a883ed02e9183cb5f4ad7086f4e3c6adf1Douglas Gregor 9175b699a883ed02e9183cb5f4ad7086f4e3c6adf1Douglas Gregorint Helper(...); 9275b699a883ed02e9183cb5f4ad7086f4e3c6adf1Douglas Gregorconst int size = sizeof(Helper(Foo())); 9306d33699f11277a494c1118a0d25a83dab3bbd4cDouglas Gregor 9406d33699f11277a494c1118a0d25a83dab3bbd4cDouglas Gregornamespace std { 9506d33699f11277a494c1118a0d25a83dab3bbd4cDouglas Gregor class type_info { }; 9606d33699f11277a494c1118a0d25a83dab3bbd4cDouglas Gregor} 9706d33699f11277a494c1118a0d25a83dab3bbd4cDouglas Gregor 9806d33699f11277a494c1118a0d25a83dab3bbd4cDouglas Gregorstruct Base { virtual ~Base(); }; 9906d33699f11277a494c1118a0d25a83dab3bbd4cDouglas GregorBase &get_base(...); 10006d33699f11277a494c1118a0d25a83dab3bbd4cDouglas Gregorint eat_base(...); 10106d33699f11277a494c1118a0d25a83dab3bbd4cDouglas Gregor 10206d33699f11277a494c1118a0d25a83dab3bbd4cDouglas Gregorvoid test_typeid(Base &base) { 10355693fbe18e9431dbb0ea9e20d140d8bc6bc4c72Eli Friedman (void)typeid(get_base(base)); // expected-warning{{cannot pass object of non-POD type 'Base' through variadic function; call will abort at runtime}} 10406d33699f11277a494c1118a0d25a83dab3bbd4cDouglas Gregor (void)typeid(eat_base(base)); // okay 10506d33699f11277a494c1118a0d25a83dab3bbd4cDouglas Gregor} 106403783337fc06ce46bc2adeb7f09e0c0471f758eChris Lattner 107403783337fc06ce46bc2adeb7f09e0c0471f758eChris Lattner 108403783337fc06ce46bc2adeb7f09e0c0471f758eChris Lattner// rdar://7985267 - Shouldn't warn, doesn't actually use __builtin_va_start is 109403783337fc06ce46bc2adeb7f09e0c0471f758eChris Lattner// magic. 110403783337fc06ce46bc2adeb7f09e0c0471f758eChris Lattner 111403783337fc06ce46bc2adeb7f09e0c0471f758eChris Lattnervoid t6(Foo somearg, ... ) { 1124bb3bf98704c98d2953381b484a9127f0909678fChris Lattner __builtin_va_list list; 1134bb3bf98704c98d2953381b484a9127f0909678fChris Lattner __builtin_va_start(list, somearg); 114403783337fc06ce46bc2adeb7f09e0c0471f758eChris Lattner} 115403783337fc06ce46bc2adeb7f09e0c0471f758eChris Lattner 1160adde128d96a73864569516e684faa570e3c0333David Majnemervoid t7(int n, ...) { 1170adde128d96a73864569516e684faa570e3c0333David Majnemer __builtin_va_list list; 1180adde128d96a73864569516e684faa570e3c0333David Majnemer __builtin_va_start(list, n); 1190adde128d96a73864569516e684faa570e3c0333David Majnemer (void)__builtin_va_arg(list, C); // expected-warning{{second argument to 'va_arg' is of non-POD type 'C'}} 1200adde128d96a73864569516e684faa570e3c0333David Majnemer __builtin_va_end(list); 1210adde128d96a73864569516e684faa570e3c0333David Majnemer} 1220adde128d96a73864569516e684faa570e3c0333David Majnemer 1230adde128d96a73864569516e684faa570e3c0333David Majnemerstruct Abstract { 1240adde128d96a73864569516e684faa570e3c0333David Majnemer virtual void doit() = 0; // expected-note{{unimplemented pure virtual method}} 1250adde128d96a73864569516e684faa570e3c0333David Majnemer}; 1260adde128d96a73864569516e684faa570e3c0333David Majnemer 1270adde128d96a73864569516e684faa570e3c0333David Majnemervoid t8(int n, ...) { 1280adde128d96a73864569516e684faa570e3c0333David Majnemer __builtin_va_list list; 1290adde128d96a73864569516e684faa570e3c0333David Majnemer __builtin_va_start(list, n); 1300adde128d96a73864569516e684faa570e3c0333David Majnemer (void)__builtin_va_arg(list, Abstract); // expected-error{{second argument to 'va_arg' is of abstract type 'Abstract'}} 1310adde128d96a73864569516e684faa570e3c0333David Majnemer __builtin_va_end(list); 1320adde128d96a73864569516e684faa570e3c0333David Majnemer} 13371b8fb5d4233420d2ed2f150a54ea61431bd8684Eli Friedman 13471b8fb5d4233420d2ed2f150a54ea61431bd8684Eli Friedmanint t9(int n) { 13571b8fb5d4233420d2ed2f150a54ea61431bd8684Eli Friedman // Make sure the error works in potentially-evaluated sizeof 13671b8fb5d4233420d2ed2f150a54ea61431bd8684Eli Friedman return (int)sizeof(*(Helper(Foo()), (int (*)[n])0)); // expected-warning{{cannot pass object of non-POD type}} 13771b8fb5d4233420d2ed2f150a54ea61431bd8684Eli Friedman} 1382edcde8747a000113b434a5c88b4648beed4197bEli Friedman 1392edcde8747a000113b434a5c88b4648beed4197bEli Friedman// PR14057 1402edcde8747a000113b434a5c88b4648beed4197bEli Friedmannamespace t10 { 1412edcde8747a000113b434a5c88b4648beed4197bEli Friedman struct F { 1422edcde8747a000113b434a5c88b4648beed4197bEli Friedman F(); 1432edcde8747a000113b434a5c88b4648beed4197bEli Friedman }; 1442edcde8747a000113b434a5c88b4648beed4197bEli Friedman 1452edcde8747a000113b434a5c88b4648beed4197bEli Friedman struct S { 1462edcde8747a000113b434a5c88b4648beed4197bEli Friedman void operator()(F, ...); 1472edcde8747a000113b434a5c88b4648beed4197bEli Friedman }; 1482edcde8747a000113b434a5c88b4648beed4197bEli Friedman 1492edcde8747a000113b434a5c88b4648beed4197bEli Friedman void foo() { 1502edcde8747a000113b434a5c88b4648beed4197bEli Friedman S s; 1512edcde8747a000113b434a5c88b4648beed4197bEli Friedman F f; 1522edcde8747a000113b434a5c88b4648beed4197bEli Friedman s.operator()(f); 1532edcde8747a000113b434a5c88b4648beed4197bEli Friedman s(f); 1542edcde8747a000113b434a5c88b4648beed4197bEli Friedman } 1552edcde8747a000113b434a5c88b4648beed4197bEli Friedman} 1560538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu 1570538f0e9200df56974b5a71bc276dbce456e9781Richard Trieunamespace t11 { 1580538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu typedef void(*function_ptr)(int, ...); 1590538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu typedef void(C::*member_ptr)(int, ...); 1600538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu typedef void(^block_ptr)(int, ...); 1610538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu 1620538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu function_ptr get_f_ptr(); 1630538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu member_ptr get_m_ptr(); 1640538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu block_ptr get_b_ptr(); 1650538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu 1660538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu function_ptr arr_f_ptr[5]; 1670538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu member_ptr arr_m_ptr[5]; 1680538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu block_ptr arr_b_ptr[5]; 1690538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu 1700538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu void test() { 1710538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu C c(10); 1720538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu 1730538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu (get_f_ptr())(10, c); // expected-warning{{cannot pass object of non-POD type 'C' through variadic function; call will abort at runtime}} 1740538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu (get_f_ptr())(10, version); 1750538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu 176e2a90b8bb054fc8de6c115a31bfadf7868bcf0c3Richard Trieu (c.*get_m_ptr())(10, c); // expected-warning{{cannot pass object of non-POD type 'C' through variadic method; call will abort at runtime}} 1770538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu (c.*get_m_ptr())(10, version); 1780538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu 1790538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu (get_b_ptr())(10, c); // expected-warning{{cannot pass object of non-POD type 'C' through variadic block; call will abort at runtime}} 1800538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu (get_b_ptr())(10, version); 1810538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu 1820538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu (arr_f_ptr[3])(10, c); // expected-warning{{cannot pass object of non-POD type 'C' through variadic function; call will abort at runtime}} 1830538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu (arr_f_ptr[3])(10, version); 1840538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu 185e2a90b8bb054fc8de6c115a31bfadf7868bcf0c3Richard Trieu (c.*arr_m_ptr[3])(10, c); // expected-warning{{cannot pass object of non-POD type 'C' through variadic method; call will abort at runtime}} 1860538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu (c.*arr_m_ptr[3])(10, version); 1870538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu 1880538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu (arr_b_ptr[3])(10, c); // expected-warning{{cannot pass object of non-POD type 'C' through variadic block; call will abort at runtime}} 1890538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu (arr_b_ptr[3])(10, version); 1900538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu } 1910538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu} 192