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