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