xref: /netbsd/tests/usr.bin/xlint/lint1/op_colon.c (revision ea649623)
1 /*	$NetBSD: op_colon.c,v 1.7 2023/03/28 14:44:35 rillig Exp $	*/
2 # 3 "op_colon.c"
3 
4 /*
5  * Test handling of the operator ':', as part of the '?:'.
6  */
7 
8 /* lint1-extra-flags: -p -X 351 */
9 
10 struct canary {
11 	int member;
12 };
13 
14 void
15 sink(struct canary);
16 
17 void
test_merge_qualifiers(_Bool cond,int * p,const int * c,volatile int * v,const volatile int * cv)18 test_merge_qualifiers(_Bool cond, int *p, const int *c, volatile int *v,
19 		      const volatile int *cv)
20 {
21 	/* expect+1: ... 'pointer to int' ... */
22 	sink(cond ? p : p);
23 	/* expect+1: ... 'pointer to const int' ... */
24 	sink(cond ? p : c);
25 	/* expect+1: ... 'pointer to volatile int' ... */
26 	sink(cond ? p : v);
27 	/* expect+1: ... 'pointer to const volatile int' ... */
28 	sink(cond ? p : cv);
29 
30 	/* expect+1: ... 'pointer to const int' ... */
31 	sink(cond ? c : p);
32 	/* expect+1: ... 'pointer to const int' ... */
33 	sink(cond ? c : c);
34 	/* expect+1: ... 'pointer to const volatile int' ... */
35 	sink(cond ? c : v);
36 	/* expect+1: ... 'pointer to const volatile int' ... */
37 	sink(cond ? c : cv);
38 
39 	/* expect+1: ... 'pointer to volatile int' ... */
40 	sink(cond ? v : p);
41 	/* expect+1: ... 'pointer to const volatile int' ... */
42 	sink(cond ? v : c);
43 	/* expect+1: ... 'pointer to volatile int' ... */
44 	sink(cond ? v : v);
45 	/* expect+1: ... 'pointer to const volatile int' ... */
46 	sink(cond ? v : cv);
47 
48 	/* expect+1: ... 'pointer to const volatile int' ... */
49 	sink(cond ? cv : p);
50 	/* expect+1: ... 'pointer to const volatile int' ... */
51 	sink(cond ? cv : c);
52 	/* expect+1: ... 'pointer to const volatile int' ... */
53 	sink(cond ? cv : v);
54 	/* expect+1: ... 'pointer to const volatile int' ... */
55 	sink(cond ? cv : cv);
56 }
57 
58 /* null pointer constant + other pointer */
59 void
c99_6_5_15_p6(_Bool cond,const volatile double * cv_dp)60 c99_6_5_15_p6(_Bool cond, const volatile double *cv_dp)
61 {
62 	/* expect+2: ... 'pointer to const volatile double' ... */
63 	/* expect+2: ... 'pointer to const volatile double' ... */
64 	sink(cond ? cv_dp : (void *)0);
65 	sink(cond ? (void *)0 : cv_dp);
66 }
67 
68 void
c99_6_5_15_p8(_Bool cond,const void * c_vp,void * vp,const int * c_ip,volatile int * v_ip,int * ip,const char * c_cp)69 c99_6_5_15_p8(
70     _Bool cond,
71     const void *c_vp,
72     void *vp,
73     const int *c_ip,
74     volatile int *v_ip,
75     int *ip,
76     const char *c_cp
77 )
78 {
79 	/* expect+2: ... 'pointer to const void' ... */
80 	/* expect+2: ... 'pointer to const void' ... */
81 	sink(cond ? c_vp : c_ip);
82 	sink(cond ? c_ip : c_vp);
83 
84 	/* expect+2: ... 'pointer to volatile int' ... */
85 	/* expect+2: ... 'pointer to volatile int' ... */
86 	sink(cond ? v_ip : 0);
87 	sink(cond ? 0 : v_ip);
88 
89 	/* expect+2: ... 'pointer to const volatile int' ... */
90 	/* expect+2: ... 'pointer to const volatile int' ... */
91 	sink(cond ? c_ip : v_ip);
92 	sink(cond ? v_ip : c_ip);
93 
94 	/* expect+2: ... 'pointer to const void' ... */
95 	/* expect+2: ... 'pointer to const void' ... */
96 	sink(cond ? vp : c_cp);
97 	sink(cond ? c_cp : vp);
98 
99 	/* expect+2: ... 'pointer to const int' ... */
100 	/* expect+2: ... 'pointer to const int' ... */
101 	sink(cond ? ip : c_ip);
102 	sink(cond ? c_ip : ip);
103 
104 	/* expect+2: ... 'pointer to void' ... */
105 	/* expect+2: ... 'pointer to void' ... */
106 	sink(cond ? vp : ip);
107 	sink(cond ? ip : vp);
108 }
109