Make sizeof() be of type size_t
This matters when sizeof is directly used in arithmetic, ala "uintptr_t t; t &= -sizeof(long)" (for alignment). When sizeof isn't size_t (as it's specified to be) this masking will truncate the high bits of the uintptr_t object (if uintptr_t is larger than uint).
This commit is contained in:
17
tccgen.c
17
tccgen.c
@ -64,7 +64,7 @@ ST_DATA int func_vc;
|
||||
ST_DATA int last_line_num, last_ind, func_ind; /* debug last line number and pc */
|
||||
ST_DATA char *funcname;
|
||||
|
||||
ST_DATA CType char_pointer_type, func_old_type, int_type;
|
||||
ST_DATA CType char_pointer_type, func_old_type, int_type, size_type;
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
static void gen_cast(CType *type);
|
||||
@ -325,6 +325,17 @@ ST_FUNC void vpushi(int v)
|
||||
vsetc(&int_type, VT_CONST, &cval);
|
||||
}
|
||||
|
||||
/* push a pointer sized constant */
|
||||
static void vpushs(long long v)
|
||||
{
|
||||
CValue cval;
|
||||
if (PTR_SIZE == 4)
|
||||
cval.i = (int)v;
|
||||
else
|
||||
cval.ull = v;
|
||||
vsetc(&size_type, VT_CONST, &cval);
|
||||
}
|
||||
|
||||
/* push long long constant */
|
||||
static void vpushll(long long v)
|
||||
{
|
||||
@ -3575,12 +3586,12 @@ ST_FUNC void unary(void)
|
||||
if (!(type.t & VT_VLA)) {
|
||||
if (size < 0)
|
||||
tcc_error("sizeof applied to an incomplete type");
|
||||
vpushi(size);
|
||||
vpushs(size);
|
||||
} else {
|
||||
vla_runtime_type_size(&type, &align);
|
||||
}
|
||||
} else {
|
||||
vpushi(align);
|
||||
vpushs(align);
|
||||
}
|
||||
vtop->type.t |= VT_UNSIGNED;
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user