docs(wiki): Implicit.md 同步——复合赋值不再单独拦截「右值有符号 vs 左值无符号」(对齐二元口径)
This commit is contained in:
1 parent
603831c3f6
commit
ca5ec70cef
1 file changed
+6
-2
+6
-2
@@ -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)——同一个语义两种写法不该一错一对。
|
||||
Reference in new issue
Block a user