1176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// RUN: %clang_cc1 -triple i686-windows %s -fsyntax-only -Wno-unused-value -Wmicrosoft -verify -fms-extensions
2b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruth
3b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruth
4b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruthstruct A
5b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruth{
6b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruth   int a[];  /* expected-warning {{flexible array member 'a' in otherwise empty struct is a Microsoft extension}} */
7b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruth};
8b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruth
94967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct PR28407
104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar{
114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  int : 1;
124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  int a[]; /* expected-warning {{flexible array member 'a' in otherwise empty struct is a Microsoft extension}} */
134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
15b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruthstruct C {
16b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruth   int l;
17b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruth   union {
18b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruth       int c1[];   /* expected-warning {{flexible array member 'c1' in a union is a Microsoft extension}}  */
19b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruth       char c2[];  /* expected-warning {{flexible array member 'c2' in a union is a Microsoft extension}} */
20b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruth   };
21b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruth};
22b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruth
23b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruth
24b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruthstruct D {
25b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruth   int l;
26b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruth   int D[];
27b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruth};
28842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois Pichet
29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct __declspec(uuid("00000000-0000-0000-C000-000000000046")) IUnknown {}; /* expected-error {{'uuid' attribute is not supported in C}} */
308e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet
318e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichettypedef struct notnested {
328e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  long bad1;
338e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  long bad2;
348e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet} NOTNESTED;
358e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet
368e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet
378e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichettypedef struct nested1 {
388e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  long a;
398e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  struct notnested var1;
408e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  NOTNESTED var2;
418e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet} NESTED1;
428e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet
438e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichetstruct nested2 {
448e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  long b;
458e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  NESTED1;  // expected-warning {{anonymous structs are a Microsoft extension}}
468e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet};
478e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet
48176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct nested2 PR20573 = { .a = 3 };
49176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
50176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct nested3 {
51176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  long d;
52176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct nested4 { // expected-warning {{anonymous structs are a Microsoft extension}}
53176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    long e;
54176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
55176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  union nested5 { // expected-warning {{anonymous unions are a Microsoft extension}}
56176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    long f;
57176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
58176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
59176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
60176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestypedef union nested6 {
61176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  long f;
62176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} NESTED6;
63176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
648e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichetstruct test {
658e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  int c;
668e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  struct nested2;   // expected-warning {{anonymous structs are a Microsoft extension}}
67176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  NESTED6;   // expected-warning {{anonymous unions are a Microsoft extension}}
688e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet};
698e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet
708e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichetvoid foo()
718e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet{
728e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  struct test var;
738e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  var.a;
748e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  var.b;
758e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  var.c;
768e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  var.bad1;   // expected-error {{no member named 'bad1' in 'struct test'}}
778e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  var.bad2;   // expected-error {{no member named 'bad2' in 'struct test'}}
788e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet}
798e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet
8086f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor// Enumeration types with a fixed underlying type.
8186f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregorconst int seventeen = 17;
8286f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregortypedef int Int;
8386f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor
8486f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregorstruct X0 {
8586f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor  enum E1 : Int { SomeOtherValue } field;  // expected-warning{{enumeration types with a fixed underlying type are a Microsoft extension}}
8686f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor  enum E1 : seventeen;
8786f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor};
8886f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor
891756ce44b0e03d6a6fd2d42add6e3227d4d04d34Douglas Gregorenum : long long {  // expected-warning{{enumeration types with a fixed underlying type are a Microsoft extension}}
9086f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor  SomeValue = 0x100000000
9186f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor};
9283e0995105222b078a57e1e20ef71fbfd0f67d3dFrancois Pichet
9383e0995105222b078a57e1e20ef71fbfd0f67d3dFrancois Pichet
9483e0995105222b078a57e1e20ef71fbfd0f67d3dFrancois Pichetvoid pointer_to_integral_type_conv(char* ptr) {
9583e0995105222b078a57e1e20ef71fbfd0f67d3dFrancois Pichet   char ch = (char)ptr;
9683e0995105222b078a57e1e20ef71fbfd0f67d3dFrancois Pichet   short sh = (short)ptr;
9783e0995105222b078a57e1e20ef71fbfd0f67d3dFrancois Pichet   ch = (char)ptr;
9883e0995105222b078a57e1e20ef71fbfd0f67d3dFrancois Pichet   sh = (short)ptr;
99649c6c50fd3dd13577071b26fec4495f7538d923Hans Wennborg
100649c6c50fd3dd13577071b26fec4495f7538d923Hans Wennborg   // This is valid ISO C.
101649c6c50fd3dd13577071b26fec4495f7538d923Hans Wennborg   _Bool b = (_Bool)ptr;
102ee625afea71ef5a9c1e386564919b86915d96b0dNico Weber}
103ee625afea71ef5a9c1e386564919b86915d96b0dNico Weber
104ee625afea71ef5a9c1e386564919b86915d96b0dNico Weber
105ee625afea71ef5a9c1e386564919b86915d96b0dNico Webertypedef struct {
106ee625afea71ef5a9c1e386564919b86915d96b0dNico Weber  UNKNOWN u; // expected-error {{unknown type name 'UNKNOWN'}}
107ee625afea71ef5a9c1e386564919b86915d96b0dNico Weber} AA;
108ee625afea71ef5a9c1e386564919b86915d96b0dNico Weber
109ee625afea71ef5a9c1e386564919b86915d96b0dNico Webertypedef struct {
110ee625afea71ef5a9c1e386564919b86915d96b0dNico Weber  AA; // expected-warning {{anonymous structs are a Microsoft extension}}
111ee625afea71ef5a9c1e386564919b86915d96b0dNico Weber} BB;
11247611c88fb0446673c6e590ab461934054be290aAaron Ballman
113176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct anon_fault {
114176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct undefined; // expected-warning {{anonymous structs are a Microsoft extension}}
115176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                    // expected-error@-1 {{field has incomplete type 'struct undefined'}}
116176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                    // expected-note@-2 {{forward declaration of 'struct undefined'}}
117176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
118176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
119176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesconst int anon_falt_size = sizeof(struct anon_fault);
120176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__declspec(deprecated("This is deprecated")) enum DE1 { one, two } e1; // expected-note {{'e1' has been explicitly marked deprecated here}}
122651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct __declspec(deprecated) DS1 { int i; float f; }; // expected-note {{'DS1' has been explicitly marked deprecated here}}
12347611c88fb0446673c6e590ab461934054be290aAaron Ballman
12447611c88fb0446673c6e590ab461934054be290aAaron Ballman#define MY_TEXT		"This is also deprecated"
125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__declspec(deprecated(MY_TEXT)) void Dfunc1( void ) {} // expected-note {{'Dfunc1' has been explicitly marked deprecated here}}
12647611c88fb0446673c6e590ab461934054be290aAaron Ballman
1273cd6feb87a62fb52c31cbc83655d76ace020513fAaron Ballmanstruct __declspec(deprecated(123)) DS2 {};	// expected-error {{'deprecated' attribute requires a string}}
128fc685ace387734599c475426b1a8efdb491054b8Aaron Ballman
12947611c88fb0446673c6e590ab461934054be290aAaron Ballmanvoid test( void ) {
13047611c88fb0446673c6e590ab461934054be290aAaron Ballman	e1 = one;	// expected-warning {{'e1' is deprecated: This is deprecated}}
13147611c88fb0446673c6e590ab461934054be290aAaron Ballman	struct DS1 s = { 0 };	// expected-warning {{'DS1' is deprecated}}
13247611c88fb0446673c6e590ab461934054be290aAaron Ballman	Dfunc1();	// expected-warning {{'Dfunc1' is deprecated: This is also deprecated}}
13347611c88fb0446673c6e590ab461934054be290aAaron Ballman
13447611c88fb0446673c6e590ab461934054be290aAaron Ballman	enum DE1 no;	// no warning because E1 is not deprecated
13547611c88fb0446673c6e590ab461934054be290aAaron Ballman}
136aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballman
137aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballmanint __sptr wrong1; // expected-error {{'__sptr' attribute only applies to pointer arguments}}
138aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballman// The modifier must follow the asterisk
139aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballmanint __sptr *wrong_psp; // expected-error {{'__sptr' attribute only applies to pointer arguments}}
140aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballmanint * __sptr __uptr wrong2; // expected-error {{'__sptr' and '__uptr' attributes are not compatible}}
141aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballmanint * __sptr __sptr wrong3; // expected-warning {{attribute '__sptr' is already applied}}
142aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballman
143aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballman// It is illegal to overload based on the type attribute.
144aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballmanvoid ptr_func(int * __ptr32 i) {}  // expected-note {{previous definition is here}}
145aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballmanvoid ptr_func(int * __ptr64 i) {} // expected-error {{redefinition of 'ptr_func'}}
146aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballman
147aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballman// It is also illegal to overload based on the pointer type attribute.
148aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballmanvoid ptr_func2(int * __sptr __ptr32 i) {}  // expected-note {{previous definition is here}}
149aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballmanvoid ptr_func2(int * __uptr __ptr32 i) {} // expected-error {{redefinition of 'ptr_func2'}}
150aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballman
151aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballmanint * __sptr __ptr32 __sptr wrong4; // expected-warning {{attribute '__sptr' is already applied}}
152aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballman
153aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballman__ptr32 int *wrong5; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
154aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballman
155aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballmanint *wrong6 __ptr32;  // expected-error {{expected ';' after top level declarator}} expected-warning {{declaration does not declare anything}}
156aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballman
157aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballmanint * __ptr32 __ptr64 wrong7;  // expected-error {{'__ptr32' and '__ptr64' attributes are not compatible}}
158aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballman
159aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballmanint * __ptr32 __ptr32 wrong8;	// expected-warning {{attribute '__ptr32' is already applied}}
160aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballman
161aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballmanint *(__ptr32 __sptr wrong9); // expected-error {{'__sptr' attribute only applies to pointer arguments}} // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
162aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballman
163aa9df09729fb8aee3e645549e95fcb413306a7aaAaron Ballmantypedef int *T;
164aa9df09729fb8aee3e645549e95fcb413306a7aaAaron BallmanT __ptr32 wrong10; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
165651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
166651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestypedef char *my_va_list;
167651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid __va_start(my_va_list *ap, ...); // expected-note {{passing argument to parameter 'ap' here}}
168651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid vmyprintf(const char *f, my_va_list ap);
169651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid myprintf(const char *f, ...) {
170651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  my_va_list ap;
171651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (1) {
172651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    __va_start(&ap, f);
173651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    vmyprintf(f, ap);
174651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    ap = 0;
175651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  } else {
176651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    __va_start(ap, f); // expected-warning {{incompatible pointer types passing 'my_va_list'}}
177651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
178651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
1794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// __unaligned handling
1814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid test_unaligned() {
1824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  __unaligned int *p1 = 0;
1834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  int *p2 = p1; // expected-warning {{initializing 'int *' with an expression of type '__unaligned int *' discards qualifiers}}
1844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  __unaligned int *p3 = p2;
1854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
1864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid test_unaligned2(int x[__unaligned 4]) {}
1884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
189