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