<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: COMMENTERTHE9</title>
    <description>The latest articles on DEV Community by COMMENTERTHE9 (@commenterthe9).</description>
    <link>https://dev.to/commenterthe9</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3823333%2F1af4f546-b6c0-4597-9d66-05fe6c618387.png</url>
      <title>DEV Community: COMMENTERTHE9</title>
      <link>https://dev.to/commenterthe9</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/commenterthe9"/>
    <language>en</language>
    <item>
      <title>Cx Dev Log — 2026-07-04</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Sun, 05 Jul 2026 02:43:00 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-07-04-2462</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-07-04-2462</guid>
      <description>&lt;p&gt;Handles in Cx have taken a big step forward with two key commits now on submain. The Handle type has finally become a real machine value processed through Cranelift, marking a major milestone for Phase 8 Round 2.&lt;/p&gt;

&lt;h2&gt;
  
  
  The packed-i64 Representation
&lt;/h2&gt;

&lt;p&gt;In Cx, a Handle is straightforward: a packed single i64 represented by &lt;code&gt;slot | (gen &amp;lt;&amp;lt; 32)&lt;/code&gt;. Both &lt;code&gt;slot&lt;/code&gt; and &lt;code&gt;gen&lt;/code&gt; are unsigned u32s and we use a u64 reinterpretation to avoid any sign-extension issues. Specifically, &lt;code&gt;lower_type(SemanticType::Handle(_))&lt;/code&gt; outputs an &lt;code&gt;IrType::I64&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Handling these machine values required placing runtime state in a &lt;code&gt;HandleRegistry&amp;lt;i64&amp;gt;&lt;/code&gt; behind a &lt;code&gt;OnceLock&amp;gt;&lt;/code&gt; static in &lt;code&gt;host_boundary.rs&lt;/code&gt;. This setup is a workaround for Cranelift limitations. The constraint? &lt;code&gt;jit_builder.symbol()&lt;/code&gt; relies on raw function pointers, not state-capturing closures. Safety here comes from &lt;code&gt;run_jit_subprocess&lt;/code&gt; which isolates states by using fresh OS processes for each fixture, preventing cross-test state carryover.&lt;/p&gt;

&lt;p&gt;A helper, &lt;code&gt;widen_handle_payload_to_i64&lt;/code&gt;, converts inner expressions' lowered types to i64 but only for &lt;code&gt;{I8, I16, I32, I64, Bool}&lt;/code&gt; types. Notably excluded are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ptr&lt;/strong&gt;: We'd face the &lt;code&gt;Handle&amp;lt;str&amp;gt;&lt;/code&gt; issue, where a raw scalar or a string descriptor pointer could confuse operations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;F64&lt;/strong&gt;: This would lead to silent truncation, not suitable for types requiring round-trip fidelity. Consideration here is crucial, reflecting intentional design rather than future work placeholders.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Handle.val and the Out-parameter Approach
&lt;/h2&gt;

&lt;p&gt;Reading the value (commit D2.5b) posed more challenges than expected. Our initial "uniform-i64" hypothesis didn't hold water due to strict type equality required downstream. Instead, HandleVal's semantic design uses I128, not i64, so handling it involves widening the i64 payload via sign-extending Cast to output a legitimate &lt;code&gt;IrType::I128&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For validity checks, an out-parameter is used instead of sentinels, given that the slot+gen packed space leaves no room for reserved bit patterns without conflicts. &lt;code&gt;_cx_handle_val(handle: i64, out_valid: *mut i8) -&amp;gt; i64_&lt;/code&gt; performs the out-parameter check and defaults to &lt;code&gt;IrTerminator::Trap&lt;/code&gt; if invalid. The reuse of the Alloca/Store/Load pattern, similar to Results, adapts well, though a single-byte slot suffices here.&lt;/p&gt;

&lt;p&gt;Though the Trap path is hardwired, we can't yet test invalid handles through current Cx code; since there’s neither HandleDrop nor uninitialized reads. The real testing awaits D2.5c alongside generational reuse that will naturally generate stale handles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handle+Array Composition Success
&lt;/h2&gt;

&lt;p&gt;A third commit by early July 3rd confirmed the correctness of Handle+array composition. An earlier syntax error audit, using &lt;code&gt;arr[i]&lt;/code&gt; instead of the correct &lt;code&gt;arr:[i]&lt;/code&gt;, had been resolved. Now, Handles in array literals process and return expected results. Notably, the &lt;code&gt;t_handle_array_no_drop&lt;/code&gt; fixture confirms this improvement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test Matrix Progress
&lt;/h2&gt;

&lt;p&gt;The matrix on submain now stands at 297/0 after rising from 292. Parity scores are 237 PASS / 60 SKIP / 0 PARITY_FAIL across this set. Recent commits introduced several new fixtures, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;t_handle_construct_cross_fn&lt;/code&gt; (from D2.5a, provisional)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;t_handle_val_positive&lt;/code&gt; (standard round-trip case)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;t_handle_val_negative&lt;/code&gt; (tests for sign-extension)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;t_handle_val_bool&lt;/code&gt; (validates discrimination)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Currently, all updates remain within submain, with main unchanged.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;Up next is the HandleDrop (D2.5c), set to handle generational reuse and empirically prove the stale-handle Trap path. An integration point approaches with submain now four commits ahead of v0.3.0 and a merge to main beckons. Still in the wings are DotAccess updates in compound forms, alongside uncommitted tutorial rewrites—280 lines ready to fit into the broader narrative.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-07-04" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-07-04&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-06-28</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Mon, 29 Jun 2026 00:10:00 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-06-28-48oe</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-06-28-48oe</guid>
      <description>&lt;p&gt;Labeled break/continue is now live across the entire Cx language stack. From the lexer to the JIT, two commits streamlined the implementation into a complete vertical slice. No parts left out, no corners cut—everything just works.&lt;/p&gt;

&lt;h2&gt;
  
  
  The lexer seam
&lt;/h2&gt;

&lt;p&gt;If you're handling character literals and labels in the same codebase, you'll know what a pain this can be. We opted for a Rust-like syntax: &lt;code&gt;'ident&lt;/code&gt; for labels, with no closing quote. The label regex sits right after &lt;code&gt;LiteralChar&lt;/code&gt; in the logos enum. Thanks to longest-match, &lt;code&gt;'x'&lt;/code&gt; becomes a char literal, while &lt;code&gt;'outer&lt;/code&gt; is parsed as a label. Escape sequences? They can't match labels because they have a backslash, making &lt;code&gt;'x'&lt;/code&gt; always look cleaner in code. A test fixture (&lt;code&gt;t_char_literal_guard&lt;/code&gt;) ensures this order and regex integrity hold. Change the lexer rules, and it'll catch any mistakes immediately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two-commit split
&lt;/h2&gt;

&lt;p&gt;We didn't cram this into a single mega-commit. No, we split it into two. Commit &lt;code&gt;f94c6a5&lt;/code&gt; laid down the frontend groundwork—adding the &lt;code&gt;Label&lt;/code&gt; token, allowing loops and breaks to carry optional labels, and rejecting any misuse with semantic checks. The interpreter and JIT, however, initially took a back seat, guarding themselves against mislabeled jumps.&lt;/p&gt;

&lt;p&gt;Then came commit &lt;code&gt;0f56f1e&lt;/code&gt;, which wiped out these guards and enabled real execution on backends. Now all parses and semantic checks play nicely without rogue labeled breaks sneaking into the wrong loops.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interpreter changes
&lt;/h2&gt;

&lt;p&gt;The interpreter now handles &lt;code&gt;BreakSignal&lt;/code&gt; and &lt;code&gt;ContinueSignal&lt;/code&gt; carrying labels. Loops catch these signals when the label is either absent (defaulting to the innermost loop) or matches their own. The difference from before? Zero unlabelled break/continue behavior change while facilitating outward jumps.&lt;/p&gt;

&lt;h2&gt;
  
  
  JIT changes
&lt;/h2&gt;

&lt;p&gt;The JIT saw more extensive adjustments, gaining a label field within &lt;code&gt;LoopContext&lt;/code&gt;. Push and pop that context on a stack, trace it through lowering calls, and you've got labeled jumps pinpointed. The unlabeled jumps? They get the same treatment as before by taking the top of the stack. Existing codegen remains untouched, minus this stack expansion for labeled functionality.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test fixtures
&lt;/h2&gt;

&lt;p&gt;To solidify all this, we introduced four new test fixtures. Semantic rejections? Covered. Breaking and continuing to outer loops? Nailed. This test suite now boasts stability: 292 pass, 0 fail. &lt;/p&gt;

&lt;h2&gt;
  
  
  Other changes
&lt;/h2&gt;

&lt;p&gt;We've also logged a packed-i128 representation and updated the &lt;code&gt;?&lt;/code&gt; operator details on the site branch (&lt;code&gt;07bef03&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Labeled breaks dug into the core of &lt;code&gt;semantic.rs&lt;/code&gt; and &lt;code&gt;lower.rs&lt;/code&gt;, setting the stage for optimizing &lt;code&gt;when&lt;/code&gt; block lowering. Projects like DotAccess in compound forms and dynamic strings are still in queue, waiting for their time in the spotlight. But, the submain branch grows restless, 26 commits ahead and aging since its last merge—no regressions, just merge delays.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-06-28" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-06-28&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-06-27</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Sun, 28 Jun 2026 02:42:44 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-06-27-1lgc</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-06-27-1lgc</guid>
      <description>&lt;p&gt;Result just crossed a major compiler boundary in Cx, marking a significant step forward in our error handling journey. Two key commits have successfully integrated the packed-i128 representation and introduced the ? (Try) operator within the JIT pathway. Let's explore how these changes shape the overall architecture and what they mean for developers working with Cx.&lt;/p&gt;

&lt;h2&gt;
  
  
  The packed-i128 representation
&lt;/h2&gt;

&lt;p&gt;Storing &lt;code&gt;Result&lt;/code&gt; as a packed i128 turned out to be an interesting technical challenge. We split the i128 into a tag and a payload, with the high 64 bits reserved for the tag (Ok = 0, Err = 1) and the low for the payload. The goal was to maintain clear separation without arithmetic packing, which would risk sign-extension messing up the tag when handling negative payloads. Instead, we opted for a memory round-trip approach: allocate, store, and then load both parts into a single i128. This method is mechanically heavier but it confidently preserves data integrity—an essential choice.&lt;/p&gt;

&lt;p&gt;One key safeguard is a canary fixture named &lt;code&gt;t_result_ok_negative.cx&lt;/code&gt;, ensuring negative payloads don't corrupt the tag. Any future attempt to optimize this away would trigger the test.&lt;/p&gt;

&lt;p&gt;On the Cranelift front, we had to tweak the settings a bit with &lt;code&gt;enable_llvm_abi_extensions&lt;/code&gt; in &lt;code&gt;host_boundary.rs&lt;/code&gt; to handle i128 arguments correctly. It’s a small but critical adjustment to maintain byte-for-byte output consistency between JIT and interpreter.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ? operator
&lt;/h2&gt;

&lt;p&gt;Bringing the &lt;code&gt;expr?&lt;/code&gt; operator into the picture with D2.4b required an ingenious unpacking process. Here, the packed i128 unpacks using &lt;code&gt;result_unpack&lt;/code&gt;, allowing us to branch on the tag. For an Ok tag, execution proceeds by narrowing the payload back into its original form. For an Err, we return the entire i128 early, preserving error data consistency to the caller.&lt;/p&gt;

&lt;p&gt;Importantly, Cx's semantic analyzer ensures &lt;code&gt;?&lt;/code&gt; is context-appropriate—enforcing its use only within Result-returning functions. This preemptive check simplifies the lowering and avoids unnecessary runtime consistency checks.&lt;/p&gt;

&lt;p&gt;It's worth noting that the Result usage is bounded by T's ability to fit within a single i64 word. While this decision limits nested Results, it keeps us honest about representation constraints and prevents unknown behavior, clearly marking where further work lies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example suite rewrite
&lt;/h2&gt;

&lt;p&gt;Apart from the core changes, the &lt;code&gt;examples/&lt;/code&gt; directory got a fresh, comprehensive rewrite. The examples now include more intuitive code patterns, richer demonstrations, and polished documentation. The &lt;code&gt;error_handling.cx&lt;/code&gt; example stands out, showcasing the Result and &lt;code&gt;?&lt;/code&gt; operator now viable due to these backend improvements. These changes, though uncommitted, prepare the ground for developers to see these new capabilities in action, adding roughly 280 lines across the suite.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Our upcoming focus is on D2.4c, addressing equality routing for Result types. While &lt;code&gt;assert_eq&lt;/code&gt; functions effortlessly for Result due to i128 equality on Ok tags, Err comparison will rely on &lt;code&gt;cx_str_eq&lt;/code&gt; for fairness on strings. These finer routing details are pivotal for robust error-type handling.&lt;/p&gt;

&lt;p&gt;Meanwhile, the example documentation overhaul is pending commit. The error-handling example, central to our recent changes, waits in the wings for the new commits to merge into main, already 24 commits behind the action.&lt;/p&gt;

&lt;p&gt;Looking ahead, our roadmap includes tackling dynamic strings (R6) and DotAccess in compound forms to complete Phase 11. Parity benchmarks have already improved with 229 tests passing out of 287 on submain, whereas main lingers a bit behind.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-06-27" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-06-27&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-06-26</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Sat, 27 Jun 2026 00:08:17 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-06-26-1kbf</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-06-26-1kbf</guid>
      <description>&lt;p&gt;No code landed today. No commits from the developer across any branch for the second day in a row. The only repo activity was automated: yesterday's daily log commit and a site blog post. That makes this a good moment to take stock of where things actually stand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Static strings are done, dynamic strings are not
&lt;/h2&gt;

&lt;p&gt;The static string subset (D2.3a through D2.3d) shipped to submain and has been stable for about 48 hours now. That covers &lt;code&gt;len()&lt;/code&gt; constant folding, string literal lowering, concat folding with content equality, and string interpolation with f64 print support. Everything that can avoid runtime allocation is handled.&lt;/p&gt;

&lt;p&gt;The next real frontier is R6: dynamic strings. This means runtime allocation, lifetime management, and a new string representation. It is a qualitative step up from the static work. It has been the predicted next move on daily logs for ten consecutive days now, but no work on it has started yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  The submain-to-main gap keeps growing
&lt;/h2&gt;

&lt;p&gt;Submain is 22 commits ahead of main. The last merge (PR #295) was 21 days ago. The test matrix on submain is clean at 286 pass / 0 fail, with parity numbers at 222 pass / 64 skip / 0 parity fail. Main sits at 230 pass / 0 fail out of 230.&lt;/p&gt;

&lt;p&gt;There is no technical blocker to merging. The gap is just growing through inertia.&lt;/p&gt;

&lt;h2&gt;
  
  
  The daily-log PR backlog
&lt;/h2&gt;

&lt;p&gt;There are at least 10 open daily-log PRs (June 16 through 25, PRs #308 through #317), and none have been merged. The last daily-log PR that actually landed on main was from late May. This matters because those PRs carry roadmap updates that check off real completed work: range-check hardening (CR#1 through 4), arithmetic safety gates, &lt;code&gt;when&lt;/code&gt; block lowering, unknown/TBool lowering, and the full static string subset. Main's ROADMAP.md still reads "Last updated: 2026-05-18," which is over five weeks stale.&lt;/p&gt;

&lt;p&gt;The roadmap on main does not reflect the current state of the project. Anyone looking at main alone would have no idea that the static string subset is done.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is actually next
&lt;/h2&gt;

&lt;p&gt;The same three items that have been predicted for the last ten days remain the natural continuation:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic strings (R6)&lt;/strong&gt; is the clearest technical frontier. It requires allocation infrastructure that does not exist yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Merging submain to main&lt;/strong&gt; would close the 22-commit gap and bring the roadmap current. Zero regressions stand in the way.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DotAccess in compound forms&lt;/strong&gt; is the last unchecked non-string item under Phase 11.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Two rest days in a row might mean the developer is away or working on something outside this repo. When work does resume, any of these three would move the project forward.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-06-26" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-06-26&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-06-25</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Fri, 26 Jun 2026 00:09:05 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-06-25-3ef2</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-06-25-3ef2</guid>
      <description>&lt;p&gt;No code landed today. The static string subset wrapped up yesterday with D2.3d (print-time interpolation and f64 print lowering), and today was a genuine pause. Sometimes those are worth documenting too, because the project state right now is interesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Static strings: done
&lt;/h2&gt;

&lt;p&gt;The D2.3a through D2.3d arc is complete on submain. The JIT now handles string literals, compile-time concatenation, content equality, and print-time string interpolation. Every string operation that can avoid runtime allocation is covered.&lt;/p&gt;

&lt;p&gt;The approach to interpolation is worth noting: &lt;code&gt;print("a {x} b")&lt;/code&gt; decomposes at lowering into a sequence of inline prints rather than building a new string in memory. That was a deliberate design call to keep R6 (dynamic string allocation) out of scope for this batch. It works for print statements; string interpolation in general expression context will need the allocation infrastructure that R6 brings.&lt;/p&gt;

&lt;p&gt;The parity numbers tell the story. Submain sits at 222 PASS / 64 SKIP / 0 PARITY_FAIL across 286 fixtures. Those 64 SKIPs are the dynamic string cases and JIT-unsound paths that need R6 or bounds checking to resolve. Main's matrix holds steady at 230/0.&lt;/p&gt;

&lt;h2&gt;
  
  
  The merge gap
&lt;/h2&gt;

&lt;p&gt;Submain is now 22 commits ahead of main. The last merge was PR #295 (the v0.2.0 batch), and that was 20 days ago. Every daily log for over a week has predicted a submain-to-main merge, and it keeps not happening.&lt;/p&gt;

&lt;p&gt;There are zero regressions on submain and no merge conflicts expected. The accumulated work includes range-check hardening, arithmetic safety gates, when block lowering, the full static string arc, and multiple rounds of parity improvements. It is a lot of verified work sitting in a branch.&lt;/p&gt;

&lt;p&gt;This is not a technical blocker. It is just a prioritization pattern where new feature work keeps winning over integration. At some point the gap gets unwieldy enough that the merge itself becomes a task worth scheduling explicitly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Roadmap catch-up
&lt;/h2&gt;

&lt;p&gt;The roadmap on main was last updated 2026-05-18, which is over five weeks stale. Today's daily log branch brought it current by checking off all the submain work through D2.3d: range-check hardening (CR#1-4), arithmetic safety gates, when block lowering, and the full static string series. No new tasks were added since the natural next steps are already represented in existing items.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is next
&lt;/h2&gt;

&lt;p&gt;The next real frontier is R6: dynamic strings. Everything the JIT handles today involves strings that are fully known at compile time or decomposed into inline print sequences. Dynamic concatenation with runtime operands, string values flowing through non-print expression contexts, runtime string construction -- all of that requires allocation infrastructure, lifetime management, and potentially a new string representation.&lt;/p&gt;

&lt;p&gt;That is a qualitative step up from the static subset. The static string work was a series of lowering patterns and host callbacks. R6 means building actual memory management into the runtime.&lt;/p&gt;

&lt;p&gt;The other long-deferred item is DotAccess in compound forms, the last unchecked non-string Phase 11 sub-item. It has been predicted in every daily log for over a week and not started. Whether it gets picked up before or after R6 remains to be seen.  &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-06-25" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-06-25&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-06-24</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Thu, 25 Jun 2026 00:07:39 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-06-24-17e5</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-06-24-17e5</guid>
      <description>&lt;p&gt;Two significant commits hit submain today, closing out the static string subset for the JIT. D2.3d brings print-time string interpolation and f64 print support, and D2.3c adds compile-time literal string concatenation and content equality. The commit sequence moved our parity numbers from 215/71/0 to 222/64/0 across 286 fixtures—submain is advancing fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  D2.3d: print-time interpolation and f64
&lt;/h2&gt;

&lt;p&gt;This is the heavyweight commit. We've got &lt;code&gt;print("a {x} b")&lt;/code&gt; now breaking down into an inline print sequence during lowering. No runtime string construction here; we're passing literals and values through type-suited intrinsics and completing the statement with a &lt;code&gt;cx_print_newline&lt;/code&gt;. The aim? Completely sidestep R6 by avoiding dynamic string allocation.&lt;/p&gt;

&lt;p&gt;We diverged from the interpreter in a couple of nuanced areas: shadowed names after exiting inner blocks and handling use-before-declaration. Neither scenario is covered by current fixtures, so it's deliberate, not a silent ship. It's linked to an ongoing interpolation-scoping question we've been nudging down the road.&lt;/p&gt;

&lt;p&gt;Five new host intrinsics are onboarded in &lt;code&gt;HostBoundary&lt;/code&gt;— &lt;code&gt;cx_print_str_inline&lt;/code&gt;, &lt;code&gt;cx_printn_inline&lt;/code&gt;, &lt;code&gt;cx_print_bool_inline&lt;/code&gt;, &lt;code&gt;cx_print_f64_inline&lt;/code&gt;, and &lt;code&gt;cx_print_newline&lt;/code&gt;. Normal print behavior remains unchanged.&lt;/p&gt;

&lt;p&gt;f64 print also gets support. Now, &lt;code&gt;print(some_f64)&lt;/code&gt; takes the &lt;code&gt;cx_print_f64_inline&lt;/code&gt; path, aligning with the interpreter's method using Rust's &lt;code&gt;Display&lt;/code&gt;. Previously, f64 was completely off the table for print. Updated fixtures &lt;code&gt;t75_string_interpolation&lt;/code&gt; and &lt;code&gt;t55_f64_basic&lt;/code&gt; confirm byte-for-byte matches with interpreter output.&lt;/p&gt;

&lt;h2&gt;
  
  
  D2.3c: literal concat folding and string equality
&lt;/h2&gt;

&lt;p&gt;Technically slightly before midnight, this commit went live on June 23. The &lt;code&gt;str + str&lt;/code&gt; concatenation collapses compile-time-known operands into one static descriptor at lowering time—employing the static leak mechanism similar to D2.3b, with runtime skipping beyond R6.&lt;/p&gt;

&lt;p&gt;For content equality, we added a &lt;code&gt;cx_str_eq(a_desc, b_desc)&lt;/code&gt; callback. It handles descriptors by checking length and &lt;code&gt;memcmp&lt;/code&gt;. &lt;code&gt;!=&lt;/code&gt; is simply &lt;code&gt;==&lt;/code&gt; negated. String equality checks, like &lt;code&gt;assert_eq&lt;/code&gt;, follow this route. Five fixtures transitioned: &lt;code&gt;t_concat_basic&lt;/code&gt;, &lt;code&gt;t_concat_chain&lt;/code&gt;, &lt;code&gt;t_concat_empty&lt;/code&gt;, &lt;code&gt;t_concat_eq&lt;/code&gt;, &lt;code&gt;t78_assert_eq_strings&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Static string subset: done
&lt;/h2&gt;

&lt;p&gt;With D2.3d in, our static string subset is complete. JIT now rolls with string literals, compile-time concat, content equality, and print-time interpolation. Anything necessitating runtime allocation—like dynamic concatenation of non-literals—remains deferred to R6. We've defined a clean boundary: no heap-allocated string type, no dynamic work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Submain gap keeps growing
&lt;/h2&gt;

&lt;p&gt;There's a 22-commit gulf between submain and main. Submain stands at 222/64/0 across 286 fixtures, while main hovers at 230/230. This separation spans 19 days and counting; predictions of a merge have been off for eight straight days. No technical hurdles in sight—submain's ready.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Next up is R6 (dynamic strings), signaling a big leap beyond static strings. This means allocation, lifetime management, maybe revisiting the string representation. DotAccess in compound forms is the loose end of Phase 11, predicted for eight days now—a start is overdue. The submain merge remains our best low-effort/high-impact move.  &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-06-24" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-06-24&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-06-20</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Sun, 21 Jun 2026 00:06:34 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-06-20-2598</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-06-20-2598</guid>
      <description>&lt;p&gt;Six weeks without new code might sound like development downtime, but in reality, the Cx project's roadmap had a few cobwebs that needed addressing. Imagine working with an ever-evolving roadmap, only to find out that confirmed work wasn't synchronized with the larger picture. That's exactly what happened with Cx — a six-week lag in roadmap updates was finally reconciled, albeit with no new commits landing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Roadmap reconciliation
&lt;/h2&gt;

&lt;p&gt;The drift in the roadmap file dates back to May 18, with a slew of confirmed work on submain going MIA from the living document. The gap? Closed today. Essential updates were added, marking the completion of the &lt;code&gt;when&lt;/code&gt; block lowering trilogy in Phase 11. While these were previously committed on submain, they hadn't made it to the roadmap:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;D1.2a&lt;/strong&gt;: Unified statement/expression handling
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;D2.1&lt;/strong&gt;: If-expression merging via shared branch-value blocks
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;D2.2&lt;/strong&gt;: Implemented tag-only enum construct and match using &lt;code&gt;variant_id&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other significant updates include post-release hardening details with the CR#1-4 fixes series, which tighten up range checks. Furthermore, the Gate-1a through 2b JIT safety checks were documented, addressing potential arithmetic vulnerabilities—highlighting the period from June 6 to June 15.&lt;/p&gt;

&lt;p&gt;Parity numbers reflected this hidden progress, adjusting from a stale state to current figures: 205/81/0 out of 286 fixtures, with the frontend matrix ticking up from 182 to 230. What does this signify? Real strides in development, previously invisible in the roadmap.&lt;/p&gt;

&lt;h2&gt;
  
  
  The submain gap continues
&lt;/h2&gt;

&lt;p&gt;Submain is racing ahead, 16 commits beyond the main, devoid of any regressions. Since the last merge on June 5, the gap widened — 15 days of clean contributions still waiting to be merged. This backlog comprises the entirety of the range-check series, all arithmetic safety gates, and the aforementioned &lt;code&gt;when&lt;/code&gt; block trilogy, all yet to reach the main.&lt;/p&gt;

&lt;p&gt;The merge appears risk-free on paper; yet, it remains in the queue, stuck in development limbo — the ongoing saga of this development log.&lt;/p&gt;

&lt;h2&gt;
  
  
  The daily-log PR backlog
&lt;/h2&gt;

&lt;p&gt;PRs remain unresolved from June 13 through June 20, continuing the trend of pending merges. Much like the main/submain situation, a backlog of clean and handy PRs waits, grounded in non-technical bottlenecks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Predictions vs. reality
&lt;/h2&gt;

&lt;p&gt;Anticipations for June 19: DotAccess in compound forms, a submain merge, unknown-value lowering, and clearing the daily-log PR backlog. Result? None materialized. Notably, DotAccess, the remaining to-do for Phase 11, hasn't been initiated despite repeated predictions. This marks it as a likely candidate for priority when development resumes in full swing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Priorities steadfastly persist:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;DotAccess in compound forms&lt;/strong&gt;: The solitary piece to complete Phase 11. Clearly marked as the starting point when work kicks back into active gear.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Submain merging to main&lt;/strong&gt;: Sixteen commits, zero regressions — straightforward.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unknown-value lowering (D2.x)&lt;/strong&gt;: Marked as a blocker in D2.2's commit notes, critical for test fixtures like &lt;code&gt;t47_edge_mix&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase 8 Round 2&lt;/strong&gt;: Incorporates str/strref layout updates, Handle adjustments, and TBool calling conventions, anticipated post-Phase 11.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Today may have been about documentation cleanup, replacing development with roadmap accuracy. Significant groundwork sits on submain, queued to bring more substantial updates when they inevitably land.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-06-20" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-06-20&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-05-18</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Wed, 17 Jun 2026 00:09:19 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-05-18-3a56</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-05-18-3a56</guid>
      <description>&lt;p&gt;Two big threads today: the ongoing push towards backend determinism in submain and a solid feature wrap-up that brings the while-in loop full source-to-IR lowering. That while-in loop is finally closing its parity gaps.&lt;/p&gt;

&lt;h2&gt;
  
  
  While-in Loop Source-to-IR Lowering
&lt;/h2&gt;

&lt;p&gt;Particularly noteworthy is CX-233. It replaces the previous &lt;code&gt;unsupported!("WhileIn")&lt;/code&gt; stub with a full-blown &lt;code&gt;lower_while_in_single&lt;/code&gt; function. You're looking at roughly 210 lines of new IR lowering in &lt;code&gt;src/ir/lower.rs&lt;/code&gt;. This implementation's core is a 5-block CFG: entry, header (where counter comparison kicks in), body (think array element loading via &lt;code&gt;PtrOffset&lt;/code&gt; and stride multiplication, followed by storing to &lt;code&gt;start_slot&lt;/code&gt;, then executing body statements), increment (adding to counter and looping back to header), and finally, exit.&lt;/p&gt;

&lt;p&gt;Here’s what’s interesting technically:&lt;/p&gt;

&lt;p&gt;Switching between &lt;code&gt;CompareOp::Le&lt;/code&gt; and &lt;code&gt;CompareOp::Lt&lt;/code&gt; in the header for inclusive vs exclusive range is what handles range checks. For iterators, the code navigates through &lt;code&gt;then_chains&lt;/code&gt;, threading the active block through each &lt;code&gt;lower_while_in_single&lt;/code&gt; call, which makes chained iteration click without special routing or exceptions.&lt;/p&gt;

&lt;p&gt;On semantics, &lt;code&gt;arr_binding&lt;/code&gt; (BindingId) and &lt;code&gt;arr_ty&lt;/code&gt; (SemanticType) are passed through the WhileIn AST node and chained thens. Opting to address the array variable with &lt;code&gt;lookup_var&lt;/code&gt; during semantic analysis rather than at IR time maintains consistency with other paths' approach to binding metadata.&lt;/p&gt;

&lt;p&gt;The tests reflect improvement: WhileLoop parity climbed from 6 PASS / 2 SKIP to 8 PASS / 0 SKIP. t34 (while-in range-based) and t35 (while-in-then) tests are passing. Markedly, this is the introductory ranged iteration construct receiving full IR lowering. This branch with changes sits in &lt;code&gt;origin/stokowski/CX-233&lt;/code&gt;, awaiting the green light from the PR review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backend Determinism Train Rolling Into Submain
&lt;/h2&gt;

&lt;p&gt;Rolling over to PR #268, we’ve got the &lt;code&gt;train/backend-determinism&lt;/code&gt; branch landing into submain. This involves a strategic approach—gather related determinism and parity efforts into a "train" of tickets (CX-223 through CX-230 in this case), then pushing them in with a single merge PR.&lt;/p&gt;

&lt;p&gt;That merge is no slouch: affecting 28 files, with &lt;code&gt;host_boundary.rs&lt;/code&gt; witnessing the most impact (+2494/-588 lines) due to determinism test suites lining up from multiple instruction categories spanning those tickets. &lt;code&gt;ir/lower.rs&lt;/code&gt; gains (+144) while &lt;code&gt;diff_harness.rs&lt;/code&gt; follows with (+116), alongside documentation tweaks to JIT's determinism and parity guides.&lt;/p&gt;

&lt;h2&gt;
  
  
  New Parity Fixtures: CX-228
&lt;/h2&gt;

&lt;p&gt;Inside the train branch, CX-228 delivers a hefty 19 new &lt;code&gt;.cx&lt;/code&gt; test fixtures to the verification matrix. Among them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Direct calls: covering implicit and explicit return, zero-arg runs, chains, forward declarations, and recursive forms.&lt;/li&gt;
&lt;li&gt;Unary operations like neg int and not bool.&lt;/li&gt;
&lt;li&gt;Various infinite loop models.&lt;/li&gt;
&lt;li&gt;Compound assignments within functions.&lt;/li&gt;
&lt;li&gt;Builtin assert/assert_eq.&lt;/li&gt;
&lt;li&gt;t128 arithmetic quirks.&lt;/li&gt;
&lt;li&gt;Constant declarations with block scope shadowing.&lt;/li&gt;
&lt;li&gt;Implementation details for basics, return scenarios, and multiple aliasing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bumping the fixture tally to t159 through t177 using current test numbering.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Submain-Main Gap Isn't Shrinking
&lt;/h2&gt;

&lt;p&gt;Submain stands 171 commits forward of main, creeping up from 164 just two days prior. This has hit the radar in each log since May 6, ballooning from 16 on May 7 to 171 at present. There’s no technical blockade for the merge. The matrix is solid at 117 PASS / 0 FAIL; it’s strictly merge lag, yet risk compounds with inaction.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's in the Pipeline
&lt;/h2&gt;

&lt;p&gt;First on deck is charting CX-233 into submain—a straight, single-commit enhancement clearing the final WhileLoop parity gap. Coming up next, target remaining parity objectives: the VariableDecl, DirectCall, InfiniteLoop, and BuiltinAssert segments still showing SKIPs.&lt;/p&gt;

&lt;p&gt;The bridge from submain to main merge remains unresolved. At 171 commits, it’s never been wider for this project.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-05-18" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-05-18&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-05-19</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Tue, 16 Jun 2026 00:09:03 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-05-19-3cmh</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-05-19-3cmh</guid>
      <description>&lt;p&gt;No new code landed in the last 24 hours. The activity was entirely infrastructure: a blog post for the May 9 dev log was published to the site, &lt;code&gt;run_matrix.sh&lt;/code&gt; picked up an execute-permission fix, and the May 18 daily log was pushed to its branch. The matrix holds steady at 117 PASS / 0 FAIL. Days like this are worth documenting because the project state between commits still matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually happened
&lt;/h2&gt;

&lt;p&gt;Three commits went out, all from the automated pipeline rather than manual development:&lt;/p&gt;

&lt;p&gt;The May 9 blog post (commit 23672a9) was published to &lt;code&gt;origin/site&lt;/code&gt; as &lt;code&gt;src/content/blog/2026-05-09.mdx&lt;/code&gt;. Content publishing, not code.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;run_matrix.sh&lt;/code&gt; execute permission fix (86901ce) was pushed on the &lt;code&gt;daily-log-2026-05-18&lt;/code&gt; branch. Without the &lt;code&gt;+x&lt;/code&gt; bit, the test matrix script required manual &lt;code&gt;bash run_matrix.sh&lt;/code&gt; invocation instead of &lt;code&gt;./run_matrix.sh&lt;/code&gt;. Small thing, but these permission mismatches cause confusion in CI environments.&lt;/p&gt;

&lt;p&gt;The May 18 daily log itself (1c2bd98) was committed and pushed to &lt;code&gt;origin/daily-log-2026-05-18&lt;/code&gt;, but the PR was never merged to main. That log documented the real work from May 18: CX-233 (while-in IR lowering), CX-228 (19 parity fixtures), and PR #268 (the backend-determinism train merging into submain).&lt;/p&gt;

&lt;h2&gt;
  
  
  The while-in branch is ready and waiting
&lt;/h2&gt;

&lt;p&gt;The most significant thing sitting unmerged is CX-233 on &lt;code&gt;origin/stokowski/CX-233&lt;/code&gt;. This branch implements while-in loop source-to-IR lowering in a 307-line change across four files: &lt;code&gt;src/ir/lower.rs&lt;/code&gt;, &lt;code&gt;src/frontend/semantic.rs&lt;/code&gt;, &lt;code&gt;src/frontend/semantic_types.rs&lt;/code&gt;, and the parity checklist.&lt;/p&gt;

&lt;p&gt;The implementation uses a 5-block CFG: entry, header, body, increment, exit. It threads &lt;code&gt;arr_binding&lt;/code&gt; and &lt;code&gt;arr_ty&lt;/code&gt; through the semantic layer and adds &lt;code&gt;Op::Mul&lt;/code&gt; cursor-deref unary lowering. With this work, WhileLoop parity moves from 6 PASS / 2 SKIP to 8 PASS / 0 SKIP. Once it merges to submain, all loop variants (while, for, while-in, loop/break/continue) will have full source-to-IR lowering.&lt;/p&gt;

&lt;p&gt;The remaining unsupported statement kinds after that merge would be &lt;code&gt;When&lt;/code&gt; (match/when blocks) and &lt;code&gt;EnumDef&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The submain gap
&lt;/h2&gt;

&lt;p&gt;The submain-to-main gap sits at 171 commits, unchanged from May 18. This number has been tracked in every daily log since May 6 and the growth has been steep: 16 on May 7, 40 on May 9, 164 on May 16, 171 on May 18. With CX-233, the actual divergence is 172 commits.&lt;/p&gt;

&lt;p&gt;Nothing is blocking the merge technically. The matrix passes at 117/117. The gap is purely merge latency, and the integration risk grows with every day it stays open.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;The obvious first move is merging CX-233 into submain. It is a clean single-commit PR that closes the last WhileLoop parity gap. After that, the parity targets shift to VariableDecl, DirectCall, InfiniteLoop, and BuiltinAssert categories.&lt;/p&gt;

&lt;p&gt;The submain-to-main merge needs to happen. At 171 commits of divergence, this is not something that gets easier with time.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-05-19" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-05-19&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-05-20</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Mon, 15 Jun 2026 00:10:36 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-05-20-kpf</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-05-20-kpf</guid>
      <description>&lt;p&gt;The JIT backend just saw its most significant leap forward with the latest commits hitting submain. We've locked in method-call lowering, tackled print argument widening, and fixed some key differential harness issues. This single day moved parity forward: from 99 PASS and 83 SKIP to 110 PASS with 72 SKIP, all without hitting any PARITY_FAILs across the board of 182 fixtures.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method-call lowering: synthesis over duplication
&lt;/h2&gt;

&lt;p&gt;We hit a big milestone with method-call lowering — a major code change landed that replaced our previous stub with full end-to-end functionality. The main decision was whether &lt;code&gt;MethodCall&lt;/code&gt; should be treated as a standalone process duplicating existing &lt;code&gt;Call&lt;/code&gt; logic or if it should leverage existing infrastructure. We opted for delegation: at &lt;code&gt;lower.rs:1791&lt;/code&gt;, the &lt;code&gt;MethodCall&lt;/code&gt; now converts the operation into a &lt;code&gt;Call&lt;/code&gt;, using the receiver as the first argument, diving into existing logic rather than creating new pathways. This keeps method dispatch as a streamlined translation layer rather than a cumbersome parallel process.&lt;/p&gt;

&lt;p&gt;With this update, our ingestion process now keeps alias parameters intact, registering methods with modified names (&lt;code&gt;{Struct}${method}&lt;/code&gt;) in the signature table. Thanks to this, new test cases (t175/t176/t177) for basic implementation, return paths, and multi-alias methods passed seamlessly.&lt;/p&gt;

&lt;p&gt;The same commit tackled literal-width narrowing. It highlighted how &lt;code&gt;Numeric&lt;/code&gt; literals matched against typed peers in operations. Instead of a patchwork fix for &lt;code&gt;MethodCall&lt;/code&gt;, the solution incorporated a comprehensive surface-level approach: aiding &lt;code&gt;assert_eq&lt;/code&gt; peer narrowing, across comparative operators, and &lt;code&gt;MethodCall&lt;/code&gt; arguments with the &lt;code&gt;insert_cast_if_needed&lt;/code&gt; function. A dedicated fixture (t178) confirms this refinement: ordering comparisons on narrow integers now clear on all fronts. This commit improved parity by +16 PASS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Print argument widening
&lt;/h2&gt;

&lt;p&gt;One crucial gap was within our &lt;code&gt;cx_printn&lt;/code&gt; runtime intrinsic, which was limited to I64. Enter &lt;code&gt;route_print_arg&lt;/code&gt;: this new helper extends I8/I16/I32 to I64 through casting and guides Bool/TBool to a dedicated &lt;code&gt;cx_print_bool&lt;/code&gt; external. Our approach targets distinct type families rather than one-size-fits-all — integers expand into &lt;code&gt;cx_printn&lt;/code&gt;, booleans take their intrinsic path, and F64/I128 await attention post-version 0.1.&lt;/p&gt;

&lt;p&gt;We saw immediate resonance in these updates: a +11 PASS jump with no steps back. Fixtures t01 and t115 succeeded at last, and bool outputs aligned with interpreter outcomes. Gaps still exist but aren't our intrinsic's fault — they rest with other structures downstream, like in t41 and t109.&lt;/p&gt;

&lt;h2&gt;
  
  
  Harness hardening
&lt;/h2&gt;

&lt;p&gt;Our differential testing setup just got sturdier. Two fixes have shored up real vulnerabilities.&lt;/p&gt;

&lt;p&gt;The first ripples into our process as it closes hard blocker H1. Previously, a non-JIT binary via standard &lt;code&gt;cargo build&lt;/code&gt; would bypass all parity fixtures as SKIPs. Now, &lt;code&gt;assert_jit_capable()&lt;/code&gt; assesses the binary at initialization, halting in 30ms if JIT support is absent. This correction erases a swath of misleading CI successes.&lt;/p&gt;

&lt;p&gt;The second tackles H5 — a hiccup in metric consistency across four successive commits. Despite reporting 94/88, actual table values were 99/83. The solution? An &lt;code&gt;AUTHORITATIVE TOTALS&lt;/code&gt; line using the same accumulators as the detailed table — ensuring cut-and-dry truth, avoiding manual errors.&lt;/p&gt;

&lt;h2&gt;
  
  
  0.1 readiness audit
&lt;/h2&gt;

&lt;p&gt;Two audit commitments embedded per-item verification directly into the roadmap file using HTML comments. Reviewers can nod along with &lt;code&gt;&amp;lt;!-- audit: VERIFIED --&amp;gt;&lt;/code&gt; or spot &lt;code&gt;&amp;lt;!-- audit: DRIFTED --&amp;gt;&lt;/code&gt; marks as the scorecards apply. Verdict from these audits? We're not ready for 0.1. Despite conquering H1, H2, and H5 today, hurdles like H3 (when-block lowering) and H4 (feature-branch parity items CX-91/CX-94/CX-34) loom.&lt;/p&gt;

&lt;p&gt;Interesting discovery: the Cast category's green status in parity reports isn't what it seems. Recent PASSes stem from narrowing touches, not a completed CX-91 Cast JIT implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Crossing off three blockers — H1, H2, H5 — leaves us grappling with H3 and H4. The CX-233 while-in loop lowering branch is fully fleshed out, tested, yet still waiting in the wings to merge into submain for the third day. When-block lowering (H3) holds back three SKIP cases and is the last blocker squarely in our domain.&lt;/p&gt;

&lt;p&gt;Meanwhile, the submain-to-main gap has ballooned to 179 commits, pegged as overdue in daily logs spanning two weeks. The rising cost of integration could soon outweigh remaining feature quests.&lt;/p&gt;

&lt;p&gt;Our JIT parity sits at 110/182 (60.4%), but the SKIPs that remain are more from specific construct needs rather than missing fundamental blocks. While 0.1 readiness remains elusive, the path forward is not.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-05-20" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-05-20&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-06-13</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Sun, 14 Jun 2026 02:42:56 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-06-13-3mi</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-06-13-3mi</guid>
      <description>&lt;p&gt;No commits landed today. No compiler work, no new features, no bug fixes. The only activity in the last 24 hours was automated: a site blog deploy and the June 12 daily log update. Both are housekeeping, not development.&lt;/p&gt;

&lt;p&gt;That makes this a good moment to look at the state of the project and what's accumulating.&lt;/p&gt;

&lt;h2&gt;
  
  
  The submain gap
&lt;/h2&gt;

&lt;p&gt;Submain sits 8 commits ahead of main. Those commits carry the CR#1-4 range-check sweep and the D1.0-D1.1 audit arc work. This gap has been open for at least three days now and continues to grow staler. Merging submain to main remains the single highest-leverage action available, and it keeps not happening.&lt;/p&gt;

&lt;p&gt;The test matrix on main was last reported at 230/0. The current checkout (an older branch point on &lt;code&gt;daily-log-2026-05-30&lt;/code&gt;) shows 172 PASS / 10 FAIL out of 182, but those 10 failures are CRLF line-ending artifacts where expected and actual output match in content but differ in endings. Not real failures.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stalled example rewrites
&lt;/h2&gt;

&lt;p&gt;Eight example files have been sitting modified in the working tree since May 23, over three weeks now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;hello.cx&lt;/code&gt;, &lt;code&gt;fibonacci.cx&lt;/code&gt;, &lt;code&gt;error_handling.cx&lt;/code&gt;, &lt;code&gt;structs_and_methods.cx&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;generics.cx&lt;/code&gt;, &lt;code&gt;tbool_uncertainty.cx&lt;/code&gt;, &lt;code&gt;arrays_and_loops.cx&lt;/code&gt;, &lt;code&gt;fizzbuzz.cx&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The changes are substantial (+280 / -78 lines) and represent a pedagogical rewrite: block-comment documentation, renamed variables for clarity, restructured code flow. The fibonacci example swapped from recursive to iterative with a &lt;code&gt;classify&lt;/code&gt; helper. The generics example switched from float pairs to string pairs to better show type-parameter flexibility.&lt;/p&gt;

&lt;p&gt;This work is either ready to commit or should be dropped. Leaving it uncommitted in the working tree for three weeks means it's accumulating risk of being accidentally lost or becoming stale against other changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Growing PR backlog
&lt;/h2&gt;

&lt;p&gt;Daily-log branches for June 5 through June 12 remain unmerged. That's eight branches sitting in the PR queue. None of these are controversial or risky merges. They're just waiting.&lt;/p&gt;

&lt;h2&gt;
  
  
  What didn't happen
&lt;/h2&gt;

&lt;p&gt;The June 12 log predicted four things for today: merge submain to main, continue the D1 audit arc, merge the daily-log PR backlog, and resume backend expansion. None of those happened, making it two consecutive days of zero-for-four on predictions.&lt;/p&gt;

&lt;p&gt;D1.2, which would gate JIT memory-safety, was identified on June 10 but has not started. The project is in a gap between the audit arc that opened on June 10 and whatever comes next.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking ahead
&lt;/h2&gt;

&lt;p&gt;The path forward is straightforward even if today was idle. The submain merge is the most obvious step. The example file decision (commit or discard) should follow. The daily-log PR backlog is low-effort to clear. And once those are done, D1.2 or backend Phase 11 are the next real development targets.&lt;/p&gt;

&lt;p&gt;Quiet days happen. The risk is when they stack up and the backlog compounds.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-06-13" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-06-13&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-05-21</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Sun, 14 Jun 2026 00:08:31 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-05-21-4dma</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-05-21-4dma</guid>
      <description>&lt;p&gt;&lt;strong&gt;Cx Dev Log — Breaking Through the When-Block Hurdle&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The introduction of &lt;code&gt;when&lt;/code&gt; block IR lowering has marked a significant checkpoint for Cx, as seen in a 426-line commit to submain. This brings us closer to addressing hard blocker H3, an integral step for the 0.1 release. The JIT parity matrix saw an uplifting shift from 110 to 120 passing fixtures, thanks in part to resolving a compound-assign narrowing issue. Here's how it came together.&lt;/p&gt;

&lt;h2&gt;
  
  
  How &lt;code&gt;when&lt;/code&gt; Lowering Works
&lt;/h2&gt;

&lt;p&gt;We've integrated a chained-decision control flow graph (CFG) for &lt;code&gt;when&lt;/code&gt; block lowering, aligning it with the strategy used for &lt;code&gt;lower_logical&lt;/code&gt; in handling AND/OR short-circuit evaluation. The process for each &lt;code&gt;when&lt;/code&gt; arm is as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Patterns such as Literal, Range, and TBool-unknown trigger Compare instructions, followed by a Branch directing to the arm body or the next block.&lt;/li&gt;
&lt;li&gt;Catchall arms execute a direct jump to their body.&lt;/li&gt;
&lt;li&gt;Statement-style &lt;code&gt;when&lt;/code&gt; blocks unify arm bodies using &lt;code&gt;merge_fallthroughs&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Expression-style &lt;code&gt;when&lt;/code&gt; blocks employ a typed block parameter for merging.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why not go for table-dispatch or SSA phi-node based merges? There's a simple reason: these alternatives would necessitate additional IR infrastructure, useful only for the &lt;code&gt;when&lt;/code&gt; functionality. By leveraging existing patterns, not only do we simplify, but we also ensure seamless integration with Cranelift's multi-way backend branching. For version 0.1, maximizing efficiency and reuse was the clear path forward.&lt;/p&gt;

&lt;h2&gt;
  
  
  TBool Unknown Matching
&lt;/h2&gt;

&lt;p&gt;Handling the TBool unknown case required a workaround: comparing the scrutinee against &lt;code&gt;ConstInt(I8, 2)&lt;/code&gt;, employing &lt;code&gt;Cast(I8 -&amp;gt; scrutinee.ty)&lt;/code&gt;, then performing a &lt;code&gt;Compare(Eq)&lt;/code&gt;. This ingenious method skirts the IR validator's constraints without venturing into literal semantics for the TBool, an issue still tabled for future discussion. Presently, focusing on wire value-based pattern matching sets a solid foundation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges with EnumVariant Arms
&lt;/h2&gt;

&lt;p&gt;EnumVariant arms remain a sticking point—better termed a deliberate limitation at this stage. The lowering process flags these as structured errors detailing the enum and variant. Until we tackle Enum IR lowering, fixtures such as t22, t27, and t28 will remain marked by the SKIP status. It’s a postponed target, slated for post-0.1 attention.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compound-Assign Narrowing Etched Out
&lt;/h2&gt;

&lt;p&gt;Another noteworthy update comes with commit &lt;code&gt;e4c9202&lt;/code&gt;, a fix that rectifies a gap in the &lt;code&gt;+=&lt;/code&gt;, &lt;code&gt;*=&lt;/code&gt;, etc., compound-assign paths. Previously, these routes missed narrowing numeric literals against target types, causing IR-validator Verifier errors when handling narrow-int fields. By extracting the target type from all &lt;code&gt;SemanticLValue&lt;/code&gt; variants and invoking &lt;code&gt;insert_cast_if_needed&lt;/code&gt; for numeric interactions, we achieved a corrective balance. This alignment nudged tests like t41_compound_assign_dot and t109_struct_field_overflow from SKIP to PASS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hard Blocker Status and What Lies Ahead
&lt;/h2&gt;

&lt;p&gt;We’ve made substantial headway, closing three hard blockers in two days:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;H1: closed (May 20)&lt;/li&gt;
&lt;li&gt;H2: closed (May 20)&lt;/li&gt;
&lt;li&gt;H3: substantially addressed (May 21, Option A scope)&lt;/li&gt;
&lt;li&gt;H5: closed (May 20)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;H4 is the next frontier, encompassing features such as CX-91, CX-94, and CX-34 that are still pending. As we shift focus to the remaining 62 SKIP fixtures, tackling Enum IR lowering and other unaddressed constructs emerges as a priority. Immediate targets aren't crystal clear—each demands dissecting to diagnose specific barriers.&lt;/p&gt;

&lt;p&gt;The task of evolving the submain-to-main merge looms large, as submain extends 181 commits beyond. This anticipated merge has been on the horizon since May 6, yet remains elusive. Today’s updates count as merely additional steps towards this pivotal integration.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-05-21" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-05-21&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
