xref: /aosp_15_r20/external/clang/test/SemaCXX/ms-property-error.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -verify -fms-compatibility %s -fsyntax-only -o -
2*67e74705SXin Li 
3*67e74705SXin Li class S {
4*67e74705SXin Li public:
5*67e74705SXin Li   __declspec(property(get=GetX,put=PutX)) int x[];
GetX(int i,int j)6*67e74705SXin Li   int GetX(int i, int j) { return i+j; } // expected-note {{'GetX' declared here}}
PutX(int i,int j,int k)7*67e74705SXin Li   void PutX(int i, int j, int k) { j = i = k; } // expected-note {{'PutX' declared here}}
8*67e74705SXin Li };
9*67e74705SXin Li 
10*67e74705SXin Li char *ptr;
11*67e74705SXin Li template <typename T>
12*67e74705SXin Li class St {
13*67e74705SXin Li public:
14*67e74705SXin Li   __declspec(property(get=GetX,put=PutX)) T x[];
GetX(T i,T j)15*67e74705SXin Li   T GetX(T i, T j) { return i+j; } // expected-note 3 {{'GetX' declared here}}
PutX(T i,T j,T k)16*67e74705SXin Li   T PutX(T i, T j, T k) { return j = i = k; }  // expected-note 2 {{'PutX' declared here}}
~St()17*67e74705SXin Li   ~St() {
18*67e74705SXin Li     x[1] = 0; // expected-error {{too few arguments to function call, expected 3, have 2}}
19*67e74705SXin Li     x[2][3] = 4;
20*67e74705SXin Li     ++x[2][3];
21*67e74705SXin Li     x[1][2] = x[3][4][5]; // expected-error {{too many arguments to function call, expected 2, have 3}}
22*67e74705SXin Li     ptr = x[1][2] = x[3][4]; // expected-error {{assigning to 'char *' from incompatible type 'int'}}
23*67e74705SXin Li   }
24*67e74705SXin Li };
25*67e74705SXin Li 
26*67e74705SXin Li // CHECK-LABEL: main
main(int argc,char ** argv)27*67e74705SXin Li int main(int argc, char **argv) {
28*67e74705SXin Li   S *p1 = 0;
29*67e74705SXin Li   St<float> *p2 = 0;
30*67e74705SXin Li   St<int> a; // expected-note {{in instantiation of member function 'St<int>::~St' requested here}}
31*67e74705SXin Li   int j = (p1->x)[223][11][2]; // expected-error {{too many arguments to function call, expected 2, have 3}}
32*67e74705SXin Li   (p1->x[23]) = argc; // expected-error {{too few arguments to function call, expected 3, have 2}}
33*67e74705SXin Li   float j1 = (p2->x); // expected-error {{too few arguments to function call, expected 2, have 0}}
34*67e74705SXin Li   ((p2->x)[23])[1][2] = *argv; // expected-error {{too many arguments to function call, expected 3, have 4}}
35*67e74705SXin Li   argv = p2->x[11][22] = argc; // expected-error {{assigning to 'char **' from incompatible type 'float'}}
36*67e74705SXin Li   return ++(((p2->x)[23])); // expected-error {{too few arguments to function call, expected 2, have 1}}
37*67e74705SXin Li }
38