202 lines · c
1// RUN: %check_clang_tidy -std=c23-or-later %s bugprone-signed-char-misuse %t2 3///////////////////////////////////////////////////////////////////4/// Test cases correctly caught by the check.5 6int SimpleVarDeclaration() {7 signed char CCharacter = -5;8 int NCharacter = CCharacter;9 // CHECK-MESSAGES: [[@LINE-1]]:20: warning: 'signed char' to 'int' conversion; consider casting to 'unsigned char' first. [bugprone-signed-char-misuse]10 11 return NCharacter;12}13 14int SimpleAssignment() {15 signed char CCharacter = -5;16 int NCharacter;17 NCharacter = CCharacter;18 // CHECK-MESSAGES: [[@LINE-1]]:16: warning: 'signed char' to 'int' conversion; consider casting to 'unsigned char' first. [bugprone-signed-char-misuse]19 20 return NCharacter;21}22 23int NegativeConstValue() {24 const signed char CCharacter = -5;25 int NCharacter = CCharacter;26 // CHECK-MESSAGES: [[@LINE-1]]:20: warning: 'signed char' to 'int' conversion; consider casting to 'unsigned char' first. [bugprone-signed-char-misuse]27 28 return NCharacter;29}30 31int CharPointer(signed char *CCharacter) {32 int NCharacter = *CCharacter;33 // CHECK-MESSAGES: [[@LINE-1]]:20: warning: 'signed char' to 'int' conversion; consider casting to 'unsigned char' first. [bugprone-signed-char-misuse]34 35 return NCharacter;36}37 38int SignedUnsignedCharEquality(signed char SCharacter) {39 unsigned char USCharacter = 'a';40 if (SCharacter == USCharacter) // CHECK-MESSAGES: [[@LINE]]:7: warning: comparison between 'signed char' and 'unsigned char' [bugprone-signed-char-misuse]41 return 1;42 return 0;43}44 45int SignedUnsignedCharIneqiality(signed char SCharacter) {46 unsigned char USCharacter = 'a';47 if (SCharacter != USCharacter) // CHECK-MESSAGES: [[@LINE]]:7: warning: comparison between 'signed char' and 'unsigned char' [bugprone-signed-char-misuse]48 return 1;49 return 0;50}51 52int CompareWithNonAsciiConstant(unsigned char USCharacter) {53 const signed char SCharacter = -5;54 if (USCharacter == SCharacter) // CHECK-MESSAGES: [[@LINE]]:7: warning: comparison between 'signed char' and 'unsigned char' [bugprone-signed-char-misuse]55 return 1;56 return 0;57}58 59int CompareWithUnsignedNonAsciiConstant(signed char SCharacter) {60 const unsigned char USCharacter = 128;61 if (USCharacter == SCharacter) // CHECK-MESSAGES: [[@LINE]]:7: warning: comparison between 'signed char' and 'unsigned char' [bugprone-signed-char-misuse]62 return 1;63 return 0;64}65 66///////////////////////////////////////////////////////////////////67/// Test cases correctly ignored by the check.68 69// Enum with a fixed underlying type of signed char.70enum EType1 : signed char {71 EType1_M128 = -128,72 EType1_1 = 1,73};74 75enum EType1 es1_1 = EType1_M128;76enum EType1 es1_2 = EType1_1;77enum EType1 es1_3 = -128;78 79void assign(enum EType1 *es) {80 *es = EType1_M128;81}82 83// Type aliased enum with a fixed underlying type of signed char.84typedef signed char int8_t;85typedef enum EType2 : int8_t {86 EType2_M128 = -128,87 EType2_1 = 1,88} EType2_t;89 90EType2_t es2_1 = EType2_M128;91EType2_t es2_2 = EType2_1;92EType2_t es2_3 = -128;93 94// Enum with a fixed underlying type of unsigned char.95enum EType3 : unsigned char {96 EType3_1 = 1,97 EType3_128 = 128,98};99 100enum EType3 es3_1 = EType3_1;101enum EType3 es3_2 = EType3_128;102enum EType3 es3_3 = 128;103 104 105int UnsignedCharCast() {106 unsigned char CCharacter = 'a';107 int NCharacter = CCharacter;108 109 return NCharacter;110}111 112int PositiveConstValue() {113 const signed char CCharacter = 5;114 int NCharacter = CCharacter;115 116 return NCharacter;117}118 119// signed char -> integer cast is not the direct child of declaration expression.120int DescendantCast() {121 signed char CCharacter = 'a';122 int NCharacter = 10 + CCharacter;123 124 return NCharacter;125}126 127// signed char -> integer cast is not the direct child of assignment expression.128int DescendantCastAssignment() {129 signed char CCharacter = 'a';130 int NCharacter;131 NCharacter = 10 + CCharacter;132 133 return NCharacter;134}135 136// bool is an integer type in clang; make sure to ignore it.137bool BoolVarDeclaration() {138 signed char CCharacter = 'a';139 bool BCharacter = CCharacter == 'b';140 141 return BCharacter;142}143 144// bool is an integer type in clang; make sure to ignore it.145bool BoolAssignment() {146 signed char CCharacter = 'a';147 bool BCharacter;148 BCharacter = CCharacter == 'b';149 150 return BCharacter;151}152 153// char is an integer type in clang; make sure to ignore it.154unsigned char CharToCharCast() {155 signed char SCCharacter = 'a';156 unsigned char USCharacter;157 USCharacter = SCCharacter;158 159 return USCharacter;160}161 162int SameCharTypeComparison(signed char SCharacter) {163 signed char SCharacter2 = 'a';164 if (SCharacter == SCharacter2)165 return 1;166 return 0;167}168 169int SameCharTypeComparison2(unsigned char USCharacter) {170 unsigned char USCharacter2 = 'a';171 if (USCharacter == USCharacter2)172 return 1;173 return 0;174}175 176int CharIntComparison(signed char SCharacter) {177 int ICharacter = 10;178 if (SCharacter == ICharacter)179 return 1;180 return 0;181}182 183int CompareWithAsciiLiteral(unsigned char USCharacter) {184 if (USCharacter == 'x')185 return 1;186 return 0;187}188 189int CompareWithAsciiConstant(unsigned char USCharacter) {190 const signed char SCharacter = 'a';191 if (USCharacter == SCharacter)192 return 1;193 return 0;194}195 196int CompareWithUnsignedAsciiConstant(signed char SCharacter) {197 const unsigned char USCharacter = 'a';198 if (USCharacter == SCharacter)199 return 1;200 return 0;201}202