diff --git a/App/lib/core/Gen/Expr/ExprGenOps.vp b/App/lib/core/Gen/Expr/ExprGenOps.vp index 5ef9856..eaf5315 100644 --- a/App/lib/core/Gen/Expr/ExprGenOps.vp +++ b/App/lib/core/Gen/Expr/ExprGenOps.vp @@ -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` # 之类因计数位宽不足而误报「移位数 >= 左操作数位宽」。