mirror of
https://github.com/frida/tinycc
synced 2024-11-24 08:39:37 +03:00
Fix conversion in a?0:ptr.
(cond ? 0 : ptr)->member wasn't handled correctly. If one arm is a null pointer constant (which also can be a pointer) the result type is that of the other arm.
This commit is contained in:
parent
f98c2306a0
commit
6471ec0a2b
19
tccgen.c
19
tccgen.c
@ -1489,7 +1489,8 @@ static inline int is_null_pointer(SValue *p)
|
||||
if ((p->r & (VT_VALMASK | VT_LVAL | VT_SYM)) != VT_CONST)
|
||||
return 0;
|
||||
return ((p->type.t & VT_BTYPE) == VT_INT && p->c.i == 0) ||
|
||||
((p->type.t & VT_BTYPE) == VT_LLONG && p->c.ll == 0);
|
||||
((p->type.t & VT_BTYPE) == VT_LLONG && p->c.ll == 0) ||
|
||||
((p->type.t & VT_BTYPE) == VT_PTR && p->c.ptr == 0);
|
||||
}
|
||||
|
||||
static inline int is_integer_btype(int bt)
|
||||
@ -4116,14 +4117,22 @@ static void expr_cond(void)
|
||||
(t2 & (VT_BTYPE | VT_UNSIGNED)) == (VT_LLONG | VT_UNSIGNED))
|
||||
type.t |= VT_UNSIGNED;
|
||||
} else if (bt1 == VT_PTR || bt2 == VT_PTR) {
|
||||
/* XXX: test pointer compatibility */
|
||||
type = type1;
|
||||
/* If one is a null ptr constant the result type
|
||||
is the other. */
|
||||
if (is_null_pointer (vtop))
|
||||
type = type1;
|
||||
else if (is_null_pointer (&sv))
|
||||
type = type2;
|
||||
/* XXX: test pointer compatibility, C99 has more elaborate
|
||||
rules here. */
|
||||
else
|
||||
type = type1;
|
||||
} else if (bt1 == VT_FUNC || bt2 == VT_FUNC) {
|
||||
/* XXX: test function pointer compatibility */
|
||||
type = type1;
|
||||
type = bt1 == VT_FUNC ? type1 : type2;
|
||||
} else if (bt1 == VT_STRUCT || bt2 == VT_STRUCT) {
|
||||
/* XXX: test structure compatibility */
|
||||
type = type1;
|
||||
type = bt1 == VT_STRUCT ? type1 : type2;
|
||||
} else if (bt1 == VT_VOID || bt2 == VT_VOID) {
|
||||
/* NOTE: as an extension, we accept void on only one side */
|
||||
type.t = VT_VOID;
|
||||
|
@ -2486,3 +2486,16 @@ void const_warn_test(void)
|
||||
{
|
||||
const_func(1);
|
||||
}
|
||||
|
||||
struct condstruct {
|
||||
int i;
|
||||
};
|
||||
|
||||
int getme (struct condstruct *s, int i)
|
||||
{
|
||||
int i1 = (i == 0 ? 0 : s)->i;
|
||||
int i2 = (i == 0 ? s : 0)->i;
|
||||
int i3 = (i == 0 ? (void*)0 : s)->i;
|
||||
int i4 = (i == 0 ? s : (void*)0)->i;
|
||||
return i1 + i2 + i3 + i4;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user