两处结构体字段**存在、被填、但没有任何消费方**。都是既有的,#414 review 时撞见, 当时没顺手清理 —— 删公开结构体字段不该混进一个修缺陷的 PR。 ## 1. `CompileFlags::contractByRole` 只写不读 `src/build/flags.cppm`: ``` :62 std::array<mcpp::build::dist::Contract, kRoleCount> contractByRole{}; :862 f.contractByRole[i] = r.effective; ← 唯一一次出现,是写 ``` 全仓再无读取点(`grep -rn 'contractByRole' src/ tests/` 只有这两行)。 它记录的是"每个角色实际拿到的契约(降级之后)",是个**有价值的观测量** —— 所以 这里有两条路,不是只能删: - **删掉**,等真有消费方时再加回来;或 - **接出去**:写进 `resolution.json`,让 `mcpp why` / `doctor` 能回答"这个产物到底 是不是 self-contained"。目前用户只能靠 `readelf` 自己看。 倾向后者 —— #414 之后共享库的契约按格式分档,"我这个 `.so` 到底拿到了哪一档"是个 用户会真的问的问题。 ## 2. `TargetEntry::cxxRuntimeTests` 既不解析也不生效 `src/manifest/types.cppm:622` 声明了它,但: - `src/manifest/toml.cppm:1358` 的 `[target.<triple>]` 解析**只读 `cxx_runtime`** (标量),从不读 `cxx_runtime_tests` / 表形式 - `src/build/prepare.cppm:1472-1473` 应用时也**只应用 `cxxRuntime`** 即:写在 manifest 里的 per-target tests 契约不会有任何效果,而字段的存在让人以为可以。 注:#414 给 `[build].cxx_runtime` 加 `shared` 键时**刻意没有**往 `TargetEntry` 里 再塞一个同样的死字段;per-target 通道目前只支持标量拼写,而标量已经覆盖所有角色 (它会成为 project-wide explicit)。 建议:删掉 `TargetEntry::cxxRuntimeTests`,或把 `[target.<triple>].cxx_runtime` 的表形式解析补全(与 `[build].cxx_runtime` 对齐,含 `default`/`tests`/`shared`)。 两者都行,**当前状态不行** —— 一个不生效的配置项比没有更糟。 ## 判据 - 要么该字段有真实消费方并被测试覆盖 - 要么它不存在 ## 背景 - 撞见于 #414 的 review
Activity
docs: 七个 issue(#412 #415 #416 #417 #418 #421 #422)的逐条核实与修复方案
fix(msvc,manifest,docs): #421-A #412-1 #412-2 #422 #418; bump to 2026…
feat(bench): cross-platform benchmark suite, and the defects it expos…
speak-agent commentedon Aug 31, 2026
两条都已处理,随 2026.8.15.1(commit
c459cf2)发布 —— 关闭得晚了,补记在此。判据是 issue 自己写的那两行:「要么该字段有真实消费方并被测试覆盖,要么它不存在」。两条各按 issue 倾向的方案落地,不是统一删掉。
1.
CompileFlags::contractByRole—— 接出去写进
resolution.json的runtime.cxx_runtime_by_role(src/build/prepare.cppm:9694起)。记的是降级之后的解析值,因为「请求被降级了」正是值得被看见的那一格。另有第二个消费方src/pack/pipeline.cppm:167。理由与 issue 一致:#414 之后共享库角色可以合法地落在与旁边的可执行文件不同的档位上,「我这个
.so到底拿到了哪一档」是用户会问的问题,而在此之前唯一的答案是自己跑readelf去推。2.
TargetEntry::cxxRuntimeTests—— 删已删除。
modules/manifest/src/types.cppm:826留了一句说明,写清楚这里没有 per-role 字段以及为什么:per-target 通道只承载标量契约,[build].cxx_runtime的表形式已经覆盖角色拆分。顺带补上了这条 issue 没有要求、但让删除成立所必需的一半:
[target.<triple>]此前没有任何未知键检查,所以删掉字段之后写cxx_runtime_tests仍然会被静默吞掉 —— 那是同一个缺陷换了个位置。现在它被报出来,单测在tests/unit/test_manifest.cpp:3679。实施时确认过 issue 提醒的那一点:
cxxRuntimeTests这个名字下有两个字段,BuildConfig::cxxRuntimeTests是活的(toml.cppm解析、flags.cppm读),没有被误删。fix(scanner, manifest, build): one answer per question, and no key th…