aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tcc.c2
-rw-r--r--tcctest.c10
2 files changed, 11 insertions, 1 deletions
diff --git a/tcc.c b/tcc.c
index ec5a47d..1b0db21 100644
--- a/tcc.c
+++ b/tcc.c
@@ -6228,7 +6228,7 @@ static void gen_cast(CType *type)
vpop();
#else
int r = gv(RC_INT);
- if (sbt != (VT_INT | VT_UNSIGNED)) {
+ if (sbt != (VT_INT | VT_UNSIGNED) && sbt != VT_PTR) {
/* x86_64 specific: movslq */
o(0x6348);
o(0xc0 + (REG_VALUE(r) << 3) + REG_VALUE(r));
diff --git a/tcctest.c b/tcctest.c
index be47c90..8ef322e 100644
--- a/tcctest.c
+++ b/tcctest.c
@@ -1109,6 +1109,8 @@ void cast_test()
char tab[10];
unsigned b,d;
short s;
+ char *p = NULL;
+ p -= 0x700000000042;
printf("cast_test:\n");
a = 0xfffff;
@@ -1150,6 +1152,14 @@ void cast_test()
printf("sizeof(+(char)'a') = %d\n", sizeof(+(char)'a'));
printf("sizeof(-(char)'a') = %d\n", sizeof(-(char)'a'));
printf("sizeof(~(char)'a') = %d\n", sizeof(-(char)'a'));
+
+ /* from pointer to integer types */
+ printf("%d %d %d %d %d %d %ld %ld %lld %lld\n",
+ (char)p, (unsigned char)p,
+ (short)p, (unsigned short)p,
+ (int)p, (unsigned int)p,
+ (long)p, (unsigned long)p,
+ (long long)p, (unsigned long long)p);
}
/* initializers tests */