blob: ddfbbd5fc4e11b57023d8156071ea6c09775312b [file] [log] [blame]
George Burgess IV08a4a8c2015-12-03 19:19:09 +00001// 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
6void a(void *p __attribute__((pass_object_size))); //expected-error{{'pass_object_size' attribute takes one argument}}
7void b(void *p __attribute__((pass_object_size(1.0)))); //expected-error{{'pass_object_size' attribute requires parameter 1 to be an integer constant}}
8
9void c(void *p __attribute__((pass_object_size(4)))); //expected-error{{'pass_object_size' attribute requires integer constant between 0 and 3 inclusive}}
10void d(void *p __attribute__((pass_object_size(-1)))); //expected-error{{'pass_object_size' attribute requires integer constant between 0 and 3 inclusive}}
11
12void 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
14void f(char p __attribute__((pass_object_size(0)))); //expected-error{{'pass_object_size' attribute only applies to constant pointer arguments}}
15void g(const char p __attribute__((pass_object_size(0)))); //expected-error{{'pass_object_size' attribute only applies to constant pointer arguments}}
16void h(char *p __attribute__((pass_object_size(0)))) {} //expected-error{{pass_object_size attribute only applies to constant pointer arguments}}
17void i(char *p __attribute__((pass_object_size(0)))); // OK -- const is only necessary on definitions, not decls.
18void 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))
22void Overloaded(void *p PS(0)) overloaded; //expected-note{{previous declaration is here}}
23void Overloaded(void *p PS(1)) overloaded; //expected-error{{conflicting pass_object_size attributes on parameters}}
24void Overloaded2(void *p PS(1), void *p2 PS(0)) overloaded; //expected-note{{previous declaration is here}}
25void Overloaded2(void *p PS(0), void *p2 PS(1)) overloaded; //expected-error{{conflicting pass_object_size attributes on parameters}}
26
27void Overloaded3(void *p PS(0), void *p2) overloaded; //expected-note{{previous declaration is here}}
28void Overloaded3(void *p, void *p2 PS(0)) overloaded; //expected-error{{conflicting pass_object_size attributes on parameters}}
29
30void TakeFn(void (*)(void *));
31void TakeFnOvl(void (*)(void *)) overloaded;
32void TakeFnOvl(void (*)(int *)) overloaded;
33
34void NotOverloaded(void *p PS(0));
35void IsOverloaded(void *p PS(0)) overloaded;
George Burgess IV7204ed92016-01-07 02:26:57 +000036void IsOverloaded(char *p) overloaded; // char* inestead of void* is intentional
George Burgess IV08a4a8c2015-12-03 19:19:09 +000037void 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 IV6da4c202016-03-23 02:33:58 +000041 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 IV08a4a8c2015-12-03 19:19:09 +000043
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 IV7204ed92016-01-07 02:26:57 +000052
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 IV08a4a8c2015-12-03 19:19:09 +000056}