fix(gen): 移位的工作位宽不计入计数宽度,修 ushort 表达式被抬成 32 位后赋回 ushort 误报窄化

This commit is contained in:
TermiNexus committed 2026-10-12 19:22:36 +08:00
1 parent 4a66aa7fd2
commit 3d638927d5
1 file changed
+4 -1
+4 -1
View File
@@ -1238,7 +1238,10 @@ novirtual class ExprGenOps(ExprGenBase.ExprGenBase):
work_bits: int = 32
if tgt_bits != 0: work_bits = tgt_bits
if lhs_bits > work_bits: work_bits = lhs_bits
if rhs_bits > work_bits: work_bits = rhs_bits
# 移位:**计数宽度不代表结果位宽**,不能计入工作位宽;否则 32 位计数字面量会把
# `s << 1`(s: ushort)抬成 32 位,顺链把整条表达式抬成 32 位、赋回 ushort 时误报窄化。
if op != ast.OpKind.LShift and op != ast.OpKind.RShift:
if rhs_bits > work_bits: work_bits = rhs_bits
# 移位:C 语义只提升**左操作数**到工作位宽(计数的宽度不参与结果类型),避免 `uchar(x) << 8`
# 之类因计数位宽不足而误报「移位数 >= 左操作数位宽」。