1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s -triple x86_64-linux-gnu -Wincompatible-pointer-types 2*67e74705SXin Li // 3*67e74705SXin Li // Tests for the pass_object_size attribute 4*67e74705SXin Li // Non-failure cases are covered in test/CodeGen/pass-object-size.c 5*67e74705SXin Li 6*67e74705SXin Li void a(void *p __attribute__((pass_object_size))); //expected-error{{'pass_object_size' attribute takes one argument}} 7*67e74705SXin Li void b(void *p __attribute__((pass_object_size(1.0)))); //expected-error{{'pass_object_size' attribute requires parameter 1 to be an integer constant}} 8*67e74705SXin Li 9*67e74705SXin Li void c(void *p __attribute__((pass_object_size(4)))); //expected-error{{'pass_object_size' attribute requires integer constant between 0 and 3 inclusive}} 10*67e74705SXin Li void d(void *p __attribute__((pass_object_size(-1)))); //expected-error{{'pass_object_size' attribute requires integer constant between 0 and 3 inclusive}} 11*67e74705SXin Li 12*67e74705SXin Li void e(void *p __attribute__((pass_object_size(1ULL<<32)))); //expected-error{{integer constant expression evaluates to value 4294967296 that cannot be represented in a 32-bit unsigned integer type}} 13*67e74705SXin Li 14*67e74705SXin Li void f(char p __attribute__((pass_object_size(0)))); //expected-error{{'pass_object_size' attribute only applies to constant pointer arguments}} 15*67e74705SXin Li void g(const char p __attribute__((pass_object_size(0)))); //expected-error{{'pass_object_size' attribute only applies to constant pointer arguments}} h(char * p)16*67e74705SXin Livoid h(char *p __attribute__((pass_object_size(0)))) {} //expected-error{{pass_object_size attribute only applies to constant pointer arguments}} 17*67e74705SXin Li void i(char *p __attribute__((pass_object_size(0)))); // OK -- const is only necessary on definitions, not decls. 18*67e74705SXin Li void j(char *p __attribute__((pass_object_size(0), pass_object_size(1)))); //expected-error{{'pass_object_size' attribute can only be applied once per parameter}} 19*67e74705SXin Li 20*67e74705SXin Li #define PS(N) __attribute__((pass_object_size(N))) 21*67e74705SXin Li #define overloaded __attribute__((overloadable)) 22*67e74705SXin Li void Overloaded(void *p PS(0)) overloaded; //expected-note{{previous declaration is here}} 23*67e74705SXin Li void Overloaded(void *p PS(1)) overloaded; //expected-error{{conflicting pass_object_size attributes on parameters}} 24*67e74705SXin Li void Overloaded2(void *p PS(1), void *p2 PS(0)) overloaded; //expected-note{{previous declaration is here}} 25*67e74705SXin Li void Overloaded2(void *p PS(0), void *p2 PS(1)) overloaded; //expected-error{{conflicting pass_object_size attributes on parameters}} 26*67e74705SXin Li 27*67e74705SXin Li void Overloaded3(void *p PS(0), void *p2) overloaded; //expected-note{{previous declaration is here}} 28*67e74705SXin Li void Overloaded3(void *p, void *p2 PS(0)) overloaded; //expected-error{{conflicting pass_object_size attributes on parameters}} 29*67e74705SXin Li 30*67e74705SXin Li void TakeFn(void (*)(void *)); 31*67e74705SXin Li void TakeFnOvl(void (*)(void *)) overloaded; 32*67e74705SXin Li void TakeFnOvl(void (*)(int *)) overloaded; 33*67e74705SXin Li 34*67e74705SXin Li void NotOverloaded(void *p PS(0)); 35*67e74705SXin Li void IsOverloaded(void *p PS(0)) overloaded; 36*67e74705SXin Li void IsOverloaded(char *p) overloaded; // char* inestead of void* is intentional FunctionPtrs()37*67e74705SXin Livoid FunctionPtrs() { 38*67e74705SXin Li void (*p)(void *) = NotOverloaded; //expected-error{{cannot take address of function 'NotOverloaded' because parameter 1 has pass_object_size attribute}} 39*67e74705SXin Li void (*p2)(void *) = &NotOverloaded; //expected-error{{cannot take address of function 'NotOverloaded' because parameter 1 has pass_object_size attribute}} 40*67e74705SXin Li 41*67e74705SXin Li void (*p3)(void *) = IsOverloaded; //expected-warning{{incompatible pointer types initializing 'void (*)(void *)' with an expression of type '<overloaded function type>'}} expected-note@-6{{candidate address cannot be taken because parameter 1 has pass_object_size attribute}} expected-note@-5{{type mismatch}} 42*67e74705SXin Li void (*p4)(void *) = &IsOverloaded; //expected-warning{{incompatible pointer types initializing 'void (*)(void *)' with an expression of type '<overloaded function type>'}} expected-note@-7{{candidate address cannot be taken because parameter 1 has pass_object_size attribute}} expected-note@-6{{type mismatch}} 43*67e74705SXin Li 44*67e74705SXin Li void (*p5)(char *) = IsOverloaded; 45*67e74705SXin Li void (*p6)(char *) = &IsOverloaded; 46*67e74705SXin Li 47*67e74705SXin Li TakeFn(NotOverloaded); //expected-error{{cannot take address of function 'NotOverloaded' because parameter 1 has pass_object_size attribute}} 48*67e74705SXin Li TakeFn(&NotOverloaded); //expected-error{{cannot take address of function 'NotOverloaded' because parameter 1 has pass_object_size attribute}} 49*67e74705SXin Li 50*67e74705SXin Li TakeFnOvl(NotOverloaded); //expected-error{{cannot take address of function 'NotOverloaded' because parameter 1 has pass_object_size attribute}} 51*67e74705SXin Li TakeFnOvl(&NotOverloaded); //expected-error{{cannot take address of function 'NotOverloaded' because parameter 1 has pass_object_size attribute}} 52*67e74705SXin Li 53*67e74705SXin Li int P; 54*67e74705SXin Li (&NotOverloaded)(&P); //expected-error{{cannot take address of function 'NotOverloaded' because parameter 1 has pass_object_size attribute}} 55*67e74705SXin Li (&IsOverloaded)(&P); //expected-error{{no matching function}} expected-note@35{{candidate address cannot be taken because parameter 1 has pass_object_size attribute}} expected-note@36{{candidate function not viable: no known conversion from 'int *' to 'char *' for 1st argument}} 56*67e74705SXin Li } 57