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