aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Matz <matz@suse.de>2016-10-04 01:20:33 +0200
committerMichael Matz <matz@suse.de>2016-12-15 17:47:12 +0100
commit3bc9c325c5fa754043986cc70ff2af45c2196c38 (patch)
tree39d667d690aef2b77597d060117b80ccccedcb12
parent0b0e64c2c95487815a8d252ab833e5eccfb5aeb5 (diff)
downloadtinycc-3bc9c325c5fa754043986cc70ff2af45c2196c38.tar.gz
tinycc-3bc9c325c5fa754043986cc70ff2af45c2196c38.tar.bz2
Fix const folding of 64bit pointer constants
See testcase.
-rw-r--r--tccgen.c4
-rw-r--r--tests/tcctest.c6
2 files changed, 8 insertions, 2 deletions
diff --git a/tccgen.c b/tccgen.c
index 79ec789..f7b7c2d 100644
--- a/tccgen.c
+++ b/tccgen.c
@@ -1659,10 +1659,10 @@ static void gen_opic(int op)
uint64_t l2 = c2 ? v2->c.i : 0;
int shm = (t1 == VT_LLONG) ? 63 : 31;
- if (t1 != VT_LLONG)
+ if (t1 != VT_LLONG && (PTR_SIZE != 8 || t1 != VT_PTR))
l1 = ((uint32_t)l1 |
(v1->type.t & VT_UNSIGNED ? 0 : -(l1 & 0x80000000)));
- if (t2 != VT_LLONG)
+ if (t2 != VT_LLONG && (PTR_SIZE != 8 || t2 != VT_PTR))
l2 = ((uint32_t)l2 |
(v2->type.t & VT_UNSIGNED ? 0 : -(l2 & 0x80000000)));
diff --git a/tests/tcctest.c b/tests/tcctest.c
index 22d9e88..5190523 100644
--- a/tests/tcctest.c
+++ b/tests/tcctest.c
@@ -946,6 +946,12 @@ void expr_ptr_test()
j = -1;
printf("%d\n", sp[j].i);
}
+#ifdef __LP64__
+ i = 1;
+ p = (int*)0x100000000UL + i;
+ i = ((long)p) >> 32;
+ printf("largeptr: %p %d\n", p, i);
+#endif
}
void expr_cmp_test()