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 */