1 // RUN: %clang_cc1 -fsyntax-only -Wsigned-enum-bitfield -verify %s --std=c++11 2 3 // Enums used in bitfields with no explicitly specified underlying type. 4 void test0() { 5 enum E { E1, E2 }; 6 enum F { F1, F2 }; 7 struct { E e1 : 1; E e2; F f1 : 1; F f2; } s; 8 9 s.e1 = E1; // expected-warning {{enums in the Microsoft ABI are signed integers by default; consider giving the enum E an unsigned underlying type to make this code portable}} 10 s.f1 = F1; // expected-warning {{enums in the Microsoft ABI are signed integers by default; consider giving the enum F an unsigned underlying type to make this code portable}} 11 12 s.e2 = E2; 13 s.f2 = F2; 14 } 15 16 // Enums used in bitfields with an explicit signed underlying type. 17 void test1() { 18 enum E : signed { E1, E2 }; 19 enum F : long { F1, F2 }; 20 struct { E e1 : 1; E e2; F f1 : 1; F f2; } s; 21 22 s.e1 = E1; 23 s.f1 = F1; 24 25 s.e2 = E2; 26 s.f2 = F2; 27 } 28 29 // Enums used in bitfields with an explicitly unsigned underlying type. 30 void test3() { 31 enum E : unsigned { E1, E2 }; 32 enum F : unsigned long { F1, F2 }; 33 struct { E e1 : 1; E e2; F f1 : 1; F f2; } s; 34 35 s.e1 = E1; 36 s.f1 = F1; 37 38 s.e2 = E2; 39 s.f2 = F2; 40 } 41