18e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet// RUN: %clang_cc1 %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
9b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruthstruct C {
10b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruth   int l;
11b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruth   union {
12b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruth       int c1[];   /* expected-warning {{flexible array member 'c1' in a union is a Microsoft extension}}  */
13b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruth       char c2[];  /* expected-warning {{flexible array member 'c2' in a union is a Microsoft extension}} */
14b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruth   };
15b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruth};
16b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruth
17b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruth
18b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruthstruct D {
19b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruth   int l;
20b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruth   int D[];
21b6448943ba1fe01be7cd658437dacae9d2fee8a8Chandler Carruth};
22842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois Pichet
23842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois Pichet
248e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet
258e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet
268e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet
278e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet
288e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichettypedef struct notnested {
298e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  long bad1;
308e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  long bad2;
318e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet} NOTNESTED;
328e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet
338e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet
348e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichettypedef struct nested1 {
358e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  long a;
368e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  struct notnested var1;
378e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  NOTNESTED var2;
388e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet} NESTED1;
398e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet
408e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichetstruct nested2 {
418e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  long b;
428e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  NESTED1;  // expected-warning {{anonymous structs are a Microsoft extension}}
438e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet};
448e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet
458e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichetstruct test {
468e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  int c;
478e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  struct nested2;   // expected-warning {{anonymous structs are a Microsoft extension}}
488e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet};
498e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet
508e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichetvoid foo()
518e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet{
528e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  struct test var;
538e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  var.a;
548e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  var.b;
558e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  var.c;
568e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  var.bad1;   // expected-error {{no member named 'bad1' in 'struct test'}}
578e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  var.bad2;   // expected-error {{no member named 'bad2' in 'struct test'}}
588e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet}
598e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet
6086f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor// Enumeration types with a fixed underlying type.
6186f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregorconst int seventeen = 17;
6286f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregortypedef int Int;
6386f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor
6486f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregorstruct X0 {
6586f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor  enum E1 : Int { SomeOtherValue } field;  // expected-warning{{enumeration types with a fixed underlying type are a Microsoft extension}}
6686f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor  enum E1 : seventeen;
6786f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor};
6886f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor
691756ce44b0e03d6a6fd2d42add6e3227d4d04d34Douglas Gregorenum : long long {  // expected-warning{{enumeration types with a fixed underlying type are a Microsoft extension}}
7086f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor  SomeValue = 0x100000000
7186f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor};
7283e0995105222b078a57e1e20ef71fbfd0f67d3dFrancois Pichet
7383e0995105222b078a57e1e20ef71fbfd0f67d3dFrancois Pichet
7483e0995105222b078a57e1e20ef71fbfd0f67d3dFrancois Pichetvoid pointer_to_integral_type_conv(char* ptr) {
7583e0995105222b078a57e1e20ef71fbfd0f67d3dFrancois Pichet   char ch = (char)ptr;
7683e0995105222b078a57e1e20ef71fbfd0f67d3dFrancois Pichet   short sh = (short)ptr;
7783e0995105222b078a57e1e20ef71fbfd0f67d3dFrancois Pichet   ch = (char)ptr;
7883e0995105222b078a57e1e20ef71fbfd0f67d3dFrancois Pichet   sh = (short)ptr;
79ee625afea71ef5a9c1e386564919b86915d96b0dNico Weber}
80ee625afea71ef5a9c1e386564919b86915d96b0dNico Weber
81ee625afea71ef5a9c1e386564919b86915d96b0dNico Weber
82ee625afea71ef5a9c1e386564919b86915d96b0dNico Webertypedef struct {
83ee625afea71ef5a9c1e386564919b86915d96b0dNico Weber  UNKNOWN u; // expected-error {{unknown type name 'UNKNOWN'}}
84ee625afea71ef5a9c1e386564919b86915d96b0dNico Weber} AA;
85ee625afea71ef5a9c1e386564919b86915d96b0dNico Weber
86ee625afea71ef5a9c1e386564919b86915d96b0dNico Webertypedef struct {
87ee625afea71ef5a9c1e386564919b86915d96b0dNico Weber  AA; // expected-warning {{anonymous structs are a Microsoft extension}}
88ee625afea71ef5a9c1e386564919b86915d96b0dNico Weber} BB;
8947611c88fb0446673c6e590ab461934054be290aAaron Ballman
90d6724367519b4f98dcce091854549282c11d70a0Fariborz Jahanian__declspec(deprecated("This is deprecated")) enum DE1 { one, two } e1; // expected-note {{'e1' declared here}}
91c3b2308f66fe8abd2c1a911b500c0b989c295819Eli Friedmanstruct __declspec(deprecated) DS1 { int i; float f; }; // expected-note {{declared here}}
9247611c88fb0446673c6e590ab461934054be290aAaron Ballman
9347611c88fb0446673c6e590ab461934054be290aAaron Ballman#define MY_TEXT		"This is also deprecated"
94d6724367519b4f98dcce091854549282c11d70a0Fariborz Jahanian__declspec(deprecated(MY_TEXT)) void Dfunc1( void ) {} // expected-note {{'Dfunc1' declared here}}
9547611c88fb0446673c6e590ab461934054be290aAaron Ballman
96fc685ace387734599c475426b1a8efdb491054b8Aaron Ballmanstruct __declspec(deprecated(123)) DS2 {};	// expected-error {{argument to deprecated attribute was not a string literal}}
97fc685ace387734599c475426b1a8efdb491054b8Aaron Ballman
9847611c88fb0446673c6e590ab461934054be290aAaron Ballmanvoid test( void ) {
9947611c88fb0446673c6e590ab461934054be290aAaron Ballman	e1 = one;	// expected-warning {{'e1' is deprecated: This is deprecated}}
10047611c88fb0446673c6e590ab461934054be290aAaron Ballman	struct DS1 s = { 0 };	// expected-warning {{'DS1' is deprecated}}
10147611c88fb0446673c6e590ab461934054be290aAaron Ballman	Dfunc1();	// expected-warning {{'Dfunc1' is deprecated: This is also deprecated}}
10247611c88fb0446673c6e590ab461934054be290aAaron Ballman
10347611c88fb0446673c6e590ab461934054be290aAaron Ballman	enum DE1 no;	// no warning because E1 is not deprecated
10447611c88fb0446673c6e590ab461934054be290aAaron Ballman}
105