brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.2 KiB · a1cc2ae Raw
250 lines · cpp
1// RUN: %check_clang_tidy %s bugprone-signed-char-misuse %t2 3///////////////////////////////////////////////////////////////////4/// Test cases correctly caught by the check.5 6typedef __SIZE_TYPE__ size_t;7 8namespace std {9template <typename T, size_t N>10struct array {11  T &operator[](size_t n);12  T &at(size_t n);13};14} // namespace std15 16int SimpleVarDeclaration() {17  signed char CCharacter = -5;18  int NCharacter = CCharacter;19  // CHECK-MESSAGES: [[@LINE-1]]:20: warning: 'signed char' to 'int' conversion; consider casting to 'unsigned char' first. [bugprone-signed-char-misuse]20 21  return NCharacter;22}23 24int SimpleAssignment() {25  signed char CCharacter = -5;26  int NCharacter;27  NCharacter = CCharacter;28  // CHECK-MESSAGES: [[@LINE-1]]:16: warning: 'signed char' to 'int' conversion; consider casting to 'unsigned char' first. [bugprone-signed-char-misuse]29 30  return NCharacter;31}32 33int CStyleCast() {34  signed char CCharacter = -5;35  int NCharacter;36  NCharacter = (int)CCharacter;37  // CHECK-MESSAGES: [[@LINE-1]]:21: warning: 'signed char' to 'int' conversion; consider casting to 'unsigned char' first. [bugprone-signed-char-misuse]38 39  return NCharacter;40}41 42int StaticCast() {43  signed char CCharacter = -5;44  int NCharacter;45  NCharacter = static_cast<int>(CCharacter);46  // CHECK-MESSAGES: [[@LINE-1]]:33: warning: 'signed char' to 'int' conversion; consider casting to 'unsigned char' first. [bugprone-signed-char-misuse]47 48  return NCharacter;49}50 51int FunctionalCast() {52  signed char CCharacter = -5;53  int NCharacter;54  NCharacter = int(CCharacter);55  // CHECK-MESSAGES: [[@LINE-1]]:20: warning: 'signed char' to 'int' conversion; consider casting to 'unsigned char' first. [bugprone-signed-char-misuse]56 57  return NCharacter;58}59 60int NegativeConstValue() {61  const signed char CCharacter = -5;62  int NCharacter = CCharacter;63  // CHECK-MESSAGES: [[@LINE-1]]:20: warning: 'signed char' to 'int' conversion; consider casting to 'unsigned char' first. [bugprone-signed-char-misuse]64 65  return NCharacter;66}67 68int CharPointer(signed char *CCharacter) {69  int NCharacter = *CCharacter;70  // CHECK-MESSAGES: [[@LINE-1]]:20: warning: 'signed char' to 'int' conversion; consider casting to 'unsigned char' first. [bugprone-signed-char-misuse]71 72  return NCharacter;73}74 75int SignedUnsignedCharEquality(signed char SCharacter) {76  unsigned char USCharacter = 'a';77  if (SCharacter == USCharacter) // CHECK-MESSAGES: [[@LINE]]:7: warning: comparison between 'signed char' and 'unsigned char' [bugprone-signed-char-misuse]78    return 1;79  return 0;80}81 82int SignedUnsignedCharIneqiality(signed char SCharacter) {83  unsigned char USCharacter = 'a';84  if (SCharacter != USCharacter) // CHECK-MESSAGES: [[@LINE]]:7: warning: comparison between 'signed char' and 'unsigned char' [bugprone-signed-char-misuse]85    return 1;86  return 0;87}88 89int CompareWithNonAsciiConstant(unsigned char USCharacter) {90  const signed char SCharacter = -5;91  if (USCharacter == SCharacter) // CHECK-MESSAGES: [[@LINE]]:7: warning: comparison between 'signed char' and 'unsigned char' [bugprone-signed-char-misuse]92    return 1;93  return 0;94}95 96int CompareWithUnsignedNonAsciiConstant(signed char SCharacter) {97  const unsigned char USCharacter = 128;98  if (USCharacter == SCharacter) // CHECK-MESSAGES: [[@LINE]]:7: warning: comparison between 'signed char' and 'unsigned char' [bugprone-signed-char-misuse]99    return 1;100  return 0;101}102 103int SignedCharCArraySubscript(signed char SCharacter) {104  int Array[3] = {1, 2, 3};105 106  return Array[static_cast<unsigned int>(SCharacter)]; // CHECK-MESSAGES: [[@LINE]]:42: warning: 'signed char' to 'unsigned int' conversion in array subscript; consider casting to 'unsigned char' first. [bugprone-signed-char-misuse]107}108 109int SignedCharSTDArraySubscript(std::array<int, 3> Array, signed char SCharacter) {110  return Array[static_cast<unsigned int>(SCharacter)]; // CHECK-MESSAGES: [[@LINE]]:42: warning: 'signed char' to 'unsigned int' conversion in array subscript; consider casting to 'unsigned char' first. [bugprone-signed-char-misuse]111}112 113///////////////////////////////////////////////////////////////////114/// Test cases correctly ignored by the check.115 116int UnsignedCharCast() {117  unsigned char CCharacter = 'a';118  int NCharacter = CCharacter;119 120  return NCharacter;121}122 123int PositiveConstValue() {124  const signed char CCharacter = 5;125  int NCharacter = CCharacter;126 127  return NCharacter;128}129 130// singed char -> integer cast is not the direct child of declaration expression.131int DescendantCast() {132  signed char CCharacter = 'a';133  int NCharacter = 10 + CCharacter;134 135  return NCharacter;136}137 138// singed char -> integer cast is not the direct child of assignment expression.139int DescendantCastAssignment() {140  signed char CCharacter = 'a';141  int NCharacter;142  NCharacter = 10 + CCharacter;143 144  return NCharacter;145}146 147// bool is an integer type in clang; make sure to ignore it.148bool BoolVarDeclaration() {149  signed char CCharacter = 'a';150  bool BCharacter = CCharacter == 'b';151 152  return BCharacter;153}154 155// bool is an integer type in clang; make sure to ignore it.156bool BoolAssignment() {157  signed char CCharacter = 'a';158  bool BCharacter;159  BCharacter = CCharacter == 'b';160 161  return BCharacter;162}163 164// char is an integer type in clang; make sure to ignore it.165unsigned char CharToCharCast() {166  signed char SCCharacter = 'a';167  unsigned char USCharacter;168  USCharacter = SCCharacter;169 170  return USCharacter;171}172 173int FixComparisonWithSignedCharCast(signed char SCharacter) {174  unsigned char USCharacter = 'a';175  if (SCharacter == static_cast<signed char>(USCharacter))176    return 1;177  return 0;178}179 180int FixComparisonWithUnSignedCharCast(signed char SCharacter) {181  unsigned char USCharacter = 'a';182  if (static_cast<unsigned char>(SCharacter) == USCharacter)183    return 1;184  return 0;185}186 187// Make sure we don't catch other type of char comparison.188int SameCharTypeComparison(signed char SCharacter) {189  signed char SCharacter2 = 'a';190  if (SCharacter == SCharacter2)191    return 1;192  return 0;193}194 195// Make sure we don't catch other type of char comparison.196int SameCharTypeComparison2(unsigned char USCharacter) {197  unsigned char USCharacter2 = 'a';198  if (USCharacter == USCharacter2)199    return 1;200  return 0;201}202 203// Make sure we don't catch integer - char comparison.204int CharIntComparison(signed char SCharacter) {205  int ICharacter = 10;206  if (SCharacter == ICharacter)207    return 1;208  return 0;209}210 211int CompareWithAsciiLiteral(unsigned char USCharacter) {212  if (USCharacter == 'x') // no warning213    return 1;214  return 0;215}216 217int CompareWithAsciiConstant(unsigned char USCharacter) {218  const signed char SCharacter = 'a';219  if (USCharacter == SCharacter)220    return 1;221  return 0;222}223 224int CompareWithUnsignedAsciiConstant(signed char SCharacter) {225  const unsigned char USCharacter = 'a';226  if (USCharacter == SCharacter)227    return 1;228  return 0;229}230 231int UnsignedCharCArraySubscript(unsigned char USCharacter) {232  int Array[3] = {1, 2, 3};233 234  return Array[static_cast<unsigned int>(USCharacter)];235}236 237int CastedCArraySubscript(signed char SCharacter) {238  int Array[3] = {1, 2, 3};239 240  return Array[static_cast<unsigned char>(SCharacter)];241}242 243int UnsignedCharSTDArraySubscript(std::array<int, 3> Array, unsigned char USCharacter) {244  return Array[static_cast<unsigned int>(USCharacter)];245}246 247int CastedSTDArraySubscript(std::array<int, 3> Array, signed char SCharacter) {248  return Array[static_cast<unsigned char>(SCharacter)];249}250