1 // RUN: %check_clang_tidy -std=c++98-or-later %s bugprone-non-zero-enum-to-bool-conversion %t -- \
2 // RUN: -config="{CheckOptions: {bugprone-non-zero-enum-to-bool-conversion.EnumIgnoreList: '::without::issue::IgnoredEnum;IgnoredSecondEnum'}}"
3
4 namespace with::issue {
5
6 typedef enum EStatus {
7 SUCCESS = 1,
8 FAILURE = 2,
9 INVALID_PARAM = 3,
10 UNKNOWN = 4
11 } Status;
12
testEnumConversion(EStatus value)13 bool testEnumConversion(EStatus value) {
14 // CHECK-MESSAGES: :[[@LINE+1]]:10: warning: conversion of 'EStatus' into 'bool' will always return 'true', enum doesn't have a zero-value enumerator [bugprone-non-zero-enum-to-bool-conversion]
15 return value;
16 }
17
testTypedefConversion(Status value)18 bool testTypedefConversion(Status value) {
19 // CHECK-MESSAGES: :[[@LINE+1]]:10: warning: conversion of 'EStatus' into 'bool' will always return 'true', enum doesn't have a zero-value enumerator [bugprone-non-zero-enum-to-bool-conversion]
20 return value;
21 }
22
testExplicitConversion(EStatus value)23 bool testExplicitConversion(EStatus value) {
24 // CHECK-MESSAGES: :[[@LINE+1]]:28: warning: conversion of 'EStatus' into 'bool' will always return 'true', enum doesn't have a zero-value enumerator [bugprone-non-zero-enum-to-bool-conversion]
25 return static_cast<bool>(value);
26 }
27
testInIfConversion(EStatus value)28 bool testInIfConversion(EStatus value) {
29 // CHECK-MESSAGES: :[[@LINE+1]]:7: warning: conversion of 'EStatus' into 'bool' will always return 'true', enum doesn't have a zero-value enumerator [bugprone-non-zero-enum-to-bool-conversion]
30 if (value) {
31 return false;
32 }
33 return true;
34 }
35
testWithNegation(EStatus value)36 bool testWithNegation(EStatus value) {
37 // CHECK-MESSAGES: :[[@LINE+1]]:14: warning: conversion of 'EStatus' into 'bool' will always return 'true', enum doesn't have a zero-value enumerator [bugprone-non-zero-enum-to-bool-conversion]
38 return not value;
39 }
40
41 }
42
43 namespace without::issue {
44
45 enum StatusWithZero {
46 UNK = 0,
47 OK = 1,
48 NOT_OK = 2
49 };
50
testEnumConversion(StatusWithZero value)51 bool testEnumConversion(StatusWithZero value) {
52 return value;
53 }
54
55 enum WithDefault {
56 Value0,
57 Value1
58 };
59
testEnumConversion(WithDefault value)60 bool testEnumConversion(WithDefault value) {
61 return value;
62 }
63
64 enum WithNegative : int {
65 Nen2 = -2,
66 Nen1,
67 Nen0
68 };
69
testEnumConversion(WithNegative value)70 bool testEnumConversion(WithNegative value) {
71 return value;
72 }
73
74 enum EStatus {
75 SUCCESS = 1,
76 FAILURE,
77 INVALID_PARAM,
78 UNKNOWN
79 };
80
explicitCompare(EStatus value)81 bool explicitCompare(EStatus value) {
82 return value == SUCCESS;
83 }
84
explicitBitUsage1(EStatus value)85 bool explicitBitUsage1(EStatus value) {
86 return (value & SUCCESS);
87 }
88
explicitBitUsage2(EStatus value)89 bool explicitBitUsage2(EStatus value) {
90 return (value | SUCCESS);
91 }
92
testEnumeratorCompare()93 bool testEnumeratorCompare() {
94 return SUCCESS;
95 }
96
97 enum IgnoredEnum {
98 IGNORED_VALUE_1 = 1,
99 IGNORED_VALUE_2
100 };
101
102 enum IgnoredSecondEnum {
103 IGNORED_SECOND_VALUE_1 = 1,
104 IGNORED_SECOND_VALUE_2
105 };
106
testIgnored(IgnoredEnum value)107 bool testIgnored(IgnoredEnum value) {
108 return value;
109 }
110
testIgnored(IgnoredSecondEnum value)111 bool testIgnored(IgnoredSecondEnum value) {
112 return value;
113 }
114
115 enum CustomOperatorEnum {
116 E0 = 0x1,
117 E1 = 0x2,
118 E2 = 0x4
119 };
120
operator &(CustomOperatorEnum a,CustomOperatorEnum b)121 CustomOperatorEnum operator&(CustomOperatorEnum a, CustomOperatorEnum b) { return static_cast<CustomOperatorEnum>(a & b); }
122
testCustomOperator(CustomOperatorEnum e)123 void testCustomOperator(CustomOperatorEnum e) {
124 if (e & E1) {}
125 if ((e & E1)) {}
126 if (!(e & E1)) {}
127 }
128
129 }
130