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