blob: 1c5fe74a154d60f8ce23bc0414c9b99bc8fabd20 [file] [log] [blame]
Daniel Dunbard7d5f022009-03-24 02:24:46 +00001// RUN: clang-cc -fsyntax-only -verify -fblocks %s
Anders Carlsson906fed02009-01-13 05:48:52 +00002
Anders Carlssondce5e2c2009-01-16 16:48:51 +00003extern char version[];
4
Anders Carlsson906fed02009-01-13 05:48:52 +00005class C {
6public:
7 C(int);
8 void g(int a, ...);
9 static void h(int a, ...);
10};
11
12void g(int a, ...);
13
14void t1()
15{
16 C c(10);
17
18 g(10, c); // expected-warning{{cannot pass object of non-POD type 'class C' through variadic function; call will abort at runtime}}
Anders Carlssondce5e2c2009-01-16 16:48:51 +000019 g(10, version);
Anders Carlsson906fed02009-01-13 05:48:52 +000020}
21
22void t2()
23{
24 C c(10);
25
26 c.g(10, c); // expected-warning{{cannot pass object of non-POD type 'class C' through variadic method; call will abort at runtime}}
Anders Carlssondce5e2c2009-01-16 16:48:51 +000027 c.g(10, version);
Anders Carlsson906fed02009-01-13 05:48:52 +000028
29 C::h(10, c); // expected-warning{{cannot pass object of non-POD type 'class C' through variadic function; call will abort at runtime}}
Anders Carlssondce5e2c2009-01-16 16:48:51 +000030 C::h(10, version);
Anders Carlsson906fed02009-01-13 05:48:52 +000031}
32
33int (^block)(int, ...);
34
35void t3()
36{
37 C c(10);
38
39 block(10, c); // expected-warning{{cannot pass object of non-POD type 'class C' through variadic block; call will abort at runtime}}
Anders Carlssondce5e2c2009-01-16 16:48:51 +000040 block(10, version);
Anders Carlsson906fed02009-01-13 05:48:52 +000041}
42
43class D {
44public:
45 void operator() (int a, ...);
46};
47
48void t4()
49{
50 C c(10);
51
52 D d;
53
54 d(10, c); // expected-warning{{Line 48: cannot pass object of non-POD type 'class C' through variadic method; call will abort at runtime}}
Anders Carlssondce5e2c2009-01-16 16:48:51 +000055 d(10, version);
Anders Carlsson906fed02009-01-13 05:48:52 +000056}