aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tcc.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/tcc.c b/tcc.c
index fdac44c..f6e3bab 100644
--- a/tcc.c
+++ b/tcc.c
@@ -5764,6 +5764,10 @@ void force_charshort_cast(int t)
bits = 32 - bits;
vpushi(bits);
gen_op(TOK_SHL);
+ /* result must be signed or the SAR is converted to an SHL
+ This was not the case when "t" was a signed short
+ and the last value on the stack was an unsigned int */
+ vtop->type.t &= ~VT_UNSIGNED;
vpushi(bits);
gen_op(TOK_SAR);
}