// RUN: %check_clang_tidy %s bugprone-signed-char-misuse %t /////////////////////////////////////////////////////////////////// /// Test cases correctly caught by the check. int SimpleVarDeclaration() { signed char CCharacter = -5; int NCharacter = CCharacter; // CHECK-MESSAGES: [[@LINE-1]]:20: warning: 'signed char' to 'int' conversion; consider casting to 'unsigned char' first. [bugprone-signed-char-misuse] return NCharacter; } int SimpleAssignment() { signed char CCharacter = -5; int NCharacter; NCharacter = CCharacter; // CHECK-MESSAGES: [[@LINE-1]]:16: warning: 'signed char' to 'int' conversion; consider casting to 'unsigned char' first. [bugprone-signed-char-misuse] return NCharacter; } int CStyleCast() { signed char CCharacter = -5; int NCharacter; NCharacter = (int)CCharacter; // CHECK-MESSAGES: [[@LINE-1]]:21: warning: 'signed char' to 'int' conversion; consider casting to 'unsigned char' first. [bugprone-signed-char-misuse] return NCharacter; } int StaticCast() { signed char CCharacter = -5; int NCharacter; NCharacter = static_cast(CCharacter); // CHECK-MESSAGES: [[@LINE-1]]:33: warning: 'signed char' to 'int' conversion; consider casting to 'unsigned char' first. [bugprone-signed-char-misuse] return NCharacter; } int FunctionalCast() { signed char CCharacter = -5; int NCharacter; NCharacter = int(CCharacter); // CHECK-MESSAGES: [[@LINE-1]]:20: warning: 'signed char' to 'int' conversion; consider casting to 'unsigned char' first. [bugprone-signed-char-misuse] return NCharacter; } int NegativeConstValue() { const signed char CCharacter = -5; int NCharacter = CCharacter; // CHECK-MESSAGES: [[@LINE-1]]:20: warning: 'signed char' to 'int' conversion; consider casting to 'unsigned char' first. [bugprone-signed-char-misuse] return NCharacter; } int CharPointer(signed char *CCharacter) { int NCharacter = *CCharacter; // CHECK-MESSAGES: [[@LINE-1]]:20: warning: 'signed char' to 'int' conversion; consider casting to 'unsigned char' first. [bugprone-signed-char-misuse] return NCharacter; } /////////////////////////////////////////////////////////////////// /// Test cases correctly ignored by the check. int UnsignedCharCast() { unsigned char CCharacter = 'a'; int NCharacter = CCharacter; return NCharacter; } int PositiveConstValue() { const signed char CCharacter = 5; int NCharacter = CCharacter; return NCharacter; } // singed char -> integer cast is not the direct child of declaration expression. int DescendantCast() { signed char CCharacter = 'a'; int NCharacter = 10 + CCharacter; return NCharacter; } // singed char -> integer cast is not the direct child of assignment expression. int DescendantCastAssignment() { signed char CCharacter = 'a'; int NCharacter; NCharacter = 10 + CCharacter; return NCharacter; } // bool is an integer type in clang; make sure to ignore it. bool BoolVarDeclaration() { signed char CCharacter = 'a'; bool BCharacter = CCharacter == 'b'; return BCharacter; } // bool is an integer type in clang; make sure to ignore it. bool BoolAssignment() { signed char CCharacter = 'a'; bool BCharacter; BCharacter = CCharacter == 'b'; return BCharacter; } // char is an integer type in clang; make sure to ignore it. unsigned char CharToCharCast() { signed char SCCharacter = 'a'; unsigned char USCharacter; USCharacter = SCCharacter; return USCharacter; }