docs(wiki): Implicit.md 同步——复合赋值不再单独拦截「右值有符号 vs 左值无符号」(对齐二元口径)

This commit is contained in:
TermiNexus committed 2026-10-12 21:17:18 +08:00
1 parent 603831c3f6
commit ca5ec70cef
1 file changed
+6 -2
+6 -2
View File
@@ -106,8 +106,9 @@
- `y` 的**有效宽度必须 ≤ `x` 的宽度**(变量按 LLVM 类型宽度;常量按 `W_min`)。
否则报 `augmented assignment operand too wide`,须显式收窄右值(如 `BYTE(...)` / `uint8(...)`)。
- 例:`u8 += 1` 合法;`u8 += 300` 报错;`buf[i] |= BYTE(UINT(1) << bit_pos)` 合法。
- **禁止 `y` 显式有符号而 `x` 无符号**(符号扩展会把负值变成巨大无符号值)。
- **移位(`<<=` / `>>=`)豁免**上述两条:计数不是写回目标的值,改为静态范围检查。
- **移位(`<<=` / `>>=`)豁免**:计数不是写回目标的值,改为静态范围检查。
- 右值显式有符号而左值无符号**不单独拦截**:拓宽方向由 §1.1 统一决定(i 类 `sext`、u 类 `zext`),
与二元形态 `x = x op y` 口径一致(如 `sizet += int` 里 `int` 先拓宽到 u64 再相加)。
---
@@ -125,3 +126,6 @@
- 动机:`ncomp: uint16 = ~n`(`n: uint16`)此前会被提升成 i32,再赋回 `uint16` 触发「隐式窄化禁止」误报;
现在 u 类保持原位宽,位图/掩码写法能同宽运算,同时 i 类仍提升到 i32 守住有符号负数陷阱。
- 配套:`-x` 的 `0`、`~x` 的 `-1` 常量改为按**当前**操作数位宽物化(否则会出现 `xor i16, i32` 这类非法 IR)。
- **2026-10-12:复合赋值取消「右值有符号而左值无符号」的单独拦截**(见 §6)。
- 动机:`pos: sizet; pos += match_len`(`match_len: int`)此前被拦,而等价的 `pos = pos + match_len`
本就允许(`match_len` 在二元路径里拓宽到 u64)——同一个语义两种写法不该一错一对。