fix(gen): 移位的工作位宽不计入计数宽度,修 ushort 表达式被抬成 32 位后赋回 ushort 误报窄化
This commit is contained in:
1 parent
4a66aa7fd2
commit
3d638927d5
1 file changed
+4
-1
@@ -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`
|
||||
# 之类因计数位宽不足而误报「移位数 >= 左操作数位宽」。
|
||||
|
||||
Reference in new issue
Block a user