1
1
#include < cstdint>
2
2
3
- void f1 () {
4
- unsigned char a1 = ' c' ; // NON_COMPLIANT
5
- unsigned char a2 = 10 ;
6
- signed char a3 = ' c' ; // NON_COMPLIANT
7
- signed char a4 = 10 ;
3
+ template <typename T, T y> class C1 {
4
+ public:
5
+ C1 () : x(y) {}
8
6
9
- std::int8_t a5 = ' c' ; // NON_COMPLIANT
10
- std::int8_t a6 = 10 ;
7
+ private:
8
+ unsigned char x;
9
+ };
11
10
12
- std::uint8_t a7 = ' c' ; // NON_COMPLIANT
13
- std::uint8_t a8 = 10 ;
11
+ template <typename T, T y> class C2 {
12
+ public:
13
+ C2 () : x(y) {}
14
14
15
- char a9 = ' c' ;
15
+ private:
16
+ signed char x;
17
+ };
18
+
19
+ template <typename T, T y> class C3 {
20
+ public:
21
+ C3 () : x(y) {}
22
+
23
+ private:
24
+ unsigned char x;
25
+ };
26
+
27
+ template <typename T, T y> class C4 {
28
+ public:
29
+ C4 () : x(y) {}
30
+
31
+ private:
32
+ signed char x;
33
+ };
34
+
35
+ /* Twin templates for std::uint8_t and std::int8_t */
36
+ template <typename T, T y> class C9 {
37
+ public:
38
+ C9 () : x(y) {}
39
+
40
+ private:
41
+ std::uint8_t x;
42
+ };
43
+
44
+ template <typename T, T y> class C10 {
45
+ public:
46
+ C10 () : x(y) {}
47
+
48
+ private:
49
+ std::int8_t x;
50
+ };
51
+
52
+ template <typename T, T y> class C11 {
53
+ public:
54
+ C11 () : x(y) {}
55
+
56
+ private:
57
+ std::uint8_t x;
58
+ };
59
+
60
+ template <typename T, T y> class C12 {
61
+ public:
62
+ C12 () : x(y) {}
63
+
64
+ private:
65
+ std::int8_t x;
66
+ };
67
+
68
+ void f1 (unsigned char x) {}
69
+ void f2 (signed char x) {}
70
+ void f3 (unsigned char x) {}
71
+ void f4 (signed char x) {}
72
+
73
+ /* Twin functions for std::uint8_t and std::int8_t */
74
+ void f9 (std::uint8_t x) {}
75
+ void f10 (std::int8_t x) {}
76
+ void f11 (std::uint8_t x) {}
77
+ void f12 (std::int8_t x) {}
78
+
79
+ template <typename T> void f5 (T x) { unsigned char y = x; }
80
+ template <typename T> void f6 (T x) { signed char y = x; }
81
+ template <typename T> void f7 (T x) { signed char y = x; }
82
+ template <typename T> void f8 (T x) { signed char y = x; }
83
+
84
+ /* Twin template functions for std::uint8_t and std::int8_t */
85
+ template <typename T> void f13 (T x) { std::uint8_t y = x; }
86
+ template <typename T> void f14 (T x) { std::int8_t y = x; }
87
+ template <typename T> void f15 (T x) { std::int8_t y = x; }
88
+ template <typename T> void f16 (T x) { std::int8_t y = x; }
89
+
90
+ template <typename T> class C5 {
91
+ public:
92
+ C5 (T y) : x(y) {}
93
+
94
+ private:
95
+ unsigned char x;
96
+ };
97
+
98
+ template <typename T> class C6 {
99
+ public:
100
+ C6 (T y) : x(y) {}
101
+
102
+ private:
103
+ signed char x;
104
+ };
105
+
106
+ template <typename T> class C7 {
107
+ public:
108
+ C7 (T y) : x(y) {}
109
+
110
+ private:
111
+ signed char x;
112
+ };
113
+
114
+ template <typename T> class C8 {
115
+ public:
116
+ C8 (T y) : x(y) {}
117
+
118
+ private:
119
+ signed char x;
120
+ };
121
+
122
+ /* Twin template classes for std::uint8_t and std::int8_t */
123
+ template <typename T> class C13 {
124
+ public:
125
+ C13 (T y) : x(y) {}
126
+
127
+ private:
128
+ std::uint8_t x;
129
+ };
130
+
131
+ template <typename T> class C14 {
132
+ public:
133
+ C14 (T y) : x(y) {}
134
+
135
+ private:
136
+ std::int8_t x;
137
+ };
138
+
139
+ template <typename T> class C15 {
140
+ public:
141
+ C15 (T y) : x(y) {}
142
+
143
+ private:
144
+ std::int8_t x;
145
+ };
146
+
147
+ template <typename T> class C16 {
148
+ public:
149
+ C16 (T y) : x(y) {}
150
+
151
+ private:
152
+ std::int8_t x;
153
+ };
154
+
155
+ int main () {
156
+
157
+ /* ========== 1. Assigning a char to another char ========== */
158
+
159
+ /* ===== 1-1. Assigning a char to a char variable ===== */
160
+
161
+ unsigned char x1 = 1 ;
162
+ unsigned char y1 =
163
+ x1; // COMPLIANT: unsigned char assigned to an unsigned char
164
+
165
+ signed char x2 = 1 ;
166
+ signed char y2 = x2; // COMPLIANT: signed char assigned to a signed char
167
+
168
+ char x3 = ' x' ;
169
+ unsigned char y3 = x3; // NON-COMPLIANT: plain char assigned to a unsigned char
170
+
171
+ char x4 = ' x' ;
172
+ signed char y4 = x4; // NON-COMPLIANT: plain char assigned to a signed char
173
+
174
+ /* Twin cases with std::uint8_t and std::int8_t */
175
+ std::uint8_t x5 = 1 ;
176
+ std::uint8_t y5 =
177
+ x5; // COMPLIANT: std::uint8_t assigned to a std::uint8_t
178
+
179
+ std::int8_t x6 = 1 ;
180
+ std::int8_t y6 = x6; // COMPLIANT: std::int8_t assigned to a std::int8_t
181
+
182
+ char x7 = ' x' ;
183
+ std::uint8_t y7 = x7; // NON-COMPLIANT: plain char assigned to a std::uint8_t
184
+
185
+ char x8 = ' x' ;
186
+ std::int8_t y8 = x8; // NON-COMPLIANT: plain char assigned to a std::int8_t
187
+
188
+ /* ===== 1-2. Assigning a char to a char member ===== */
189
+
190
+ C1<unsigned char , 1 > c1; // COMPLIANT: unsigned char arg passed to an unsigned
191
+ // char member through a template
192
+
193
+ C2<signed char , 1 > c2; // COMPLIANT: signed char arg passed to a signed char
194
+ // member through a template
195
+
196
+ C3<char , ' x' > c3; // NON-COMPLIANT: plain char arg passed to a unsigned char
197
+ // member through a template
198
+
199
+ C4<char , ' x' > c4; // NON-COMPLIANT: plain char arg passed to a signed char
200
+ // member through a template
201
+
202
+ /* Twin cases with std::uint8_t and std::int8_t */
203
+ C9<std::uint8_t , 1 > c9; // COMPLIANT: std::uint8_t arg passed to a std::uint8_t
204
+ // member through a template
205
+
206
+ C10<std::int8_t , 1 > c10; // COMPLIANT: std::int8_t arg passed to a std::int8_t
207
+ // member through a template
208
+
209
+ C11<char , ' x' > c11; // NON-COMPLIANT: plain char arg passed to a std::uint8_t
210
+ // member through a template
211
+
212
+ C12<char , ' x' > c12; // NON-COMPLIANT: plain char arg passed to a std::int8_t
213
+ // member through a template
214
+
215
+ /* ========== 1-3. Assigning a char to a char through a pointer ========== */
216
+
217
+ unsigned char x9 = 1 ;
218
+ unsigned char *y9 = &x9;
219
+ signed char z1 =
220
+ *y9; // COMPLIANT: unsigned char assigned to a *&unsigned char
221
+
222
+ unsigned char x10 = 1 ;
223
+ unsigned char *y10 = &x10;
224
+ signed char z2 = *y10; // COMPLIANT: signed char assigned to an *&signed char
225
+
226
+ char x11 = 1 ;
227
+ char *y11 = &x11;
228
+ unsigned char z3 =
229
+ *y11; // NON-COMPLIANT: plain char assigned to an *&unsigned char
230
+
231
+ char x12 = 1 ;
232
+ char *y12 = &x12;
233
+ signed char z4 =
234
+ *y12; // NON-COMPLIANT: plain char assigned to an *&signed char
235
+
236
+ /* Twin cases with std::uint8_t and std::int8_t */
237
+ std::uint8_t x13 = 1 ;
238
+ std::uint8_t *y13 = &x13;
239
+ std::int8_t z5 =
240
+ *y13; // COMPLIANT: std::uint8_t assigned to a *&std::uint8_t
241
+
242
+ std::uint8_t x14 = 1 ;
243
+ std::uint8_t *y14 = &x14;
244
+ std::int8_t z6 = *y14; // COMPLIANT: std::int8_t assigned to an *&std::int8_t
245
+
246
+ char x15 = 1 ;
247
+ char *y15 = &x15;
248
+ std::uint8_t z7 =
249
+ *y15; // NON-COMPLIANT: plain char assigned to an *&std::uint8_t
250
+
251
+ char x16 = 1 ;
252
+ char *y16 = &x16;
253
+ std::int8_t z8 =
254
+ *y16; // NON-COMPLIANT: plain char assigned to an *&std::int8_t
255
+
256
+ /* ========== 2. Passing a char argument to a char parameter ========== */
257
+
258
+ /* ===== 2-1. Passing char argument to a char parameter of a regular function
259
+ * ===== */
260
+
261
+ unsigned char a1 = 1 ;
262
+ f1 (a1); // COMPLIANT: unsigned char arg passed to an unsigned char parameter
263
+
264
+ signed char a2 = 1 ;
265
+ f2 (a2); // COMPLIANT: signed char arg passed to a signed char parameter
266
+
267
+ char a3 = ' a' ;
268
+ f3 (a3); // NON-COMPLIANT: plain char arg passed to a unsigned char parameter
269
+
270
+ char a4 = ' a' ;
271
+ f4 (a4); // NON-COMPLIANT: plain char arg passed to a signed char parameter
272
+
273
+ /* Twin cases with std::uint8_t and std::int8_t */
274
+ std::uint8_t a5 = 1 ;
275
+ f9 (a5); // COMPLIANT: std::uint8_t arg passed to a std::uint8_t parameter
276
+
277
+ std::int8_t a6 = 1 ;
278
+ f10 (a6); // COMPLIANT: std::int8_t arg passed to a std::int8_t parameter
279
+
280
+ char a7 = ' a' ;
281
+ f11 (a7); // NON-COMPLIANT: plain char arg passed to a std::uint8_t parameter
282
+
283
+ char a8 = ' a' ;
284
+ f12 (a8); // NON-COMPLIANT: plain char arg passed to a std::int8_t parameter
285
+
286
+ /* ===== 2-2. Passing char argument to a char parameter through a template
287
+ * ===== */
288
+
289
+ unsigned char a9 = ' a' ;
290
+ f5 (a9); // COMPLIANT: unsigned char arg passed to an unsigned char parameter
291
+ // through a template
292
+
293
+ signed char a10 = ' a' ;
294
+ f6 (a10); // COMPLIANT: signed char arg passed to a signed char parameter
295
+ // through a template
296
+
297
+ char a11 = ' a' ;
298
+ f7 (a11); // NON-COMPLIANT: plain char arg passed to a unsigned char parameter
299
+ // through a template
300
+
301
+ char a12 = ' a' ;
302
+ f8 (a12); // COMPLIANT: plain char arg passed to a signed char parameter through
303
+ // a template
304
+
305
+ /* Twin cases with std::uint8_t and std::int8_t */
306
+ std::uint8_t a13 = ' a' ;
307
+ f13 (a13); // COMPLIANT: std::uint8_t arg passed to a std::uint8_t parameter
308
+ // through a template
309
+
310
+ std::int8_t a14 = ' a' ;
311
+ f14 (a14); // COMPLIANT: std::int8_t arg passed to a std::int8_t parameter
312
+ // through a template
313
+
314
+ char a15 = ' a' ;
315
+ f15 (a15); // NON-COMPLIANT: plain char arg passed to a std::uint8_t parameter
316
+ // through a template
317
+
318
+ char a16 = ' a' ;
319
+ f16 (a16); // COMPLIANT: plain char arg passed to a std::int8_t parameter through
320
+ // a template
321
+
322
+ /* ========== 2-3. Passing a char argument to a char parameter through a
323
+ * template ========== */
324
+
325
+ unsigned char a17 = 1 ;
326
+ C5<unsigned char > c5 (
327
+ a17); // COMPLIANT: unsigned char arg passed to an unsigned char parameter
328
+ // of a constructor through a template
329
+
330
+ signed char a18 = 1 ;
331
+ C6<signed char > c6 (a18); // COMPLIANT: signed char arg passed to an signed
332
+ // char parameter of a constructor through a template
333
+
334
+ char a19 = ' a' ;
335
+ C7<char > c7 (a19); // NON-COMPLIANT: plain char arg passed to an unsigned char
336
+ // parameter of a constructor through a template
337
+
338
+ char a20 = ' a' ;
339
+ C8<char > c8 (a20); // NON-COMPLIANT: plain char arg passed to an signed char
340
+ // parameter of a constructor through a template
341
+
342
+ /* Twin cases with std::uint8_t and std::int8_t */
343
+ std::uint8_t a21 = 1 ;
344
+ C13<std::uint8_t > c13 (
345
+ a21); // COMPLIANT: std::uint8_t arg passed to a std::uint8_t parameter
346
+ // of a constructor through a template
347
+
348
+ std::int8_t a22 = 1 ;
349
+ C14<std::int8_t > c14 (a22); // COMPLIANT: std::int8_t arg passed to a std::int8_t
350
+ // parameter of a constructor through a template
351
+
352
+ char a23 = ' a' ;
353
+ C15<char > c15 (a23); // NON-COMPLIANT: plain char arg passed to a std::uint8_t
354
+ // parameter of a constructor through a template
355
+
356
+ char a24 = ' a' ;
357
+ C16<char > c16 (a24); // NON-COMPLIANT: plain char arg passed to a std::int8_t
358
+ // parameter of a constructor through a template
16
359
}
0 commit comments