mirror of
https://github.com/mirror/tinycc.git
synced 2024-12-28 04:00:06 +08:00
Fix casts from 32bit integer types to 64bit integer types.
This bug was reported in http://lists.gnu.org/archive/html/tinycc-devel/2010-08/msg00050.html In this case, we should not emit any code when we cast from VT_FUNC to VT_PTR.
This commit is contained in:
parent
9d347f8742
commit
c31dc7aa0c
12
tccgen.c
12
tccgen.c
@ -1883,12 +1883,14 @@ static void gen_cast(CType *type)
|
|||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
} else if ((dbt & VT_BTYPE) == VT_LLONG ||
|
} else if ((dbt & VT_BTYPE) == VT_LLONG ||
|
||||||
(dbt & VT_BTYPE) == VT_PTR) {
|
(dbt & VT_BTYPE) == VT_PTR ||
|
||||||
/* XXX: not sure if this is perfect... need more tests */
|
(dbt & VT_BTYPE) == VT_FUNC) {
|
||||||
if ((sbt & VT_BTYPE) != VT_LLONG) {
|
if ((sbt & VT_BTYPE) != VT_LLONG &&
|
||||||
|
(sbt & VT_BTYPE) != VT_PTR &&
|
||||||
|
(sbt & VT_BTYPE) != VT_FUNC) {
|
||||||
|
/* need to convert from 32bit to 64bit */
|
||||||
int r = gv(RC_INT);
|
int r = gv(RC_INT);
|
||||||
if (sbt != (VT_INT | VT_UNSIGNED) &&
|
if (sbt != (VT_INT | VT_UNSIGNED)) {
|
||||||
sbt != VT_PTR && sbt != VT_FUNC) {
|
|
||||||
/* x86_64 specific: movslq */
|
/* x86_64 specific: movslq */
|
||||||
o(0x6348);
|
o(0x6348);
|
||||||
o(0xc0 + (REG_VALUE(r) << 3) + REG_VALUE(r));
|
o(0xc0 + (REG_VALUE(r) << 3) + REG_VALUE(r));
|
||||||
|
@ -1094,6 +1094,14 @@ void struct_assign_test(void)
|
|||||||
printf("before call: %d %d\n", lsta2.f1, lsta2.f2);
|
printf("before call: %d %d\n", lsta2.f1, lsta2.f2);
|
||||||
lsta2 = struct_assign_test2(lsta2, 4);
|
lsta2 = struct_assign_test2(lsta2, 4);
|
||||||
printf("after call: %d %d\n", lsta2.f1, lsta2.f2);
|
printf("after call: %d %d\n", lsta2.f1, lsta2.f2);
|
||||||
|
|
||||||
|
static struct {
|
||||||
|
void (*elem)();
|
||||||
|
} t[] = {
|
||||||
|
/* XXX: we should allow this even without braces */
|
||||||
|
{ struct_assign_test }
|
||||||
|
};
|
||||||
|
printf("%d\n", struct_assign_test == t[0].elem);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* casts to short/char */
|
/* casts to short/char */
|
||||||
|
Loading…
Reference in New Issue
Block a user