TermiNexus
aaf9330b3b
fix(tpc): 负数常量与负值整型加宽改为保符号,sext 与常量折叠,不再零扩展
根因:多处手写 zext 做整型加宽,把有符号为负的常量当无符号处理。涉及 HandlesAnnAssign 局部标量初始化两处、HandlesExprCall 的 typedef 与 builtins 强转两处。
一元负号对常量无条件发运行期 neg,常量 -1 变成 neg i32 指令后再被零扩展成 4294967295。
_eval_global_const 用无符号读回值取负,-196608 被物化成 4294770688 即 0x00000000FFFD0000。
现场:b 为 int64 等于 -196608 后,b 右移 1 呈逻辑右移假象,负数右移循环不收敛,见 IntWidthTest Test 5 与 Test 6。
改法:统一收敛到 _coerce_value,加宽用 sext,窄化按其规则 fail-fast;一元负号对常量直接折叠为有符号常量;_eval_global_const 先按位宽还原带符号真值。
另修右移符号性:去掉 emit_binary_op 里按 self._last_var_name 的残留变量名重判,调用方改按 _check_node_unsigned 判定。
验收:Test/IntWidthTest 10 项全 PASS,此前 TPC 侧 5 项通过 2 项失败。
2026-10-14 20:49:35 +08:00
..
2026-08-21 12:36:00 +08:00
2026-10-14 20:49:35 +08:00
2026-10-07 19:03:29 +08:00
2026-10-12 20:59:39 +08:00
2026-10-02 22:40:04 +08:00
2026-10-12 15:06:48 +08:00
2026-10-12 15:06:48 +08:00
2026-10-02 23:15:42 +08:00
2026-10-12 15:06:48 +08:00
2026-08-17 09:36:38 +08:00
2026-10-12 20:59:39 +08:00
2026-09-30 23:47:36 +08:00
2026-10-12 15:06:48 +08:00
2026-10-12 15:06:48 +08:00
2026-10-14 20:49:35 +08:00
2026-10-12 15:06:48 +08:00
2026-10-03 00:39:53 +08:00
2026-10-14 20:49:35 +08:00
2026-10-12 15:06:48 +08:00
2026-10-02 23:15:42 +08:00
2026-10-12 15:06:48 +08:00
2026-10-07 19:09:59 +08:00
2026-10-12 15:06:48 +08:00
2026-10-03 00:18:54 +08:00
2026-08-17 09:36:38 +08:00
2026-10-08 12:10:24 +08:00
2026-10-07 19:09:59 +08:00
2026-08-17 09:36:38 +08:00
2026-10-12 15:06:48 +08:00
2026-10-03 00:39:53 +08:00
2026-09-26 19:27:22 +08:00