1c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// RUN: %clang_cc1 -triple i386-mingw32 -fsyntax-only -Wno-missing-declarations -verify -fms-extensions %s 2c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines__stdcall int func0(void); 3c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesint __stdcall func(void); 4c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestypedef int (__cdecl *tptr)(void); 5c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid (*__fastcall fastpfunc)(void); 6c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesextern __declspec(dllimport) void __stdcall VarR4FromDec(void); 7239f07384fe5e7194e780d98a17553084efeeb44Steve Naroff__declspec(deprecated) __declspec(deprecated) char * __cdecl ltoa( long _Val, char * _DstBuf, int _Radix); 80e2c34f92f00628d48968dfea096d36381f494cbStephen Hines__declspec(safebuffers) __declspec(noalias) __declspec(restrict) void * __cdecl xxx(void *_Memory); /* expected-warning{{__declspec attribute 'safebuffers' is not supported}} expected-warning{{__declspec attribute 'noalias' is not supported}} */ 986bc6cf05ad3ff7198671c394ba5157974e8a39cSteve Narofftypedef __w64 unsigned long ULONG_PTR, *PULONG_PTR; 1058fd97a6f4f7c909aeef46b501ab46f3d6eac671Francois Pichet 11c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid * __ptr64 PtrToPtr64(const void *p) { 12c052dbb2d8fe0e23e90d81236aab0f864f712b45John McCall return((void * __ptr64) (unsigned __int64) (ULONG_PTR)p ); 1386bc6cf05ad3ff7198671c394ba5157974e8a39cSteve Naroff} 1458fd97a6f4f7c909aeef46b501ab46f3d6eac671Francois Pichet 15c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid * __ptr32 PtrToPtr32(const void *p) { 16c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return((void * __ptr32) (unsigned __int32) (ULONG_PTR)p ); 17e23fbf1fca9be5653ca706ccefc31d5e5a3a334dChad Rosier} 18d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov 19c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/* Both inline and __forceinline is OK. */ 20c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesinline void __forceinline pr8264(void) {} 21c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines__forceinline void inline pr8264_1(void) {} 22c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid inline __forceinline pr8264_2(void) {} 23c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid __forceinline inline pr8264_3(void) {} 24c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/* But duplicate __forceinline causes warning. */ 25c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid __forceinline __forceinline pr8264_4(void) { /* expected-warning{{duplicate '__forceinline' declaration specifier}} */ 26d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov} 27d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov 28c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines_inline int foo99(void) { return 99; } 2986bc6cf05ad3ff7198671c394ba5157974e8a39cSteve Naroff 30c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid test_ms_alignof_alias(void) { 31da8d8c2b5e56ba9c49de70c18d11933d67458a34Douglas Gregor unsigned int s = _alignof(int); 32da8d8c2b5e56ba9c49de70c18d11933d67458a34Douglas Gregor s = __builtin_alignof(int); 33da8d8c2b5e56ba9c49de70c18d11933d67458a34Douglas Gregor} 34da8d8c2b5e56ba9c49de70c18d11933d67458a34Douglas Gregor 35c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/* Charify extension. */ 366633522aaea663ebb18044a997b963bf92cd1a74Chris Lattner#define FOO(x) #@x 376633522aaea663ebb18044a997b963bf92cd1a74Chris Lattnerchar x = FOO(a); 386633522aaea663ebb18044a997b963bf92cd1a74Chris Lattner 390c99ec6d229b49085ec3c364d5c6090b33438a93Douglas Gregortypedef enum E { e1 }; 4001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 41c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesenum __declspec(deprecated) E2 { i, j, k }; /* expected-note {{'E2' has been explicitly marked deprecated here}} */ 42c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines__declspec(deprecated) enum E3 { a, b, c } e; /* expected-note {{'e' has been explicitly marked deprecated here}} */ 4301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 44c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid deprecated_enum_test(void) { 45c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines /* Test to make sure the deprecated warning follows the right thing */ 46c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines enum E2 e1; /* expected-warning {{'E2' is deprecated}} */ 47c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines enum E3 e2; /* No warning expected, the deprecation follows the variable */ 48c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines enum E3 e3 = e; /* expected-warning {{'e' is deprecated}} */ 490e3c98951de30a129525c70bd4242739dcdb5ab5Aaron Ballman} 50b2419466892e5445fec6ce30f97784ae8b99f134Francois Pichet 51334d47e92e9f241576fdeb7477b69a03136ba854Francois Pichet/* Microsoft attribute tests */ 52fc685ace387734599c475426b1a8efdb491054b8Aaron Ballman[returnvalue:SA_Post( attr=1)] 53334d47e92e9f241576fdeb7477b69a03136ba854Francois Pichetint foo1([SA_Post(attr=1)] void *param); 54334d47e92e9f241576fdeb7477b69a03136ba854Francois Pichet 55c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid ms_intrinsics(int a) { 56b2419466892e5445fec6ce30f97784ae8b99f134Francois Pichet __noop(); 57b2419466892e5445fec6ce30f97784ae8b99f134Francois Pichet __assume(a); 58699f9b1effc8fd891637797ef3dc58d7b80d476aFrancois Pichet __debugbreak(); 59b2419466892e5445fec6ce30f97784ae8b99f134Francois Pichet} 60fc685ace387734599c475426b1a8efdb491054b8Aaron Ballman 61651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct __declspec(frobble) S1 {}; /* expected-warning {{__declspec attribute 'frobble' is not supported}} */ 62fc685ace387734599c475426b1a8efdb491054b8Aaron Ballmanstruct __declspec(12) S2 {}; /* expected-error {{__declspec attributes must be an identifier or string literal}} */ 63fc685ace387734599c475426b1a8efdb491054b8Aaron Ballmanstruct __declspec("testing") S3 {}; /* expected-warning {{__declspec attribute '"testing"' is not supported}} */ 64fc685ace387734599c475426b1a8efdb491054b8Aaron Ballman 656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/* declspecs with arguments cannot have an empty argument list, even if the 666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines arguments are optional. */ 676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(deprecated()) void dep_func_test(void); /* expected-error {{parentheses must be omitted if 'deprecated' attribute's argument list is empty}} */ 686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(deprecated) void dep_func_test2(void); 696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(deprecated("")) void dep_func_test3(void); 706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 71fc685ace387734599c475426b1a8efdb491054b8Aaron Ballman/* Ensure multiple declspec attributes are supported */ 72fc685ace387734599c475426b1a8efdb491054b8Aaron Ballmanstruct __declspec(align(8) deprecated) S4 {}; 73fc685ace387734599c475426b1a8efdb491054b8Aaron Ballman 74fc685ace387734599c475426b1a8efdb491054b8Aaron Ballman/* But multiple declspecs must still be legal */ 75651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct __declspec(deprecated frobble "testing") S5 {}; /* expected-warning {{__declspec attribute 'frobble' is not supported}} expected-warning {{__declspec attribute '"testing"' is not supported}} */ 76651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct __declspec(unknown(12) deprecated) S6 {}; /* expected-warning {{__declspec attribute 'unknown' is not supported}}*/ 77fc685ace387734599c475426b1a8efdb491054b8Aaron Ballman 78aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballmanint * __sptr psp; 79aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballmanint * __uptr pup; 80aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballman/* Either ordering is acceptable */ 81aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballmanint * __ptr32 __sptr psp32; 82aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballmanint * __ptr32 __uptr pup32; 83aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballmanint * __sptr __ptr64 psp64; 84aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballmanint * __uptr __ptr64 pup64; 85aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballman 86aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballman/* Legal to have nested pointer attributes */ 87aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballmanint * __sptr * __ptr32 ppsp32; 880e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 890e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// Ignored type qualifiers after comma in declarator lists 900e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestypedef int ignored_quals_dummy1, const volatile __ptr32 __ptr64 __w64 __unaligned __sptr __uptr ignored_quals1; // expected-warning {{qualifiers after comma in declarator list are ignored}} 910e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestypedef void(*ignored_quals_dummy2)(), __fastcall ignored_quals2; // expected-warning {{qualifiers after comma in declarator list are ignored}} 920e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestypedef void(*ignored_quals_dummy3)(), __stdcall ignored_quals3; // expected-warning {{qualifiers after comma in declarator list are ignored}} 930e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestypedef void(*ignored_quals_dummy4)(), __thiscall ignored_quals4; // expected-warning {{qualifiers after comma in declarator list are ignored}} 940e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestypedef void(*ignored_quals_dummy5)(), __cdecl ignored_quals5; // expected-warning {{qualifiers after comma in declarator list are ignored}} 950e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestypedef void(*ignored_quals_dummy6)(), __vectorcall ignored_quals6; // expected-warning {{qualifiers after comma in declarator list are ignored}} 96