MicrosoftExtensions.c revision 86f208c1a112c3e8984e63daec15ccf0a1a84329
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
24842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois Pichetenum ENUM1; // expected-warning {{forward references to 'enum' types are a Microsoft extension}}
25842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois Pichetenum ENUM1 var1 = 3;
26842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois Pichetenum ENUM1* var2 = 0;
27842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois Pichet
28842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois Pichet
29842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois Pichetenum ENUM2 {
308e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  ENUM2_a = (enum ENUM2) 4,
318e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  ENUM2_b = 0x9FFFFFFF, // expected-warning {{enumerator value is not representable in the underlying type 'int'}}
328e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  ENUM2_c = 0x100000000 // expected-warning {{enumerator value is not representable in the underlying type 'int'}}
33842e7a22c6a0fbf0ccdb4bb9308d92ca9e9621f6Francois Pichet};
348e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet
358e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet
368e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet
378e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet
388e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichettypedef struct notnested {
398e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  long bad1;
408e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  long bad2;
418e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet} NOTNESTED;
428e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet
438e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet
448e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichettypedef struct nested1 {
458e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  long a;
468e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  struct notnested var1;
478e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  NOTNESTED var2;
488e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet} NESTED1;
498e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet
508e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichetstruct nested2 {
518e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  long b;
528e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  NESTED1;  // expected-warning {{anonymous structs are a Microsoft extension}}
538e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet};
548e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet
558e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichetstruct test {
568e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  int c;
578e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  struct nested2;   // expected-warning {{anonymous structs are a Microsoft extension}}
588e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet};
598e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet
608e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichetvoid foo()
618e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet{
628e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  struct test var;
638e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  var.a;
648e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  var.b;
658e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  var.c;
668e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  var.bad1;   // expected-error {{no member named 'bad1' in 'struct test'}}
678e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet  var.bad2;   // expected-error {{no member named 'bad2' in 'struct test'}}
688e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet}
698e161ed8e63bd9d3783a987d837b72b2b96c4512Francois Pichet
7086f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor// Enumeration types with a fixed underlying type.
7186f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregorconst int seventeen = 17;
7286f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregortypedef int Int;
7386f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor
7486f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregorstruct X0 {
7586f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor  enum E1 : Int { SomeOtherValue } field;  // expected-warning{{enumeration types with a fixed underlying type are a Microsoft extension}}
7686f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor  enum E1 : seventeen;
7786f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor};
7886f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor
7986f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregorenum : long {  // expected-warning{{enumeration types with a fixed underlying type are a Microsoft extension}}
8086f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor  SomeValue = 0x100000000
8186f208c1a112c3e8984e63daec15ccf0a1a84329Douglas Gregor};
82