From 3bc9c325c5fa754043986cc70ff2af45c2196c38 Mon Sep 17 00:00:00 2001 From: Michael Matz Date: Tue, 4 Oct 2016 01:20:33 +0200 Subject: [PATCH] Fix const folding of 64bit pointer constants See testcase. --- tccgen.c | 4 ++-- tests/tcctest.c | 6 ++++++ 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()