Skip to content

Commit 1916a5f

Browse files
committed
fix: explain the 32-bit MSVC coroutine failures and keep host headers out
LLVM 23.1.3 Part 3, from the review of #781 and #786. - clang 23 does not predefine __cpp_impl_coroutine for i686-pc-windows-msvc, so the MSVC STL's <coroutine> is empty: the C++23 std module stops inside <generator>, and code that uses coroutines stops at "use of undeclared identifier 'std'". mcpp follows the compiler and appends a note to either failure (mcpp.toolchain.msvc_coroutines): C++20 first, where import std and import std.compat build, and llvm@22.1.8 for that target as an option. The note is decided after the failure from the failed command and a -dM -E probe of the same compiler, on the std precompile, the ninja path and the fast path alike. Measured on probe PR #788. - The graph C library note fires only when the C library is the graph's: the plan checks cAbi.fromGraph(), and the fast path reads .mcpp-graph-c-library beside build.ninja. A native build on a managed glibc carries -nostdlibinc too, which made the token alone a wrong answer. - GCC without a usable subos takes -isysroot <C library payload>, replacing the sysroot recorded when the compiler was built. - No host system header directory is searched on a managed C library; a project that needs one writes -idirafter /usr/include (e2e 891). - aarch64-linux-gnu is preview until the released engine is consumed on a clean ARM64 host; README rows and the baremetal sample name LLVM 23. - docs/20 (en/zh), SPEC-006 §3.8, SPEC-009 §6.4, CHANGELOG. Refs: #786
1 parent c6dca54 commit 1916a5f

25 files changed

Lines changed: 916 additions & 45 deletions

‎.github/workflows/openkal-cross.yml‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -651,7 +651,7 @@ jobs:
651651
for t in tests/e2e/285_*.sh tests/e2e/286_*.sh tests/e2e/287_*.sh \
652652
tests/e2e/288_*.sh tests/e2e/289_*.sh tests/e2e/291_*.sh \
653653
tests/e2e/292_*.sh tests/e2e/293_*.sh tests/e2e/294_*.sh \
654-
tests/e2e/738_*.sh tests/e2e/778_*.sh; do
654+
tests/e2e/738_*.sh tests/e2e/778_*.sh tests/e2e/891_*.sh; do
655655
echo "=== $t ==="
656656
bash "$t" 2>&1 | tee "$(basename "$t").log" || true
657657
rc=${PIPESTATUS[0]}
@@ -718,6 +718,11 @@ jobs:
718718
"ok: aarch64-linux-musl links -lm from the graph and runs under qemu-aarch64" || fail=1
719719
check 778_a_graph_link_searches_no_host_directory.sh \
720720
"ok: a host directory in ldflags is refused, by name" || fail=1
721+
# LLVM 23.1.3 Part 3 (D2/D3): the payload's C library closes the
722+
# host's /usr/include, a written -idirafter reopens it, and the
723+
# graph note stays away from a payload C library on both paths.
724+
check 891_a_host_header_is_written_not_searched.sh \
725+
"PASS: 891 a host header is written down, not searched" || fail=1
721726
[ "$fail" = 0 ] || exit 1
722727
723728

‎CHANGELOG.md‎

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
> Each `## [<version>]` section is that release's notes. Entries are written in English
55
> from 2026.9.28.3 on; earlier entries remain as written.
66

7-
## [2026.10.8.1] - 2026-10-08
7+
## [2026.10.8.1] - 2026-10-09
88

99
### Changed
1010

@@ -16,6 +16,16 @@
1616
- Use the native GNU manifest row when building mcpp and installing the
1717
toolchain for ARM64 consumer jobs. Centralize E2E toolchain version discovery
1818
and respect a custom MCPP_HOME.
19+
- Search no system header directory of the host on a managed C library. clang
20+
carries `-nostdlibinc` on the native Linux rows, including through the driver
21+
configuration file regenerated after installation; GCC without a usable
22+
subos takes `-isysroot <C library payload>` in place of the sysroot recorded
23+
when it was built. A project that needs a host header writes the directory,
24+
for example `cxxflags = ["-idirafter", "/usr/include"]`; `allow_host_libs`
25+
concerns the link only. The std module and object caches of Linux clang
26+
builds are rebuilt once.
27+
- Mark `aarch64-linux-gnu` `preview` until the released engine is consumed on
28+
a clean ARM64 host.
1929

2030
### Fixed
2131

@@ -24,7 +34,8 @@
2434
engine-selected foreign payloads.
2535
- Keep AArch64 host `std` modules and build programs on the same compiler-rt
2636
code-generation settings. Suppress the driver's automatic unwinder library
27-
when a self-contained ELF already links its static unwinder explicitly.
37+
(`--unwindlib=none`, on every architecture) when a self-contained ELF already
38+
links its static unwinder explicitly.
2839
- Stop E2E package discovery from exporting GCC's reserved `GCC_ROOT` variable,
2940
which redirected managed Windows GCC helper lookup to the registry wrapper.
3041
- Verify the native ARM64 openkal stack and indexed JSON serialization and
@@ -33,6 +44,18 @@
3344
- Cover both xcode-27 E2E shards and exercise explicit toolchain installation
3445
with a cold registry. Restore historical measurements to their original
3546
environment and adapt the namespace fixture to libc++ 23.
47+
- Give the note for a graph-supplied C library only when the C library is the
48+
graph's, on the full build and on the fast path; a native build on a managed
49+
C library carries `-nostdlibinc` as well.
50+
51+
### Known limitations
52+
53+
- clang 23 does not support C++20 coroutines on `i686-pc-windows-msvc`: it no
54+
longer predefines `__cpp_impl_coroutine` there, so the MSVC STL's
55+
`<coroutine>` is empty. The C++23 std module (through `<generator>`) and code
56+
that uses coroutines fail on that target, and mcpp appends a note naming the
57+
cause: C++20, where `import std` and `import std.compat` build, or optionally
58+
`llvm@22.1.8` for that target. mcpp does not define the macro (#786).
3659

3760
## [2026.10.5.3] - 2026-10-06
3861

‎README.md‎

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -427,20 +427,20 @@ list` reports for this machine):
427427
| `aarch64-linux-musl` | gcc 16, fully static — cross from x86_64 (qemu) or native | verified |
428428
| `x86_64-windows-gnu` | gcc 16 MinGW-w64 — native on Windows, cross from Linux (wine) *(Windows default without Visual Studio)* | verified |
429429
| `x86_64-windows-msvc` | `msvc@system` (detected VS/BuildTools) or llvm ¹ *(Windows default with Visual Studio)* | verified |
430-
| `x86_64-windows-musl` | llvm 22 — a PE with a musl C library, which no gcc emits; the system comes from the dependency graph | preview |
430+
| `x86_64-windows-musl` | llvm 23 — a PE with a musl C library, which no gcc emits; the system comes from the dependency graph | preview |
431431
| `aarch64-macos` | llvm *(macOS default)* | verified |
432-
| `riscv64-none-elf` · `riscv32-none-elf` | llvm 22 — bare metal, `xim:picolibc-riscv` ² | verified |
433-
| `thumbv6m-none-eabi` · `thumbv7m-none-eabi` | llvm 22 — Cortex-M0/M0+/M1, Cortex-M3 ² | verified |
434-
| `thumbv7em-none-eabihf` · `thumbv8m.main-none-eabi` | llvm 22 — Cortex-M4F/M7F hard float, Cortex-M33/M55 soft float ² | verified |
435-
| `armv7a-none-eabi` · `armv7a-none-eabihf` | llvm 22 — Cortex-A 32-bit, the first row with an MMU ² | verified |
436-
| `aarch64-none-elf` · `x86_64-none-elf` | llvm 22 — bare metal, no C library by default ² | preview |
437-
| `thumbv7em-none-eabi` · `thumbv8m.base-none-eabi` · `thumbv8m.main-none-eabihf` | llvm 22 — Cortex-M4/M7 soft float, M23, M33F/M55F ² | preview |
438-
| `aarch64-linux-gnu` | `llvm@23.1.3` | verified |
432+
| `riscv64-none-elf` · `riscv32-none-elf` | llvm 23 — bare metal, `xim:picolibc-riscv` ² | verified |
433+
| `thumbv6m-none-eabi` · `thumbv7m-none-eabi` | llvm 23 — Cortex-M0/M0+/M1, Cortex-M3 ² | verified |
434+
| `thumbv7em-none-eabihf` · `thumbv8m.main-none-eabi` | llvm 23 — Cortex-M4F/M7F hard float, Cortex-M33/M55 soft float ² | verified |
435+
| `armv7a-none-eabi` · `armv7a-none-eabihf` | llvm 23 — Cortex-A 32-bit, the first row with an MMU ² | verified |
436+
| `aarch64-none-elf` · `x86_64-none-elf` | llvm 23 — bare metal, no C library by default ² | preview |
437+
| `thumbv7em-none-eabi` · `thumbv8m.base-none-eabi` · `thumbv8m.main-none-eabihf` | llvm 23 — Cortex-M4/M7 soft float, M23, M33F/M55F ² | preview |
438+
| `aarch64-linux-gnu` | `llvm@23.1.3` | preview |
439439
| `riscv64-linux-musl` · `x86_64-macos` | — | planned |
440440
| `wasm32-emscripten` | `emsdk@6.0.9` — Emscripten ships its own sysroot and its own libc++ module surface; `mcpp run` executes the module with the `node` the payload declares (`xim:node`), not one found on PATH | verified |
441441
| `x86_64-linux-android` | `android-ndk@30.0.16248370` — bionic from the NDK, one payload for both ABIs; ran on an API 24 x86_64 emulator image | verified |
442442
| `aarch64-linux-android` | the same payload and the same build; ran under qemu-user over the system image's own bionic, which the platform emulator cannot do from an x86_64 host | verified |
443-
| `aarch64-ios-sim` | llvm 22 plus the machine's iPhoneSimulator SDK, which mcpp locates rather than installs; ran on a simulator through `simctl-run` ³ | verified |
443+
| `aarch64-ios-sim` | llvm 23 plus the machine's iPhoneSimulator SDK, which mcpp locates rather than installs; ran on a simulator through `simctl-run` ³ | verified |
444444
| `aarch64-ios` | the same split for the device; the artefact names the iOS platform, and running it off a device needs a signature the developer owns ³ | preview |
445445
| `x86_64-ios-sim` | the same build; nothing ran it, because a simulator runs the host's architecture and the machine measured was Apple silicon ³ | preview |
446446

‎README.zh-CN.md‎

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -381,20 +381,20 @@ mcpp 的身份模型有两条正交的轴:**工具链**是 `family@version`(
381381
| `aarch64-linux-musl` | gcc 16,全静态;从 x86_64 交叉编译(qemu)或原生构建 | verified |
382382
| `x86_64-windows-gnu` | gcc 16 MinGW-w64;Windows 上原生构建,Linux 上交叉编译(wine)(*无 Visual Studio 时的 Windows 默认*) | verified |
383383
| `x86_64-windows-msvc` | `msvc@system`(探测 VS/BuildTools)或 llvm ¹(*有 Visual Studio 时的 Windows 默认*) | verified |
384-
| `x86_64-windows-musl` | llvm 22;带 musl C 库的 PE,gcc 无法产出;系统部分由依赖图提供 | preview |
384+
| `x86_64-windows-musl` | llvm 23;带 musl C 库的 PE,gcc 无法产出;系统部分由依赖图提供 | preview |
385385
| `aarch64-macos` | llvm(*macOS 默认*) | verified |
386-
| `riscv64-none-elf` · `riscv32-none-elf` | llvm 22;裸机,`xim:picolibc-riscv` ² | verified |
387-
| `thumbv6m-none-eabi` · `thumbv7m-none-eabi` | llvm 22;Cortex-M0/M0+/M1、Cortex-M3 ² | verified |
388-
| `thumbv7em-none-eabihf` · `thumbv8m.main-none-eabi` | llvm 22;Cortex-M4F/M7F 硬浮点,Cortex-M33/M55 软浮点 ² | verified |
389-
| `armv7a-none-eabi` · `armv7a-none-eabihf` | llvm 22;Cortex-A 32 位,第一个带 MMU 的目标 ² | verified |
390-
| `aarch64-none-elf` · `x86_64-none-elf` | llvm 22;裸机,默认不带 C 库 ² | preview |
391-
| `thumbv7em-none-eabi` · `thumbv8m.base-none-eabi` · `thumbv8m.main-none-eabihf` | llvm 22;Cortex-M4/M7 软浮点、M23、M33F/M55F ² | preview |
392-
| `aarch64-linux-gnu` | `llvm@23.1.3` | verified |
386+
| `riscv64-none-elf` · `riscv32-none-elf` | llvm 23;裸机,`xim:picolibc-riscv` ² | verified |
387+
| `thumbv6m-none-eabi` · `thumbv7m-none-eabi` | llvm 23;Cortex-M0/M0+/M1、Cortex-M3 ² | verified |
388+
| `thumbv7em-none-eabihf` · `thumbv8m.main-none-eabi` | llvm 23;Cortex-M4F/M7F 硬浮点,Cortex-M33/M55 软浮点 ² | verified |
389+
| `armv7a-none-eabi` · `armv7a-none-eabihf` | llvm 23;Cortex-A 32 位,第一个带 MMU 的目标 ² | verified |
390+
| `aarch64-none-elf` · `x86_64-none-elf` | llvm 23;裸机,默认不带 C 库 ² | preview |
391+
| `thumbv7em-none-eabi` · `thumbv8m.base-none-eabi` · `thumbv8m.main-none-eabihf` | llvm 23;Cortex-M4/M7 软浮点、M23、M33F/M55F ² | preview |
392+
| `aarch64-linux-gnu` | `llvm@23.1.3` | preview |
393393
| `riscv64-linux-musl` · `x86_64-macos` | — | planned |
394394
| `wasm32-emscripten` | `emsdk@6.0.9`;Emscripten 自带 sysroot 与 libc++ 模块接口;`mcpp run` 使用 payload 声明的 `node`(`xim:node`)运行模块,不使用 PATH 上的 `node` | verified |
395395
| `x86_64-linux-android` | `android-ndk@30.0.16248370`;bionic 来自 NDK,一个 payload 服务两个 ABI;已在 API 24 的 x86_64 模拟器镜像上运行 | verified |
396396
| `aarch64-linux-android` | 同一个 payload、同样的构建;已在 qemu-user 上配合系统镜像自带的 bionic 运行,平台模拟器无法在 x86_64 宿主上做到这一点 | verified |
397-
| `aarch64-ios-sim` | llvm 22 加上本机的 iPhoneSimulator SDK(mcpp 定位该 SDK,不安装它);已通过 `simctl-run` 在模拟器上运行 ³ | verified |
397+
| `aarch64-ios-sim` | llvm 23 加上本机的 iPhoneSimulator SDK(mcpp 定位该 SDK,不安装它);已通过 `simctl-run` 在模拟器上运行 ³ | verified |
398398
| `aarch64-ios` | 真机采用同样的分工;产物标记为 iOS 平台,在设备上运行需要开发者自己的签名 ³ | preview |
399399
| `x86_64-ios-sim` | 同一次构建;尚未运行过,因为模拟器运行宿主的架构,而测量所用的机器是 Apple 芯片 ³ | preview |
400400

‎docs/20-toolchains.md‎

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -947,6 +947,39 @@ that reaches a build silently is.** That is why the entries above are a table
947947
rather than a prohibition: each is reachable, each has a reason, and each says
948948
so where it is used.
949949

950+
### System headers: none are the host's (2026.10.8.1+)
951+
952+
A build on a managed C library searches no system header directory of the
953+
host. The managed glibc and `linux-headers` supply the whole system header
954+
surface, and each compiler family is closed against the host's copy:
955+
956+
- **clang** carries `-nostdlibinc` on the native Linux rows. The driver keeps
957+
its own resource headers and stops its fallback to `/usr/include`, including
958+
when the driver configuration file is bypassed. A directly invoked
959+
`clang++` reads the same token from the configuration file mcpp regenerates
960+
after installation.
961+
- **GCC** compiles with `--sysroot=<the xlings subos>`, so its search ends at
962+
the subos's `usr/include`. When no usable subos exists, it falls back to the
963+
payload layout and receives `-isysroot <the C library payload>`, which
964+
replaces the sysroot recorded when the compiler was built: that recorded
965+
path belongs to the machine that built the compiler and is otherwise
966+
searched wherever it happens to exist.
967+
968+
A header that only the host has is therefore not found. A project that needs
969+
one names the directory in its own manifest, where the dependency on the host
970+
is visible:
971+
972+
```toml
973+
[build]
974+
cflags = ["-idirafter", "/usr/include"]
975+
cxxflags = ["-idirafter", "/usr/include"]
976+
```
977+
978+
`-idirafter` places the directory after the managed headers, so the C library
979+
the build links against still supplies its own declarations. `allow_host_libs`
980+
does not change the header search: it concerns the libraries a link may
981+
resolve from the host.
982+
950983
### The host surface this adds, named and bounded
951984

952985
Two items, both macOS-only, both in the category a proprietary runtime that
@@ -1269,6 +1302,51 @@ workarounds were measured downstream:
12691302

12701303
Tracked as [mcpp#609](https://github.com/mcpp-community/mcpp/issues/609).
12711304

1305+
## Known Toolchain Limitation: Coroutines on the 32-bit x86 Microsoft ABI (clang 23)
1306+
1307+
clang 23 does not support C++20 coroutines on `i686-pc-windows-msvc`. It does
1308+
not predefine `__cpp_impl_coroutine` for that target, and it reports code that
1309+
uses coroutines there with `-Wcoroutines-unsupported-target`. clang 22.1.8 and
1310+
every other target mcpp builds for, including `x86_64-pc-windows-msvc` and
1311+
`i686-pc-windows-gnu`, still predefine the macro.
1312+
1313+
The MSVC STL keys `<coroutine>` on that macro, so the header is empty on this
1314+
target. Two failures follow:
1315+
1316+
- **The C++23 std module.** `std.ixx` includes `<generator>` under C++23, and
1317+
`<generator>` uses `coroutine_handle` and `suspend_always` without checking
1318+
for them. The precompile stops inside `generator`.
1319+
- **Code that uses coroutines.** The compile stops at `use of undeclared
1320+
identifier 'std'` and `std::coroutine_traits type was not found`, before
1321+
clang's own coroutine diagnostic is reached.
1322+
1323+
mcpp follows the compiler. It does not define the macro and does not alter the
1324+
std module; it appends a note to either failure, naming the cause and the
1325+
options. The note is decided after the failure, from the failed command and a
1326+
`-dM -E` probe of the same compiler and target, so a build that succeeds is not
1327+
affected and the note disappears when the compiler or the STL changes.
1328+
1329+
The options, in the order the note gives them:
1330+
1331+
- Build the package as C++20. `import std` and `import std.compat` do not
1332+
include `<generator>` there and build on this target. This does not make
1333+
coroutines available.
1334+
- Name an LLVM that still enables coroutines for this target:
1335+
1336+
```toml
1337+
[target.i686-windows-msvc]
1338+
toolchain = "llvm@22.1.8"
1339+
```
1340+
1341+
The newer compiler treats coroutines on this ABI as unsupported; code that
1342+
uses them on this target does so at its own risk.
1343+
1344+
Defining `__cpp_impl_coroutine` in a project is not a workaround. It switches
1345+
on a feature the compiler has declared unsupported for this ABI.
1346+
1347+
`i686-windows-msvc` is not a row of the target table; a project that builds
1348+
for it declares `[target.i686-windows-msvc]`, as for any custom triple.
1349+
12721350
## The C++ runtime contract (`cxx_runtime`)
12731351

12741352
`cxx_runtime` states what the produced artifact promises about the machine that

‎docs/21-the-target-triple.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -492,7 +492,7 @@ other's rows.
492492
| target | tier | pin | linux-x86_64 | linux-aarch64 | macos-arm64 | windows-x86_64 |
493493
|---|---|---|---|---|---|---|
494494
| `x86_64-linux-gnu` | verified | — | payload | — | — | — |
495-
| `aarch64-linux-gnu` | verified | `llvm@23.1.3` | — | payload | — | — |
495+
| `aarch64-linux-gnu` | preview | `llvm@23.1.3` | — | payload | — | — |
496496
| `x86_64-linux-musl` | verified | `gcc@16.1.0` | payload | payload | — | payload |
497497
| `aarch64-linux-musl` | verified | `gcc@16.1.0` | payload | payload | — | — |
498498
| `riscv64-linux-musl` | planned | — | planned | planned | planned | planned |

‎docs/40-baremetal.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ Output (2026.9.30.1; the times vary by machine):
205205

206206
```
207207
Resolving toolchain
208-
Resolved llvm@22.1.8 → riscv64-none-elf → @mcpp/registry/data/xpkgs/xim-x-llvm/22.1.8/bin/clang++
208+
Resolved llvm@23.1.3 → riscv64-none-elf → @mcpp/registry/data/xpkgs/xim-x-llvm/23.1.3/bin/clang++
209209
Resolved host toolchain for build.mcpp: clang 22.1.8 (x86_64-unknown-linux-gnu)
210210
build.mcpp blinky ran 0.41s
211211
Inferred sources [src/**/*.{cppm,cpp,cc,c,S,s,asm}]

‎docs/specs/README.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@
3535
| [SPEC-003](exit-codes.md) | 退出码契约(分类、语义、稳定性承诺) | 评审中 v1.0 | 2026-09-01 | mcpp >= 2026.9.1.1 |
3636
| [SPEC-004](manifest-semantics.md) | `mcpp.toml` 的平面划分、条件化形状、解析轴与命名规约 | 草案 v1.13 | 2026-10-06 | 条件化形状 mcpp >= 2026.8.29.1;目标轴 mcpp >= 2026.9.6.4;`linkage` 默认值 mcpp >= 2026.9.15.2;链接 flag 的词读法 mcpp >= 2026.9.26.2;条件化的 `dialect_cxxflags` 与 `-p` 的包身份 mcpp >= 2026.9.28.1;条件表按具体程度生效 mcpp >= 2026.9.28.2;平台前缀规约 mcpp >= 2026.10.5.1;根包的继承、根位置的 profile、链接 flag 的作用域、链接期优化与导出发现 mcpp >= 2026.10.5.2;架构段的 `x86` 即 `i686` mcpp >= 2026.10.5.3 |
3737
| [SPEC-005](build-database.md) | 构建数据库:`mcpp emit build-database` 的内容、取值规则与不写工程目录的保证 | 评审中 v1.6 | 2026-09-29 | mcpp >= 2026.9.15.1;v1.3 条款 mcpp >= 2026.9.26.2;v1.4 条款 mcpp >= 2026.9.27.1;v1.5 条款 mcpp >= 2026.9.28.1;v1.6 条款 mcpp >= 2026.9.29.5 |
38-
| [SPEC-006](toolchain-management.md) | 工具链管理:身份、来源、选择与载荷契约 | 草案 v0.6 | 2026-10-02 | 逐条标注;已实现条款 mcpp >= 2026.9.24.1;§3.7 mcpp >= 2026.9.28.1;§3.7.1 mcpp >= 2026.9.28.2;§2.2.1 与 §3.3 的非缺省来源 mcpp >= 2026.10.1.3 |
38+
| [SPEC-006](toolchain-management.md) | 工具链管理:身份、来源、选择与载荷契约 | 草案 v0.7 | 2026-10-09 | 逐条标注;已实现条款 mcpp >= 2026.9.24.1;§3.7 mcpp >= 2026.9.28.1;§3.7.1 mcpp >= 2026.9.28.2;§2.2.1 与 §3.3 的非缺省来源 mcpp >= 2026.10.1.3;§3.8 mcpp >= 2026.10.8.1 |
3939
| [SPEC-007](build-plugins.md) | 构建插件:配置、施工与校验的分工,运行时与规划期的义务 | 草案 v0.6 | 2026-09-28 | 逐条标注;mcpp >= 2026.9.26.2;v0.3 条款 mcpp >= 2026.9.27.1;v0.4 条款 mcpp >= 2026.9.28.1;v0.5 条款 mcpp >= 2026.9.28.2;v0.6(§9)mcpp >= 2026.9.28.3 |
4040
| [SPEC-008](library-interface.md) | 库的接口:公开模块、发布闭包与两种形态的一致 | 草案 v0.1 | 2026-09-28 | 第一阶段(只警告)mcpp >= 2026.9.28.3 |
41-
| [SPEC-009](toolchain-maintenance.md) | 工具链的支持与维护:版本线、默认值、来源、移动与退役 | 草案 v0.5 | 2026-10-08 | 逐条标注;本版只有规范,多数条款未实现 |
41+
| [SPEC-009](toolchain-maintenance.md) | 工具链的支持与维护:版本线、默认值、来源、移动与退役 | 草案 v0.6 | 2026-10-09 | 逐条标注;本版只有规范,多数条款未实现;§6.4 mcpp >= 2026.10.8.1 |
4242

4343
## 文档约定
4444

0 commit comments

Comments
 (0)