From ca5ec70cef8ea849258ce12e576804bbe7d8a0af Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Mon, 12 Oct 2026 21:17:18 +0800 Subject: [PATCH] =?UTF-8?q?docs(wiki):=20Implicit.md=20=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E2=80=94=E2=80=94=E5=A4=8D=E5=90=88=E8=B5=8B=E5=80=BC=E4=B8=8D?= =?UTF-8?q?=E5=86=8D=E5=8D=95=E7=8B=AC=E6=8B=A6=E6=88=AA=E3=80=8C=E5=8F=B3?= =?UTF-8?q?=E5=80=BC=E6=9C=89=E7=AC=A6=E5=8F=B7=20vs=20=E5=B7=A6=E5=80=BC?= =?UTF-8?q?=E6=97=A0=E7=AC=A6=E5=8F=B7=E3=80=8D=EF=BC=88=E5=AF=B9=E9=BD=90?= =?UTF-8?q?=E4=BA=8C=E5=85=83=E5=8F=A3=E5=BE=84=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Implicit.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Implicit.md b/Implicit.md index b68d743..7ab7de8 100644 --- a/Implicit.md +++ b/Implicit.md @@ -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)——同一个语义两种写法不该一错一对。