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