aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tccgen.c12
-rw-r--r--tests/tcctest.c8
2 files changed, 15 insertions, 5 deletions
diff --git a/tccgen.c b/tccgen.c
index 7d7cafc..fecaedf 100644
--- a/tccgen.c
+++ b/tccgen.c
@@ -1883,12 +1883,14 @@ static void gen_cast(CType *type)
}
#else
} else if ((dbt & VT_BTYPE) == VT_LLONG ||
- (dbt & VT_BTYPE) == VT_PTR) {
- /* XXX: not sure if this is perfect... need more tests */
- if ((sbt & VT_BTYPE) != VT_LLONG) {
+ (dbt & VT_BTYPE) == VT_PTR ||
+ (dbt & VT_BTYPE) == VT_FUNC) {
+ 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);
- if (sbt != (VT_INT | VT_UNSIGNED) &&
- sbt != VT_PTR && sbt != VT_FUNC) {
+ if (sbt != (VT_INT | VT_UNSIGNED)) {
/* x86_64 specific: movslq */
o(0x6348);
o(0xc0 + (REG_VALUE(r) << 3) + REG_VALUE(r));
diff --git a/tests/tcctest.c b/tests/tcctest.c
index 7236971..916db09 100644
--- a/tests/tcctest.c
+++ b/tests/tcctest.c
@@ -1094,6 +1094,14 @@ void struct_assign_test(void)
printf("before call: %d %d\n", lsta2.f1, lsta2.f2);
lsta2 = struct_assign_test2(lsta2, 4);
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 */