2012-02-03 09:49:51 +08:00
// RUN: %clang_cc1 -fsyntax-only -verify -fblocks %s -Wno-error=non-pod-varargs
2009-01-13 13:48:52 +08:00
2014-09-30 07:06:57 +08:00
// Check that the warning is still there under -fms-compatibility.
// RUN: %clang_cc1 -fsyntax-only -verify -fblocks %s -Wno-error=non-pod-varargs -fms-compatibility
2009-01-17 00:48:51 +08:00
extern char version [ ] ;
2009-01-13 13:48:52 +08:00
class C {
public :
C ( int ) ;
void g ( int a , . . . ) ;
static void h ( int a , . . . ) ;
} ;
void g ( int a , . . . ) ;
void t1 ( )
{
C c ( 10 ) ;
2010-03-10 19:27:22 +08:00
g ( 10 , c ) ; // expected-warning{{cannot pass object of non-POD type 'C' through variadic function; call will abort at runtime}}
2009-01-17 00:48:51 +08:00
g ( 10 , version ) ;
2013-06-21 05:03:13 +08:00
void ( * ptr ) ( int , . . . ) = g ;
ptr ( 10 , c ) ; // expected-warning{{cannot pass object of non-POD type 'C' through variadic function; call will abort at runtime}}
ptr ( 10 , version ) ;
2009-01-13 13:48:52 +08:00
}
void t2 ( )
{
C c ( 10 ) ;
2010-03-10 19:27:22 +08:00
c . g ( 10 , c ) ; // expected-warning{{cannot pass object of non-POD type 'C' through variadic method; call will abort at runtime}}
2009-01-17 00:48:51 +08:00
c . g ( 10 , version ) ;
2013-06-21 05:03:13 +08:00
void ( C : : * ptr ) ( int , . . . ) = & C : : g ;
2013-06-22 10:30:38 +08:00
( c . * ptr ) ( 10 , c ) ; // expected-warning{{cannot pass object of non-POD type 'C' through variadic method; call will abort at runtime}}
2013-06-21 05:03:13 +08:00
( c . * ptr ) ( 10 , version ) ;
2010-03-10 19:27:22 +08:00
C : : h ( 10 , c ) ; // expected-warning{{cannot pass object of non-POD type 'C' through variadic function; call will abort at runtime}}
2009-01-17 00:48:51 +08:00
C : : h ( 10 , version ) ;
2013-06-21 05:03:13 +08:00
void ( * static_ptr ) ( int , . . . ) = & C : : h ;
static_ptr ( 10 , c ) ; // expected-warning{{cannot pass object of non-POD type 'C' through variadic function; call will abort at runtime}}
static_ptr ( 10 , version ) ;
2009-01-13 13:48:52 +08:00
}
int ( ^ block ) ( int , . . . ) ;
void t3 ( )
{
C c ( 10 ) ;
2010-03-10 19:27:22 +08:00
block ( 10 , c ) ; // expected-warning{{cannot pass object of non-POD type 'C' through variadic block; call will abort at runtime}}
2009-01-17 00:48:51 +08:00
block ( 10 , version ) ;
2009-01-13 13:48:52 +08:00
}
class D {
public :
void operator ( ) ( int a , . . . ) ;
} ;
void t4 ( )
{
C c ( 10 ) ;
D d ;
2010-03-10 19:27:22 +08:00
d ( 10 , c ) ; // expected-warning{{cannot pass object of non-POD type 'C' through variadic method; call will abort at runtime}}
2009-01-17 00:48:51 +08:00
d ( 10 , version ) ;
2009-01-13 13:48:52 +08:00
}
2009-09-08 09:48:42 +08:00
class E {
2011-05-22 03:26:31 +08:00
E ( int , . . . ) ; // expected-note 2{{implicitly declared private here}}
2009-09-08 09:48:42 +08:00
} ;
void t5 ( )
{
C c ( 10 ) ;
2011-05-22 03:26:31 +08:00
E e ( 10 , c ) ; / / expected - warning { { cannot pass object of non - POD type ' C ' through variadic constructor ; call will abort at runtime } } \
// expected-error{{calling a private constructor of class 'E'}}
( void ) E ( 10 , c ) ; / / expected - warning { { cannot pass object of non - POD type ' C ' through variadic constructor ; call will abort at runtime } } \
// expected-error{{calling a private constructor of class 'E'}}
2009-11-08 09:45:36 +08:00
}
2009-12-12 15:25:49 +08:00
// PR5761: unevaluated operands and the non-POD warning
class Foo {
public :
Foo ( ) { }
} ;
int Helper ( . . . ) ;
const int size = sizeof ( Helper ( Foo ( ) ) ) ;
2009-12-12 15:57:52 +08:00
namespace std {
class type_info { } ;
}
struct Base { virtual ~ Base ( ) ; } ;
Base & get_base ( . . . ) ;
int eat_base ( . . . ) ;
void test_typeid ( Base & base ) {
2014-12-18 05:57:17 +08:00
( void ) typeid ( get_base ( base ) ) ; // expected-warning{{cannot pass object of non-POD type 'Base' through variadic function; call will abort at runtime}} expected-warning{{expression with side effects will be evaluated despite being used as an operand to 'typeid'}}
2009-12-12 15:57:52 +08:00
( void ) typeid ( eat_base ( base ) ) ; // okay
}
2010-05-16 12:01:30 +08:00
// rdar://7985267 - Shouldn't warn, doesn't actually use __builtin_va_start is
// magic.
void t6 ( Foo somearg , . . . ) {
2010-05-16 13:00:34 +08:00
__builtin_va_list list ;
__builtin_va_start ( list , somearg ) ;
2010-05-16 12:01:30 +08:00
}
2011-06-14 13:17:32 +08:00
void t7 ( int n , . . . ) {
__builtin_va_list list ;
__builtin_va_start ( list , n ) ;
( void ) __builtin_va_arg ( list , C ) ; // expected-warning{{second argument to 'va_arg' is of non-POD type 'C'}}
__builtin_va_end ( list ) ;
}
struct Abstract {
virtual void doit ( ) = 0 ; // expected-note{{unimplemented pure virtual method}}
} ;
void t8 ( int n , . . . ) {
__builtin_va_list list ;
__builtin_va_start ( list , n ) ;
( void ) __builtin_va_arg ( list , Abstract ) ; // expected-error{{second argument to 'va_arg' is of abstract type 'Abstract'}}
__builtin_va_end ( list ) ;
}
2012-01-21 09:01:51 +08:00
int t9 ( int n ) {
// Make sure the error works in potentially-evaluated sizeof
return ( int ) sizeof ( * ( Helper ( Foo ( ) ) , ( int ( * ) [ n ] ) 0 ) ) ; // expected-warning{{cannot pass object of non-POD type}}
}
2012-10-11 08:30:58 +08:00
// PR14057
namespace t10 {
struct F {
F ( ) ;
} ;
struct S {
void operator ( ) ( F , . . . ) ;
} ;
void foo ( ) {
S s ;
F f ;
s . operator ( ) ( f ) ;
s ( f ) ;
}
}
2013-06-22 08:20:41 +08:00
namespace t11 {
typedef void ( * function_ptr ) ( int , . . . ) ;
typedef void ( C : : * member_ptr ) ( int , . . . ) ;
typedef void ( ^ block_ptr ) ( int , . . . ) ;
function_ptr get_f_ptr ( ) ;
member_ptr get_m_ptr ( ) ;
block_ptr get_b_ptr ( ) ;
function_ptr arr_f_ptr [ 5 ] ;
member_ptr arr_m_ptr [ 5 ] ;
block_ptr arr_b_ptr [ 5 ] ;
void test ( ) {
C c ( 10 ) ;
( get_f_ptr ( ) ) ( 10 , c ) ; // expected-warning{{cannot pass object of non-POD type 'C' through variadic function; call will abort at runtime}}
( get_f_ptr ( ) ) ( 10 , version ) ;
2013-06-22 10:30:38 +08:00
( c . * get_m_ptr ( ) ) ( 10 , c ) ; // expected-warning{{cannot pass object of non-POD type 'C' through variadic method; call will abort at runtime}}
2013-06-22 08:20:41 +08:00
( c . * get_m_ptr ( ) ) ( 10 , version ) ;
( get_b_ptr ( ) ) ( 10 , c ) ; // expected-warning{{cannot pass object of non-POD type 'C' through variadic block; call will abort at runtime}}
( get_b_ptr ( ) ) ( 10 , version ) ;
( arr_f_ptr [ 3 ] ) ( 10 , c ) ; // expected-warning{{cannot pass object of non-POD type 'C' through variadic function; call will abort at runtime}}
( arr_f_ptr [ 3 ] ) ( 10 , version ) ;
2013-06-22 10:30:38 +08:00
( 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}}
2013-06-22 08:20:41 +08:00
( c . * arr_m_ptr [ 3 ] ) ( 10 , version ) ;
( arr_b_ptr [ 3 ] ) ( 10 , c ) ; // expected-warning{{cannot pass object of non-POD type 'C' through variadic block; call will abort at runtime}}
( arr_b_ptr [ 3 ] ) ( 10 , version ) ;
}
}