xref: /aosp_15_r20/external/clang/test/SemaCXX/MicrosoftExtensions.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 %s -triple i686-pc-win32 -fsyntax-only -Wmicrosoft -Wc++11-extensions -Wno-long-long -verify -fms-extensions -fexceptions -fcxx-exceptions -DTEST1
2*67e74705SXin Li // RUN: %clang_cc1 %s -triple i686-pc-win32 -fsyntax-only -Wmicrosoft -Wc++11-extensions -Wno-long-long -verify -fexceptions -fcxx-exceptions -DTEST2
3*67e74705SXin Li 
4*67e74705SXin Li #if TEST1
5*67e74705SXin Li 
6*67e74705SXin Li // Microsoft doesn't validate exception specification.
7*67e74705SXin Li namespace microsoft_exception_spec {
8*67e74705SXin Li 
9*67e74705SXin Li void foo(); // expected-note {{previous declaration}}
10*67e74705SXin Li void foo() throw(); // expected-warning {{exception specification in declaration does not match previous declaration}}
11*67e74705SXin Li 
12*67e74705SXin Li void r6() throw(...); // expected-note {{previous declaration}}
13*67e74705SXin Li void r6() throw(int); // expected-warning {{exception specification in declaration does not match previous declaration}}
14*67e74705SXin Li 
15*67e74705SXin Li struct Base {
16*67e74705SXin Li   virtual void f2();
17*67e74705SXin Li   virtual void f3() throw(...);
18*67e74705SXin Li };
19*67e74705SXin Li 
20*67e74705SXin Li struct Derived : Base {
21*67e74705SXin Li   virtual void f2() throw(...);
22*67e74705SXin Li   virtual void f3();
23*67e74705SXin Li };
24*67e74705SXin Li 
25*67e74705SXin Li class A {
26*67e74705SXin Li   virtual ~A() throw();  // expected-note {{overridden virtual function is here}}
27*67e74705SXin Li };
28*67e74705SXin Li 
29*67e74705SXin Li class B : public A {
30*67e74705SXin Li   virtual ~B();  // expected-warning {{exception specification of overriding function is more lax than base version}}
31*67e74705SXin Li };
32*67e74705SXin Li 
33*67e74705SXin Li }
34*67e74705SXin Li 
35*67e74705SXin Li // MSVC allows type definition in anonymous union and struct
36*67e74705SXin Li struct A
37*67e74705SXin Li {
38*67e74705SXin Li   union
39*67e74705SXin Li   {
40*67e74705SXin Li     int a;
41*67e74705SXin Li     struct B  // expected-warning {{types declared in an anonymous union are a Microsoft extension}}
42*67e74705SXin Li     {
43*67e74705SXin Li       int c;
44*67e74705SXin Li     } d;
45*67e74705SXin Li 
46*67e74705SXin Li     union C   // expected-warning {{types declared in an anonymous union are a Microsoft extension}}
47*67e74705SXin Li     {
48*67e74705SXin Li       int e;
49*67e74705SXin Li       int ee;
50*67e74705SXin Li     } f;
51*67e74705SXin Li 
52*67e74705SXin Li     typedef int D;  // expected-warning {{types declared in an anonymous union are a Microsoft extension}}
53*67e74705SXin Li     struct F;  // expected-warning {{types declared in an anonymous union are a Microsoft extension}}
54*67e74705SXin Li   };
55*67e74705SXin Li 
56*67e74705SXin Li   struct
57*67e74705SXin Li   {
58*67e74705SXin Li     int a2;
59*67e74705SXin Li 
60*67e74705SXin Li     struct B2  // expected-warning {{types declared in an anonymous struct are a Microsoft extension}}
61*67e74705SXin Li     {
62*67e74705SXin Li       int c2;
63*67e74705SXin Li     } d2;
64*67e74705SXin Li 
65*67e74705SXin Li 	union C2  // expected-warning {{types declared in an anonymous struct are a Microsoft extension}}
66*67e74705SXin Li     {
67*67e74705SXin Li       int e2;
68*67e74705SXin Li       int ee2;
69*67e74705SXin Li     } f2;
70*67e74705SXin Li 
71*67e74705SXin Li     typedef int D2;  // expected-warning {{types declared in an anonymous struct are a Microsoft extension}}
72*67e74705SXin Li     struct F2;  // expected-warning {{types declared in an anonymous struct are a Microsoft extension}}
73*67e74705SXin Li   };
74*67e74705SXin Li };
75*67e74705SXin Li 
76*67e74705SXin Li // __stdcall handling
77*67e74705SXin Li struct M {
78*67e74705SXin Li     int __stdcall addP();
79*67e74705SXin Li     float __stdcall subtractP();
80*67e74705SXin Li };
81*67e74705SXin Li 
82*67e74705SXin Li // __unaligned handling
83*67e74705SXin Li typedef char __unaligned *aligned_type;
84*67e74705SXin Li typedef struct UnalignedTag { int f; } __unaligned *aligned_type2;
85*67e74705SXin Li typedef char __unaligned aligned_type3;
86*67e74705SXin Li 
87*67e74705SXin Li struct aligned_type4 {
88*67e74705SXin Li   int i;
89*67e74705SXin Li };
90*67e74705SXin Li 
91*67e74705SXin Li __unaligned int aligned_type4::*p1_aligned_type4 = &aligned_type4::i;
92*67e74705SXin Li int aligned_type4::* __unaligned p2_aligned_type4 = &aligned_type4::i;
93*67e74705SXin Li __unaligned int aligned_type4::* __unaligned p3_aligned_type4 = &aligned_type4::i;
94*67e74705SXin Li void (aligned_type4::*__unaligned p4_aligned_type4)();
95*67e74705SXin Li 
96*67e74705SXin Li // Check that __unaligned qualifier can be used for overloading
foo_unaligned(int * arg)97*67e74705SXin Li void foo_unaligned(int *arg) {}
foo_unaligned(__unaligned int * arg)98*67e74705SXin Li void foo_unaligned(__unaligned int *arg) {}
foo_unaligned(int arg)99*67e74705SXin Li void foo_unaligned(int arg) {} // expected-note {{previous definition is here}}
foo_unaligned(__unaligned int arg)100*67e74705SXin Li void foo_unaligned(__unaligned int arg) {} // expected-error {{redefinition of 'foo_unaligned'}}
101*67e74705SXin Li class A_unaligned {};
102*67e74705SXin Li class B_unaligned : public A_unaligned {};
foo_unaligned(__unaligned A_unaligned * arg)103*67e74705SXin Li int foo_unaligned(__unaligned A_unaligned *arg) { return 0; }
foo_unaligned(B_unaligned * arg)104*67e74705SXin Li void *foo_unaligned(B_unaligned *arg) { return 0; }
105*67e74705SXin Li 
test_unaligned()106*67e74705SXin Li void test_unaligned() {
107*67e74705SXin Li   int *p1 = 0;
108*67e74705SXin Li   foo_unaligned(p1);
109*67e74705SXin Li 
110*67e74705SXin Li   __unaligned int *p2 = 0;
111*67e74705SXin Li   foo_unaligned(p2);
112*67e74705SXin Li 
113*67e74705SXin Li   __unaligned B_unaligned *p3 = 0;
114*67e74705SXin Li   int p4 = foo_unaligned(p3);
115*67e74705SXin Li 
116*67e74705SXin Li   B_unaligned *p5 = p3; // expected-error {{cannot initialize a variable of type 'B_unaligned *' with an lvalue of type '__unaligned B_unaligned *'}}
117*67e74705SXin Li 
118*67e74705SXin Li   __unaligned B_unaligned *p6 = p3;
119*67e74705SXin Li 
120*67e74705SXin Li   p1_aligned_type4 = p2_aligned_type4;
121*67e74705SXin Li   p2_aligned_type4 = p1_aligned_type4; // expected-error {{assigning to 'int aligned_type4::*' from incompatible type '__unaligned int aligned_type4::*'}}
122*67e74705SXin Li   p3_aligned_type4 = p1_aligned_type4;
123*67e74705SXin Li 
124*67e74705SXin Li   __unaligned int a[10];
125*67e74705SXin Li   int *b = a; // expected-error {{cannot initialize a variable of type 'int *' with an lvalue of type '__unaligned int [10]'}}
126*67e74705SXin Li }
127*67e74705SXin Li 
128*67e74705SXin Li // Test from PR27367
129*67e74705SXin Li // We should accept assignment of an __unaligned pointer to a non-__unaligned
130*67e74705SXin Li // pointer to void
131*67e74705SXin Li typedef struct _ITEMIDLIST { int i; } ITEMIDLIST;
132*67e74705SXin Li typedef ITEMIDLIST __unaligned *LPITEMIDLIST;
133*67e74705SXin Li extern "C" __declspec(dllimport) void __stdcall CoTaskMemFree(void* pv);
FreeIDListArray(LPITEMIDLIST * ppidls)134*67e74705SXin Li __inline void FreeIDListArray(LPITEMIDLIST *ppidls) {
135*67e74705SXin Li   CoTaskMemFree(*ppidls);
136*67e74705SXin Li   __unaligned int *x = 0;
137*67e74705SXin Li   void *y = x;
138*67e74705SXin Li }
139*67e74705SXin Li 
140*67e74705SXin Li // Test from PR27666
141*67e74705SXin Li // We should accept type conversion of __unaligned to non-__unaligned references
142*67e74705SXin Li typedef struct in_addr {
143*67e74705SXin Li public:
in_addrin_addr144*67e74705SXin Li   in_addr(in_addr &a) {} // expected-note {{candidate constructor not viable: no known conversion from '__unaligned IN_ADDR *' (aka '__unaligned in_addr *') to 'in_addr &' for 1st argument; dereference the argument with *}}
in_addrin_addr145*67e74705SXin Li   in_addr(in_addr *a) {} // expected-note {{candidate constructor not viable: 1st argument ('__unaligned IN_ADDR *' (aka '__unaligned in_addr *')) would lose __unaligned qualifier}}
146*67e74705SXin Li } IN_ADDR;
147*67e74705SXin Li 
f(IN_ADDR __unaligned * a)148*67e74705SXin Li void f(IN_ADDR __unaligned *a) {
149*67e74705SXin Li   IN_ADDR local_addr = *a;
150*67e74705SXin Li   IN_ADDR local_addr2 = a; // expected-error {{no viable conversion from '__unaligned IN_ADDR *' (aka '__unaligned in_addr *') to 'IN_ADDR' (aka 'in_addr')}}
151*67e74705SXin Li }
152*67e74705SXin Li 
h1(T (__stdcall M::* const)())153*67e74705SXin Li template<typename T> void h1(T (__stdcall M::* const )()) { }
154*67e74705SXin Li 
m1()155*67e74705SXin Li void m1() {
156*67e74705SXin Li   h1<int>(&M::addP);
157*67e74705SXin Li   h1(&M::subtractP);
158*67e74705SXin Li }
159*67e74705SXin Li 
160*67e74705SXin Li 
161*67e74705SXin Li 
162*67e74705SXin Li 
163*67e74705SXin Li 
164*67e74705SXin Li void f(long long);
165*67e74705SXin Li void f(int);
166*67e74705SXin Li 
main()167*67e74705SXin Li int main()
168*67e74705SXin Li {
169*67e74705SXin Li   // This is an ambiguous call in standard C++.
170*67e74705SXin Li   // This calls f(long long) in Microsoft mode because LL is always signed.
171*67e74705SXin Li   f(0xffffffffffffffffLL);
172*67e74705SXin Li   f(0xffffffffffffffffi64);
173*67e74705SXin Li }
174*67e74705SXin Li 
175*67e74705SXin Li // Enumeration types with a fixed underlying type.
176*67e74705SXin Li const int seventeen = 17;
177*67e74705SXin Li typedef int Int;
178*67e74705SXin Li 
179*67e74705SXin Li struct X0 {
180*67e74705SXin Li   enum E1 : Int { SomeOtherValue } field; // expected-warning{{enumeration types with a fixed underlying type are a C++11 extension}}
181*67e74705SXin Li   enum E1 : seventeen;
182*67e74705SXin Li };
183*67e74705SXin Li 
184*67e74705SXin Li enum : long long {  // expected-warning{{enumeration types with a fixed underlying type are a C++11 extension}}
185*67e74705SXin Li   SomeValue = 0x100000000
186*67e74705SXin Li };
187*67e74705SXin Li 
188*67e74705SXin Li 
189*67e74705SXin Li class AAA {
f(void)190*67e74705SXin Li __declspec(dllimport) void f(void) { }
191*67e74705SXin Li void f2(void); // expected-note{{previous declaration is here}}
192*67e74705SXin Li };
193*67e74705SXin Li 
f2(void)194*67e74705SXin Li __declspec(dllimport) void AAA::f2(void) { // expected-error{{dllimport cannot be applied to non-inline function definition}}
195*67e74705SXin Li                                            // expected-error@-1{{redeclaration of 'AAA::f2' cannot add 'dllimport' attribute}}
196*67e74705SXin Li 
197*67e74705SXin Li }
198*67e74705SXin Li 
199*67e74705SXin Li 
200*67e74705SXin Li 
201*67e74705SXin Li template <class T>
202*67e74705SXin Li class BB {
203*67e74705SXin Li public:
204*67e74705SXin Li    void f(int g = 10 ); // expected-note {{previous definition is here}}
205*67e74705SXin Li };
206*67e74705SXin Li 
207*67e74705SXin Li template <class T>
f(int g=0)208*67e74705SXin Li void BB<T>::f(int g = 0) { } // expected-warning {{redefinition of default argument}}
209*67e74705SXin Li 
210*67e74705SXin Li 
211*67e74705SXin Li 
212*67e74705SXin Li extern void static_func();
213*67e74705SXin Li void static_func(); // expected-note {{previous declaration is here}}
214*67e74705SXin Li 
215*67e74705SXin Li 
static_func()216*67e74705SXin Li static void static_func() // expected-warning {{redeclaring non-static 'static_func' as static is a Microsoft extension}}
217*67e74705SXin Li {
218*67e74705SXin Li 
219*67e74705SXin Li }
220*67e74705SXin Li 
221*67e74705SXin Li extern const int static_var; // expected-note {{previous declaration is here}}
222*67e74705SXin Li static const int static_var = 3; // expected-warning {{redeclaring non-static 'static_var' as static is a Microsoft extension}}
223*67e74705SXin Li 
pointer_to_integral_type_conv(char * ptr)224*67e74705SXin Li void pointer_to_integral_type_conv(char* ptr) {
225*67e74705SXin Li    char ch = (char)ptr;
226*67e74705SXin Li    short sh = (short)ptr;
227*67e74705SXin Li    ch = (char)ptr;
228*67e74705SXin Li    sh = (short)ptr;
229*67e74705SXin Li 
230*67e74705SXin Li    // These are valid C++.
231*67e74705SXin Li    bool b = (bool)ptr;
232*67e74705SXin Li    b = static_cast<bool>(ptr);
233*67e74705SXin Li 
234*67e74705SXin Li    // This is bad.
235*67e74705SXin Li    b = reinterpret_cast<bool>(ptr); // expected-error {{cast from pointer to smaller type 'bool' loses information}}
236*67e74705SXin Li }
237*67e74705SXin Li 
238*67e74705SXin Li struct PR11150 {
239*67e74705SXin Li   class X {
240*67e74705SXin Li     virtual void f() = 0;
241*67e74705SXin Li   };
242*67e74705SXin Li 
243*67e74705SXin Li   int array[__is_abstract(X)? 1 : -1];
244*67e74705SXin Li };
245*67e74705SXin Li 
f()246*67e74705SXin Li void f() { int __except = 0; }
247*67e74705SXin Li 
248*67e74705SXin Li void ::f(); // expected-warning{{extra qualification on member 'f'}}
249*67e74705SXin Li 
250*67e74705SXin Li class C {
251*67e74705SXin Li   C::C(); // expected-warning{{extra qualification on member 'C'}}
252*67e74705SXin Li };
253*67e74705SXin Li 
254*67e74705SXin Li struct StructWithProperty {
255*67e74705SXin Li   __declspec(property(get=GetV)) int V1;
256*67e74705SXin Li   __declspec(property(put=SetV)) int V2;
257*67e74705SXin Li   __declspec(property(get=GetV, put=SetV_NotExist)) int V3;
258*67e74705SXin Li   __declspec(property(get=GetV_NotExist, put=SetV)) int V4;
259*67e74705SXin Li   __declspec(property(get=GetV, put=SetV)) int V5;
260*67e74705SXin Li 
GetVStructWithProperty261*67e74705SXin Li   int GetV() { return 123; }
SetVStructWithProperty262*67e74705SXin Li   void SetV(int i) {}
263*67e74705SXin Li };
TestProperty()264*67e74705SXin Li void TestProperty() {
265*67e74705SXin Li   StructWithProperty sp;
266*67e74705SXin Li   int i = sp.V2; // expected-error{{no getter defined for property 'V2'}}
267*67e74705SXin Li   sp.V1 = 12; // expected-error{{no setter defined for property 'V1'}}
268*67e74705SXin Li   int j = sp.V4; // expected-error{{no member named 'GetV_NotExist' in 'StructWithProperty'}} expected-error{{cannot find suitable getter for property 'V4'}}
269*67e74705SXin Li   sp.V3 = 14; // expected-error{{no member named 'SetV_NotExist' in 'StructWithProperty'}} expected-error{{cannot find suitable setter for property 'V3'}}
270*67e74705SXin Li   int k = sp.V5;
271*67e74705SXin Li   sp.V5 = k++;
272*67e74705SXin Li }
273*67e74705SXin Li 
274*67e74705SXin Li /* 4 tests for PseudoObject, begin */
275*67e74705SXin Li struct SP1
276*67e74705SXin Li {
operator ()SP1277*67e74705SXin Li   bool operator()() { return true; }
278*67e74705SXin Li };
279*67e74705SXin Li struct SP2
280*67e74705SXin Li {
281*67e74705SXin Li   __declspec(property(get=GetV)) SP1 V;
GetVSP2282*67e74705SXin Li   SP1 GetV() { return SP1(); }
283*67e74705SXin Li };
TestSP2()284*67e74705SXin Li void TestSP2() {
285*67e74705SXin Li   SP2 sp2;
286*67e74705SXin Li   bool b = sp2.V();
287*67e74705SXin Li }
288*67e74705SXin Li 
289*67e74705SXin Li struct SP3 {
290*67e74705SXin Li   template <class T>
fSP3291*67e74705SXin Li   void f(T t) {}
292*67e74705SXin Li };
293*67e74705SXin Li template <class T>
294*67e74705SXin Li struct SP4
295*67e74705SXin Li {
296*67e74705SXin Li   __declspec(property(get=GetV)) int V;
GetVSP4297*67e74705SXin Li   int GetV() { return 123; }
fSP4298*67e74705SXin Li   void f() { SP3 s2; s2.f(V); }
299*67e74705SXin Li };
TestSP4()300*67e74705SXin Li void TestSP4() {
301*67e74705SXin Li   SP4<int> s;
302*67e74705SXin Li   s.f();
303*67e74705SXin Li }
304*67e74705SXin Li 
305*67e74705SXin Li template <class T>
306*67e74705SXin Li struct SP5
307*67e74705SXin Li {
308*67e74705SXin Li   __declspec(property(get=GetV)) T V;
GetVSP5309*67e74705SXin Li   int GetV() { return 123; }
fSP5310*67e74705SXin Li   void f() { int *p = new int[V]; }
311*67e74705SXin Li };
312*67e74705SXin Li 
313*67e74705SXin Li template <class T>
314*67e74705SXin Li struct SP6
315*67e74705SXin Li {
316*67e74705SXin Li public:
317*67e74705SXin Li   __declspec(property(get=GetV)) T V;
GetVSP6318*67e74705SXin Li   T GetV() { return 123; }
fSP6319*67e74705SXin Li   void f() { int t = V; }
320*67e74705SXin Li };
TestSP6()321*67e74705SXin Li void TestSP6() {
322*67e74705SXin Li   SP6<int> c;
323*67e74705SXin Li   c.f();
324*67e74705SXin Li }
325*67e74705SXin Li /* 4 tests for PseudoObject, end */
326*67e74705SXin Li 
327*67e74705SXin Li // Property access: explicit, implicit, with Qualifier
328*67e74705SXin Li struct SP7 {
329*67e74705SXin Li   __declspec(property(get=GetV, put=SetV)) int V;
GetVSP7330*67e74705SXin Li   int GetV() { return 123; }
SetVSP7331*67e74705SXin Li   void SetV(int v) {}
332*67e74705SXin Li 
ImplicitAccessSP7333*67e74705SXin Li   void ImplicitAccess() { int i = V; V = i; }
ExplicitAccessSP7334*67e74705SXin Li   void ExplicitAccess() { int i = this->V; this->V = i; }
335*67e74705SXin Li };
336*67e74705SXin Li struct SP8: public SP7 {
AccessWithQualifierSP8337*67e74705SXin Li   void AccessWithQualifier() { int i = SP7::V; SP7::V = i; }
338*67e74705SXin Li };
339*67e74705SXin Li 
340*67e74705SXin Li // Property usage
341*67e74705SXin Li template <class T>
342*67e74705SXin Li struct SP9 {
343*67e74705SXin Li   __declspec(property(get=GetV, put=SetV)) T V;
GetVSP9344*67e74705SXin Li   T GetV() { return 0; }
SetVSP9345*67e74705SXin Li   void SetV(T v) {}
fSP9346*67e74705SXin Li   bool f() { V = this->V; return V < this->V; }
gSP9347*67e74705SXin Li   void g() { V++; }
hSP9348*67e74705SXin Li   void h() { V*=2; }
349*67e74705SXin Li };
350*67e74705SXin Li struct SP10 {
SP10SP10351*67e74705SXin Li   SP10(int v) {}
operator <SP10352*67e74705SXin Li   bool operator<(const SP10& v) { return true; }
operator *SP10353*67e74705SXin Li   SP10 operator*(int v) { return *this; }
operator +SP10354*67e74705SXin Li   SP10 operator+(int v) { return *this; }
operator =SP10355*67e74705SXin Li   SP10& operator=(const SP10& v) { return *this; }
356*67e74705SXin Li };
TestSP9()357*67e74705SXin Li void TestSP9() {
358*67e74705SXin Li   SP9<int> c;
359*67e74705SXin Li   int i = c.V; // Decl initializer
360*67e74705SXin Li   i = c.V; // Binary op operand
361*67e74705SXin Li   c.SetV(c.V); // CallExpr arg
362*67e74705SXin Li   int *p = new int[c.V + 1]; // Array size
363*67e74705SXin Li   p[c.V] = 1; // Array index
364*67e74705SXin Li 
365*67e74705SXin Li   c.V = 123; // Setter
366*67e74705SXin Li 
367*67e74705SXin Li   c.V++; // Unary op operand
368*67e74705SXin Li   c.V *= 2; // Unary op operand
369*67e74705SXin Li 
370*67e74705SXin Li   SP9<int*> c2;
371*67e74705SXin Li   c2.V[0] = 123; // Array
372*67e74705SXin Li 
373*67e74705SXin Li   SP9<SP10> c3;
374*67e74705SXin Li   c3.f(); // Overloaded binary op operand
375*67e74705SXin Li   c3.g(); // Overloaded incdec op operand
376*67e74705SXin Li   c3.h(); // Overloaded unary op operand
377*67e74705SXin Li }
378*67e74705SXin Li 
379*67e74705SXin Li union u {
380*67e74705SXin Li   int *i1;
381*67e74705SXin Li   int &i2;  // expected-warning {{union member 'i2' has reference type 'int &', which is a Microsoft extension}}
382*67e74705SXin Li };
383*67e74705SXin Li 
384*67e74705SXin Li // Property getter using reference.
385*67e74705SXin Li struct SP11 {
386*67e74705SXin Li   __declspec(property(get=GetV)) int V;
387*67e74705SXin Li   int _v;
GetVSP11388*67e74705SXin Li   int& GetV() { return _v; }
389*67e74705SXin Li   void UseV();
TakePtrSP11390*67e74705SXin Li   void TakePtr(int *) {}
TakeRefSP11391*67e74705SXin Li   void TakeRef(int &) {}
TakeValSP11392*67e74705SXin Li   void TakeVal(int) {}
393*67e74705SXin Li };
394*67e74705SXin Li 
UseV()395*67e74705SXin Li void SP11::UseV() {
396*67e74705SXin Li   TakePtr(&V);
397*67e74705SXin Li   TakeRef(V);
398*67e74705SXin Li   TakeVal(V);
399*67e74705SXin Li }
400*67e74705SXin Li 
401*67e74705SXin Li struct StructWithUnnamedMember {
402*67e74705SXin Li   __declspec(property(get=GetV)) int : 10; // expected-error {{anonymous property is not supported}}
403*67e74705SXin Li };
404*67e74705SXin Li 
405*67e74705SXin Li struct MSPropertyClass {
getMSPropertyClass406*67e74705SXin Li   int get() { return 42; }
407*67e74705SXin Li   int __declspec(property(get = get)) n;
408*67e74705SXin Li };
409*67e74705SXin Li 
f(MSPropertyClass & x)410*67e74705SXin Li int *f(MSPropertyClass &x) {
411*67e74705SXin Li   return &x.n; // expected-error {{address of property expression requested}}
412*67e74705SXin Li }
g()413*67e74705SXin Li int MSPropertyClass::*g() {
414*67e74705SXin Li   return &MSPropertyClass::n; // expected-error {{address of property expression requested}}
415*67e74705SXin Li }
416*67e74705SXin Li 
417*67e74705SXin Li namespace rdar14250378 {
418*67e74705SXin Li   class Bar {};
419*67e74705SXin Li 
420*67e74705SXin Li   namespace NyNamespace {
421*67e74705SXin Li     class Foo {
422*67e74705SXin Li     public:
423*67e74705SXin Li       Bar* EnsureBar();
424*67e74705SXin Li     };
425*67e74705SXin Li 
426*67e74705SXin Li     class Baz : public Foo {
427*67e74705SXin Li     public:
428*67e74705SXin Li       friend class Bar;
429*67e74705SXin Li     };
430*67e74705SXin Li 
EnsureBar()431*67e74705SXin Li     Bar* Foo::EnsureBar() {
432*67e74705SXin Li       return 0;
433*67e74705SXin Li     }
434*67e74705SXin Li   }
435*67e74705SXin Li }
436*67e74705SXin Li 
437*67e74705SXin Li // expected-error@+1 {{'sealed' keyword not permitted with interface types}}
438*67e74705SXin Li __interface InterfaceWithSealed sealed {
439*67e74705SXin Li };
440*67e74705SXin Li 
441*67e74705SXin Li struct SomeBase {
442*67e74705SXin Li   virtual void OverrideMe();
443*67e74705SXin Li 
444*67e74705SXin Li   // expected-note@+2 {{overridden virtual function is here}}
445*67e74705SXin Li   // expected-warning@+1 {{'sealed' keyword is a Microsoft extension}}
446*67e74705SXin Li   virtual void SealedFunction() sealed; // expected-note {{overridden virtual function is here}}
447*67e74705SXin Li };
448*67e74705SXin Li 
449*67e74705SXin Li // expected-note@+2 {{'SealedType' declared here}}
450*67e74705SXin Li // expected-warning@+1 {{'sealed' keyword is a Microsoft extension}}
451*67e74705SXin Li struct SealedType sealed : SomeBase {
452*67e74705SXin Li   // expected-error@+2 {{declaration of 'SealedFunction' overrides a 'sealed' function}}
453*67e74705SXin Li   // FIXME. warning can be suppressed if we're also issuing error for overriding a 'final' function.
454*67e74705SXin Li   virtual void SealedFunction(); // expected-warning {{'SealedFunction' overrides a member function but is not marked 'override'}}
455*67e74705SXin Li 
456*67e74705SXin Li   // expected-warning@+1 {{'override' keyword is a C++11 extension}}
457*67e74705SXin Li   virtual void OverrideMe() override;
458*67e74705SXin Li };
459*67e74705SXin Li 
460*67e74705SXin Li // expected-error@+1 {{base 'SealedType' is marked 'sealed'}}
461*67e74705SXin Li struct InheritFromSealed : SealedType {};
462*67e74705SXin Li 
AfterClassBody()463*67e74705SXin Li void AfterClassBody() {
464*67e74705SXin Li   // expected-warning@+1 {{attribute 'deprecated' is ignored, place it after "struct" to apply attribute to type declaration}}
465*67e74705SXin Li   struct D {} __declspec(deprecated);
466*67e74705SXin Li 
467*67e74705SXin Li   struct __declspec(align(4)) S {} __declspec(align(8)) s1;
468*67e74705SXin Li   S s2;
469*67e74705SXin Li   _Static_assert(__alignof(S) == 4, "");
470*67e74705SXin Li   _Static_assert(__alignof(s1) == 8, "");
471*67e74705SXin Li   _Static_assert(__alignof(s2) == 4, "");
472*67e74705SXin Li }
473*67e74705SXin Li 
474*67e74705SXin Li namespace PR24246 {
475*67e74705SXin Li template <typename TX> struct A {
476*67e74705SXin Li   template <bool> struct largest_type_select;
477*67e74705SXin Li   // expected-warning@+1 {{explicit specialization of 'largest_type_select' within class scope is a Microsoft extension}}
478*67e74705SXin Li   template <> struct largest_type_select<false> {
479*67e74705SXin Li     blah x;  // expected-error {{unknown type name 'blah'}}
480*67e74705SXin Li   };
481*67e74705SXin Li };
482*67e74705SXin Li }
483*67e74705SXin Li 
484*67e74705SXin Li namespace PR25265 {
485*67e74705SXin Li struct S {
486*67e74705SXin Li   int fn() throw(); // expected-note {{previous declaration is here}}
487*67e74705SXin Li };
488*67e74705SXin Li 
fn()489*67e74705SXin Li int S::fn() { return 0; } // expected-warning {{is missing exception specification}}
490*67e74705SXin Li }
491*67e74705SXin Li 
492*67e74705SXin Li #elif TEST2
493*67e74705SXin Li 
494*67e74705SXin Li // Check that __unaligned is not recognized if MS extensions are not enabled
495*67e74705SXin Li typedef char __unaligned *aligned_type; // expected-error {{expected ';' after top level declarator}}
496*67e74705SXin Li 
497*67e74705SXin Li #else
498*67e74705SXin Li 
499*67e74705SXin Li #error Unknown test mode
500*67e74705SXin Li 
501*67e74705SXin Li #endif
502*67e74705SXin Li 
503