1+ void test_incompatible_arithmetic () {
2+ float f = 0.0f ;
3+ int * p = (int * )& f ; // NON_COMPLIANT - arithmetic types are not compatible
4+ // with each other
5+ (* p )++ ;
6+
7+ short s [2 ];
8+ (int * )& s ; // NON_COMPLIANT
9+
10+ (short (* )[4 ]) & s ; // NON_COMPLIANT - array of size 2 is not compatible with
11+ // array of size 4 (n1570 6.7.6.2 paragraph 7)
12+ (short (* )[2 ]) & s ; // COMPLIANT
13+
14+ // char may be signed or unsigned, and so is not compatible with either
15+ char c1 ;
16+ (signed char * )& c1 ; // NON_COMPLIANT
17+ (unsigned char * )& c1 ; // NON_COMPLIANT
18+ (char * )& c1 ; // NON_COMPLIANT
19+
20+ // int is defined as signed, so is compatible with all the signed versions
21+ // (long, short etc. are similar)
22+ int i1 ;
23+ (signed int * )& i1 ; // COMPLIANT
24+ (int * )& i1 ; // COMPLIANT
25+ (signed * )& i1 ; // COMPLIANT
26+ (unsigned int * )& i1 ; // NON_COMPLIANT
27+ (const int * )& i1 ; // NON_COMPLIANT
28+ }
29+
30+ struct {
31+ int a ;
32+ } * s1 ;
33+ struct {
34+ int a ;
35+ } * s2 ;
36+ struct S1 {
37+ int a ;
38+ } * s3 ;
39+ struct S1 * s4 ;
40+
41+ // TODO test across files
42+ void test_incompatible_structs () {
43+ // s1 and s2 do not have tags, and are therefore not compatible
44+ s1 = s2 ; // NON_COMPLIANT
45+ // s3 tag is inconsistent with s1 tag
46+ s1 = s3 ; // NON_COMPLIANT
47+ s3 = s1 ; // NON_COMPLIANT
48+ // s4 tag is consistent with s3 tag
49+ s3 = s4 ; // COMPLIANT
50+ s4 = s3 ; // COMPLIANT
51+ }
52+
53+ enum E1 { E1A , E1B };
54+ enum E2 { E2A , E2B };
55+
56+ void test_enums () {
57+ enum E1 e1 = E1A ;
58+ enum E2 e2 = e1 ; // COMPLIANT
59+ // Enums are also compatible with one of `char`, a signed integer type or an
60+ // unsigned integer type. It is implementation defined which is used, so
61+ // choose an appropriate type below for this test
62+ (int * )& e1 ; // COMPLIANT
63+ }
64+
65+ int * void_cast (void * v ) { return (int * )v ; }
66+
67+ void test_indirect_cast () {
68+ float f1 = 0.0f ;
69+ void_cast (& f1 ); // NON_COMPLIANT
70+ int i1 = 0 ;
71+ void_cast (& i1 ); // COMPLIANT
72+ }
73+
74+ signed f (int y ) { return y ; }
75+ int g (signed int x ) { return x ; }
76+
77+ // 6.7.6.3 p15
78+ void test_compatible_functions () {
79+ signed (* f1 )(int ) = & g ; // COMPLIANT
80+ int (* g1 )(signed int ) = & f ; // COMPLIANT
81+ }
0 commit comments