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