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 }