From 3dec4a745f276b056c32c84ddf0bffd90a7c1af6 Mon Sep 17 00:00:00 2001 From: Yaraslau Tamashevich Date: Wed, 12 Aug 2026 09:01:01 +0300 Subject: [PATCH 1/2] ci: add /bigobj to morph_forms_demo for MSVC Debug builds main.cpp instantiates schema/rule templates over every demo action type. Under the cl-debug preset (MSVC, full /Zi debug info, no /Og folding) this pushes main.cpp.obj's COFF section count past the 32-bit SN_LOFF format's limit, and MSVC aborts with C1128 ("number of sections exceeded object file format limit"). /bigobj switches to the extended section-count format; harmless on Release and on other compilers, so it is applied unconditionally (guarded by CXX_COMPILER_ID:MSVC) to this one target. Co-Authored-By: Claude Sonnet 5 --- examples/forms/CMakeLists.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/examples/forms/CMakeLists.txt b/examples/forms/CMakeLists.txt index 0a035912..45a6a718 100644 --- a/examples/forms/CMakeLists.txt +++ b/examples/forms/CMakeLists.txt @@ -9,6 +9,17 @@ add_executable(morph_forms_demo main.cpp) target_link_libraries(morph_forms_demo PRIVATE morph::morph) apply_warnings(morph_forms_demo) +# main.cpp instantiates schema/rule templates over every demo action type; +# under MSVC Debug (more sections per symbol than Release: no /Og folding, +# full /Zi debug info) that pushes main.cpp.obj's COFF section count past the +# 32-bit SN_LOFF format's limit -- MSVC then aborts with C1128 ("number of +# sections exceeded object file format limit"). /bigobj switches the object +# file to the extended section-count format; harmless on Release and on +# other compilers, so it is unconditional for this target. +target_compile_options(morph_forms_demo PRIVATE + $<$:/bigobj> +) + if(DEFINED AF_SANITIZER) apply_sanitizers(morph_forms_demo ${AF_SANITIZER}) endif() From c560d21509ec16d34da71a0b048d9f437f1cc403 Mon Sep 17 00:00:00 2001 From: Yaraslau Tamashevich Date: Wed, 12 Aug 2026 09:01:14 +0300 Subject: [PATCH 2/2] docs: fix two Doxygen doc-completeness/parse failures forms.hpp: the second equals() overload's @brief opened an inline code span with a backtick right before a "///" line break (equals(&A::code, then "X")) on the next line, inside a Qt-autobrief @brief. Doxygen lost the parameter/return docs that followed, reporting them as undocumented even though @tparam/@param/@return were all present. Confirmed by isolating each overload in turn: renaming the second overload made Doxygen point at it specifically, not the first, ruling out an overload-association mixup. Rewrapping the brief so the code span opens and closes on the same line fixes it. wire.hpp: EscapingWriteOpts's doc comment contains a single unpaired literal double-quote character ("...or a double-quote earlier in the same string..."), making the block's total count of literal double-quote characters odd. Bisected with byte-exact reproductions down to a single line: Doxygen's comment lexer tracks quote parity across the whole comment block, and an odd count leaves it in a bad state that surfaces later as a bogus "end of comment block while expecting command " error once the block closes. Rewording to name the character in prose instead of using a bare quote glyph fixes it. Both verified against Doxygen 1.17.0 (the version CI installs explicitly in .github/workflows/docs.yml) via "cmake --build build --target doc": exit 0, zero "is not documented" or parse-error lines. Co-Authored-By: Claude Sonnet 5 --- include/morph/core/wire.hpp | 2 +- include/morph/forms/forms.hpp | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/include/morph/core/wire.hpp b/include/morph/core/wire.hpp index b9a7f3de..f44747ee 100644 --- a/include/morph/core/wire.hpp +++ b/include/morph/core/wire.hpp @@ -301,7 +301,7 @@ namespace detail { /// anywhere serializes to JSON the peer's `decode` then throws on. /// - **Silent corruption.** Worse, the writer's chunked fast path mangles such a /// byte outright once the string also contains an escaped character: with a -/// `\\` or `"` earlier in the same string, a 0x0B at certain offsets is written +/// backslash or double-quote character earlier in the same string, a 0x0B at certain offsets is written /// as *two* 0x00 bytes. The payload is destroyed before it reaches the wire, /// so no amount of post-processing on the serialized form can recover it — /// the escaping has to happen inside the writer. diff --git a/include/morph/forms/forms.hpp b/include/morph/forms/forms.hpp index 3a0ef2a7..d2e5c8c8 100644 --- a/include/morph/forms/forms.hpp +++ b/include/morph/forms/forms.hpp @@ -991,8 +991,9 @@ template return Equals{field, std::move(literal)}; } -/// @brief `equals` overload for a string-literal argument (`equals(&A::code, -/// "X")`), so callers do not have to spell `std::string{"X"}` explicitly. +/// @brief `equals` overload for a string-literal argument +/// (`equals(&A::code, "X")`), so callers do not have to spell +/// `std::string{"X"}` explicitly. /// /// The literal is captured inline as a `detail::LiteralString`, not copied into a /// `std::string`, so the resulting node stays a literal type and the documented