Skip to content

两处只写不读/不生效的死字段:CompileFlags::contractByRole 与 TargetEntry::cxxRuntimeTests #418

Description

@speak-agent

两处结构体字段存在、被填、但没有任何消费方。都是既有的,#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_runtimeshared 键时刻意没有TargetEntry
再塞一个同样的死字段;per-target 通道目前只支持标量拼写,而标量已经覆盖所有角色
(它会成为 project-wide explicit)。

建议:删掉 TargetEntry::cxxRuntimeTests,或把 [target.<triple>].cxx_runtime
的表形式解析补全(与 [build].cxx_runtime 对齐,含 default/tests/shared)。
两者都行,当前状态不行 —— 一个不生效的配置项比没有更糟。

判据

  • 要么该字段有真实消费方并被测试覆盖
  • 要么它不存在

背景

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions