189a1d03eSRichard // RUN: %check_clang_tidy %s bugprone-signed-char-misuse %t \
289a1d03eSRichard // RUN: -config='{CheckOptions: \
3*e8a3ddafSNathan James // RUN:  {bugprone-signed-char-misuse.CharTypdefsToIgnore: "sal_Int8;int8_t"}}' \
489a1d03eSRichard // RUN: --
589a1d03eSRichard 
689a1d03eSRichard ///////////////////////////////////////////////////////////////////
789a1d03eSRichard /// Test cases correctly caught by the check.
889a1d03eSRichard 
989a1d03eSRichard // Check that a simple test case is still caught.
SimpleAssignment()1089a1d03eSRichard int SimpleAssignment() {
1189a1d03eSRichard   signed char CCharacter = -5;
1289a1d03eSRichard   int NCharacter;
1389a1d03eSRichard   NCharacter = CCharacter;
1489a1d03eSRichard   // CHECK-MESSAGES: [[@LINE-1]]:16: warning: 'signed char' to 'int' conversion; consider casting to 'unsigned char' first. [bugprone-signed-char-misuse]
1589a1d03eSRichard 
1689a1d03eSRichard   return NCharacter;
1789a1d03eSRichard }
1889a1d03eSRichard 
1989a1d03eSRichard typedef signed char sal_Char;
2089a1d03eSRichard 
TypedefNotInIgnorableList()2189a1d03eSRichard int TypedefNotInIgnorableList() {
2289a1d03eSRichard   sal_Char CCharacter = 'a';
2389a1d03eSRichard   int NCharacter = CCharacter;
2489a1d03eSRichard   // CHECK-MESSAGES: [[@LINE-1]]:20: warning: 'signed char' to 'int' conversion; consider casting to 'unsigned char' first. [bugprone-signed-char-misuse]
2589a1d03eSRichard 
2689a1d03eSRichard   return NCharacter;
2789a1d03eSRichard }
2889a1d03eSRichard 
2989a1d03eSRichard ///////////////////////////////////////////////////////////////////
3089a1d03eSRichard /// Test cases correctly ignored by the check.
3189a1d03eSRichard 
3289a1d03eSRichard typedef signed char sal_Int8;
3389a1d03eSRichard 
OneIgnorableTypedef()3489a1d03eSRichard int OneIgnorableTypedef() {
3589a1d03eSRichard   sal_Int8 CCharacter = 'a';
3689a1d03eSRichard   int NCharacter = CCharacter;
3789a1d03eSRichard 
3889a1d03eSRichard   return NCharacter;
3989a1d03eSRichard }
4089a1d03eSRichard 
4189a1d03eSRichard typedef signed char int8_t;
4289a1d03eSRichard 
OtherIgnorableTypedef()4389a1d03eSRichard int OtherIgnorableTypedef() {
4489a1d03eSRichard   int8_t CCharacter = 'a';
4589a1d03eSRichard   int NCharacter = CCharacter;
4689a1d03eSRichard 
4789a1d03eSRichard   return NCharacter;
4889a1d03eSRichard }
4989a1d03eSRichard 
5089a1d03eSRichard ///////////////////////////////////////////////////////////////////
5189a1d03eSRichard /// Test cases which should be caught by the check.
5289a1d03eSRichard 
5389a1d03eSRichard namespace boost {
5489a1d03eSRichard 
5589a1d03eSRichard template <class T>
5689a1d03eSRichard class optional {
5789a1d03eSRichard   T *member;
5889a1d03eSRichard 
5989a1d03eSRichard public:
optional(T value)6089a1d03eSRichard   optional(T value) {
6189a1d03eSRichard     member = new T(value);
6289a1d03eSRichard   }
6389a1d03eSRichard 
operator *()6489a1d03eSRichard   T operator*() { return *member; }
6589a1d03eSRichard };
6689a1d03eSRichard 
6789a1d03eSRichard } // namespace boost
6889a1d03eSRichard 
DereferenceWithTypdef(boost::optional<sal_Int8> param)6989a1d03eSRichard int DereferenceWithTypdef(boost::optional<sal_Int8> param) {
7089a1d03eSRichard   int NCharacter = *param;
7189a1d03eSRichard   // CHECK-MESSAGES: [[@LINE-1]]:20: warning: 'signed char' to 'int' conversion; consider casting to 'unsigned char' first. [bugprone-signed-char-misuse]
7289a1d03eSRichard 
7389a1d03eSRichard   return NCharacter;
7489a1d03eSRichard }
75