1dde385dd9b87b791736750114b2e0790195e373bFrancois Pichet// RUN: %clang_cc1 %s -triple i686-pc-win32 -fsyntax-only -Wmicrosoft -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 958dc3abcc36df883324461daad0c05364158f3cf0Francois Pichet//MSVC allows forward enum declaration 968dc3abcc36df883324461daad0c05364158f3cf0Francois Pichetenum ENUM; // expected-warning {{forward references to 'enum' types are a Microsoft extension}} 97842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois PichetENUM *var = 0; 98842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois PichetENUM var2 = (ENUM)3; 99842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois Pichetenum ENUM1* var3 = 0;// expected-warning {{forward references to 'enum' types are a Microsoft extension}} 100842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois Pichet 101842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois Pichet 102842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois Pichetenum ENUM2 { 103842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois Pichet ENUM2_a = (enum ENUM2) 4, 104842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois Pichet ENUM2_b = 0x9FFFFFFF, // expected-warning {{enumerator value is not representable in the underlying type 'int'}} 105842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois Pichet ENUM2_c = 0x100000000 // expected-warning {{enumerator value is not representable in the underlying type 'int'}} 106842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois Pichet}; 1075be38be82a6631786624625d010d695d529802a8Francois Pichet 1085be38be82a6631786624625d010d695d529802a8Francois Pichet 1095be38be82a6631786624625d010d695d529802a8Francois Pichetvoid f(long long); 1105be38be82a6631786624625d010d695d529802a8Francois Pichetvoid f(int); 1115be38be82a6631786624625d010d695d529802a8Francois Pichet 1125be38be82a6631786624625d010d695d529802a8Francois Pichetint main() 1135be38be82a6631786624625d010d695d529802a8Francois Pichet{ 1145be38be82a6631786624625d010d695d529802a8Francois Pichet // This is an ambiguous call in standard C++. 1155be38be82a6631786624625d010d695d529802a8Francois Pichet // This calls f(long long) in Microsoft mode because LL is always signed. 1165be38be82a6631786624625d010d695d529802a8Francois Pichet f(0xffffffffffffffffLL); 1175be38be82a6631786624625d010d695d529802a8Francois Pichet f(0xffffffffffffffffi64); 1185be38be82a6631786624625d010d695d529802a8Francois Pichet} 11986f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor 12086f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor// Enumeration types with a fixed underlying type. 12186f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregorconst int seventeen = 17; 12286f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregortypedef int Int; 12386f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor 12486f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregorstruct X0 { 12586f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor enum E1 : Int { SomeOtherValue } field; // expected-warning{{enumeration types with a fixed underlying type are a Microsoft extension}} 12686f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor enum E1 : seventeen; 12786f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor}; 12886f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor 1291756ce44b0e03d6a6fd2d42add6e3227d4d04d34Douglas Gregorenum : long long { // expected-warning{{enumeration types with a fixed underlying type are a Microsoft extension}} 13086f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor SomeValue = 0x100000000 13186f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor}; 132b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet 133b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet 134b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichetclass AAA { 135b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet__declspec(dllimport) void f(void) { } 136b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichetvoid f2(void); 137b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet}; 138b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet 139b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet__declspec(dllimport) void AAA::f2(void) { // expected-error {{dllimport attribute can be applied only to symbol}} 140b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet 141b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet} 142b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet 143b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet 144b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet 1458d051e00ad674754d476cc1fa0442da0bc47b2c8Francois Pichettemplate <class T> 1468d051e00ad674754d476cc1fa0442da0bc47b2c8Francois Pichetclass BB { 1478d051e00ad674754d476cc1fa0442da0bc47b2c8Francois Pichetpublic: 1488d051e00ad674754d476cc1fa0442da0bc47b2c8Francois Pichet void f(int g = 10 ); // expected-note {{previous definition is here}} 1498d051e00ad674754d476cc1fa0442da0bc47b2c8Francois Pichet}; 1508d051e00ad674754d476cc1fa0442da0bc47b2c8Francois Pichet 1518d051e00ad674754d476cc1fa0442da0bc47b2c8Francois Pichettemplate <class T> 1528d051e00ad674754d476cc1fa0442da0bc47b2c8Francois Pichetvoid BB<T>::f(int g = 0) { } // expected-warning {{redefinition of default argument}} 1538d051e00ad674754d476cc1fa0442da0bc47b2c8Francois Pichet 1546943e9befee204becfae55de1298b3d5fee87934Francois Pichet 1552e510a0c0f7afa7951aa19c65a06c2da579535a8Francois Pichet 1562e510a0c0f7afa7951aa19c65a06c2da579535a8Francois Pichetextern void static_func(); 1572e510a0c0f7afa7951aa19c65a06c2da579535a8Francois Pichetvoid static_func(); // expected-note {{previous declaration is here}} 1582e510a0c0f7afa7951aa19c65a06c2da579535a8Francois Pichet 1592e510a0c0f7afa7951aa19c65a06c2da579535a8Francois Pichet 1602e510a0c0f7afa7951aa19c65a06c2da579535a8Francois Pichetstatic void static_func() // expected-warning {{static declaration of 'static_func' follows non-static declaration}} 1612e510a0c0f7afa7951aa19c65a06c2da579535a8Francois Pichet{ 1622e510a0c0f7afa7951aa19c65a06c2da579535a8Francois Pichet 163a8ef3ac9fa7637fad33d52614794b92e2261d65bFrancois Pichet} 164a8ef3ac9fa7637fad33d52614794b92e2261d65bFrancois Pichet 165a8ef3ac9fa7637fad33d52614794b92e2261d65bFrancois Pichetlong function_prototype(int a); 166a8ef3ac9fa7637fad33d52614794b92e2261d65bFrancois Pichetlong (*function_ptr)(int a); 167a8ef3ac9fa7637fad33d52614794b92e2261d65bFrancois Pichet 168a8ef3ac9fa7637fad33d52614794b92e2261d65bFrancois Pichetvoid function_to_voidptr_conv() { 169a8ef3ac9fa7637fad33d52614794b92e2261d65bFrancois Pichet void *a1 = function_prototype; 170a8ef3ac9fa7637fad33d52614794b92e2261d65bFrancois Pichet void *a2 = &function_prototype; 171b594fac7007281ef52e2746349abf970348661ffFrancois Pichet void *a3 = function_ptr; 172a8ef3ac9fa7637fad33d52614794b92e2261d65bFrancois Pichet} 17330aff5b794599fac45cd8716412caf32f29ccb7eFrancois Pichet 17430aff5b794599fac45cd8716412caf32f29ccb7eFrancois Pichet 17530aff5b794599fac45cd8716412caf32f29ccb7eFrancois Pichetvoid pointer_to_integral_type_conv(char* ptr) { 17630aff5b794599fac45cd8716412caf32f29ccb7eFrancois Pichet char ch = (char)ptr; 17730aff5b794599fac45cd8716412caf32f29ccb7eFrancois Pichet short sh = (short)ptr; 17830aff5b794599fac45cd8716412caf32f29ccb7eFrancois Pichet ch = (char)ptr; 17930aff5b794599fac45cd8716412caf32f29ccb7eFrancois Pichet sh = (short)ptr; 18030aff5b794599fac45cd8716412caf32f29ccb7eFrancois Pichet} 181b2ee8305f878259613b65d0f96a03f7f852977eaFrancois Pichet 182b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet 183b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichetnamespace friend_as_a_forward_decl { 184b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet 185b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichetclass A { 186b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet class Nested { 187b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet friend class B; 188b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet B* b; 189b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet }; 190b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet B* b; 191b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet}; 192b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois PichetB* global_b; 193b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet 194b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet 195b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichetvoid f() 196b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet{ 197b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet class Local { 198b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet friend class Z; 199b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet Z* b; 200b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet }; 201b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet Z* b; 202b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet} 203b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet 204c985b88efc9188845952ab524fe6d4717705257bFrancois Pichet} 205c985b88efc9188845952ab524fe6d4717705257bFrancois Pichet 206a2b4e5d9292688bc67b583592918dbeecae31ea3Douglas Gregorstruct PR11150 { 207a2b4e5d9292688bc67b583592918dbeecae31ea3Douglas Gregor class X { 208a2b4e5d9292688bc67b583592918dbeecae31ea3Douglas Gregor virtual void f() = 0; 209a2b4e5d9292688bc67b583592918dbeecae31ea3Douglas Gregor }; 210a2b4e5d9292688bc67b583592918dbeecae31ea3Douglas Gregor 211a2b4e5d9292688bc67b583592918dbeecae31ea3Douglas Gregor int array[__is_abstract(X)? 1 : -1]; 212a2b4e5d9292688bc67b583592918dbeecae31ea3Douglas Gregor}; 213