1913b7bf8c40454641588611b7bbad981dc53c882Francois Pichet// RUN: %clang_cc1 -triple i386-mingw32 -fsyntax-only -verify -fms-extensions  -Wno-missing-declarations -x objective-c++ %s
2239f07384fe5e7194e780d98a17553084efeeb44Steve Naroff__stdcall int func0();
3239f07384fe5e7194e780d98a17553084efeeb44Steve Naroffint __stdcall func();
4239f07384fe5e7194e780d98a17553084efeeb44Steve Narofftypedef int (__cdecl *tptr)();
5239f07384fe5e7194e780d98a17553084efeeb44Steve Naroffvoid (*__fastcall fastpfunc)();
6fc685ace387734599c475426b1a8efdb491054b8Aaron Ballmanstruct __declspec(uuid("00000000-0000-0000-C000-000000000046")) __declspec(novtable) IUnknown {}; /* expected-warning{{__declspec attribute 'novtable' is not supported}} */
7239f07384fe5e7194e780d98a17553084efeeb44Steve Naroffextern __declspec(dllimport) void __stdcall VarR4FromDec();
8239f07384fe5e7194e780d98a17553084efeeb44Steve Naroff__declspec(deprecated) __declspec(deprecated) char * __cdecl ltoa( long _Val, char * _DstBuf, int _Radix);
9fc685ace387734599c475426b1a8efdb491054b8Aaron Ballman__declspec(noalias) __declspec(restrict) void * __cdecl xxx( void * _Memory ); /* expected-warning{{__declspec attribute 'noalias' is not supported}} expected-warning{{__declspec attribute 'restrict' is not supported}} */
1086bc6cf05ad3ff7198671c394ba5157974e8a39cSteve Narofftypedef __w64 unsigned long ULONG_PTR, *PULONG_PTR;
1158fd97a6f4f7c909aeef46b501ab46f3d6eac671Francois Pichet
1286bc6cf05ad3ff7198671c394ba5157974e8a39cSteve Naroffvoid * __ptr64 PtrToPtr64(const void *p)
1386bc6cf05ad3ff7198671c394ba5157974e8a39cSteve Naroff{
14c052dbb2d8fe0e23e90d81236aab0f864f712b45John McCall  return((void * __ptr64) (unsigned __int64) (ULONG_PTR)p );
1586bc6cf05ad3ff7198671c394ba5157974e8a39cSteve Naroff}
1658fd97a6f4f7c909aeef46b501ab46f3d6eac671Francois Pichetvoid * __ptr32 PtrToPtr32(const void *p)
1758fd97a6f4f7c909aeef46b501ab46f3d6eac671Francois Pichet{
18c052dbb2d8fe0e23e90d81236aab0f864f712b45John McCall  return((void * __ptr32) (unsigned __int32) (ULONG_PTR)p );
1958fd97a6f4f7c909aeef46b501ab46f3d6eac671Francois Pichet}
2058fd97a6f4f7c909aeef46b501ab46f3d6eac671Francois Pichet
21d1969d803cfcc65f1c334df4cc89c7fdd33ee4c9Mike Stumpvoid __forceinline InterlockedBitTestAndSet (long *Base, long Bit)
2286bc6cf05ad3ff7198671c394ba5157974e8a39cSteve Naroff{
2352e4ed949ba52958db1e938860e3b49944ce8680Chad Rosier  __asm { // expected-warning {{MS-style inline assembly is not supported}}
241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    mov eax, Bit
251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    mov ecx, Base
261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    lock bts [ecx], eax
271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    setc al
281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  };
2986bc6cf05ad3ff7198671c394ba5157974e8a39cSteve Naroff}
30229ca4a04cd1f94ca5ce907638c699fd024a6347Francois Pichet_inline int foo99() { return 99; }
3186bc6cf05ad3ff7198671c394ba5157974e8a39cSteve Naroff
32da8d8c2b5e56ba9c49de70c18d11933d67458a34Douglas Gregorvoid test_ms_alignof_alias() {
33da8d8c2b5e56ba9c49de70c18d11933d67458a34Douglas Gregor  unsigned int s = _alignof(int);
34da8d8c2b5e56ba9c49de70c18d11933d67458a34Douglas Gregor  s = __builtin_alignof(int);
35da8d8c2b5e56ba9c49de70c18d11933d67458a34Douglas Gregor}
36da8d8c2b5e56ba9c49de70c18d11933d67458a34Douglas Gregor
3747f5209a80c7c75592e87eb296d2b51e03208ae0Steve Naroffvoid *_alloca(int);
3847f5209a80c7c75592e87eb296d2b51e03208ae0Steve Naroff
3947f5209a80c7c75592e87eb296d2b51e03208ae0Steve Naroffvoid foo() {
401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  __declspec(align(16)) int *buffer = (int *)_alloca(9);
4147f5209a80c7c75592e87eb296d2b51e03208ae0Steve Naroff}
425a2f5d304897220f16e00c05cf122dd95e859aa9Douglas Gregor
435a2f5d304897220f16e00c05cf122dd95e859aa9Douglas Gregortypedef bool (__stdcall __stdcall *blarg)(int);
446633522aaea663ebb18044a997b963bf92cd1a74Chris Lattner
456229c8e7ecccbc6b661df0b4399eb205587c61b4Chris Lattnervoid local_callconv()
466229c8e7ecccbc6b661df0b4399eb205587c61b4Chris Lattner{
476229c8e7ecccbc6b661df0b4399eb205587c61b4Chris Lattner  bool (__stdcall *p)(int);
486229c8e7ecccbc6b661df0b4399eb205587c61b4Chris Lattner}
496633522aaea663ebb18044a997b963bf92cd1a74Chris Lattner
506633522aaea663ebb18044a997b963bf92cd1a74Chris Lattner// Charify extension.
516633522aaea663ebb18044a997b963bf92cd1a74Chris Lattner#define FOO(x) #@x
526633522aaea663ebb18044a997b963bf92cd1a74Chris Lattnerchar x = FOO(a);
536633522aaea663ebb18044a997b963bf92cd1a74Chris Lattner
540c99ec6d229b49085ec3c364d5c6090b33438a93Douglas Gregortypedef enum E { e1 };
5501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet
5601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet
57c3b2308f66fe8abd2c1a911b500c0b989c295819Eli Friedmanenum __declspec(deprecated) E2 { i, j, k }; // expected-note {{declared here}}
58c3b2308f66fe8abd2c1a911b500c0b989c295819Eli Friedman__declspec(deprecated) enum E3 { a, b, c } e; // expected-note {{declared here}}
59d3d3be9bc717b37366324e9711f1ea22dea42caaFrancois Pichet
600e3c98951de30a129525c70bd4242739dcdb5ab5Aaron Ballmanvoid deprecated_enum_test(void)
610e3c98951de30a129525c70bd4242739dcdb5ab5Aaron Ballman{
620e3c98951de30a129525c70bd4242739dcdb5ab5Aaron Ballman  // Test to make sure the deprecated warning follows the right thing
630e3c98951de30a129525c70bd4242739dcdb5ab5Aaron Ballman  enum E2 e1;  // expected-warning {{'E2' is deprecated}}
640e3c98951de30a129525c70bd4242739dcdb5ab5Aaron Ballman  enum E3 e2; // No warning expected, the deprecation follows the variable
650e3c98951de30a129525c70bd4242739dcdb5ab5Aaron Ballman  enum E3 e3 = e;  // expected-warning {{'e' is deprecated}}
660e3c98951de30a129525c70bd4242739dcdb5ab5Aaron Ballman}
67b2419466892e5445fec6ce30f97784ae8b99f134Francois Pichet
68334d47e92e9f241576fdeb7477b69a03136ba854Francois Pichet/* Microsoft attribute tests */
69334d47e92e9f241576fdeb7477b69a03136ba854Francois Pichet[repeatable][source_annotation_attribute( Parameter|ReturnValue )]
70334d47e92e9f241576fdeb7477b69a03136ba854Francois Pichetstruct SA_Post{ SA_Post(); int attr; };
71334d47e92e9f241576fdeb7477b69a03136ba854Francois Pichet
72fc685ace387734599c475426b1a8efdb491054b8Aaron Ballman[returnvalue:SA_Post( attr=1)]
73334d47e92e9f241576fdeb7477b69a03136ba854Francois Pichetint foo1([SA_Post(attr=1)] void *param);
74334d47e92e9f241576fdeb7477b69a03136ba854Francois Pichet
75334d47e92e9f241576fdeb7477b69a03136ba854Francois Pichet
76b2419466892e5445fec6ce30f97784ae8b99f134Francois Pichet
77b2419466892e5445fec6ce30f97784ae8b99f134Francois Pichetvoid ms_intrinsics(int a)
78b2419466892e5445fec6ce30f97784ae8b99f134Francois Pichet{
79b2419466892e5445fec6ce30f97784ae8b99f134Francois Pichet  __noop();
80b2419466892e5445fec6ce30f97784ae8b99f134Francois Pichet  __assume(a);
81699f9b1effc8fd891637797ef3dc58d7b80d476aFrancois Pichet  __debugbreak();
82b2419466892e5445fec6ce30f97784ae8b99f134Francois Pichet}
83fc685ace387734599c475426b1a8efdb491054b8Aaron Ballman
84fc685ace387734599c475426b1a8efdb491054b8Aaron Ballmanstruct __declspec(frobble) S1 {};	/* expected-warning {{unknown __declspec attribute 'frobble' ignored}} */
85fc685ace387734599c475426b1a8efdb491054b8Aaron Ballmanstruct __declspec(12) S2 {};	/* expected-error {{__declspec attributes must be an identifier or string literal}} */
86fc685ace387734599c475426b1a8efdb491054b8Aaron Ballmanstruct __declspec("testing") S3 {}; /* expected-warning {{__declspec attribute '"testing"' is not supported}} */
87fc685ace387734599c475426b1a8efdb491054b8Aaron Ballman
88fc685ace387734599c475426b1a8efdb491054b8Aaron Ballman/* Ensure multiple declspec attributes are supported */
89fc685ace387734599c475426b1a8efdb491054b8Aaron Ballmanstruct __declspec(align(8) deprecated) S4 {};
90fc685ace387734599c475426b1a8efdb491054b8Aaron Ballman
91fc685ace387734599c475426b1a8efdb491054b8Aaron Ballman/* But multiple declspecs must still be legal */
92fc685ace387734599c475426b1a8efdb491054b8Aaron Ballmanstruct __declspec(deprecated frobble "testing") S5 {};  /* expected-warning {{unknown __declspec attribute 'frobble' ignored}} expected-warning {{__declspec attribute '"testing"' is not supported}} */
93fc685ace387734599c475426b1a8efdb491054b8Aaron Ballmanstruct __declspec(unknown(12) deprecated) S6 {};	/* expected-warning {{unknown __declspec attribute 'unknown' ignored}}*/
94fc685ace387734599c475426b1a8efdb491054b8Aaron Ballman
95fc685ace387734599c475426b1a8efdb491054b8Aaron Ballmanstruct S7 {
96fc685ace387734599c475426b1a8efdb491054b8Aaron Ballman	int foo() { return 12; }
97c3b2308f66fe8abd2c1a911b500c0b989c295819Eli Friedman	__declspec(property(get=foo) deprecated) int t; // expected-note {{declared here}}
98fc685ace387734599c475426b1a8efdb491054b8Aaron Ballman};
99fc685ace387734599c475426b1a8efdb491054b8Aaron Ballman
100fc685ace387734599c475426b1a8efdb491054b8Aaron Ballman/* Technically, this is legal (though it does nothing) */
101fc685ace387734599c475426b1a8efdb491054b8Aaron Ballman__declspec() void quux( void ) {
102fc685ace387734599c475426b1a8efdb491054b8Aaron Ballman  struct S7 s;
103fc685ace387734599c475426b1a8efdb491054b8Aaron Ballman  int i = s.t;	/* expected-warning {{'t' is deprecated}} */
104fc685ace387734599c475426b1a8efdb491054b8Aaron Ballman}
105