George Burgess IV | 08a4a8c | 2015-12-03 19:19:09 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -fsyntax-only -verify %s -triple x86_64-linux-gnu -Wincompatible-pointer-types |
| 2 | // |
| 3 | // Tests for the pass_object_size attribute |
| 4 | // Non-failure cases are covered in test/CodeGen/pass-object-size.c |
| 5 | |
| 6 | void a(void *p __attribute__((pass_object_size))); //expected-error{{'pass_object_size' attribute takes one argument}} |
| 7 | 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 | |
| 9 | void c(void *p __attribute__((pass_object_size(4)))); //expected-error{{'pass_object_size' attribute requires integer constant between 0 and 3 inclusive}} |
| 10 | void d(void *p __attribute__((pass_object_size(-1)))); //expected-error{{'pass_object_size' attribute requires integer constant between 0 and 3 inclusive}} |
| 11 | |
| 12 | 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 | |
| 14 | void f(char p __attribute__((pass_object_size(0)))); //expected-error{{'pass_object_size' attribute only applies to constant pointer arguments}} |
| 15 | void g(const char p __attribute__((pass_object_size(0)))); //expected-error{{'pass_object_size' attribute only applies to constant pointer arguments}} |
| 16 | void h(char *p __attribute__((pass_object_size(0)))) {} //expected-error{{pass_object_size attribute only applies to constant pointer arguments}} |
| 17 | void i(char *p __attribute__((pass_object_size(0)))); // OK -- const is only necessary on definitions, not decls. |
| 18 | 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 | |
| 20 | #define PS(N) __attribute__((pass_object_size(N))) |
| 21 | #define overloaded __attribute__((overloadable)) |
| 22 | void Overloaded(void *p PS(0)) overloaded; //expected-note{{previous declaration is here}} |
| 23 | void Overloaded(void *p PS(1)) overloaded; //expected-error{{conflicting pass_object_size attributes on parameters}} |
| 24 | void Overloaded2(void *p PS(1), void *p2 PS(0)) overloaded; //expected-note{{previous declaration is here}} |
| 25 | void Overloaded2(void *p PS(0), void *p2 PS(1)) overloaded; //expected-error{{conflicting pass_object_size attributes on parameters}} |
| 26 | |
| 27 | void Overloaded3(void *p PS(0), void *p2) overloaded; //expected-note{{previous declaration is here}} |
| 28 | void Overloaded3(void *p, void *p2 PS(0)) overloaded; //expected-error{{conflicting pass_object_size attributes on parameters}} |
| 29 | |
| 30 | void TakeFn(void (*)(void *)); |
| 31 | void TakeFnOvl(void (*)(void *)) overloaded; |
| 32 | void TakeFnOvl(void (*)(int *)) overloaded; |
| 33 | |
| 34 | void NotOverloaded(void *p PS(0)); |
| 35 | void IsOverloaded(void *p PS(0)) overloaded; |
George Burgess IV | 7204ed9 | 2016-01-07 02:26:57 +0000 | [diff] [blame] | 36 | void IsOverloaded(char *p) overloaded; // char* inestead of void* is intentional |
George Burgess IV | 08a4a8c | 2015-12-03 19:19:09 +0000 | [diff] [blame] | 37 | void FunctionPtrs() { |
| 38 | void (*p)(void *) = NotOverloaded; //expected-error{{cannot take address of function 'NotOverloaded' because parameter 1 has pass_object_size attribute}} |
| 39 | void (*p2)(void *) = &NotOverloaded; //expected-error{{cannot take address of function 'NotOverloaded' because parameter 1 has pass_object_size attribute}} |
| 40 | |
George Burgess IV | 6da4c20 | 2016-03-23 02:33:58 +0000 | [diff] [blame] | 41 | 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 | 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}} |
George Burgess IV | 08a4a8c | 2015-12-03 19:19:09 +0000 | [diff] [blame] | 43 | |
| 44 | void (*p5)(char *) = IsOverloaded; |
| 45 | void (*p6)(char *) = &IsOverloaded; |
| 46 | |
| 47 | TakeFn(NotOverloaded); //expected-error{{cannot take address of function 'NotOverloaded' because parameter 1 has pass_object_size attribute}} |
| 48 | TakeFn(&NotOverloaded); //expected-error{{cannot take address of function 'NotOverloaded' because parameter 1 has pass_object_size attribute}} |
| 49 | |
| 50 | TakeFnOvl(NotOverloaded); //expected-error{{cannot take address of function 'NotOverloaded' because parameter 1 has pass_object_size attribute}} |
| 51 | TakeFnOvl(&NotOverloaded); //expected-error{{cannot take address of function 'NotOverloaded' because parameter 1 has pass_object_size attribute}} |
George Burgess IV | 7204ed9 | 2016-01-07 02:26:57 +0000 | [diff] [blame] | 52 | |
| 53 | int P; |
| 54 | (&NotOverloaded)(&P); //expected-error{{cannot take address of function 'NotOverloaded' because parameter 1 has pass_object_size attribute}} |
| 55 | (&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}} |
George Burgess IV | 08a4a8c | 2015-12-03 19:19:09 +0000 | [diff] [blame] | 56 | } |