1cef3a7bf84817c58c7666df9e87199b9a6b8b9a3Eli Friedman// RUN: %clang_cc1 %s -triple i686-pc-win32 -fsyntax-only -Wmicrosoft -Wc++11-extensions -Wno-long-long -verify -fms-extensions -fexceptions -fcxx-exceptions
25c0ca52e40e0b9e3c2da7abba47b18e468c84060Douglas Gregor
35c0ca52e40e0b9e3c2da7abba47b18e468c84060Douglas Gregor
45c0ca52e40e0b9e3c2da7abba47b18e468c84060Douglas Gregor// ::type_info is predeclared with forward class declartion
55c0ca52e40e0b9e3c2da7abba47b18e468c84060Douglas Gregorvoid f(const type_info &a);
65c0ca52e40e0b9e3c2da7abba47b18e468c84060Douglas Gregor
75b6f769a6abda4da44186cc8e6a2d6ed37dc9344Douglas Gregor
8eedd4670b2eb7e4d67d11b2f26ed1ad304b70596Francois Pichet// Microsoft doesn't validate exception specification.
90f161593b36584ec447e5268dbed2953489854d8Francois Pichetnamespace microsoft_exception_spec {
100f161593b36584ec447e5268dbed2953489854d8Francois Pichet
11eedd4670b2eb7e4d67d11b2f26ed1ad304b70596Francois Pichetvoid foo(); // expected-note {{previous declaration}}
12eedd4670b2eb7e4d67d11b2f26ed1ad304b70596Francois Pichetvoid foo() throw(); // expected-warning {{exception specification in declaration does not match previous declaration}}
135b6f769a6abda4da44186cc8e6a2d6ed37dc9344Douglas Gregor
14eedd4670b2eb7e4d67d11b2f26ed1ad304b70596Francois Pichetvoid r6() throw(...); // expected-note {{previous declaration}}
15eedd4670b2eb7e4d67d11b2f26ed1ad304b70596Francois Pichetvoid r6() throw(int); // expected-warning {{exception specification in declaration does not match previous declaration}}
165b6f769a6abda4da44186cc8e6a2d6ed37dc9344Douglas Gregor
175b6f769a6abda4da44186cc8e6a2d6ed37dc9344Douglas Gregorstruct Base {
185b6f769a6abda4da44186cc8e6a2d6ed37dc9344Douglas Gregor  virtual void f2();
195b6f769a6abda4da44186cc8e6a2d6ed37dc9344Douglas Gregor  virtual void f3() throw(...);
205b6f769a6abda4da44186cc8e6a2d6ed37dc9344Douglas Gregor};
215b6f769a6abda4da44186cc8e6a2d6ed37dc9344Douglas Gregor
225b6f769a6abda4da44186cc8e6a2d6ed37dc9344Douglas Gregorstruct Derived : Base {
235b6f769a6abda4da44186cc8e6a2d6ed37dc9344Douglas Gregor  virtual void f2() throw(...);
245b6f769a6abda4da44186cc8e6a2d6ed37dc9344Douglas Gregor  virtual void f3();
255b6f769a6abda4da44186cc8e6a2d6ed37dc9344Douglas Gregor};
26afac01d7e76f28d5e5a5c377369cc400919387eeDouglas Gregor
270f161593b36584ec447e5268dbed2953489854d8Francois Pichetclass A {
280f161593b36584ec447e5268dbed2953489854d8Francois Pichet  virtual ~A() throw();  // expected-note {{overridden virtual function is here}}
290f161593b36584ec447e5268dbed2953489854d8Francois Pichet};
300f161593b36584ec447e5268dbed2953489854d8Francois Pichet
310f161593b36584ec447e5268dbed2953489854d8Francois Pichetclass B : public A {
320f161593b36584ec447e5268dbed2953489854d8Francois Pichet  virtual ~B();  // expected-warning {{exception specification of overriding function is more lax than base version}}
330f161593b36584ec447e5268dbed2953489854d8Francois Pichet};
340f161593b36584ec447e5268dbed2953489854d8Francois Pichet
350f161593b36584ec447e5268dbed2953489854d8Francois Pichet}
36538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet
37538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet// MSVC allows type definition in anonymous union and struct
38538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichetstruct A
39538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet{
40538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet  union
41538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet  {
42538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet    int a;
43538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet    struct B  // expected-warning {{types declared in an anonymous union are a Microsoft extension}}
44538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet    {
45538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet      int c;
46538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet    } d;
47538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet
48538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet    union C   // expected-warning {{types declared in an anonymous union are a Microsoft extension}}
49538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet    {
50538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet      int e;
51538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet      int ee;
52538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet    } f;
53538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet
54538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet    typedef int D;  // expected-warning {{types declared in an anonymous union are a Microsoft extension}}
55538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet    struct F;  // expected-warning {{types declared in an anonymous union are a Microsoft extension}}
56538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet  };
57538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet
58538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet  struct
59538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet  {
60538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet    int a2;
61538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet
62538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet    struct B2  // expected-warning {{types declared in an anonymous struct are a Microsoft extension}}
63538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet    {
64538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet      int c2;
65538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet    } d2;
66538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet
67538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet	union C2  // expected-warning {{types declared in an anonymous struct are a Microsoft extension}}
68538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet    {
69538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet      int e2;
70538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet      int ee2;
71538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet    } f2;
72538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet
73538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet    typedef int D2;  // expected-warning {{types declared in an anonymous struct are a Microsoft extension}}
74538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet    struct F2;  // expected-warning {{types declared in an anonymous struct are a Microsoft extension}}
75538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet  };
76538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet};
77538e0d0292cab16198a4fce5c388ff06adc74d0cFrancois Pichet
78afac01d7e76f28d5e5a5c377369cc400919387eeDouglas Gregor// __stdcall handling
79afac01d7e76f28d5e5a5c377369cc400919387eeDouglas Gregorstruct M {
80afac01d7e76f28d5e5a5c377369cc400919387eeDouglas Gregor    int __stdcall addP();
81afac01d7e76f28d5e5a5c377369cc400919387eeDouglas Gregor    float __stdcall subtractP();
82afac01d7e76f28d5e5a5c377369cc400919387eeDouglas Gregor};
83afac01d7e76f28d5e5a5c377369cc400919387eeDouglas Gregor
843bd9aa4593b4332d477407d9b5a42f3c4ababb21Francois Pichet// __unaligned handling
853bd9aa4593b4332d477407d9b5a42f3c4ababb21Francois Pichettypedef char __unaligned *aligned_type;
863bd9aa4593b4332d477407d9b5a42f3c4ababb21Francois Pichet
873bd9aa4593b4332d477407d9b5a42f3c4ababb21Francois Pichet
88afac01d7e76f28d5e5a5c377369cc400919387eeDouglas Gregortemplate<typename T> void h1(T (__stdcall M::* const )()) { }
89afac01d7e76f28d5e5a5c377369cc400919387eeDouglas Gregor
90afac01d7e76f28d5e5a5c377369cc400919387eeDouglas Gregorvoid m1() {
91afac01d7e76f28d5e5a5c377369cc400919387eeDouglas Gregor  h1<int>(&M::addP);
92afac01d7e76f28d5e5a5c377369cc400919387eeDouglas Gregor  h1(&M::subtractP);
93afac01d7e76f28d5e5a5c377369cc400919387eeDouglas Gregor}
948dc3abcc36df883324461daad0c05364158f3cf0Francois Pichet
95842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois Pichet
96842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois Pichet
975be38be82a6631786624625d010d695d529802a8Francois Pichet
985be38be82a6631786624625d010d695d529802a8Francois Pichet
995be38be82a6631786624625d010d695d529802a8Francois Pichetvoid f(long long);
1005be38be82a6631786624625d010d695d529802a8Francois Pichetvoid f(int);
1015be38be82a6631786624625d010d695d529802a8Francois Pichet
1025be38be82a6631786624625d010d695d529802a8Francois Pichetint main()
1035be38be82a6631786624625d010d695d529802a8Francois Pichet{
1045be38be82a6631786624625d010d695d529802a8Francois Pichet  // This is an ambiguous call in standard C++.
1055be38be82a6631786624625d010d695d529802a8Francois Pichet  // This calls f(long long) in Microsoft mode because LL is always signed.
1065be38be82a6631786624625d010d695d529802a8Francois Pichet  f(0xffffffffffffffffLL);
1075be38be82a6631786624625d010d695d529802a8Francois Pichet  f(0xffffffffffffffffi64);
1085be38be82a6631786624625d010d695d529802a8Francois Pichet}
10986f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor
11086f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor// Enumeration types with a fixed underlying type.
11186f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregorconst int seventeen = 17;
11286f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregortypedef int Int;
11386f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor
11486f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregorstruct X0 {
115cef3a7bf84817c58c7666df9e87199b9a6b8b9a3Eli Friedman  enum E1 : Int { SomeOtherValue } field; // expected-warning{{enumeration types with a fixed underlying type are a C++11 extension}}
11686f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor  enum E1 : seventeen;
11786f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor};
11886f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor
119cef3a7bf84817c58c7666df9e87199b9a6b8b9a3Eli Friedmanenum : long long {  // expected-warning{{enumeration types with a fixed underlying type are a C++11 extension}}
12086f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor  SomeValue = 0x100000000
12186f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor};
122b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet
123b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet
124b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichetclass AAA {
125b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet__declspec(dllimport) void f(void) { }
126b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichetvoid f2(void);
127b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet};
128b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet
129b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet__declspec(dllimport) void AAA::f2(void) { // expected-error {{dllimport attribute can be applied only to symbol}}
130b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet
131b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet}
132b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet
133b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet
134b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet
1358d051e00ad674754d476cc1fa0442da0bc47b2c8Francois Pichettemplate <class T>
1368d051e00ad674754d476cc1fa0442da0bc47b2c8Francois Pichetclass BB {
1378d051e00ad674754d476cc1fa0442da0bc47b2c8Francois Pichetpublic:
1388d051e00ad674754d476cc1fa0442da0bc47b2c8Francois Pichet   void f(int g = 10 ); // expected-note {{previous definition is here}}
1398d051e00ad674754d476cc1fa0442da0bc47b2c8Francois Pichet};
1408d051e00ad674754d476cc1fa0442da0bc47b2c8Francois Pichet
1418d051e00ad674754d476cc1fa0442da0bc47b2c8Francois Pichettemplate <class T>
1428d051e00ad674754d476cc1fa0442da0bc47b2c8Francois Pichetvoid BB<T>::f(int g = 0) { } // expected-warning {{redefinition of default argument}}
1438d051e00ad674754d476cc1fa0442da0bc47b2c8Francois Pichet
1446943e9befee204becfae55de1298b3d5fee87934Francois Pichet
1452e510a0c0f7afa7951aa19c65a06c2da579535a8Francois Pichet
1462e510a0c0f7afa7951aa19c65a06c2da579535a8Francois Pichetextern void static_func();
1472e510a0c0f7afa7951aa19c65a06c2da579535a8Francois Pichetvoid static_func(); // expected-note {{previous declaration is here}}
1482e510a0c0f7afa7951aa19c65a06c2da579535a8Francois Pichet
1492e510a0c0f7afa7951aa19c65a06c2da579535a8Francois Pichet
1502e510a0c0f7afa7951aa19c65a06c2da579535a8Francois Pichetstatic void static_func() // expected-warning {{static declaration of 'static_func' follows non-static declaration}}
1512e510a0c0f7afa7951aa19c65a06c2da579535a8Francois Pichet{
1522e510a0c0f7afa7951aa19c65a06c2da579535a8Francois Pichet
153a8ef3ac9fa7637fad33d52614794b92e2261d65bFrancois Pichet}
154a8ef3ac9fa7637fad33d52614794b92e2261d65bFrancois Pichet
155a8ef3ac9fa7637fad33d52614794b92e2261d65bFrancois Pichetlong function_prototype(int a);
156a8ef3ac9fa7637fad33d52614794b92e2261d65bFrancois Pichetlong (*function_ptr)(int a);
157a8ef3ac9fa7637fad33d52614794b92e2261d65bFrancois Pichet
158a8ef3ac9fa7637fad33d52614794b92e2261d65bFrancois Pichetvoid function_to_voidptr_conv() {
159a8ef3ac9fa7637fad33d52614794b92e2261d65bFrancois Pichet   void *a1 = function_prototype;
160a8ef3ac9fa7637fad33d52614794b92e2261d65bFrancois Pichet   void *a2 = &function_prototype;
161b594fac7007281ef52e2746349abf970348661ffFrancois Pichet   void *a3 = function_ptr;
162a8ef3ac9fa7637fad33d52614794b92e2261d65bFrancois Pichet}
16330aff5b794599fac45cd8716412caf32f29ccb7eFrancois Pichet
16430aff5b794599fac45cd8716412caf32f29ccb7eFrancois Pichet
16530aff5b794599fac45cd8716412caf32f29ccb7eFrancois Pichetvoid pointer_to_integral_type_conv(char* ptr) {
16630aff5b794599fac45cd8716412caf32f29ccb7eFrancois Pichet   char ch = (char)ptr;
16730aff5b794599fac45cd8716412caf32f29ccb7eFrancois Pichet   short sh = (short)ptr;
16830aff5b794599fac45cd8716412caf32f29ccb7eFrancois Pichet   ch = (char)ptr;
16930aff5b794599fac45cd8716412caf32f29ccb7eFrancois Pichet   sh = (short)ptr;
170b2ee8305f878259613b65d0f96a03f7f852977eaFrancois Pichet
171649c6c50fd3dd13577071b26fec4495f7538d923Hans Wennborg   // These are valid C++.
172649c6c50fd3dd13577071b26fec4495f7538d923Hans Wennborg   bool b = (bool)ptr;
173649c6c50fd3dd13577071b26fec4495f7538d923Hans Wennborg   b = static_cast<bool>(ptr);
174649c6c50fd3dd13577071b26fec4495f7538d923Hans Wennborg
175649c6c50fd3dd13577071b26fec4495f7538d923Hans Wennborg   // This is bad.
176649c6c50fd3dd13577071b26fec4495f7538d923Hans Wennborg   b = reinterpret_cast<bool>(ptr); // expected-error {{cast from pointer to smaller type 'bool' loses information}}
177649c6c50fd3dd13577071b26fec4495f7538d923Hans Wennborg}
178b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet
179b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichetnamespace friend_as_a_forward_decl {
180b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet
181b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichetclass A {
182b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet  class Nested {
183b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet    friend class B;
184b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet    B* b;
185b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet  };
186b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet  B* b;
187b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet};
188b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois PichetB* global_b;
189b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet
190b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet
191b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichetvoid f()
192b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet{
193b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet  class Local {
194b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet    friend class Z;
195b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet    Z* b;
196b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet  };
197b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet  Z* b;
198b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet}
199b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet
200c985b88efc9188845952ab524fe6d4717705257bFrancois Pichet}
201c985b88efc9188845952ab524fe6d4717705257bFrancois Pichet
202a2b4e5d9292688bc67b583592918dbeecae31ea3Douglas Gregorstruct PR11150 {
203a2b4e5d9292688bc67b583592918dbeecae31ea3Douglas Gregor  class X {
204a2b4e5d9292688bc67b583592918dbeecae31ea3Douglas Gregor    virtual void f() = 0;
205a2b4e5d9292688bc67b583592918dbeecae31ea3Douglas Gregor  };
206a2b4e5d9292688bc67b583592918dbeecae31ea3Douglas Gregor
207a2b4e5d9292688bc67b583592918dbeecae31ea3Douglas Gregor  int array[__is_abstract(X)? 1 : -1];
208a2b4e5d9292688bc67b583592918dbeecae31ea3Douglas Gregor};
209b57791e5b40afa6691063c83d0e95c416fb19fdeDouglas Gregor
210b57791e5b40afa6691063c83d0e95c416fb19fdeDouglas Gregorvoid f() { int __except = 0; }
211b57791e5b40afa6691063c83d0e95c416fb19fdeDouglas Gregor
21275379455fc88ca1f021e55ffe1cab3a9c2b2a37aDouglas Gregorvoid ::f(); // expected-warning{{extra qualification on member 'f'}}
2131b9e8f7e0bf2c6a2857f1b2208ca5f83b567b835Dmitri Gribenko
2141b9e8f7e0bf2c6a2857f1b2208ca5f83b567b835Dmitri Gribenkoclass C {
2151b9e8f7e0bf2c6a2857f1b2208ca5f83b567b835Dmitri Gribenko  C::C(); // expected-warning{{extra qualification on member 'C'}}
2161b9e8f7e0bf2c6a2857f1b2208ca5f83b567b835Dmitri Gribenko};
21776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall
21876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCallstruct StructWithProperty {
21976da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  __declspec(property(get=GetV)) int V1;
22076da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  __declspec(property(put=SetV)) int V2;
22176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  __declspec(property(get=GetV, put=SetV_NotExist)) int V3;
22276da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  __declspec(property(get=GetV_NotExist, put=SetV)) int V4;
22376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  __declspec(property(get=GetV, put=SetV)) int V5;
22476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall
22576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  int GetV() { return 123; }
22676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  void SetV(int i) {}
22776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall};
22876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCallvoid TestProperty() {
22976da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  StructWithProperty sp;
23076da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  int i = sp.V2; // expected-error{{no getter defined for property 'V2'}}
23176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  sp.V1 = 12; // expected-error{{no setter defined for property 'V1'}}
23276da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  int j = sp.V4; // expected-error{{no member named 'GetV_NotExist' in 'StructWithProperty'}} expected-error{{cannot find suitable getter for property 'V4'}}
23376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  sp.V3 = 14; // expected-error{{no member named 'SetV_NotExist' in 'StructWithProperty'}} expected-error{{cannot find suitable setter for property 'V3'}}
23476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  int k = sp.V5;
23576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  sp.V5 = k++;
23676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall}
23776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall
23876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall/* 4 tests for PseudoObject, begin */
23976da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCallstruct SP1
24076da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall{
24176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  bool operator()() { return true; }
24276da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall};
24376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCallstruct SP2
24476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall{
24576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  __declspec(property(get=GetV)) SP1 V;
24676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  SP1 GetV() { return SP1(); }
24776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall};
24876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCallvoid TestSP2() {
24976da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  SP2 sp2;
25076da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  bool b = sp2.V();
25176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall}
25276da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall
25376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCallstruct SP3 {
25476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  template <class T>
25576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  void f(T t) {}
25676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall};
25776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCalltemplate <class T>
25876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCallstruct SP4
25976da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall{
26076da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  __declspec(property(get=GetV)) int V;
26176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  int GetV() { return 123; }
26276da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  void f() { SP3 s2; s2.f(V); }
26376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall};
26476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCallvoid TestSP4() {
26576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  SP4<int> s;
26676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  s.f();
26776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall}
26876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall
26976da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCalltemplate <class T>
27076da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCallstruct SP5
27176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall{
27276da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  __declspec(property(get=GetV)) T V;
27376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  int GetV() { return 123; }
27476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  void f() { int *p = new int[V]; }
27576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall};
27676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall
27776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCalltemplate <class T>
27876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCallstruct SP6
27976da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall{
28076da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCallpublic:
28176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  __declspec(property(get=GetV)) T V;
28276da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  T GetV() { return 123; }
28376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  void f() { int t = V; }
28476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall};
28576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCallvoid TestSP6() {
28676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  SP6<int> c;
28776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  c.f();
28876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall}
28976da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall/* 4 tests for PseudoObject, end */
29076da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall
29176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall// Property access: explicit, implicit, with Qualifier
29276da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCallstruct SP7 {
29376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  __declspec(property(get=GetV, put=SetV)) int V;
29476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  int GetV() { return 123; }
29576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  void SetV(int v) {}
29676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall
29776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  void ImplicitAccess() { int i = V; V = i; }
29876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  void ExplicitAccess() { int i = this->V; this->V = i; }
29976da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall};
30076da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCallstruct SP8: public SP7 {
30176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  void AccessWithQualifier() { int i = SP7::V; SP7::V = i; }
30276da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall};
30376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall
30476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall// Property usage
30576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCalltemplate <class T>
30676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCallstruct SP9 {
30776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  __declspec(property(get=GetV, put=SetV)) T V;
30876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  T GetV() { return 0; }
30976da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  void SetV(T v) {}
31076da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  void f() { V = this->V; V < this->V; }
311d314abeffba04dffc101e4e71cc3a32ddeed4ae6John McCall  void g() { V++; }
312d314abeffba04dffc101e4e71cc3a32ddeed4ae6John McCall  void h() { V*=2; }
31376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall};
31476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCallstruct SP10 {
31576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  SP10(int v) {}
31676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  bool operator<(const SP10& v) { return true; }
31776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  SP10 operator*(int v) { return *this; }
318d314abeffba04dffc101e4e71cc3a32ddeed4ae6John McCall  SP10 operator+(int v) { return *this; }
31976da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  SP10& operator=(const SP10& v) { return *this; }
32076da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall};
32176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCallvoid TestSP9() {
32276da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  SP9<int> c;
32376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  int i = c.V; // Decl initializer
32476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  i = c.V; // Binary op operand
32576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  c.SetV(c.V); // CallExpr arg
32676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  int *p = new int[c.V + 1]; // Array size
32776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  p[c.V] = 1; // Array index
32876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall
32976da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  c.V = 123; // Setter
33076da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall
33176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  c.V++; // Unary op operand
33276da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  c.V *= 2; // Unary op operand
33376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall
33476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  SP9<int*> c2;
33576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  c2.V[0] = 123; // Array
33676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall
33776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  SP9<SP10> c3;
33876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  c3.f(); // Overloaded binary op operand
339d314abeffba04dffc101e4e71cc3a32ddeed4ae6John McCall  c3.g(); // Overloaded incdec op operand
340d314abeffba04dffc101e4e71cc3a32ddeed4ae6John McCall  c3.h(); // Overloaded unary op operand
34176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall}
34276eed42f99158082fae5b903f46dfb6355e66f95Aaron Ballman
34376eed42f99158082fae5b903f46dfb6355e66f95Aaron Ballmanunion u {
34476eed42f99158082fae5b903f46dfb6355e66f95Aaron Ballman  int *i1;
34576eed42f99158082fae5b903f46dfb6355e66f95Aaron Ballman  int &i2;  // expected-warning {{union member 'i2' has reference type 'int &', which is a Microsoft extension}}
34676eed42f99158082fae5b903f46dfb6355e66f95Aaron Ballman};
347f67129ab204e2884d674075d74e8ffe1f17f67e3Reid Kleckner
348f67129ab204e2884d674075d74e8ffe1f17f67e3Reid Kleckner// Property getter using reference.
349f67129ab204e2884d674075d74e8ffe1f17f67e3Reid Klecknerstruct SP11 {
350f67129ab204e2884d674075d74e8ffe1f17f67e3Reid Kleckner  __declspec(property(get=GetV)) int V;
351f67129ab204e2884d674075d74e8ffe1f17f67e3Reid Kleckner  int _v;
352f67129ab204e2884d674075d74e8ffe1f17f67e3Reid Kleckner  int& GetV() { return _v; }
353f67129ab204e2884d674075d74e8ffe1f17f67e3Reid Kleckner  void UseV();
354f67129ab204e2884d674075d74e8ffe1f17f67e3Reid Kleckner  void TakePtr(int *) {}
355f67129ab204e2884d674075d74e8ffe1f17f67e3Reid Kleckner  void TakeRef(int &) {}
356f67129ab204e2884d674075d74e8ffe1f17f67e3Reid Kleckner  void TakeVal(int) {}
357f67129ab204e2884d674075d74e8ffe1f17f67e3Reid Kleckner};
358f67129ab204e2884d674075d74e8ffe1f17f67e3Reid Kleckner
359f67129ab204e2884d674075d74e8ffe1f17f67e3Reid Klecknervoid SP11::UseV() {
360f67129ab204e2884d674075d74e8ffe1f17f67e3Reid Kleckner  TakePtr(&V);
361f67129ab204e2884d674075d74e8ffe1f17f67e3Reid Kleckner  TakeRef(V);
362f67129ab204e2884d674075d74e8ffe1f17f67e3Reid Kleckner  TakeVal(V);
363f67129ab204e2884d674075d74e8ffe1f17f67e3Reid Kleckner}
364b4f0f3f3f7adcbaf1cd56e53ddb7af92afba2c58Aaron Ballman
365b4f0f3f3f7adcbaf1cd56e53ddb7af92afba2c58Aaron Ballmanstruct StructWithUnnamedMember {
366b4f0f3f3f7adcbaf1cd56e53ddb7af92afba2c58Aaron Ballman  __declspec(property(get=GetV)) int : 10; // expected-error {{anonymous property is not supported}}
367b4f0f3f3f7adcbaf1cd56e53ddb7af92afba2c58Aaron Ballman};
368d943352fabd065ce2eaa21f4a550ed2ffa5353abDouglas Gregor
369d943352fabd065ce2eaa21f4a550ed2ffa5353abDouglas Gregornamespace rdar14250378 {
370d943352fabd065ce2eaa21f4a550ed2ffa5353abDouglas Gregor  class Bar {};
371d943352fabd065ce2eaa21f4a550ed2ffa5353abDouglas Gregor
372d943352fabd065ce2eaa21f4a550ed2ffa5353abDouglas Gregor  namespace NyNamespace {
373d943352fabd065ce2eaa21f4a550ed2ffa5353abDouglas Gregor    class Foo {
374d943352fabd065ce2eaa21f4a550ed2ffa5353abDouglas Gregor    public:
375d943352fabd065ce2eaa21f4a550ed2ffa5353abDouglas Gregor      Bar* EnsureBar();
376d943352fabd065ce2eaa21f4a550ed2ffa5353abDouglas Gregor    };
377d943352fabd065ce2eaa21f4a550ed2ffa5353abDouglas Gregor
378d943352fabd065ce2eaa21f4a550ed2ffa5353abDouglas Gregor    class Baz : public Foo {
379d943352fabd065ce2eaa21f4a550ed2ffa5353abDouglas Gregor    public:
380d943352fabd065ce2eaa21f4a550ed2ffa5353abDouglas Gregor      friend class Bar;
381d943352fabd065ce2eaa21f4a550ed2ffa5353abDouglas Gregor    };
382d943352fabd065ce2eaa21f4a550ed2ffa5353abDouglas Gregor
383d943352fabd065ce2eaa21f4a550ed2ffa5353abDouglas Gregor    Bar* Foo::EnsureBar() {
384d943352fabd065ce2eaa21f4a550ed2ffa5353abDouglas Gregor      return 0;
385d943352fabd065ce2eaa21f4a550ed2ffa5353abDouglas Gregor    }
386d943352fabd065ce2eaa21f4a550ed2ffa5353abDouglas Gregor  }
387d943352fabd065ce2eaa21f4a550ed2ffa5353abDouglas Gregor}
388