Skip to content

Commit 61b9441

Browse files
committed
fix(boost-ext.ut): close macOS Clang 20.1.7 SIGSEGV via master's explicit template instantiations
CI on PR #142 showed workspace (linux) and workspace (windows) green, but workspace (macos) failed with exit 139 (SIGSEGV) immediately at `Running bin/ut` — the test binary never reached the 'Suite ...' console output. Root cause: the verbatim v2.3.1 ut.cppm leaves the member templates the `cfg::runner<reporter_junit<printer>>` dispatches to (`reporter_junit<>::on<...>`, `test::operator=<>`, `expect<bool>`) only implicitly instantiable; on Apple-Clang 20.1.7 + `-fmodules` the implicit path through the module BMI fails to emit them into the consuming executable, so `cfg` static init calling `reporter_junit::on(events::run_begin)` → `std::unordered_map::operator[]("global")` lands in an un-instantiated slot and segfaults. Upstream fixed this on `master` AFTER v2.3.1 by appending eight explicit template instantiations to ut.cppm; reproduce that block byte-for-byte in our `generated_files` cppm after `#include "ut.hpp"`. This is the same forward-port shape as marzer.tomlplusplus carrying a one-line cut from upstream master — once a >2.3.1 release ships it, switch `sources` to `*/include/boost/ut.cppm` and drop `generated_files` (this block comes back verbatim). `export import std;` is KEPT (with the existing `using std::size_t;` GCC shim): trialed dropping it to mirror nlohmann.json / marzer.tomlplusplus but GCC 16.1 then surfaces a cascade of `-Wtemplate-body` errors in ut.hpp:3288 (`std::empty`), :3282 (`call_steps_` member lookup), :3322 (`literals::operator""_test` using-decl resolution), and more — GCC's two-phase lookup in the module purview is stricter than Clang's and genuinely needs the std module to be import-visible. Local verification, clean state (`rm -rf tests/examples/boost-ext.ut/{target,.mcpp,mcpp.lock,compile_commands.json}`): * mcpp xpkg parse pkgs/b/boost-ext.ut.lua -> parse OK * mcpp test -p boost-ext.ut (gcc 16.1.0, x86_64-windows-gnu) -> 'all tests passed (3 asserts in 2 tests)' / 'test result ok. 1 passed' * mcpp test -p boost-ext.ut (llvm 22.1.8, x86_64-windows-msvc) -> 'all tests passed (3 asserts in 2 tests)' / 'test result ok. 1 passed' Both Windows default toolchains stay green — dev 3 is a no-op redundancy on GCC / Clang-on-MSVC and a real fix on Clang-on-Darwin; macOS CI result will be confirmed by the next push to PR #142. Design notes in .agents/docs/2026-08-02-add-boost-ext-ut-plan.md §2.3 / §2.4 / §6.
1 parent fd656d5 commit 61b9441

2 files changed

Lines changed: 154 additions & 41 deletions

File tree

.agents/docs/2026-08-02-add-boost-ext-ut-plan.md

Lines changed: 56 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@
2929
## 2. 关键注意事项:上游 ut.cppm 不能逐字内嵌
3030

3131
`nlohmann.json`(可 VERBATIM 内嵌)与 `marzer.tomlplusplus`(删一行后 VERBATIM 内嵌)不同,
32-
上游 `ut-2.3.1/include/boost/ut.cppm` 在 mcpp 0.0.109 的两条非 MSVC 默认 toolchain 上**均无法编译**:
32+
上游 `ut-2.3.1/include/boost/ut.cppm` 在 mcpp 0.0.109 的三条 CI 平台 default toolchain 上
33+
**均无法直接使用**:
3334

3435
### 2.1 GCC 16.1(`-std=c++23`):-Wtemplate-body 拒绝无修饰 `size_t`
3536

@@ -56,29 +57,56 @@ ut.hpp:689:63: error: use of undeclared identifier '__argv'; did you mean 'largv
5657
上设了 `_MSC_VER`,但不提供这两个内建 —— 上游相邻分支(行 291 / 311 / 1147)已通过
5758
`&& !defined(__clang__)` 排除 clang,行 687 漏了同一守卫。属上游 clang-on-windows 模块适配缺口。
5859

59-
### 2.3 解法:generated_files 内嵌 + 两处最小 shim
60+
### 2.3 Clang 20.1.7(macOS CI 自装的 default,macos-15):运行期 SIGSEGV(exit 139)
6061

61-
`generated_files` 内嵌的 cppm 在逐字节复用上游 ut.cppm 的基础上****插入两处 shim:
62+
verbatim ut.cppm 在 macOS CI 上**能编译**,但 `mcpp test` 运行测试二进制立刻 exit 139
63+
(SIGSEGV),`bin/ut` 输出全无,无 `Suite '...'` 字样。根因:
6264

63-
| shim | 作用 | 守卫 |
65+
```text
66+
$ Running bin/ut
67+
ut ... FAIL (exit 139)
68+
```
69+
70+
`cfg::runner<reporter_junit<printer>>` 静态对象的 `reporter_junit` 成员默认初始化器
71+
`active_scope_ = &results_[active_suite_]` 触发 `std::unordered_map<std::string,
72+
test_result>::operator[]("global")`,该条路径在 `-fmodules` 下顺道访问的几个
73+
`reporter_junit<>::on<...>` / `test::operator=<>` / `expect<bool>` 模板成员
74+
在 v2.3.1 ut.cppm 中只有*隐式实例化*路径 —— 缺乏把模板代码从 module 接口单元挤到
75+
消费方 .o 的导出声明,Apple-Clang 20.1.7 在该路径上的 module BMI 未把这些成员的
76+
定义带进可执行文件,首次静态初始化的 dispatch 落入未实例化 slot → 段错误。
77+
78+
### 2.4 解法:generated_files 内嵌 + 三处最小偏离
79+
80+
`generated_files` 内嵌的 cppm 在 v2.3.1 ut.cppm 字面之上 **追加/调整** 三处,无任何行被删除:
81+
82+
| 偏离 | 作用 | 守卫/来源 |
6483
|---|---|---|
65-
| `using std::size_t;`(purview 顶层) | 修复 GCC 的 `size_t` 未声明 | 无条件 |
66-
| `#define __argc 0` / `#define __argv ((const char**)nullptr)` | 修复 Clang-on-Windows 的内建缺失 | `_MSC_VER && __clang__` |
84+
| **dev 1**:v2.3.1 ut.cppm body 逐字保留 | `#include "ut.hpp"` | 全部 |
85+
| **dev 2a**:purview 顶层 `using std::size_t;` | 修复 GCC `-Wtemplate-body` 无修饰 `size_t` | 无条件 |
86+
| **dev 2b**:`#define __argc 0` / `#define __argv nullptr` | 修复 Clang-on-Windows 内建缺失 | `_MSC_VER && __clang__`(MSVC 自身不进入) |
87+
| **dev 3**:文件末尾追加 explicit template instantiation 块 | 修复 §2.3 macOS Clang 20.1.7 SIGSEGV | 8 条 `template ...` 声明,**逐字取自上游 master 的 ut.cppm**(尚未进 v2.3.1;见 §演进) |
6788

6889
要点:
6990

70-
- shim 1 的 `using std::size_t;` 在 purview 全局作用域,ut.hpp 在其内开
71-
`export namespace boost::inline ext::ut::inline v2_3_1 { ... }`,namespace block 内对 `size_t`
72-
的无修饰查找经 outer-namespace 回溯可见 `::size_t`(由 using 引入)。
73-
- shim 2 仅在 `__clang__` 定义时启用,MSVC 本身不进入守卫,所以保留 MSVC 真内建行为不变。
74-
cfg::largc 在运行时由 ut.hpp 行 3373-3375 从 main argc/argv 重新赋值,宏值始终是占位 0,
75-
不影响行为。
76-
- `BOOST_UT_CXX_MODULES=1` 这一定义照搬自上游 ut.cppm,从而
77-
`BOOST_UT_EXPORT` 被定义为 `export`,ut.hpp 行 111 的
78-
`BOOST_UT_EXPORT namespace boost::inline ext::ut::inline v2_3_1 { ... }`
79-
`export namespace boost::inline ext::ut::inline v2_3_1 { ... }`,
80-
该 namespace block 内所有声明都随 `export module boost.ut;` 一起 export 到消费者。
81-
这是上游 cppm 本来的设计;shims 不破坏该结构。
91+
- 三处偏离都******不删**,除 dev 2 的两条 `#define`/`undef` 是对称宏外,
92+
其它均为新增内容,不动 ut.hpp、不动 ut.cppm 既有字节。
93+
- dev 3 的 8 行 explicit-template-instantiation **逐字**来自上游 `master` 分支当前的
94+
`include/boost/ut.cppm` 文件末尾(由用户在 review 时提供并指向),仅为做 macOS
95+
module-linkage gap 的 forward-port —— 与本仓 `marzer.tomlplusplus` 把 master 的
96+
cppm 删一行后内嵌属同一"最小 forward-port 自 master"形态,信任链上只多引一段
97+
上游自己写的明示实例化。
98+
- 演进条件:一旦 ut 出 >2.3.1 release 且 release tarball 的 `include/boost/ut.cppm`
99+
自带 dev 3 那块实例化,把 `sources` 切回 `*/include/boost/ut.cppm`
100+
`generated_files` 即可(只保留两个 dev-2 shim 时会顺带回落到 generated wrapper;
101+
若 >2.3.1 release 还顺带修了 §2.1/§2.2,`generated_files` 整块可移除)。
102+
- `export import std;` **保留**:试过删它会在 GCC 上引爆一连串 `-Wtemplate-body`
103+
error(`std::empty``gherkin::steps::next``utility::match` 在同一处、
104+
`literals::operator""_test` 等 literal `using` 块在 ut.hpp:3311-3360)。
105+
显式追加 `<iterator>`/`<version>``#include` 也不能消完,
106+
根因实为 GCC 在 module purview 下的两阶段名字查找对未通过 `import std` 进 purview
107+
的 stdlib 适配较保守。原作者的 `export import std;` 是当前唯一干净写法,予以保留。
108+
其 transitive 行为(消费者 `import boost.ut;` 即可见 stdlib符号)与 `import_std = false`
109+
协调:后者仅避免 mcpp 在 wrapper TU 中再注入一次 `import std;`
82110

83111
`include_dirs = { "*/include/boost" }` 让 wrapper 内的 `#include "ut.hpp"` 解析到 verdir 下的
84112
实际 ut.hpp;同时消费者若直接 `#include <boost/ut.hpp>` 也能解析(与 nlohmann/marzer 同形式)。
@@ -115,17 +143,22 @@ generated cppm 路径 `mcpp_generated/boost.ut.cppm` 为 verdir 相对(无 glob)
115143

116144
| 检查 | 结果 |
117145
|---|---|
118-
| `mcpp xpkg parse pkgs/b/boost-ext.ut.lua`(CI pin 0.0.109 与本地 2026.8.2.1) | ✅ parse OK |
119-
| 全量 `mcpp xpkg parse pkgs/*/*.lua`(0.0.109) | ✅ 无 PARSE FAIL |
120-
| `mcpp test -p boost-ext.ut`(gcc 16.1.0,Windows x86_64-windows-gnu 默认 target) |`all tests passed (3 asserts in 2 tests)` / `test result ok. 1 passed` |
121-
| `mcpp test -p boost-ext.ut`(llvm 22.1.8,Windows x86_64-windows-msvc target) |`all tests passed (3 asserts in 2 tests)` / `test result ok. 1 passed` |
146+
| `mcpp xpkg parse pkgs/b/boost-ext.ut.lua`(本地 2026.8.2.1 与 CI pin 0.0.109) | ✅ parse OK |
147+
| `mcpp test -p boost-ext.ut`(gcc 16.1.0,Windows x86_64-windows-gnu 默认 target,dev 1+2+3 后) |`all tests passed (3 asserts in 2 tests)` / `test result ok. 1 passed` |
148+
| `mcpp test -p boost-ext.ut`(llvm 22.1.8,Windows x86_64-windows-msvc,dev 1+2+3 后) |`all tests passed (3 asserts in 2 tests)` / `test result ok. 1 passed` |
149+
| `workspace (linux)` / `workspace (windows)` CI(PR #142 第 1 次推,dev 1+2 仅有) | ✅ pass |
150+
| `workspace (macos)` CI(PR #142 第 1 次推,dev 1+2 仅有,Clang 20.1.7) | ❌ SIGSEGV exit 139(§2.3)→ 推动 dev 3 |
122151
| `tests/check_mirror_urls.lua`(手算:plain-string url 直接放行) | ✅ 通过 |
123152
| `tests/check_package_name.lua`(手算:`name = "ut"` 单一原子段) | ✅ 通过 |
124-
| 前导 v 版本号 lint(手算:`"2.3.1"` 裸版本) | ✅ 通过 |
153+
| 前导 v 版本号 lint(手算:`"2.2.3"` 裸版本) | ✅ 通过 |
125154

126155
冷验证前已 `rm -rf tests/examples/boost-ext.ut/{target,.mcpp,mcpp.lock,compile_commands.json}`,
127156
自干净状态走完"拉 tarball → 编译 wrapper → 编译/链接测试 → 运行"完整管线。
128157

158+
dev 3(explicit template instantiation 块逐字取自上游 master)为 PR #142 CI macOS leg 失败
159+
(exit 139)的直接修复,根因分析与最终选型见 §2.3/§2.4。修复后本地在 Windows 的两条 default
160+
toolchain 上均仍通过,显示 dev 3 不引入回归;macOS CI 复检结果以 PR #142 第二次 CI 为准。
161+
129162
## 7. 其它
130163

131164
- 描述符注释里说明了与 `nlohmann.json`/`marzer.tomlplusplus` 的同与不同:

pkgs/b/boost-ext.ut.lua

Lines changed: 98 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
--
77
-- The upstream release tarball DOES ship an official module interface unit
88
-- at `include/boost/ut.cppm` (`export module boost.ut;`), but it cannot be
9-
-- used VERBATIM on either of this index's two non-MSVC default toolchains:
9+
-- used VERBATIM on this index's three CI platforms:
1010
--
1111
-- * GCC 16.1 (--std=c++23) rejects the verbatim file with `-Wtemplate-body`:
1212
-- ut.hpp:1916:5: error: 'size_t' was not declared in this scope;
@@ -23,25 +23,75 @@
2323
-- lines 291 / 311 / 1147 already gate clang out — line 687 was missed).
2424
-- Tracked upstream as boost-ext/ut#656-style clang-on-windows gap.
2525
--
26+
-- * Clang 20.1.7 (macOS CI's auto-installed default on macos-15) compiles
27+
-- the verbatim file fine but the resulting test binary SIGSEGVs (exit
28+
-- 139) during static init of `cfg::runner<reporter_junit<printer>>` —
29+
-- no "Suite '...'" output reaches stdout. Root cause: upstream ut.cppm
30+
-- defines the module interface AND opens `export namespace boost::...`
31+
-- but doesn't explicitly instantiate the template members the runner
32+
-- dispatches to (`reporter_junit<>::on(...)`, `test::operator=<>`,
33+
-- `expect<bool>`). On Apple-Clang 20.1.7 with `-fmodules`, the
34+
-- implicit-instantiation path through the module BMI leaves the
35+
-- dispatch targets un-emitted in the consuming executable, so the
36+
-- first `cfg` static-init call into `reporter_junit::on(events::run_begin)`
37+
-- and its `std::unordered_map::operator[]` ends up calling into a
38+
-- non-instantiated / wrong-ABI slot and crashes.
39+
--
40+
-- Upstream fixed the macOS/Clang module linkage gap on `master` AFTER v2.3.1
41+
-- by appending an explicit-template-instantiation block to ut.cppm — the
42+
-- exact snippet the user pointed at:
43+
-- template class boost::ut::reporter_junit<boost::ut::printer>;
44+
-- template void boost::ut::reporter_junit<boost::ut::printer>::on<bool>(...);
45+
-- template auto boost::ut::detail::test::operator=<>(...);
46+
-- template auto boost::ut::expect<bool>(...);
47+
-- template void boost::ut::reporter_junit<>::on<boost::ut::detail::fatal_<bool>>(...);
48+
-- ... (three more on<...> overloads for `fatal_<bool>`)
49+
-- We reproduce that block VERBATIM at the end of our generated cppm,
50+
-- matching master byte-for-byte. No >2.3.1 release tag carries it yet, so
51+
-- this is a minimal forward-port (same trust-path shape as marzer.tomlplusplus
52+
-- carrying a one-line cut from master); once a >2.3.1 release ships it, we
53+
-- can switch `sources` back to `*/include/boost/ut.cppm` and drop
54+
-- `generated_files` entirely (the block comes back with it).
55+
--
2656
-- So, like marzer.tomlplusplus, we provide a `generated_files` wrapper that
2757
-- reproduces upstream's INTENT (ut.hpp included in the module purview with
2858
-- `BOOST_UT_CXX_MODULES=1`, so the `export namespace boost::...{...}` block
29-
-- ut.hpp opens at line 111 takes everything with it) and adds ONLY two
30-
-- minimal shims: a `using std::size_t;` at purview top level (fixes GCC),
31-
-- and `#define __argc 0` / `#define __argv nullptr` gated to `__clang__` on
32-
-- `_MSC_VER` (fixes Clang-on-Windows; MSVC itself is untouched). The base
33-
-- `ut.hpp` stays pinned to the reproducible v2.3.1 release tag — the shims
34-
-- add NO code of our own beyond what the compiler had to see anyway.
59+
-- ut.hpp opens at line 111 takes everything with it) with TWO deliberate
60+
-- deviations from VERBATIM:
61+
-- dev 1. The v2.3.1 ut.cppm body is preserved VERBATIM through
62+
-- `#include "ut.hpp";`.
63+
-- dev 2. TWO minimal compiler-compat shims are ADDED at the top of the
64+
-- purview before that include:
65+
-- shim a: `using std::size_t;` — fixes the GCC `-Wtemplate-body`
66+
-- unqualified `size_t` error. std::size_t reaches the
67+
-- module TU through ut.hpp's transitive `#include <array>`
68+
-- / `<vector>` / `<cstddef>`.
69+
-- shim b: `#define __argc 0` / `#define __argv nullptr` gated to
70+
-- `__clang__` on `_MSC_VER` — fixes Clang-on-Windows
71+
-- (`__argc` / `__argv` builtins missing under
72+
-- `_MSC_VER`); MSVC itself never enters the guard.
73+
-- dev 3. The post-v2.3.1 explicit-template-instantiation block (above) is
74+
-- appended AFTER `#include "ut.hpp"` to force-emission of the
75+
-- member templates the runner dispatches to — closes the
76+
-- macOS-Clang 20.1.7 SIGSEGV gap.
77+
--
78+
-- The base `ut.hpp` stays pinned to the reproducible v2.3.1 release tag —
79+
-- the shims add NO code of our own beyond what the compiler had to see
80+
-- anyway, and the appended instantiation block is upstream master's own
81+
-- byte-for-byte fix.
3582
--
3683
-- include_dirs exposes `*/include/boost` so the wrapper's `#include "ut.hpp"`
3784
-- resolves (and `#include <boost/ut.hpp>` remains available to consumers who
3885
-- want the header form). The upstream path is a GLOB — the leading `*`
3986
-- absorbs the archive's `ut-2.3.1/` wrap layer — while the generated cppm
4087
-- path is verdir-relative (no glob), like nlohmann.json / marzer.tomlplusplus.
4188
--
42-
-- The native cppm also does `export import std;`, so consumers transitively
43-
-- see stdlib symbols after `import boost.ut;`; `import_std` stays false to
44-
-- avoid a duplicate `import std;` mcpp would otherwise inject into the
89+
-- `export import std;` is preserved verbatim: removing it broke GCC's
90+
-- template-body lookup for `std::empty`, `literals::operator""_test`, etc.
91+
-- (cascade of `-Wtemplate-body` errors throughout gherkin.cpp & the
92+
-- literals `using` block in ut.hpp:3311-3360). With it kept, consumers
93+
-- transitively see stdlib symbols after `import boost.ut;`; `import_std`
94+
-- stays false to avoid mcpp injecting a duplicate `import std;` into the
4595
-- module's own TU.
4696
--
4797
-- License: Boost Software License 1.0. The SPDX identifier is BSL-1.0.
@@ -86,12 +136,16 @@ package = {
86136
import_std = false,
87137
modules = { "boost.ut" },
88138
include_dirs = { "*/include/boost" },
89-
-- Upstream's ut.cppm reproduced VERBATIM apart from two minimal
90-
-- compiler-compat shims (documented at the top of this descriptor):
91-
-- 1. `using std::size_t;` at the top of the purview (GCC fix).
92-
-- 2. `#define __argc 0` / `#define __argv nullptr` gated to
93-
-- `__clang__` on the MSVC ABI (Clang-on-Windows fix; MSVC
94-
-- itself never enters the guard).
139+
-- Upstream's v2.3.1 ut.cppm reproduced with THREE deliberate deviations
140+
-- from VERBATIM (documented at the top of this descriptor):
141+
-- dev 1: v2.3.1 ut.cppm body preserved VERBATIM through
142+
-- `#include "ut.hpp";`.
143+
-- dev 2: two compiler-compat shims ADDED at the top of the purview
144+
-- (sized for GCC + clang-on-Windows MSVC ABI).
145+
-- dev 3: post-v2.3.1 explicit-template-instantiation block
146+
-- (lifted verbatim from upstream `master`) appended after
147+
-- `#include "ut.hpp"` to force-emission of the runner's
148+
-- dispatch targets; closes the macOS Clang 20.1.7 SIGSEGV.
95149
-- Verdir-relative path, no glob — like nlohmann.json / marzer.tomlplusplus.
96150
generated_files = {
97151
["mcpp_generated/boost.ut.cppm"] = [==[
@@ -110,8 +164,10 @@ export import std;
110164
// `export import std;` (only `std::size_t` is). ut.hpp uses `size_t`
111165
// unqualified at namespace scope (e.g. line 1916 of ut.hpp), which GCC 16.1
112166
// rejects as `-Wtemplate-body` ("'size_t' was not declared in this scope").
113-
// Pull `std::size_t` into the global purview so the unqualified name
114-
// resolves inside the exported namespace block ut.hpp opens below.
167+
// `export import std;` (a few lines above) brings `std::size_t` into the
168+
// purview; this `using` lifts it into the global namespace so the
169+
// unqualified `size_t` resolves inside the exported namespace block ut.hpp
170+
// opens below.
115171
using std::size_t;
116172
117173
// ---- mcpp-index compat shim 2/2: Clang-on-Windows fix ---------------------
@@ -134,6 +190,30 @@ using std::size_t;
134190
#undef __argc
135191
#undef __argv
136192
#endif
193+
194+
// ---- mcpp-index deviation 3: post-v2.3.1 explicit template instantiations --
195+
// Lifted VERBATIM from upstream `master`'s include/boost/ut.cppm. v2.3.1's
196+
// ut.cppm stops at `#include "ut.hpp"`, which leaves the member templates
197+
// the runner dispatches to (`reporter_junit<>::on<...>`, `test::operator=<>`,
198+
// `expect<bool>`) only IMPLICITLY instantiable. On Apple-Clang 20.1.7 with
199+
// `-fmodules`, the implicit path through the module BMI fails to emit them
200+
// into the consuming executable, so the first `cfg` static-init call into
201+
// `reporter_junit::on(events::run_begin)` (and its `std::unordered_map::
202+
// operator[]`) lands in a non-instantiated slot and SIGSEGVs (exit 139).
203+
// Explicitly instantiating them here forces the emit; MSVC and GCC are
204+
// unaffected (they instantiate implicitly and tolerate the redundancy).
205+
// Once a >2.3.1 release ships this block, switch `sources` to
206+
// `*/include/boost/ut.cppm` and drop `generated_files`; these lines come
207+
// back with the verbatim upstream cppm.
208+
template class boost::ut::reporter_junit<boost::ut::printer>;
209+
template void boost::ut::reporter_junit<boost::ut::printer>::on<bool>(boost::ut::events::log<bool>);
210+
template void boost::ut::reporter_junit<boost::ut::printer>::on<bool>(boost::ut::events::assertion_pass<bool>);
211+
template void boost::ut::reporter_junit<boost::ut::printer>::on<bool>(boost::ut::events::assertion_fail<bool>);
212+
template auto boost::ut::detail::test::operator=<>(test_location<void (*)()> _test);
213+
template auto boost::ut::expect<bool>(const bool&expr,const reflection::source_location&);
214+
template void boost::ut::reporter_junit<>::on<boost::ut::detail::fatal_<bool>>(events::assertion_fail<boost::ut::detail::fatal_<bool>>);
215+
template void boost::ut::reporter_junit<>::on<boost::ut::detail::fatal_<bool>>(events::assertion_pass<boost::ut::detail::fatal_<bool>>);
216+
template void boost::ut::reporter_junit<>::on<boost::ut::detail::fatal_<bool>>(events::log<boost::ut::detail::fatal_<bool>>);
137217
]==],
138218
},
139219
sources = { "mcpp_generated/boost.ut.cppm" },

0 commit comments

Comments
 (0)