1+ #include < cassert>
2+ #include < cctype>
3+ #include < cstdint>
4+ #include < iostream>
5+ #include < locale>
6+ #include < optional>
7+ #include < string>
8+
9+ void test_character_literal_assignment () {
10+ char l1 = ' a' ; // COMPLIANT
11+ char l2 = ' \r ' ; // COMPLIANT
12+ char l3 = ' \n ' ; // COMPLIANT
13+ char l4 = ' \0 ' ; // COMPLIANT
14+ }
15+
16+ void test_implicit_conversion_from_int () {
17+ char l1 = 10 ; // NON_COMPLIANT
18+ char l2 = 65 ; // NON_COMPLIANT
19+ char l3 = 0 ; // NON_COMPLIANT
20+ }
21+
22+ void test_implicit_conversion_to_int () {
23+ char l1 = ' a' ;
24+ std::int8_t l2 = ' a' ; // NON_COMPLIANT
25+ std::uint8_t l3 = ' \r ' ; // NON_COMPLIANT
26+ int l4 = ' b' ; // NON_COMPLIANT
27+ }
28+
29+ void test_signed_char_assignment () {
30+ signed char l1 = 11 ; // COMPLIANT
31+ signed char l2 = 65 ; // COMPLIANT
32+ }
33+
34+ void test_conversion_between_character_types () {
35+ char l1 = L' A' ; // COMPLIANT
36+ wchar_t l2 = ' B' ; // COMPLIANT
37+ char16_t l3 = ' C' ; // COMPLIANT
38+ char32_t l4 = ' D' ; // COMPLIANT
39+ }
40+
41+ void test_arithmetic_operations () {
42+ char l1 = ' a' ;
43+ char l2 = l1 - ' 0' ; // NON_COMPLIANT
44+ char l3 = l1 + 1 ; // NON_COMPLIANT
45+ char l4 = l1 * 2 ; // NON_COMPLIANT
46+ }
47+
48+ void test_boolean_conversion () {
49+ char l1 = ' a' ;
50+ char l2 = ' \0 ' ;
51+ if (l1 && l2) { // NON_COMPLIANT
52+ }
53+ if (l1) { // NON_COMPLIANT
54+ }
55+ if (!l2) { // NON_COMPLIANT
56+ }
57+ }
58+
59+ void test_same_type_comparison () {
60+ char l1 = ' a' ;
61+ if (l1 != ' q' ) { // COMPLIANT
62+ }
63+ if (l1 == ' b' ) { // COMPLIANT
64+ }
65+ }
66+
67+ void test_char_traits_usage () {
68+ using CT = std::char_traits<char >;
69+ char l1 = ' a' ;
70+ if (CT::eq (l1, ' q' )) { // COMPLIANT
71+ }
72+ auto l2 = CT::to_int_type (' a' ); // COMPLIANT
73+ auto l3 = static_cast <CT ::int_type>(' a' ); // NON_COMPLIANT
74+ }
75+
76+ void test_optional_comparison () {
77+ std::optional<char > l1;
78+ if (l1 == ' r' ) { // COMPLIANT
79+ }
80+ }
81+
82+ void test_unevaluated_operand () {
83+ decltype (' s' + ' t' ) l1; // COMPLIANT
84+ static_assert (sizeof (' x' ) > 0 ); // COMPLIANT
85+ }
86+
87+ void test_range_check_non_compliant () {
88+ char l1 = ' a' ;
89+ if ((l1 >= ' 0' ) && (l1 <= ' 9' )) { // NON_COMPLIANT
90+ }
91+ }
92+
93+ void test_range_check_compliant () {
94+ using CT = std::char_traits<char >;
95+ char l1 = ' a' ;
96+ if (!CT::lt (l1, ' 0' ) && !CT::lt (' 9' , l1)) { // COMPLIANT
97+ }
98+ }
99+
100+ void test_isdigit_non_compliant () {
101+ char l1 = ' a' ;
102+ if (0 == std::isdigit (l1)) { // NON_COMPLIANT
103+ }
104+ }
105+
106+ void test_isdigit_compliant () {
107+ char l1 = ' a' ;
108+ if (std::isdigit (l1, std::locale{})) { // COMPLIANT
109+ }
110+ }
111+
112+ void test_stream_conversion () {
113+ std::istream &l1 = std::cin;
114+ auto l2 = l1.get ();
115+ using CT = std::char_traits<char >;
116+ if (CT::not_eof (l2)) {
117+ char l3 = l2; // NON_COMPLIANT
118+ char l4 = CT::to_char_type (l2); // COMPLIANT
119+ }
120+ }
121+
122+ void test_explicit_cast () {
123+ char l1 = static_cast <char >(65 ); // NON_COMPLIANT
124+ int l2 = static_cast <int >(' A' ); // NON_COMPLIANT
125+ }
126+
127+ void test_function_parameter_conversion () {
128+ auto f1 = [](int l1) {};
129+ char l2 = ' x' ;
130+ f1 (l2); // NON_COMPLIANT
131+ }
0 commit comments