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