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