From c4e3f804053fa7df4d6d6f1e0288e9b26a468dd0 Mon Sep 17 00:00:00 2001 From: dimgigov Date: Mon, 8 Jun 2026 20:03:33 +0300 Subject: [PATCH] fix(selfhost/c_backend): handle backtick raw string literals Backtick strings were emitted directly into C code without stripping the backticks or escaping the content, causing C syntax errors. Fix: detect backtick-wrapped literals in CBE_EmitExpr, strip the backticks, escape inner content, and wrap in double quotes. --- src/c_backend.bux | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/c_backend.bux b/src/c_backend.bux index 07a1aa0..eca736a 100644 --- a/src/c_backend.bux +++ b/src/c_backend.bux @@ -108,13 +108,24 @@ func CBE_EmitExpr(cbe: *CEmitter, node: *HirNode) { let slen: int = String_Len(s) as int; var start: int = 0; var end: int = slen; + var isQuoted: bool = false; + var isBacktick: bool = false; // If the literal is wrapped in quotes (from lexer), preserve outer quotes // and only escape the inner content. if slen >= 2 && s[0] == 34 as char8 && s[slen - 1] == 34 as char8 { - StringBuilder_Append(&cbe.sb, "\""); + isQuoted = true; start = 1; end = slen - 1; } + // Backtick raw string: strip backticks, escape inner content for C + if slen >= 2 && s[0] == 96 as char8 && s[slen - 1] == 96 as char8 { + isBacktick = true; + start = 1; + end = slen - 1; + } + if isQuoted || isBacktick { + StringBuilder_Append(&cbe.sb, "\""); + } var i: int = start; while i < end { let c: int = s[i] as int; @@ -133,7 +144,7 @@ func CBE_EmitExpr(cbe: *CEmitter, node: *HirNode) { } i = i + 1; } - if slen >= 2 && s[0] == 34 as char8 && s[slen - 1] == 34 as char8 { + if isQuoted || isBacktick { StringBuilder_Append(&cbe.sb, "\""); } }