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 Klecknerint 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 Klecknerint 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