xref: /llvm-project/clang/test/Sema/sign-compare-enum.c (revision b0a17edff7f8873a33e304077b7528e2ed09e36b)
1*b0a17edfSReid Kleckner // RUN: %clang_cc1 -triple=x86_64-pc-linux-gnu -fsyntax-only -verify -Wsign-compare %s
2*b0a17edfSReid Kleckner // RUN: %clang_cc1 -triple=x86_64-pc-win32 -fsyntax-only -verify -Wsign-compare %s
3*b0a17edfSReid Kleckner // RUN: %clang_cc1 -x c++ -triple=x86_64-pc-linux-gnu -fsyntax-only -verify -Wsign-compare %s
4*b0a17edfSReid Kleckner // RUN: %clang_cc1 -x c++ -triple=x86_64-pc-win32 -fsyntax-only -verify -Wsign-compare %s
57ade0173SRoman Lebedev 
6*b0a17edfSReid Kleckner // Check that -Wsign-compare is off by default.
7*b0a17edfSReid Kleckner // RUN: %clang_cc1 -triple=x86_64-pc-linux-gnu -fsyntax-only -verify -DSILENCE %s
8*b0a17edfSReid Kleckner 
9*b0a17edfSReid Kleckner #ifdef SILENCE
10*b0a17edfSReid Kleckner // expected-no-diagnostics
11*b0a17edfSReid Kleckner #endif
12*b0a17edfSReid Kleckner 
13*b0a17edfSReid Kleckner enum PosEnum {
14*b0a17edfSReid Kleckner   A_a = 0,
15*b0a17edfSReid Kleckner   A_b = 1,
16*b0a17edfSReid Kleckner   A_c = 10
17*b0a17edfSReid Kleckner };
18*b0a17edfSReid Kleckner 
197ade0173SRoman Lebedev static const int message[] = {0, 1};
207ade0173SRoman Lebedev 
test_pos(enum PosEnum a)21*b0a17edfSReid Kleckner int test_pos(enum PosEnum a) {
227ade0173SRoman Lebedev   if (a < 2)
237ade0173SRoman Lebedev     return 0;
247ade0173SRoman Lebedev 
25*b0a17edfSReid Kleckner   // No warning, except in Windows C mode, where PosEnum is 'int' and it can
26*b0a17edfSReid Kleckner   // take on any value according to the C standard.
27*b0a17edfSReid Kleckner #if !defined(SILENCE) && defined(_WIN32) && !defined(__cplusplus)
28*b0a17edfSReid Kleckner   // expected-warning@+2 {{comparison of integers of different signs}}
29*b0a17edfSReid Kleckner #endif
307ade0173SRoman Lebedev   if (a < 2U)
317ade0173SRoman Lebedev     return 0;
32*b0a17edfSReid Kleckner 
33*b0a17edfSReid Kleckner   unsigned uv = 2;
34*b0a17edfSReid Kleckner #if !defined(SILENCE) && defined(_WIN32) && !defined(__cplusplus)
35*b0a17edfSReid Kleckner   // expected-warning@+2 {{comparison of integers of different signs}}
36*b0a17edfSReid Kleckner #endif
37*b0a17edfSReid Kleckner   if (a < uv)
38*b0a17edfSReid Kleckner     return 1;
39*b0a17edfSReid Kleckner 
40*b0a17edfSReid Kleckner #if !defined(SILENCE) && defined(_WIN32) && !defined(__cplusplus)
41*b0a17edfSReid Kleckner   // expected-warning@+2 {{comparison of integers of different signs}}
42*b0a17edfSReid Kleckner #endif
437ade0173SRoman Lebedev   if (a < sizeof(message)/sizeof(message[0]))
447ade0173SRoman Lebedev     return 0;
45*b0a17edfSReid Kleckner   return 4;
46*b0a17edfSReid Kleckner }
47*b0a17edfSReid Kleckner 
48*b0a17edfSReid Kleckner enum NegEnum {
49*b0a17edfSReid Kleckner   NE_a = -1,
50*b0a17edfSReid Kleckner   NE_b = 0,
51*b0a17edfSReid Kleckner   NE_c = 10
52*b0a17edfSReid Kleckner };
53*b0a17edfSReid Kleckner 
test_neg(enum NegEnum a)54*b0a17edfSReid Kleckner int test_neg(enum NegEnum a) {
55*b0a17edfSReid Kleckner   if (a < 2)
56*b0a17edfSReid Kleckner     return 0;
57*b0a17edfSReid Kleckner 
58*b0a17edfSReid Kleckner #ifndef SILENCE
59*b0a17edfSReid Kleckner   // expected-warning@+2 {{comparison of integers of different signs}}
607ade0173SRoman Lebedev #endif
61*b0a17edfSReid Kleckner   if (a < 2U)
62*b0a17edfSReid Kleckner     return 0;
63*b0a17edfSReid Kleckner 
64*b0a17edfSReid Kleckner   unsigned uv = 2;
65*b0a17edfSReid Kleckner #ifndef SILENCE
66*b0a17edfSReid Kleckner   // expected-warning@+2 {{comparison of integers of different signs}}
67*b0a17edfSReid Kleckner #endif
68*b0a17edfSReid Kleckner   if (a < uv)
69*b0a17edfSReid Kleckner     return 1;
70*b0a17edfSReid Kleckner 
71*b0a17edfSReid Kleckner #ifndef SILENCE
72*b0a17edfSReid Kleckner   // expected-warning@+2 {{comparison of integers of different signs}}
73*b0a17edfSReid Kleckner #endif
74*b0a17edfSReid Kleckner   if (a < sizeof(message)/sizeof(message[0]))
75*b0a17edfSReid Kleckner     return 0;
76*b0a17edfSReid Kleckner   return 4;
777ade0173SRoman Lebedev }
78