1f08c3bdfSopenharmony_ci#define	__nocast	__attribute__((nocast))
2f08c3bdfSopenharmony_citypedef unsigned long __nocast ulong_nc_t;
3f08c3bdfSopenharmony_ci
4f08c3bdfSopenharmony_ciextern void use_val(ulong_nc_t);
5f08c3bdfSopenharmony_ciextern void use_ptr(ulong_nc_t *);
6f08c3bdfSopenharmony_ci
7f08c3bdfSopenharmony_ci/* use address */
8f08c3bdfSopenharmony_cistatic void good_use_address(void)
9f08c3bdfSopenharmony_ci{
10f08c3bdfSopenharmony_ci	ulong_nc_t t;
11f08c3bdfSopenharmony_ci
12f08c3bdfSopenharmony_ci	use_ptr(&t);
13f08c3bdfSopenharmony_ci}
14f08c3bdfSopenharmony_ci
15f08c3bdfSopenharmony_cistatic ulong_nc_t *good_ret_address(void)
16f08c3bdfSopenharmony_ci{
17f08c3bdfSopenharmony_ci	static ulong_nc_t t;
18f08c3bdfSopenharmony_ci
19f08c3bdfSopenharmony_ci	return &t;
20f08c3bdfSopenharmony_ci}
21f08c3bdfSopenharmony_ci
22f08c3bdfSopenharmony_cistatic ulong_nc_t good_deref(ulong_nc_t *t)
23f08c3bdfSopenharmony_ci{
24f08c3bdfSopenharmony_ci	return *t;
25f08c3bdfSopenharmony_ci}
26f08c3bdfSopenharmony_ci
27f08c3bdfSopenharmony_ci/* assign value */
28f08c3bdfSopenharmony_cistatic ulong_nc_t t;
29f08c3bdfSopenharmony_ci
30f08c3bdfSopenharmony_ci
31f08c3bdfSopenharmony_ci
32f08c3bdfSopenharmony_ci/* assign pointer */
33f08c3bdfSopenharmony_cistatic ulong_nc_t *good_ptr = &t;
34f08c3bdfSopenharmony_cistatic ulong_nc_t *bad_ptr_to = 1UL;
35f08c3bdfSopenharmony_cistatic unsigned long *bad_ptr_from = &t;
36f08c3bdfSopenharmony_ci
37f08c3bdfSopenharmony_ci/* arithmetic operation */
38f08c3bdfSopenharmony_cistatic ulong_nc_t good_arith(ulong_nc_t t, unsigned int n)
39f08c3bdfSopenharmony_ci{
40f08c3bdfSopenharmony_ci	return t + n;
41f08c3bdfSopenharmony_ci}
42f08c3bdfSopenharmony_ci
43f08c3bdfSopenharmony_ci/* implicit cast to other types */
44f08c3bdfSopenharmony_cistatic unsigned long good_ret_samecast(ulong_nc_t t)
45f08c3bdfSopenharmony_ci{
46f08c3bdfSopenharmony_ci	return t;
47f08c3bdfSopenharmony_ci}
48f08c3bdfSopenharmony_cistatic unsigned long long bad_ret_biggercast(ulong_nc_t t)
49f08c3bdfSopenharmony_ci{
50f08c3bdfSopenharmony_ci	return t;
51f08c3bdfSopenharmony_ci}
52f08c3bdfSopenharmony_cistatic long bad_ret_signcast(ulong_nc_t t)
53f08c3bdfSopenharmony_ci{
54f08c3bdfSopenharmony_ci	return t;
55f08c3bdfSopenharmony_ci}
56f08c3bdfSopenharmony_cistatic short bad_ret_smallercast(ulong_nc_t t)
57f08c3bdfSopenharmony_ci{
58f08c3bdfSopenharmony_ci	return t;
59f08c3bdfSopenharmony_ci}
60f08c3bdfSopenharmony_ci
61f08c3bdfSopenharmony_cistatic void assign_val(ulong_nc_t t)
62f08c3bdfSopenharmony_ci{
63f08c3bdfSopenharmony_ci	ulong_nc_t good_c = t;
64f08c3bdfSopenharmony_ci	unsigned long good_ul = t;
65f08c3bdfSopenharmony_ci	unsigned long long bad_ull = t;
66f08c3bdfSopenharmony_ci	long bad_l = t;
67f08c3bdfSopenharmony_ci	short bad_i = t;
68f08c3bdfSopenharmony_ci}
69f08c3bdfSopenharmony_ci
70f08c3bdfSopenharmony_cistatic void assign_via_ptr(ulong_nc_t *t)
71f08c3bdfSopenharmony_ci{
72f08c3bdfSopenharmony_ci	ulong_nc_t good_c = *t;
73f08c3bdfSopenharmony_ci	unsigned long good_ul = *t;
74f08c3bdfSopenharmony_ci	unsigned long long bad_ull = *t;
75f08c3bdfSopenharmony_ci	long bad_l = *t;
76f08c3bdfSopenharmony_ci	short bad_i = *t;
77f08c3bdfSopenharmony_ci}
78f08c3bdfSopenharmony_ci
79f08c3bdfSopenharmony_cistatic void assign_ptr(ulong_nc_t *t)
80f08c3bdfSopenharmony_ci{
81f08c3bdfSopenharmony_ci	ulong_nc_t *good_same_type = t;
82f08c3bdfSopenharmony_ci	unsigned long *bad_mod = t;
83f08c3bdfSopenharmony_ci	unsigned long long __nocast *bad_size = t;
84f08c3bdfSopenharmony_ci	short __nocast *bad_i = t;
85f08c3bdfSopenharmony_ci	long __nocast *bad_l = t;
86f08c3bdfSopenharmony_ci}
87f08c3bdfSopenharmony_ci
88f08c3bdfSopenharmony_ci/* implicit cast to nocast */
89f08c3bdfSopenharmony_cistatic void implicit_assign_to(void)
90f08c3bdfSopenharmony_ci{
91f08c3bdfSopenharmony_ci	ulong_nc_t t;
92f08c3bdfSopenharmony_ci	unsigned long ul = 1;
93f08c3bdfSopenharmony_ci	unsigned short us = 1;
94f08c3bdfSopenharmony_ci	unsigned long long ull = 1;
95f08c3bdfSopenharmony_ci	long l = 1;
96f08c3bdfSopenharmony_ci
97f08c3bdfSopenharmony_ci	t = ul;		/* implicit to nocast from same type: OK? */
98f08c3bdfSopenharmony_ci	t = us;
99f08c3bdfSopenharmony_ci	t = ull;
100f08c3bdfSopenharmony_ci	t = l;
101f08c3bdfSopenharmony_ci}
102f08c3bdfSopenharmony_ci
103f08c3bdfSopenharmony_cistatic void bad_implicit_arg_to(void)
104f08c3bdfSopenharmony_ci{
105f08c3bdfSopenharmony_ci	unsigned long ul = 1;
106f08c3bdfSopenharmony_ci	unsigned short us = 1;
107f08c3bdfSopenharmony_ci	unsigned long long ull = 1;
108f08c3bdfSopenharmony_ci	long l = 1;
109f08c3bdfSopenharmony_ci
110f08c3bdfSopenharmony_ci	use_val(ul);	/* implicit to nocast from same type: OK? */
111f08c3bdfSopenharmony_ci	use_val(us);
112f08c3bdfSopenharmony_ci	use_val(ull);
113f08c3bdfSopenharmony_ci	use_val(l);
114f08c3bdfSopenharmony_ci}
115f08c3bdfSopenharmony_ci
116f08c3bdfSopenharmony_ci/* implicit cast from nocast */
117f08c3bdfSopenharmony_cistatic unsigned long good_implicit_ret_ul(ulong_nc_t t)
118f08c3bdfSopenharmony_ci{
119f08c3bdfSopenharmony_ci	return t;	/* implicit to nocast from same type: OK? */
120f08c3bdfSopenharmony_ci}
121f08c3bdfSopenharmony_ci
122f08c3bdfSopenharmony_cistatic unsigned short bad_implicit_ret_us(ulong_nc_t t)
123f08c3bdfSopenharmony_ci{
124f08c3bdfSopenharmony_ci	return t;
125f08c3bdfSopenharmony_ci}
126f08c3bdfSopenharmony_ci
127f08c3bdfSopenharmony_cistatic unsigned long long bad_implicit_ret_ull(ulong_nc_t t)
128f08c3bdfSopenharmony_ci{
129f08c3bdfSopenharmony_ci	return t;
130f08c3bdfSopenharmony_ci}
131f08c3bdfSopenharmony_ci
132f08c3bdfSopenharmony_cistatic long bad_implicit_ret_l(ulong_nc_t t)
133f08c3bdfSopenharmony_ci{
134f08c3bdfSopenharmony_ci	return t;
135f08c3bdfSopenharmony_ci}
136f08c3bdfSopenharmony_ci
137f08c3bdfSopenharmony_ci/* FIXME: explicit cast: should we complain? */
138f08c3bdfSopenharmony_cistatic ulong_nc_t good_samecast(ulong_nc_t v)
139f08c3bdfSopenharmony_ci{
140f08c3bdfSopenharmony_ci	return (ulong_nc_t) v;
141f08c3bdfSopenharmony_ci}
142f08c3bdfSopenharmony_ci
143f08c3bdfSopenharmony_cistatic ulong_nc_t bad_tocast(unsigned long v)
144f08c3bdfSopenharmony_ci{
145f08c3bdfSopenharmony_ci	return (ulong_nc_t) v;
146f08c3bdfSopenharmony_ci}
147f08c3bdfSopenharmony_ci
148f08c3bdfSopenharmony_cistatic unsigned long bad_fromcast(ulong_nc_t v)
149f08c3bdfSopenharmony_ci{
150f08c3bdfSopenharmony_ci	return (unsigned long) v;
151f08c3bdfSopenharmony_ci}
152f08c3bdfSopenharmony_ci
153f08c3bdfSopenharmony_cistatic void assign_value(void)
154f08c3bdfSopenharmony_ci{
155f08c3bdfSopenharmony_ci	ulong_nc_t good_assign_self = t;
156f08c3bdfSopenharmony_ci	unsigned long good_assign_sametype = t;
157f08c3bdfSopenharmony_ci}
158f08c3bdfSopenharmony_ci
159f08c3bdfSopenharmony_ci/*
160f08c3bdfSopenharmony_ci * check-name: nocast.c
161f08c3bdfSopenharmony_ci *
162f08c3bdfSopenharmony_ci * check-error-start
163f08c3bdfSopenharmony_cinocast.c:34:33: warning: incorrect type in initializer (different base types)
164f08c3bdfSopenharmony_cinocast.c:34:33:    expected unsigned long [nocast] [usertype] *static [toplevel] bad_ptr_to
165f08c3bdfSopenharmony_cinocast.c:34:33:    got unsigned long
166f08c3bdfSopenharmony_cinocast.c:34:33: warning: implicit cast to nocast type
167f08c3bdfSopenharmony_cinocast.c:35:39: warning: incorrect type in initializer (different modifiers)
168f08c3bdfSopenharmony_cinocast.c:35:39:    expected unsigned long *static [toplevel] bad_ptr_from
169f08c3bdfSopenharmony_cinocast.c:35:39:    got unsigned long [nocast] *
170f08c3bdfSopenharmony_cinocast.c:35:39: warning: implicit cast from nocast type
171f08c3bdfSopenharmony_cinocast.c:50:16: warning: implicit cast from nocast type
172f08c3bdfSopenharmony_cinocast.c:54:16: warning: implicit cast from nocast type
173f08c3bdfSopenharmony_cinocast.c:58:16: warning: implicit cast from nocast type
174f08c3bdfSopenharmony_cinocast.c:65:38: warning: implicit cast from nocast type
175f08c3bdfSopenharmony_cinocast.c:66:22: warning: implicit cast from nocast type
176f08c3bdfSopenharmony_cinocast.c:67:23: warning: implicit cast from nocast type
177f08c3bdfSopenharmony_cinocast.c:74:38: warning: implicit cast from nocast type
178f08c3bdfSopenharmony_cinocast.c:75:22: warning: implicit cast from nocast type
179f08c3bdfSopenharmony_cinocast.c:76:23: warning: implicit cast from nocast type
180f08c3bdfSopenharmony_cinocast.c:82:34: warning: incorrect type in initializer (different modifiers)
181f08c3bdfSopenharmony_cinocast.c:82:34:    expected unsigned long *bad_mod
182f08c3bdfSopenharmony_cinocast.c:82:34:    got unsigned long [nocast] [usertype] *t
183f08c3bdfSopenharmony_cinocast.c:82:34: warning: implicit cast from nocast type
184f08c3bdfSopenharmony_cinocast.c:83:49: warning: incorrect type in initializer (different type sizes)
185f08c3bdfSopenharmony_cinocast.c:83:49:    expected unsigned long long [nocast] *bad_size
186f08c3bdfSopenharmony_cinocast.c:83:49:    got unsigned long [nocast] [usertype] *t
187f08c3bdfSopenharmony_cinocast.c:83:49: warning: implicit cast to/from nocast type
188f08c3bdfSopenharmony_cinocast.c:84:33: warning: incorrect type in initializer (different type sizes)
189f08c3bdfSopenharmony_cinocast.c:84:33:    expected short [nocast] *bad_i
190f08c3bdfSopenharmony_cinocast.c:84:33:    got unsigned long [nocast] [usertype] *t
191f08c3bdfSopenharmony_cinocast.c:84:33: warning: implicit cast to/from nocast type
192f08c3bdfSopenharmony_cinocast.c:85:32: warning: implicit cast to/from nocast type
193f08c3bdfSopenharmony_cinocast.c:98:13: warning: implicit cast to nocast type
194f08c3bdfSopenharmony_cinocast.c:99:13: warning: implicit cast to nocast type
195f08c3bdfSopenharmony_cinocast.c:100:13: warning: implicit cast to nocast type
196f08c3bdfSopenharmony_cinocast.c:111:17: warning: implicit cast to nocast type
197f08c3bdfSopenharmony_cinocast.c:112:17: warning: implicit cast to nocast type
198f08c3bdfSopenharmony_cinocast.c:113:17: warning: implicit cast to nocast type
199f08c3bdfSopenharmony_cinocast.c:124:16: warning: implicit cast from nocast type
200f08c3bdfSopenharmony_cinocast.c:129:16: warning: implicit cast from nocast type
201f08c3bdfSopenharmony_cinocast.c:134:16: warning: implicit cast from nocast type
202f08c3bdfSopenharmony_ci * check-error-end
203f08c3bdfSopenharmony_ci */
204