MicrosoftExtensions.cpp revision b4746036322385bf27d33ec1fc3c82a8bb3d1e58
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 84afac01d7e76f28d5e5a5c377369cc400919387eeDouglas Gregortemplate<typename T> void h1(T (__stdcall M::* const )()) { } 85afac01d7e76f28d5e5a5c377369cc400919387eeDouglas Gregor 86afac01d7e76f28d5e5a5c377369cc400919387eeDouglas Gregorvoid m1() { 87afac01d7e76f28d5e5a5c377369cc400919387eeDouglas Gregor h1<int>(&M::addP); 88afac01d7e76f28d5e5a5c377369cc400919387eeDouglas Gregor h1(&M::subtractP); 89afac01d7e76f28d5e5a5c377369cc400919387eeDouglas Gregor} 908dc3abcc36df883324461daad0c05364158f3cf0Francois Pichet 918dc3abcc36df883324461daad0c05364158f3cf0Francois Pichet//MSVC allows forward enum declaration 928dc3abcc36df883324461daad0c05364158f3cf0Francois Pichetenum ENUM; // expected-warning {{forward references to 'enum' types are a Microsoft extension}} 93842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois PichetENUM *var = 0; 94842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois PichetENUM var2 = (ENUM)3; 95842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois Pichetenum ENUM1* var3 = 0;// expected-warning {{forward references to 'enum' types are a Microsoft extension}} 96842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois Pichet 97842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois Pichet 98842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois Pichetenum ENUM2 { 99842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois Pichet ENUM2_a = (enum ENUM2) 4, 100842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois Pichet ENUM2_b = 0x9FFFFFFF, // expected-warning {{enumerator value is not representable in the underlying type 'int'}} 101842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois Pichet ENUM2_c = 0x100000000 // expected-warning {{enumerator value is not representable in the underlying type 'int'}} 102842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois Pichet}; 1035be38be82a6631786624625d010d695d529802a8Francois Pichet 1045be38be82a6631786624625d010d695d529802a8Francois Pichet 1055be38be82a6631786624625d010d695d529802a8Francois Pichetvoid f(long long); 1065be38be82a6631786624625d010d695d529802a8Francois Pichetvoid f(int); 1075be38be82a6631786624625d010d695d529802a8Francois Pichet 1085be38be82a6631786624625d010d695d529802a8Francois Pichetint main() 1095be38be82a6631786624625d010d695d529802a8Francois Pichet{ 1105be38be82a6631786624625d010d695d529802a8Francois Pichet // This is an ambiguous call in standard C++. 1115be38be82a6631786624625d010d695d529802a8Francois Pichet // This calls f(long long) in Microsoft mode because LL is always signed. 1125be38be82a6631786624625d010d695d529802a8Francois Pichet f(0xffffffffffffffffLL); 1135be38be82a6631786624625d010d695d529802a8Francois Pichet f(0xffffffffffffffffi64); 1145be38be82a6631786624625d010d695d529802a8Francois Pichet} 11586f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor 11686f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor// Enumeration types with a fixed underlying type. 11786f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregorconst int seventeen = 17; 11886f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregortypedef int Int; 11986f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor 12086f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregorstruct X0 { 12186f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor enum E1 : Int { SomeOtherValue } field; // expected-warning{{enumeration types with a fixed underlying type are a Microsoft extension}} 12286f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor enum E1 : seventeen; 12386f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor}; 12486f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor 1251756ce44b0e03d6a6fd2d42add6e3227d4d04d34Douglas Gregorenum : long long { // expected-warning{{enumeration types with a fixed underlying type are a Microsoft extension}} 12686f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor SomeValue = 0x100000000 12786f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor}; 128b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet 129b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet 130b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichetclass AAA { 131b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet__declspec(dllimport) void f(void) { } 132b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichetvoid f2(void); 133b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet}; 134b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet 135b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet__declspec(dllimport) void AAA::f2(void) { // expected-error {{dllimport attribute can be applied only to symbol}} 136b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet 137b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet} 138b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet 139b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet 140b613cd6862a80126666c46a41de36c1ba7704c2eFrancois Pichet 1418d051e00ad674754d476cc1fa0442da0bc47b2c8Francois Pichettemplate <class T> 1428d051e00ad674754d476cc1fa0442da0bc47b2c8Francois Pichetclass BB { 1438d051e00ad674754d476cc1fa0442da0bc47b2c8Francois Pichetpublic: 1448d051e00ad674754d476cc1fa0442da0bc47b2c8Francois Pichet void f(int g = 10 ); // expected-note {{previous definition is here}} 1458d051e00ad674754d476cc1fa0442da0bc47b2c8Francois Pichet}; 1468d051e00ad674754d476cc1fa0442da0bc47b2c8Francois Pichet 1478d051e00ad674754d476cc1fa0442da0bc47b2c8Francois Pichettemplate <class T> 1488d051e00ad674754d476cc1fa0442da0bc47b2c8Francois Pichetvoid BB<T>::f(int g = 0) { } // expected-warning {{redefinition of default argument}} 1498d051e00ad674754d476cc1fa0442da0bc47b2c8Francois Pichet 1506943e9befee204becfae55de1298b3d5fee87934Francois Pichet 1516943e9befee204becfae55de1298b3d5fee87934Francois Pichetnamespace MissingTypename { 1526943e9befee204becfae55de1298b3d5fee87934Francois Pichet 1536943e9befee204becfae55de1298b3d5fee87934Francois Pichettemplate<class T> class A { 1546943e9befee204becfae55de1298b3d5fee87934Francois Pichetpublic: 1556943e9befee204becfae55de1298b3d5fee87934Francois Pichet typedef int TYPE; 1566943e9befee204becfae55de1298b3d5fee87934Francois Pichet}; 1576943e9befee204becfae55de1298b3d5fee87934Francois Pichet 1586943e9befee204becfae55de1298b3d5fee87934Francois Pichettemplate<class T> class B { 1596943e9befee204becfae55de1298b3d5fee87934Francois Pichetpublic: 1606943e9befee204becfae55de1298b3d5fee87934Francois Pichet typedef int TYPE; 1616943e9befee204becfae55de1298b3d5fee87934Francois Pichet}; 1626943e9befee204becfae55de1298b3d5fee87934Francois Pichet 1636943e9befee204becfae55de1298b3d5fee87934Francois Pichet 1646943e9befee204becfae55de1298b3d5fee87934Francois Pichettemplate<class T, class U> 1656943e9befee204becfae55de1298b3d5fee87934Francois Pichetclass C : private A<T>, public B<U> { 1666943e9befee204becfae55de1298b3d5fee87934Francois Pichetpublic: 1676943e9befee204becfae55de1298b3d5fee87934Francois Pichet typedef A<T> Base1; 1686943e9befee204becfae55de1298b3d5fee87934Francois Pichet typedef B<U> Base2; 1696943e9befee204becfae55de1298b3d5fee87934Francois Pichet typedef A<U> Base3; 1706943e9befee204becfae55de1298b3d5fee87934Francois Pichet 1716943e9befee204becfae55de1298b3d5fee87934Francois Pichet A<T>::TYPE a1; // expected-warning {{missing 'typename' prior to dependent type name}} 1726943e9befee204becfae55de1298b3d5fee87934Francois Pichet Base1::TYPE a2; // expected-warning {{missing 'typename' prior to dependent type name}} 1736943e9befee204becfae55de1298b3d5fee87934Francois Pichet 1746943e9befee204becfae55de1298b3d5fee87934Francois Pichet B<U>::TYPE a3; // expected-warning {{missing 'typename' prior to dependent type name}} 1756943e9befee204becfae55de1298b3d5fee87934Francois Pichet Base2::TYPE a4; // expected-warning {{missing 'typename' prior to dependent type name}} 1766943e9befee204becfae55de1298b3d5fee87934Francois Pichet 1776943e9befee204becfae55de1298b3d5fee87934Francois Pichet A<U>::TYPE a5; // expected-error {{missing 'typename' prior to dependent type name}} 1786943e9befee204becfae55de1298b3d5fee87934Francois Pichet Base3::TYPE a6; // expected-error {{missing 'typename' prior to dependent type name}} 1796943e9befee204becfae55de1298b3d5fee87934Francois Pichet }; 1806943e9befee204becfae55de1298b3d5fee87934Francois Pichet 1812e510a0c0f7afa7951aa19c65a06c2da579535a8Francois Pichet} 1822e510a0c0f7afa7951aa19c65a06c2da579535a8Francois Pichet 1832e510a0c0f7afa7951aa19c65a06c2da579535a8Francois Pichet 1842e510a0c0f7afa7951aa19c65a06c2da579535a8Francois Pichet 1852e510a0c0f7afa7951aa19c65a06c2da579535a8Francois Pichet 1862e510a0c0f7afa7951aa19c65a06c2da579535a8Francois Pichetextern void static_func(); 1872e510a0c0f7afa7951aa19c65a06c2da579535a8Francois Pichetvoid static_func(); // expected-note {{previous declaration is here}} 1882e510a0c0f7afa7951aa19c65a06c2da579535a8Francois Pichet 1892e510a0c0f7afa7951aa19c65a06c2da579535a8Francois Pichet 1902e510a0c0f7afa7951aa19c65a06c2da579535a8Francois Pichetstatic void static_func() // expected-warning {{static declaration of 'static_func' follows non-static declaration}} 1912e510a0c0f7afa7951aa19c65a06c2da579535a8Francois Pichet{ 1922e510a0c0f7afa7951aa19c65a06c2da579535a8Francois Pichet 193a8ef3ac9fa7637fad33d52614794b92e2261d65bFrancois Pichet} 194a8ef3ac9fa7637fad33d52614794b92e2261d65bFrancois Pichet 195a8ef3ac9fa7637fad33d52614794b92e2261d65bFrancois Pichetlong function_prototype(int a); 196a8ef3ac9fa7637fad33d52614794b92e2261d65bFrancois Pichetlong (*function_ptr)(int a); 197a8ef3ac9fa7637fad33d52614794b92e2261d65bFrancois Pichet 198a8ef3ac9fa7637fad33d52614794b92e2261d65bFrancois Pichetvoid function_to_voidptr_conv() { 199a8ef3ac9fa7637fad33d52614794b92e2261d65bFrancois Pichet void *a1 = function_prototype; 200a8ef3ac9fa7637fad33d52614794b92e2261d65bFrancois Pichet void *a2 = &function_prototype; 201b594fac7007281ef52e2746349abf970348661ffFrancois Pichet void *a3 = function_ptr; 202a8ef3ac9fa7637fad33d52614794b92e2261d65bFrancois Pichet} 20330aff5b794599fac45cd8716412caf32f29ccb7eFrancois Pichet 20430aff5b794599fac45cd8716412caf32f29ccb7eFrancois Pichet 20530aff5b794599fac45cd8716412caf32f29ccb7eFrancois Pichetvoid pointer_to_integral_type_conv(char* ptr) { 20630aff5b794599fac45cd8716412caf32f29ccb7eFrancois Pichet char ch = (char)ptr; 20730aff5b794599fac45cd8716412caf32f29ccb7eFrancois Pichet short sh = (short)ptr; 20830aff5b794599fac45cd8716412caf32f29ccb7eFrancois Pichet ch = (char)ptr; 20930aff5b794599fac45cd8716412caf32f29ccb7eFrancois Pichet sh = (short)ptr; 21030aff5b794599fac45cd8716412caf32f29ccb7eFrancois Pichet} 211b2ee8305f878259613b65d0f96a03f7f852977eaFrancois Pichet 212b2ee8305f878259613b65d0f96a03f7f852977eaFrancois Pichetnamespace ms_using_declaration_bug { 213b2ee8305f878259613b65d0f96a03f7f852977eaFrancois Pichet 214b2ee8305f878259613b65d0f96a03f7f852977eaFrancois Pichetclass A { 215b2ee8305f878259613b65d0f96a03f7f852977eaFrancois Pichetpublic: 216b2ee8305f878259613b65d0f96a03f7f852977eaFrancois Pichet int f(); 217b2ee8305f878259613b65d0f96a03f7f852977eaFrancois Pichet}; 218b2ee8305f878259613b65d0f96a03f7f852977eaFrancois Pichet 219b2ee8305f878259613b65d0f96a03f7f852977eaFrancois Pichetclass B : public A { 220b2ee8305f878259613b65d0f96a03f7f852977eaFrancois Pichetprivate: 221b2ee8305f878259613b65d0f96a03f7f852977eaFrancois Pichet using A::f; 222b2ee8305f878259613b65d0f96a03f7f852977eaFrancois Pichet}; 223b2ee8305f878259613b65d0f96a03f7f852977eaFrancois Pichet 224b2ee8305f878259613b65d0f96a03f7f852977eaFrancois Pichetclass C : public B { 225b2ee8305f878259613b65d0f96a03f7f852977eaFrancois Pichetprivate: 226b2ee8305f878259613b65d0f96a03f7f852977eaFrancois Pichet using B::f; // expected-warning {{using declaration refers to inaccessible member 'ms_using_declaration_bug::B::f', which refers to accessible member 'ms_using_declaration_bug::A::f', accepted for Microsoft compatibility}} 227b2ee8305f878259613b65d0f96a03f7f852977eaFrancois Pichet}; 228b2ee8305f878259613b65d0f96a03f7f852977eaFrancois Pichet 229b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet} 230b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet 231b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet 232b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet 233b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichetnamespace friend_as_a_forward_decl { 234b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet 235b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichetclass A { 236b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet class Nested { 237b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet friend class B; 238b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet B* b; 239b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet }; 240b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet B* b; 241b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet}; 242b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois PichetB* global_b; 243b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet 244b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet 245b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichetvoid f() 246b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet{ 247b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet class Local { 248b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet friend class Z; 249b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet Z* b; 250b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet }; 251b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet Z* b; 252b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet} 253b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet 254b4746036322385bf27d33ec1fc3c82a8bb3d1e58Francois Pichet }