Skip to content

fix(批8 D 类): @typeInfo 返回型 TI_INT(placeholder) → TI_STR(声明与产物一致的收口) - #140

Merged
dslsdzc merged 1 commit into
developfrom
feature/b8-typeinfo-return-type
Sep 19, 2026
Merged

dslsdzc merged 1 commit into
developfrom
feature/b8-typeinfo-return-type

Conversation

@dslsdzc

@dslsdzc dslsdzc commented Sep 18, 2026

Copy link
Copy Markdown
Owner

本 PR = D 类(@typeInfo 返回型)真缺陷修复src/compiler/checker.cr +5/−1)

基线(口径更正后):本 PR 的所有取数与判据锚 = 现查现用的 commit id f4165cbf7e29320c6f6fb1a0cb310efe9932c78d(= 当时的 develop@origin,不再以 bookmark 名当锚)。
可信度复核:D/E/F 侦察时基线为 c2551307c2551307..f4165cbf 区间对本 PR 引用过的 8 档 改动 = 0 档 ⇒ 引用未失效(已机械核)。

根因(真缺陷)

checker.cr 的 EXPR_AT @typeInfo 分支恒 return TI_INT;原注释自承 placeholder — returns handle),
ir_gen.cr 的同名分支把值构造成类型名串TYP_NAMED ⇒ 名字;标量 ⇒ "int"/"bool"/…
checker 说 int、产物是 string契约出处 = TODO.md@ 内建清单「@typeInfo(T)类型名称字符串
有文档契约背书 ⇒ 不是设计未定,是 checker 未按契约落实
4 点(两载体档各 2 点,形状恒 p=3(TI_STR 形参) vs a=0(TI_INT 实参)):
tests/suite/at_test_struct.crstr_len(ti) ×2)· tools/cir-str-domain/probes/scope_typeinfo.crprintln(@typeInfo(…)) ×2)。

修法

该分支返回型 → TI_STR(+ 注释写明契约出处)。不动 ir_gen 发射面(产物本就是串)。

影响面枚举(改前实测)

实际调用点只有上述 2 档 4 处checker.cr/ir_gen.cr 的命中 = 实现本身(非调用);
src/lsp/analysis.cr = 补全候选字符串字面量编译器自源里零 @typeInfo(...) 调用点
⇒ 该返回型变更不改变编译器自身行为;其余仅文档提及。

📌 两份开发者文档的判别结论(判为「未实现的设计」⇒ 本 PR 不改

docs/developer/at-intrinsics.mddocs/developer/syntax.md@typeInfo 写作「返回类型的完整结构」,
TODO.md/ir_gen 的「名称字符串」不符。按本仓固定动作先判别「陈旧文档」还是「未实现的设计」

判别取证(在 pin f4165cbf… 上实读)——命中「有设计稿」支

出处 逐字
docs/superpowers/specs/2026-07-28-at-intrinsics-design.md @typeInfo(T) | IR_CONST dest, type_info_ni | 编译期构造结构体」(设计表)
同上 「需要定义新类型 TY_FIELDINFOTY_TYPEINFO 用于 @field/@typeInfo 的返回类型」
同上 「// TypeInfo 结构体@typeInfo(T) 的返回类型 | TY_TYPEINFO : int = ...; // struct { name: string, size: int, align: int, fields: []FieldInfo }
同上 「具体实现方案:在 checker/ir_gen 中使用编译期已知的 struct layout 来构造返回值」
docs/superpowers/plans/2026-07-28-at-intrinsics.md // @typeInfo(T): build type info struct

设计稿明文要求返回 TypeInfo 结构体 ⇒ 那两份开发者文档记的是未实现的设计(aspirational)不是陈旧文档
按裁定:不许改,只登记「文档描述的设计未实现」(另立条;与 D 的修复分离)。
附带的契约并存事实(登记用)TODO.md 的「名称字符串」与 07-28 设计稿的「结构体」是两套说法
本 PR 只把 checker 对齐到「已实现 + TODO 已写」的那一套(名称字符串)不触碰设计稿那一套。

判据(两向 + 防误杀)

内容 结果
正向 4 点归零:两载体档 check rc=0 · error[]=0 · 台账 0 行(修前 2+2)
活性自证 + 同档对照 同档注入变量实参的已知会响调用 ⇒ 命中 1 行 = 注入点本身;同一次运行里该档 @typeInfo 用法已归零、注入点仍报 ⇒ 归零 ≠ 打点被关
反向钉 与上同一次:string 形参 ← int 变量 异型仍被记未用字面量,skip 规则会吞)
防误杀钉 正常用法 str_len(@typeInfo(Q)) + println(@typeInfo(Q))rc=0 · 0 诊断 · 0 点

全量层

check rc=0 · bootstrap-tests rc=0 · suite rc=0 · selfhost-tests rc=0 · full-bootstrap rc=0
(⚠ full-bootstrap 于 04:14–04:24:40 完成,其判定 = cmp /tmp/corec2 /tmp/corec3 通过;/tmp/corec2/corec3最后写入时刻为 04:27:46 / 04:30:15 = 本腿结束之后,与「无并发」一致——但 mtime 不能排除更早的重叠,故该腿读数按待隔离复跑对待,见下)。

canary(红线——未触碰)

5/5 PASS,且逐条与锁定值逐字节相同canary_elf f1137275… · pa_ccr f06bf45b… · pa_static_ccr 76df0adf… ·
gt_ccr edfd8e98… · gt_static_ccr bbfe4789…(28854 / 96945 / 97088 / 143687 / 143830 全等)
canary 面零变化 ⇒ 无需重锁;D1 确定性闸门 5 条全 PASS。

【根因(D 类 4 点,只读侦察已定性为**真缺陷**)】`checker.cr` 的 EXPR_AT `@typeInfo` 分支恒 `return TI_INT;`
(原注释自承 `placeholder — returns handle`),而 `ir_gen.cr` 的同名分支把值构造成**类型名串**
(`TYP_NAMED` ⇒ 名字;标量 ⇒ `"int"/"bool"/"dex"/"string"/"char"/"unit"`)⇒ **checker 说 int、产物是 string**。
契约出处 = `TODO.md` 的 `@` 内建清单「`@typeInfo(T)` — 类型名称字符串」⇒ 实现与契约不一致(非设计未定)。
4 点 = 两载体档各 2 点,形状恒 `p=3 (TI_STR 形参) vs a=0 (TI_INT 实参)`:
`tests/suite/at_test_struct.cr`(`str_len(ti)` ×2)· `tools/cir-str-domain/probes/scope_typeinfo.cr`(`println(@typeinfo(…))` ×2)。

【修法】该分支返回型 → `TI_STR`(1 处 + 注释说明契约出处)。**不动** `ir_gen` 的发射面(产物本就是串)。

【影响面枚举(改前实测,全仓 `@typeInfo` 逐档)】实际**调用点只有上述 2 档 4 处**;
`src/compiler/checker.cr` / `src/compiler/ir_gen.cr` = **实现本身**(非调用);`src/lsp/analysis.cr` = 补全候选**字符串字面量**。
⇒ **编译器自源里零 `@typeInfo(...)` 调用点** ⇒ 该返回型变更**不改变编译器自身行为**;其余为文档提及(非消费者)。

【判据(两向 + 防误杀)】
- **正向**:4 点**归零** ✓ —— 两载体档 `check rc=0` · `error[]=0` · **台账 0 行**(修前 2+2);
- **活性自证**(读 0 前必做):同档注入**变量实参**的已知会响调用 ⇒ 两档均命中 **1 行 = 注入点本身**(`9917 … 0 3 0 _lp`)
  ⇒ 「0 行」是真读数,不是打点没装;
- **反向钉**(与活性自证同一次):注入的 `string 形参 ← int 变量` 异型**仍被记** ✓(**未用字面量**——skip 规则会吞);
- **防误杀钉**:正常用法 `str_len(@typeinfo(Q))` + `println(@typeinfo(Q))` ⇒ `check rc=0` · 0 诊断 · 0 点 ✓。

【全量层(五档,本地 `CI_JOB_NAME=… bash src/ci/run.sh`,sequential)】`check` **rc=0** · `bootstrap-tests` **rc=0** ·
`suite` **rc=0** · `selfhost-tests` **rc=0** · `full-bootstrap` **rc=0**。
【canary(红线)】**5/5 PASS 且逐条与锁定值逐字节相同**(`canary_elf f1137275…` · `pa_ccr f06bf45b…` ·
`pa_static_ccr 76df0adf…` · `gt_ccr edfd8e98…` · `gt_static_ccr bbfe4789…`,尺寸 28854/96945/97088/143687/143830 全等)
⇒ **canary 面零变化 ⇒ 未触碰红线、无需重锁**;D1 确定性闸门 5 条全 PASS(两次构建逐字节相同)。

【基线】改前 `develop@origin` = `f4165cbf`;推送前复查仍 = `f4165cbf`(未移动)⇒ **无需 rebase**,上述五档读数对本基点有效。
@dslsdzc
dslsdzc force-pushed the feature/b8-typeinfo-return-type branch from 5dccc56 to b6bb7f4 Compare September 19, 2026 13:00
@dslsdzc
dslsdzc merged commit 1ea9c47 into develop Sep 19, 2026
4 checks passed
@dslsdzc
dslsdzc deleted the feature/b8-typeinfo-return-type branch September 19, 2026 13:03
dslsdzc added a commit that referenced this pull request Sep 19, 2026
**性质 = 更正,不是状态变更**(team-lead 2026-09-19 裁定):
`-8` 的 D 行原写「**显式排除 + 登记**」,而 lead 给两侧的裁定原文都是「**D —— 真缺陷 ⇒ 修**」
⇒ **抄录时把处置写反了,且已进 develop**。本条目自始定性 = 真缺陷 ⇒ 修。

**只增不删**两处:
  ① **D 行后紧跟**插入〔2026-09-19 留痕更正〕行(5 列表格行,保持表结构):写明与裁定相反、
     已由 PR #140(`1ea9c47e`)修为 `@typeInfo` 返回型 `TI_INT` → `TI_STR`、原处置作废;
  ② **口径行**补现值:真面 **63 → 61**(E-skip 落环,PR #142 / `c1044645`)→ **57**(D 修复,PR #140 / `1ea9c47e`);
     现类分解 = A 49 · B 2 · C 4 · D 0(已修)· E 0(已排除)· F 2 = 57;两个 project 单元仍 0 / 6。

**证据两条写进更正行**:① lead 对 #140 的合前核验(单档 +5/−1 · 链根父 · 区间内容等价核);
② **本代理的独立读数**(`at_test_struct.cr` / `scope_typeinfo.cr` 各 2 → 0,只用台账面、未改任何代码)
—— 与 #140 自己的判据互补。

判据:tests/harness/test_todo_id_migration.py 6/6。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant