commit 1377fae4cd6e32fbd62704169dde59d86d104bb8 (tree)
parent 58702f9648e639b4655114b49e122a96fe011e91
Author: Motiejus Jakštys <motiejus@jakstys.lt>
Date: Mon, 16 Feb 2026 16:18:20 +0000
astgen: fix InternPool.zig — parser fallthrough for struct/enum/union, add @compileLog, fix @"..." escape scanning
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat:
3 files changed, 48 insertions(+), 4 deletions(-)
diff --git a/stage0/astgen.c b/stage0/astgen.c
@@ -1318,8 +1318,11 @@ static uint32_t identAsString(AstGenCtx* ag, uint32_t ident_token) {
uint32_t content_start = start + 2; // skip @"
uint32_t content_end = content_start;
while (
- content_end < ag->tree->source_len && source[content_end] != '"')
+ content_end < ag->tree->source_len && source[content_end] != '"') {
+ if (source[content_end] == '\\')
+ content_end++; // skip escape character
content_end++;
+ }
// Check for escapes.
bool has_escapes = false;
for (uint32_t j = content_start; j < content_end; j++) {
@@ -5474,6 +5477,29 @@ static uint32_t builtinCall(
return rvalue(gz, rl, result, node);
}
// clang-format on
+ // @compileLog — AstGen.zig:9275-9286.
+ // clang-format off
+ if (name_len == 10
+ && memcmp(source + name_start, "compileLog", 10) == 0) {
+ // clang-format on
+ AstData nd = tree->nodes.datas[node];
+ uint32_t param_count
+ = (nd.lhs != 0 ? 1u : 0u) + (nd.rhs != 0 ? 1u : 0u);
+ ensureExtraCapacity(ag, 1 + param_count);
+ uint32_t payload_index = ag->extra_len;
+ ag->extra[ag->extra_len++]
+ = (uint32_t)((int32_t)node - (int32_t)gz->decl_node_index);
+ uint32_t args_index = ag->extra_len;
+ ag->extra_len += param_count;
+ if (nd.lhs != 0)
+ ag->extra[args_index++] = expr(gz, scope, nd.lhs);
+ if (nd.rhs != 0)
+ ag->extra[args_index++] = expr(gz, scope, nd.rhs);
+ uint32_t result
+ = addExtendedPayloadSmall(gz, (uint16_t)ZIR_EXT_COMPILE_LOG,
+ (uint16_t)param_count, payload_index);
+ return rvalue(gz, rl, result, node);
+ }
// TODO: handle other 1-arg builtins.
SET_ERROR(ag);
@@ -5817,6 +5843,24 @@ static uint32_t builtinCallMultiArg(GenZir* gz, Scope* scope, ResultLoc rl,
return rvalue(gz, rl, result, node);
}
// clang-format on
+ // @compileLog — AstGen.zig:9275-9286.
+ // clang-format off
+ if (name_len == 10
+ && memcmp(source + name_start, "compileLog", 10) == 0) {
+ // clang-format on
+ ensureExtraCapacity(ag, 1 + param_count);
+ uint32_t payload_index = ag->extra_len;
+ ag->extra[ag->extra_len++]
+ = (uint32_t)((int32_t)node - (int32_t)gz->decl_node_index);
+ uint32_t args_index = ag->extra_len;
+ ag->extra_len += param_count;
+ for (uint32_t i = 0; i < param_count; i++)
+ ag->extra[args_index + i] = expr(gz, scope, params[i]);
+ uint32_t result
+ = addExtendedPayloadSmall(gz, (uint16_t)ZIR_EXT_COMPILE_LOG,
+ (uint16_t)param_count, payload_index);
+ return rvalue(gz, rl, result, node);
+ }
// TODO: handle other multi-arg builtins.
SET_ERROR(ag);
diff --git a/stage0/astgen_test.zig b/stage0/astgen_test.zig
@@ -1319,7 +1319,7 @@ const corpus_files = .{
"../src/Type.zig",
"../src/translate_c.zig",
"../src/Compilation.zig",
- //"../src/InternPool.zig",
+ "../src/InternPool.zig",
//"../src/Sema.zig",
};
diff --git a/stage0/parser.c b/stage0/parser.c
@@ -796,8 +796,8 @@ static AstNodeIndex expectStatement(Parser* p, bool allow_defer_var) {
return expectIfStatement(p);
case TOKEN_KEYWORD_ENUM:
case TOKEN_KEYWORD_STRUCT:
- case TOKEN_KEYWORD_UNION:;
- fail(p, "unsupported statement keyword");
+ case TOKEN_KEYWORD_UNION:
+ // Parse.zig:961-971: fall through to expression parsing.
default:;
}