fix(批8 D 类): @typeInfo 返回型 TI_INT(placeholder) → TI_STR(声明与产物一致的收口) - #140
Merged
Merged
Conversation
【根因(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
force-pushed
the
feature/b8-typeinfo-return-type
branch
from
September 19, 2026 13:00
5dccc56 to
b6bb7f4
Compare
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。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
本 PR = D 类(
@typeInfo返回型)真缺陷修复(src/compiler/checker.cr+5/−1)根因(真缺陷)
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 形参) vsa=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(+ 注释写明契约出处)。不动ir_gen发射面(产物本就是串)。影响面枚举(改前实测)
实际调用点只有上述 2 档 4 处;
checker.cr/ir_gen.cr的命中 = 实现本身(非调用);src/lsp/analysis.cr= 补全候选字符串字面量 ⇒ 编译器自源里零@typeInfo(...)调用点⇒ 该返回型变更不改变编译器自身行为;其余仅文档提及。
📌 两份开发者文档的判别结论(判为「未实现的设计」⇒ 本 PR 不改)
docs/developer/at-intrinsics.md与docs/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_FIELDINFO和TY_TYPEINFO用于@field/@typeInfo的返回类型」@typeInfo(T)的返回类型 |TY_TYPEINFO : int = ...; // struct { name: string, size: int, align: int, fields: []FieldInfo }」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 已写」的那一套(名称字符串),不触碰设计稿那一套。
判据(两向 + 防误杀)
check rc=0·error[]=0· 台账 0 行(修前 2+2)@typeInfo用法已归零、注入点仍报 ⇒ 归零 ≠ 打点被关string 形参 ← int 变量异型仍被记(未用字面量,skip 规则会吞)str_len(@typeInfo(Q))+println(@typeInfo(Q))⇒rc=0· 0 诊断 · 0 点全量层
checkrc=0 ·bootstrap-testsrc=0 ·suiterc=0 ·selfhost-testsrc=0 ·full-bootstraprc=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。