1
+ #include < cstdint>
2
+ #include < string>
3
+
4
+ // Test non-numeric type categories - these should not trigger rule violations
5
+ void test_non_numeric_type_categories () {
6
+ // Character category types
7
+ char l1 = ' a' ;
8
+ wchar_t l2 = L' b' ;
9
+ char16_t l3 = u' c' ;
10
+ char32_t l4 = U' d' ;
11
+
12
+ // Other category types
13
+ bool l5 = true ;
14
+ void *l6 = nullptr ;
15
+ std::nullptr_t l7 = nullptr ;
16
+
17
+ // Assignments between character types and numeric types
18
+ // Rule should not apply since source/target involve non-numeric types
19
+ std::uint8_t l8 = 42 ;
20
+ std::int32_t l9 = 100 ;
21
+ float l10 = 3 .14f ;
22
+
23
+ // Character to numeric - rule does not apply
24
+ l8 = l1; // COMPLIANT - char is character category, not numeric
25
+ l9 = l2; // COMPLIANT - wchar_t is character category, not numeric
26
+ l8 = l3; // COMPLIANT - char16_t is character category, not numeric
27
+ l9 = l4; // COMPLIANT - char32_t is character category, not numeric
28
+ l10 = l1; // COMPLIANT - char is character category, not numeric
29
+
30
+ // Numeric to character - rule does not apply
31
+ l1 = l8; // COMPLIANT - char is character category, not numeric
32
+ l2 = l9; // COMPLIANT - wchar_t is character category, not numeric
33
+ l3 = l8; // COMPLIANT - char16_t is character category, not numeric
34
+ l4 = l9; // COMPLIANT - char32_t is character category, not numeric
35
+ l1 = l10; // COMPLIANT - char is character category, not numeric
36
+
37
+ // Other category to numeric - rule does not apply
38
+ l8 = l5; // COMPLIANT - bool is other category, not numeric
39
+ l9 = l5; // COMPLIANT - bool is other category, not numeric
40
+ l10 = l5; // COMPLIANT - bool is other category, not numeric
41
+
42
+ // Numeric to other category - rule does not apply
43
+ l5 = l8; // COMPLIANT - bool is other category, not numeric
44
+ l5 = l9; // COMPLIANT - bool is other category, not numeric
45
+ l5 = l10; // COMPLIANT - bool is other category, not numeric
46
+
47
+ // Character to character - rule does not apply
48
+ l1 = l2; // COMPLIANT - both character category, not numeric
49
+ l3 = l4; // COMPLIANT - both character category, not numeric
50
+ l1 = l3; // COMPLIANT - both character category, not numeric
51
+
52
+ // Other to other - rule does not apply
53
+ std::nullptr_t l11 = l7; // COMPLIANT - both other category, not numeric
54
+ l6 = l7; // COMPLIANT - both other category, not numeric
55
+
56
+ // Character to other - rule does not apply
57
+ l5 = l1; // COMPLIANT - neither is numeric category
58
+ l6 = nullptr ; // COMPLIANT - neither is numeric category
59
+
60
+ // Other to character - rule does not apply
61
+ l1 = l5; // COMPLIANT - neither is numeric category
62
+ }
63
+
64
+ // Test function parameters with non-numeric types
65
+ void f15 (char l1) {}
66
+ void f16 (bool l1) {}
67
+ void f17 (wchar_t l1) {}
68
+
69
+ void test_non_numeric_function_parameters () {
70
+ std::uint8_t l1 = 42 ;
71
+ std::int32_t l2 = 100 ;
72
+ char l3 = ' x' ;
73
+ bool l4 = true ;
74
+ wchar_t l5 = L' y' ;
75
+
76
+ // Function calls with non-numeric parameters - rule does not apply
77
+ f15 (l1); // COMPLIANT - parameter is character category, not numeric
78
+ f15 (l2); // COMPLIANT - parameter is character category, not numeric
79
+ f15 (l3); // COMPLIANT - parameter is character category, not numeric
80
+
81
+ f16 (l1); // COMPLIANT - parameter is other category, not numeric
82
+ f16 (l2); // COMPLIANT - parameter is other category, not numeric
83
+ f16 (l4); // COMPLIANT - parameter is other category, not numeric
84
+
85
+ f17 (l1); // COMPLIANT - parameter is character category, not numeric
86
+ f17 (l2); // COMPLIANT - parameter is character category, not numeric
87
+ f17 (l5); // COMPLIANT - parameter is character category, not numeric
88
+ }
89
+
90
+ // Test references to non-numeric types
91
+ void test_non_numeric_references () {
92
+ char l1 = ' a' ;
93
+ bool l2 = true ;
94
+ wchar_t l3 = L' b' ;
95
+ std::uint8_t l4 = 42 ;
96
+ std::int32_t l5 = 100 ;
97
+
98
+ char &l6 = l1;
99
+ bool &l7 = l2;
100
+ wchar_t &l8 = l3;
101
+
102
+ // Assignments involving references to non-numeric types - rule does not apply
103
+ l4 = l6; // COMPLIANT - reference to character category, not numeric
104
+ l5 = l7; // COMPLIANT - reference to other category, not numeric
105
+ l4 = l8; // COMPLIANT - reference to character category, not numeric
106
+
107
+ l6 = l4; // COMPLIANT - reference to character category, not numeric
108
+ l7 = l5; // COMPLIANT - reference to other category, not numeric
109
+ l8 = l4; // COMPLIANT - reference to character category, not numeric
110
+ }
111
+
112
+ // Test bit-fields with non-numeric types (though these are rare in practice)
113
+ struct NonNumericBitFields {
114
+ bool m1 : 1 ; // Other category
115
+ char m2 : 7 ; // Character category
116
+ wchar_t m3 : 16 ; // Character category
117
+ };
118
+
119
+ void test_non_numeric_bitfields () {
120
+ NonNumericBitFields l1;
121
+ std::uint8_t l2 = 42 ;
122
+ std::int32_t l3 = 100 ;
123
+ bool l4 = true ;
124
+ char l5 = ' x' ;
125
+
126
+ // Assignments to/from non-numeric bit-fields - rule does not apply
127
+ l1.m1 = l2; // COMPLIANT - bit-field is other category, not numeric
128
+ l1.m1 = l4; // COMPLIANT - bit-field is other category, not numeric
129
+ l1.m2 = l2; // COMPLIANT - bit-field is character category, not numeric
130
+ l1.m2 = l5; // COMPLIANT - bit-field is character category, not numeric
131
+ l1.m3 = l3; // COMPLIANT - bit-field is character category, not numeric
132
+
133
+ l2 = l1.m1 ; // COMPLIANT - bit-field is other category, not numeric
134
+ l4 = l1.m1 ; // COMPLIANT - bit-field is other category, not numeric
135
+ l2 = l1.m2 ; // COMPLIANT - bit-field is character category, not numeric
136
+ l5 = l1.m2 ; // COMPLIANT - bit-field is character category, not numeric
137
+ l3 = l1.m3 ; // COMPLIANT - bit-field is character category, not numeric
138
+ }
0 commit comments