| // RUN: %clang_cc1 -x c -fsyntax-only -verify -Wenum-compare -Wno-unused-comparison %s |
| // RUN: %clang_cc1 -x c++ -fsyntax-only -verify -Wenum-compare -Wno-unused-comparison %s |
| |
| // In C enumerators (i.e enumeration constants) have type int (until C23). In |
| // order to support diagnostics such as -Wenum-compare we pretend they have the |
| // type of their enumeration. |
| |
| typedef enum EnumA { |
| A |
| } EnumA; |
| |
| enum EnumB { |
| B, |
| B1 = 1, |
| // In C++ this comparison doesnt warn as enumerators dont have the type of |
| // their enumeration before the closing brace. We mantain the same behavior |
| // in C. |
| B2 = A == B1 |
| }; |
| |
| enum { |
| C |
| }; |
| |
| void foo(void) { |
| enum EnumA a = A; |
| enum EnumB b = B; |
| A == B; |
| // expected-warning@-1 {{comparison of different enumeration types}} |
| a == (B); |
| // expected-warning@-1 {{comparison of different enumeration types}} |
| a == b; |
| // expected-warning@-1 {{comparison of different enumeration types}} |
| A > B; |
| // expected-warning@-1 {{comparison of different enumeration types}} |
| A >= b; |
| // expected-warning@-1 {{comparison of different enumeration types}} |
| a > b; |
| // expected-warning@-1 {{comparison of different enumeration types}} |
| (A) <= ((B)); |
| // expected-warning@-1 {{comparison of different enumeration types}} |
| a < B; |
| // expected-warning@-1 {{comparison of different enumeration types}} |
| a < b; |
| // expected-warning@-1 {{comparison of different enumeration types}} |
| |
| // In the following cases we purposefully differ from GCC and dont warn |
| a == C; |
| A < C; |
| b >= C; |
| } |