99 lines · c
1// RUN: %clang_cc1 -fsyntax-only -Wenum-compare-typo -verify %s 2// RUN: %clang_cc1 -fsyntax-only -Wenum-compare-typo -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s3 4 5enum PossibleTypoLeft { 6 Val1 = 1 << 0,7 // expected-warning@+3 {{comparison operator '<' is potentially a typo for a shift operator '<<'}} 8 // expected-note@+2 {{use '<<' to perform a bitwise shift}}9 // CHECK: fix-it:"{{.*}}":{[[@LINE+1]]:12-[[@LINE+1]]:13}:"<<"10 Bad1 = 1 < 2, 11 // expected-warning@+3 {{comparison operator '>' is potentially a typo for a shift operator '>>'}} 12 // expected-note@+2 {{use '>>' to perform a bitwise shift}}13 // CHECK: fix-it:"{{.*}}":{[[@LINE+1]]:12-[[@LINE+1]]:13}:">>"14 Bad2 = 1 > 3,15 // expected-warning@+3 {{comparison operator '>' is potentially a typo for a shift operator '>>'}} 16 // expected-note@+2 {{use '>>' to perform a bitwise shift}}17 // CHECK: fix-it:"{{.*}}":{[[@LINE+1]]:13-[[@LINE+1]]:14}:">>"18 Bad3 = (1 > 3) 19};20 21enum PossibleTypoRight { 22 Val2 = 1 >> 0,23 // expected-warning@+3 {{comparison operator '<' is potentially a typo for a shift operator '<<'}} 24 // expected-note@+2 {{use '<<' to perform a bitwise shift}}25 // CHECK: fix-it:"{{.*}}":{[[@LINE+1]]:12-[[@LINE+1]]:13}:"<<"26 Bad4 = 1 < 2, 27 // expected-warning@+3 {{comparison operator '>' is potentially a typo for a shift operator '>>'}} 28 // expected-note@+2 {{use '>>' to perform a bitwise shift}}29 // CHECK: fix-it:"{{.*}}":{[[@LINE+1]]:12-[[@LINE+1]]:13}:">>"30 Bad5 = 1 > 3,31 // expected-warning@+3 {{comparison operator '<' is potentially a typo for a shift operator '<<'}} 32 // expected-note@+2 {{use '<<' to perform a bitwise shift}}33 // CHECK: fix-it:"{{.*}}":{[[@LINE+1]]:13-[[@LINE+1]]:14}:"<<"34 Bad6 = (1 < 3) 35};36 37// Case 3: Context provided by other bitwise operators (&, |)38// Even though there are no shifts, the presence of '|' implies flags.39enum PossibleTypoBitwiseOr {40 FlagA = 0x1,41 FlagB = 0x2,42 FlagCombo = FlagA | FlagB,43 // expected-warning@+3 {{comparison operator '<' is potentially a typo for a shift operator '<<'}} 44 // expected-note@+2 {{use '<<' to perform a bitwise shift}}45 // CHECK: fix-it:"{{.*}}":{[[@LINE+1]]:17-[[@LINE+1]]:18}:"<<"46 FlagTypo1 = 1 < FlagCombo,47 // expected-warning@+3 {{comparison operator '>' is potentially a typo for a shift operator '>>'}} 48 // expected-note@+2 {{use '>>' to perform a bitwise shift}}49 // CHECK: fix-it:"{{.*}}":{[[@LINE+1]]:17-[[@LINE+1]]:18}:">>"50 FlagTypo2 = 1 > FlagCombo51};52 53enum PossibleTypoBitwiseAnd {54 FlagAnd = FlagA & FlagB,55 // expected-warning@+3 {{comparison operator '<' is potentially a typo for a shift operator '<<'}} 56 // expected-note@+2 {{use '<<' to perform a bitwise shift}}57 // CHECK: fix-it:"{{.*}}":{[[@LINE+1]]:17-[[@LINE+1]]:18}:"<<"58 FlagTypo3 = 1 < FlagAnd,59 // expected-warning@+3 {{comparison operator '>' is potentially a typo for a shift operator '>>'}} 60 // expected-note@+2 {{use '>>' to perform a bitwise shift}}61 // CHECK: fix-it:"{{.*}}":{[[@LINE+1]]:17-[[@LINE+1]]:18}:">>"62 FlagTypo4 = 1 > FlagAnd63};64 65enum NoWarningOnDirectInit {66 A = 0,67 B = 1,68 Ok1 = 1 < 2, // No warning expected69 Ok2 = 1 > 2 // No warning expected70};71 72enum NoWarningOnArith {73 D = 0 + 1,74 E = D * 10,75 F = E - D,76 G = F / D,77 Ok3 = 1 < E, // No warning expected78 Ok4 = 1 > E // No warning expected79};80 81enum NoWarningOnExplicitCast {82 Bit1 = 1 << 0,83 Ok5 = (int)(1 < 2) // No warning expected84};85 86enum NoWarningOnNoneBitShift {87 Bit2 = 1 << 0,88 Ok6 = (3 < 2) // No warning expected89};90 91// Ensure the diagnostic group works92#pragma clang diagnostic push93#pragma clang diagnostic ignored "-Wenum-compare-typo"94enum IGNORED {95 Ok7 = 1 << 1,96 Ignored3 = 1 < 10 // No warning97};98#pragma clang diagnostic pop99