zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 8da2f93bd0d11cb1cd5e7380230226df1c45b950 (tree)
parent 06ab4f702e29d173919ab8e4471467e5bab05af5
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Sun, 12 Apr 2026 07:28:18 +0200

Merge pull request 'update aro and translate-c to latest' (#31826) from aro-sync into master

Reviewed-on: https://codeberg.org/ziglang/zig/pulls/31826

Diffstat:
Mlib/compiler/aro/aro/Attribute.zig | 318++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------
Mlib/compiler/aro/aro/Attribute/names.zig | 1193++++++++++++++++++++++++++++++++++++++++---------------------------------------
Mlib/compiler/aro/aro/Builtins.zig | 1-
Mlib/compiler/aro/aro/Builtins/common.zig | 1737++++++++++++++++++++++++++++++++++++++++---------------------------------------
Mlib/compiler/aro/aro/Builtins/eval.zig | 22+++++++++++++++-------
Mlib/compiler/aro/aro/CodeGen.zig | 4+++-
Mlib/compiler/aro/aro/Compilation.zig | 217++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
Mlib/compiler/aro/aro/Diagnostics.zig | 38+++++++++++++++++++++-----------------
Mlib/compiler/aro/aro/Driver.zig | 174++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------
Dlib/compiler/aro/aro/Driver/Filesystem.zig | 241-------------------------------------------------------------------------------
Alib/compiler/aro/aro/Driver/GCCDetector.zig | 635+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mlib/compiler/aro/aro/LangOpts.zig | 14++++++++++++--
Mlib/compiler/aro/aro/Parser.zig | 478+++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------
Mlib/compiler/aro/aro/Parser/Diagnostic.zig | 98+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------
Mlib/compiler/aro/aro/Preprocessor.zig | 183+++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------
Mlib/compiler/aro/aro/Preprocessor/Diagnostic.zig | 21+++++++++++++++++++++
Mlib/compiler/aro/aro/Target.zig | 29+++++++++++++++++------------
Mlib/compiler/aro/aro/Tokenizer.zig | 45+++++++++++++++++++++++++++++++--------------
Mlib/compiler/aro/aro/Toolchain.zig | 11++++-------
Mlib/compiler/aro/aro/Tree.zig | 326+++++++++++++++++++++++++++++++++++++++++++------------------------------------
Mlib/compiler/aro/aro/TypeStore.zig | 106+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------
Mlib/compiler/aro/aro/Value.zig | 30+++++++++++++-----------------
Mlib/compiler/aro/aro/features.zig | 1+
Mlib/compiler/aro/aro/pragmas/once.zig | 1-
Mlib/compiler/aro/aro/record_layout.zig | 6+++---
Mlib/compiler/aro/assembly_backend/x86_64.zig | 7+++----
Mlib/compiler/aro/backend/Assembly.zig | 3+--
Mlib/compiler/aro/backend/Interner.zig | 4++--
Mlib/compiler/aro/backend/Ir.zig | 192+++++++++++++++++++++++++++++++++++++++++--------------------------------------
Mlib/compiler/aro/backend/Ir/x86/Renderer.zig | 6+++---
Alib/compiler/aro/include/ptrcheck.h | 49+++++++++++++++++++++++++++++++++++++++++++++++++
Mlib/compiler/aro/main.zig | 36++++++++++++++++++++++++++----------
Mlib/compiler/resinator/main.zig | 8+++++++-
Mlib/compiler/resinator/preprocess.zig | 4+---
Mlib/compiler/translate-c/MacroTranslator.zig | 91+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------
Mlib/compiler/translate-c/PatternList.zig | 10+---------
Mlib/compiler/translate-c/Scope.zig | 49+++++++++++++++++++++++++++++++++++++++++++------
Mlib/compiler/translate-c/Translator.zig | 490++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------
Mlib/compiler/translate-c/ast.zig | 30+++++++++++++++++++-----------
Mlib/compiler/translate-c/main.zig | 91+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------
Mlib/std/zig/c_translation/helpers.zig | 23++++++++++++++---------
Msrc/libs/mingw.zig | 10++++++++--
42 files changed, 4298 insertions(+), 2734 deletions(-)

diff --git a/lib/compiler/aro/aro/Attribute.zig b/lib/compiler/aro/aro/Attribute.zig @@ -7,7 +7,9 @@ const Diagnostics = @import("Diagnostics.zig"); const Parser = @import("Parser.zig"); const Tree = @import("Tree.zig"); const TokenIndex = Tree.TokenIndex; -const QualType = @import("TypeStore.zig").QualType; +const TypeStore = @import("TypeStore.zig"); +const Type = TypeStore.Type; +const QualType = TypeStore.QualType; const Value = @import("Value.zig"); const Attribute = @This(); @@ -341,7 +343,6 @@ fn diagnoseField( pub fn diagnose(attr: Tag, arguments: *Arguments, arg_idx: u32, res: Parser.Result, arg_start: TokenIndex, node: Tree.Node, p: *Parser) !bool { switch (attr) { - .nonnull => return false, inline else => |tag| { const decl = @typeInfo(attributes).@"struct".decls[@intFromEnum(tag)]; const max_arg_count = comptime maxArgCount(tag); @@ -529,7 +530,10 @@ const attributes = struct { pub const @"noinline" = struct {}; pub const noipa = struct {}; // TODO: arbitrary number of arguments - pub const nonnull = struct {}; + // const nonnull = struct { + // // arg_index: []const u32, + // }; + // }; pub const nonstring = struct {}; pub const noplt = struct {}; pub const @"noreturn" = struct {}; @@ -577,6 +581,7 @@ const attributes = struct { }; } = null, }; + pub const single = struct {}; pub const spectre = struct { arg: enum { nomitigation, @@ -618,6 +623,7 @@ const attributes = struct { __name_tok: TokenIndex, }; pub const uninitialized = struct {}; + pub const unsafe_indexable = struct {}; pub const unsequenced = struct {}; pub const unused = struct {}; pub const used = struct {}; @@ -723,6 +729,7 @@ pub const Arguments = blk: { name.* = decl.name; T.* = @field(attributes, decl.name); } + break :blk @Union(.auto, null, &names, &types, &@splat(.{})); }; @@ -784,15 +791,8 @@ fn ignoredAttrErr(p: *Parser, tok: TokenIndex, attr: Attribute.Tag, context: []c try p.err(tok, .ignored_attribute, .{ @tagName(attr), context }); } -pub fn applyParameterAttributes(p: *Parser, qt: QualType, attr_buf_start: usize, diagnostic: ?Parser.Diagnostic) !QualType { - return applyVariableOrParameterAttributes(p, qt, attr_buf_start, diagnostic, .parameter); -} - +pub const applyParameterAttributes = applyVariableAttributes; pub fn applyVariableAttributes(p: *Parser, qt: QualType, attr_buf_start: usize, diagnostic: ?Parser.Diagnostic) !QualType { - return applyVariableOrParameterAttributes(p, qt, attr_buf_start, diagnostic, .variable); -} - -fn applyVariableOrParameterAttributes(p: *Parser, qt: QualType, attr_buf_start: usize, diagnostic: ?Parser.Diagnostic, context: enum { parameter, variable }) !QualType { const gpa = p.comp.gpa; const attrs = p.attr_buf.items(.attr)[attr_buf_start..]; const toks = p.attr_buf.items(.tok)[attr_buf_start..]; @@ -804,6 +804,7 @@ fn applyVariableOrParameterAttributes(p: *Parser, qt: QualType, attr_buf_start: // zig fmt: off .alias, .may_alias, .deprecated, .unavailable, .unused, .warn_if_not_aligned, .weak, .used, .noinit, .retain, .persistent, .section, .mode, .asm_label, .nullability, .unaligned, .selectany, .internal_linkage, + .visibility, => try p.attr_application_buf.append(gpa, attr), // zig fmt: on .common => if (nocommon) { @@ -820,12 +821,6 @@ fn applyVariableOrParameterAttributes(p: *Parser, qt: QualType, attr_buf_start: }, .vector_size => try attr.applyVectorSize(p, tok, &base_qt), .aligned => try attr.applyAligned(p, base_qt, diagnostic), - .nonnull => { - switch (context) { - .parameter => try p.err(tok, .attribute_todo, .{ "nonnull", "parameters" }), - .variable => try p.err(tok, .nonnull_not_applicable, .{}), - } - }, .nonstring => { if (base_qt.get(p.comp, .array)) |array_ty| { if (array_ty.elem.get(p.comp, .int)) |int_ty| switch (int_ty) { @@ -848,11 +843,28 @@ fn applyVariableOrParameterAttributes(p: *Parser, qt: QualType, attr_buf_start: } else { try p.attr_application_buf.append(gpa, attr); }, - .calling_convention => try applyCallingConvention(attr, p, tok, base_qt), + .single, + .unsafe_indexable, + => try applyBoundsSafetyAttr(.fromTag(attr.tag), p, tok, &base_qt), + + .calling_convention => try applyKeywordCallingConvention(attr, p, tok, base_qt), + + .fastcall, + .stdcall, + .thiscall, + .vectorcall, + .cdecl, + .pcs, + .riscv_vector_cc, + .aarch64_sve_pcs, + .aarch64_vector_pcs, + .sysv_abi, + .ms_abi, + => try applyGnuAttrCallingConvention(attr, p, tok, base_qt), + .alloc_size, .copy, .tls_model, - .visibility, => |t| try p.err(tok, .attribute_todo, .{ @tagName(t), "variables" }), // There is already an error in Parser for _Noreturn keyword .noreturn => if (attr.syntax != .keyword) try ignoredAttrErr(p, tok, attr.tag, "variables"), @@ -903,7 +915,25 @@ pub fn applyTypeAttributes(p: *Parser, qt: QualType, attr_buf_start: usize, diag } else { try p.err(tok, .designated_init_invalid, .{}); }, - .calling_convention => try applyCallingConvention(attr, p, tok, base_qt), + .calling_convention => try applyKeywordCallingConvention(attr, p, tok, base_qt), + + .fastcall, + .stdcall, + .thiscall, + .vectorcall, + .cdecl, + .pcs, + .riscv_vector_cc, + .aarch64_sve_pcs, + .aarch64_vector_pcs, + .sysv_abi, + .ms_abi, + => try applyGnuAttrCallingConvention(attr, p, tok, base_qt), + + .single, + .unsafe_indexable, + => try applyBoundsSafetyAttr(.fromTag(attr.tag), p, tok, &base_qt), + .alloc_size, .copy, .scalar_storage_order, @@ -931,6 +961,7 @@ pub fn applyFunctionAttributes(p: *Parser, qt: QualType, attr_buf_start: usize) .@"const", .warn_unused_result, .section, .returns_nonnull, .returns_twice, .@"error", .externally_visible, .retain, .flatten, .gnu_inline, .alias, .asm_label, .nodiscard, .reproducible, .unsequenced, .nothrow, .nullability, .unaligned, .internal_linkage, + .visibility, => try p.attr_application_buf.append(gpa, attr), // zig fmt: on .hot => if (cold) { @@ -959,97 +990,21 @@ pub fn applyFunctionAttributes(p: *Parser, qt: QualType, attr_buf_start: usize) }, .aligned => try attr.applyAligned(p, base_qt, null), .format => try attr.applyFormat(p, base_qt), - .calling_convention => try applyCallingConvention(attr, p, tok, base_qt), - .fastcall => if (p.comp.target.cpu.arch == .x86) { - try p.attr_application_buf.append(gpa, .{ - .tag = .calling_convention, - .args = .{ .calling_convention = .{ .cc = .fastcall } }, - .syntax = attr.syntax, - }); - } else { - try p.err(tok, .callconv_not_supported, .{"fastcall"}); - }, - .stdcall => if (p.comp.target.cpu.arch == .x86) { - try p.attr_application_buf.append(gpa, .{ - .tag = .calling_convention, - .args = .{ .calling_convention = .{ .cc = .stdcall } }, - .syntax = attr.syntax, - }); - } else { - try p.err(tok, .callconv_not_supported, .{"stdcall"}); - }, - .thiscall => if (p.comp.target.cpu.arch == .x86) { - try p.attr_application_buf.append(gpa, .{ - .tag = .calling_convention, - .args = .{ .calling_convention = .{ .cc = .thiscall } }, - .syntax = attr.syntax, - }); - } else { - try p.err(tok, .callconv_not_supported, .{"thiscall"}); - }, - .vectorcall => if (p.comp.target.cpu.arch == .x86 or p.comp.target.cpu.arch.isAARCH64()) { - try p.attr_application_buf.append(gpa, .{ - .tag = .calling_convention, - .args = .{ .calling_convention = .{ .cc = .vectorcall } }, - .syntax = attr.syntax, - }); - } else { - try p.err(tok, .callconv_not_supported, .{"vectorcall"}); - }, - .cdecl => {}, - .pcs => if (p.comp.target.cpu.arch.isArm()) { - try p.attr_application_buf.append(gpa, .{ - .tag = .calling_convention, - .args = .{ .calling_convention = .{ .cc = switch (attr.args.pcs.kind) { - .aapcs => .arm_aapcs, - .@"aapcs-vfp" => .arm_aapcs_vfp, - } } }, - .syntax = attr.syntax, - }); - } else { - try p.err(tok, .callconv_not_supported, .{"pcs"}); - }, - .riscv_vector_cc => if (p.comp.target.cpu.arch.isRISCV()) { - try p.attr_application_buf.append(gpa, .{ - .tag = .calling_convention, - .args = .{ .calling_convention = .{ .cc = .riscv_vector } }, - .syntax = attr.syntax, - }); - } else { - try p.err(tok, .callconv_not_supported, .{"pcs"}); - }, - .aarch64_sve_pcs => if (p.comp.target.cpu.arch.isAARCH64()) { - try p.attr_application_buf.append(gpa, .{ - .tag = .calling_convention, - .args = .{ .calling_convention = .{ .cc = .aarch64_sve_pcs } }, - .syntax = attr.syntax, - }); - } else { - try p.err(tok, .callconv_not_supported, .{"pcs"}); - }, - .aarch64_vector_pcs => if (p.comp.target.cpu.arch.isAARCH64()) { - try p.attr_application_buf.append(gpa, .{ - .tag = .calling_convention, - .args = .{ .calling_convention = .{ .cc = .aarch64_vector_pcs } }, - .syntax = attr.syntax, - }); - } else { - try p.err(tok, .callconv_not_supported, .{"pcs"}); - }, - .sysv_abi => if (p.comp.target.cpu.arch == .x86_64 and p.comp.target.os.tag == .windows) { - try p.attr_application_buf.append(gpa, .{ - .tag = .calling_convention, - .args = .{ .calling_convention = .{ .cc = .x86_64_sysv } }, - .syntax = attr.syntax, - }); - }, - .ms_abi => if (p.comp.target.cpu.arch == .x86_64 and p.comp.target.os.tag != .windows) { - try p.attr_application_buf.append(gpa, .{ - .tag = .calling_convention, - .args = .{ .calling_convention = .{ .cc = .x86_64_win } }, - .syntax = attr.syntax, - }); - }, + .calling_convention => try applyKeywordCallingConvention(attr, p, tok, base_qt), + + .fastcall, + .stdcall, + .thiscall, + .vectorcall, + .cdecl, + .pcs, + .riscv_vector_cc, + .aarch64_sve_pcs, + .aarch64_vector_pcs, + .sysv_abi, + .ms_abi, + => try applyGnuAttrCallingConvention(attr, p, tok, base_qt), + .malloc => { if (base_qt.get(p.comp, .func).?.return_type.isPointer(p.comp)) { try p.attr_application_buf.append(gpa, attr); @@ -1102,7 +1057,7 @@ pub fn applyFunctionAttributes(p: *Parser, qt: QualType, attr_buf_start: usize) .no_stack_protector, .noclone, .noipa, - .nonnull, + // .nonnull, .noplt, // .optimize, .patchable_function_entry, @@ -1112,7 +1067,6 @@ pub fn applyFunctionAttributes(p: *Parser, qt: QualType, attr_buf_start: usize) .symver, .target, .target_clones, - .visibility, .weakref, .zero_call_used_regs, => |t| try p.err(tok, .attribute_todo, .{ @tagName(t), "functions" }), @@ -1262,9 +1216,129 @@ fn applyFormat(attr: Attribute, p: *Parser, qt: QualType) !void { try p.attr_application_buf.append(p.comp.gpa, attr); } -fn applyCallingConvention(attr: Attribute, p: *Parser, tok: TokenIndex, qt: QualType) !void { - if (!qt.is(p.comp, .func)) { - return p.err(tok, .callconv_non_func, .{ p.tok_ids[tok].symbol(), qt }); +/// These come from GNU attributes like __attribute__((sysv_abi)) +fn applyGnuAttrCallingConvention(attr: Attribute, p: *Parser, tok: TokenIndex, qt: QualType) !void { + if (!qt.isCallable(p.comp)) { + return p.err(tok, .callconv_non_func, .{ p.tokSlice(tok), qt }); + } + const gpa = p.comp.gpa; + switch (attr.tag) { + .fastcall => if (p.comp.target.cpu.arch == .x86) { + try p.attr_application_buf.append(gpa, .{ + .tag = .calling_convention, + .args = .{ .calling_convention = .{ .cc = .fastcall } }, + .syntax = attr.syntax, + }); + } else { + try p.err(tok, .callconv_not_supported, .{"fastcall"}); + }, + .stdcall => if (p.comp.target.cpu.arch == .x86) { + try p.attr_application_buf.append(gpa, .{ + .tag = .calling_convention, + .args = .{ .calling_convention = .{ .cc = .stdcall } }, + .syntax = attr.syntax, + }); + } else { + try p.err(tok, .callconv_not_supported, .{"stdcall"}); + }, + .thiscall => if (p.comp.target.cpu.arch == .x86) { + try p.attr_application_buf.append(gpa, .{ + .tag = .calling_convention, + .args = .{ .calling_convention = .{ .cc = .thiscall } }, + .syntax = attr.syntax, + }); + } else { + try p.err(tok, .callconv_not_supported, .{"thiscall"}); + }, + .vectorcall => if (p.comp.target.cpu.arch == .x86 or p.comp.target.cpu.arch.isAARCH64()) { + try p.attr_application_buf.append(gpa, .{ + .tag = .calling_convention, + .args = .{ .calling_convention = .{ .cc = .vectorcall } }, + .syntax = attr.syntax, + }); + } else { + try p.err(tok, .callconv_not_supported, .{"vectorcall"}); + }, + .cdecl => {}, + .pcs => if (p.comp.target.cpu.arch.isArm()) { + try p.attr_application_buf.append(gpa, .{ + .tag = .calling_convention, + .args = .{ .calling_convention = .{ .cc = switch (attr.args.pcs.kind) { + .aapcs => .arm_aapcs, + .@"aapcs-vfp" => .arm_aapcs_vfp, + } } }, + .syntax = attr.syntax, + }); + } else { + try p.err(tok, .callconv_not_supported, .{"pcs"}); + }, + .riscv_vector_cc => if (p.comp.target.cpu.arch.isRISCV()) { + try p.attr_application_buf.append(gpa, .{ + .tag = .calling_convention, + .args = .{ .calling_convention = .{ .cc = .riscv_vector } }, + .syntax = attr.syntax, + }); + } else { + try p.err(tok, .callconv_not_supported, .{"pcs"}); + }, + .aarch64_sve_pcs => if (p.comp.target.cpu.arch.isAARCH64()) { + try p.attr_application_buf.append(gpa, .{ + .tag = .calling_convention, + .args = .{ .calling_convention = .{ .cc = .aarch64_sve_pcs } }, + .syntax = attr.syntax, + }); + } else { + try p.err(tok, .callconv_not_supported, .{"pcs"}); + }, + .aarch64_vector_pcs => if (p.comp.target.cpu.arch.isAARCH64()) { + try p.attr_application_buf.append(gpa, .{ + .tag = .calling_convention, + .args = .{ .calling_convention = .{ .cc = .aarch64_vector_pcs } }, + .syntax = attr.syntax, + }); + } else { + try p.err(tok, .callconv_not_supported, .{"pcs"}); + }, + .sysv_abi => if (p.comp.target.cpu.arch == .x86_64 and p.comp.target.os.tag == .windows) { + try p.attr_application_buf.append(gpa, .{ + .tag = .calling_convention, + .args = .{ .calling_convention = .{ .cc = .x86_64_sysv } }, + .syntax = attr.syntax, + }); + }, + .ms_abi => if (p.comp.target.cpu.arch == .x86_64 and p.comp.target.os.tag != .windows) { + try p.attr_application_buf.append(gpa, .{ + .tag = .calling_convention, + .args = .{ .calling_convention = .{ .cc = .x86_64_win } }, + .syntax = attr.syntax, + }); + }, + else => unreachable, + } +} + +fn applyBoundsSafetyAttr(bounds: Type.Pointer.Bounds, p: *Parser, tok: TokenIndex, qt: *QualType) !void { + if (qt.isInvalid()) return; + const pointer = qt.get(p.comp, .pointer) orelse { + return p.err(tok, .attribute_requires_pointer, .{@tagName(bounds)}); + }; + if (pointer.bounds == bounds) { + return p.err(tok, .redundant_bounds_annotation, .{@tagName(bounds)}); + } + if (pointer.bounds != .c) { + return p.err(tok, .multiple_bounds_annotations, .{}); + } + qt.* = try p.comp.type_store.put(p.comp.gpa, .{ .pointer = .{ + .child = pointer.child, + .decayed = pointer.decayed, + .bounds = bounds, + } }); +} + +/// These come from explicit MSVC keywords like __stdcall, __fastcall, etc +fn applyKeywordCallingConvention(attr: Attribute, p: *Parser, tok: TokenIndex, qt: QualType) !void { + if (!qt.isCallable(p.comp)) { + return p.err(tok, .callconv_non_func, .{ p.tokSlice(tok), qt }); } switch (attr.args.calling_convention.cc) { .c => {}, @@ -1295,3 +1369,15 @@ fn applySelected(qt: QualType, p: *Parser) !QualType { .attributes = p.attr_application_buf.items, } })).withQualifiers(qt); } + +pub fn visibilityFromString(s: []const u8) ?std.builtin.SymbolVisibility { + if (mem.eql(u8, s, "internal")) { + return .hidden; + } + const visibility = std.meta.stringToEnum(std.builtin.SymbolVisibility, s) orelse return null; + // compiler will notify us if .internal is added as a visibility type + switch (visibility) { + .default, .hidden, .protected => {}, + } + return visibility; +} diff --git a/lib/compiler/aro/aro/Attribute/names.zig b/lib/compiler/aro/aro/Attribute/names.zig @@ -99,6 +99,7 @@ pub const Tag = enum(u16) { aarch64_sve_pcs, selectany, sentinel, simd, + single, spectre, stack_protect, stdcall, @@ -112,6 +113,7 @@ pub const Tag = enum(u16) { aarch64_sve_pcs, transparent_union, unavailable, uninitialized, + unsafe_indexable, unsequenced, unused, used, @@ -181,7 +183,7 @@ pub const longest_name = 30; /// If found, returns the index of the node within the `dafsa` array. /// Otherwise, returns `null`. pub fn findInList(first_child_index: u16, char: u8) ?u16 { - @setEvalBranchQuota(234); + @setEvalBranchQuota(238); var index = first_child_index; while (true) { if (dafsa[index].char == char) return index; @@ -290,9 +292,9 @@ const dafsa = [_]Node{ .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 25, .child_index = 47 }, .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 49 }, .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 54 }, - .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 11, .child_index = 56 }, + .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 12, .child_index = 56 }, .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 63 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 67 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = false, .number = 7, .child_index = 67 }, .{ .char = 'v', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 70 }, .{ .char = 'w', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 72 }, .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 74 }, @@ -334,642 +336,653 @@ const dafsa = [_]Node{ .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 130 }, .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 131 }, .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 132 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 135 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 136 }, - .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 137 }, - .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 139 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 141 }, - .{ .char = 'h', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 142 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 144 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 145 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 146 }, - .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 150 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 151 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 152 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 153 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 154 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 155 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 156 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 157 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 158 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 159 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 161 }, - .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 162 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 163 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 164 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 165 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 166 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 167 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 135 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 137 }, + .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 138 }, + .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 140 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 142 }, + .{ .char = 'h', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 143 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 145 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 146 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 147 }, + .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 151 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 152 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 153 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 154 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 155 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 156 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 157 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 158 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 159 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 160 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 162 }, + .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 163 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 164 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 165 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 166 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 167 }, .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 168 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 169 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 170 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 171 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 172 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 173 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 174 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 175 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 177 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 179 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 180 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 181 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 182 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 183 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 184 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 185 }, - .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 169 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 170 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 171 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 172 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 173 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 174 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 175 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 176 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 178 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 180 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 181 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 182 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 183 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 184 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 185 }, .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 186 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 187 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 188 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 189 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 190 }, - .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 191 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 193 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 194 }, - .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 150 }, - .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 13, .child_index = 195 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 200 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 201 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 203 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 204 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 206 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 207 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 208 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 209 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 110 }, + .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 187 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 188 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 189 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 190 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 191 }, + .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 192 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 194 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 195 }, + .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 151 }, + .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 13, .child_index = 196 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 201 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 202 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 204 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 205 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 207 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 208 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 209 }, .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 210 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 110 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 211 }, .{ .char = 's', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 211 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 212 }, .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 76 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 193 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 212 }, - .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 213 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 214 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 216 }, - .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 217 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 218 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 219 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 220 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 221 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 170 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 222 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 223 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 224 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 225 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 226 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 227 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 228 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 229 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 230 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 231 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 232 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 233 }, - .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 234 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 235 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 170 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 170 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 236 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 237 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 238 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 239 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 240 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 241 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 242 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 194 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 213 }, + .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 214 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 215 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 217 }, + .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 218 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 219 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 220 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 221 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 222 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 171 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 223 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 224 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 225 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 226 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 227 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 228 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 229 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 230 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 231 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 232 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 233 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 234 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 235 }, + .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 236 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 238 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 171 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 171 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 239 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 240 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 241 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 242 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 243 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 244 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 245 }, .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 122 }, - .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 243 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 244 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 245 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 246 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 247 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 248 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 249 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 250 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 251 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 252 }, + .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 246 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 247 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 248 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 249 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 250 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 251 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 252 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 253 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 254 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 255 }, .{ .char = 'd', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 253 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 254 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 256 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 257 }, .{ .char = 'y', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 255 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 256 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 257 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 258 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 259 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 260 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 261 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 262 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 224 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 263 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 264 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 265 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 266 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 267 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 268 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 258 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 259 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 260 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 261 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 262 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 263 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 264 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 265 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 226 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 266 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 267 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 268 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 269 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 270 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 271 }, .{ .char = 'f', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 269 }, - .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 270 }, - .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 271 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 272 }, + .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 273 }, + .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 274 }, .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 272 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 273 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 274 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 276 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 277 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 278 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 281 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 282 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 283 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 284 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 285 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 287 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 288 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 275 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 276 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 277 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 279 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 280 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 281 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 284 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 285 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 286 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 287 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 288 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 290 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 291 }, .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 101 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 289 }, - .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 290 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 291 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 292 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 293 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 294 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 295 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 296 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 297 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 298 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 299 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 300 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 292 }, + .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 293 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 294 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 295 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 296 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 297 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 298 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 299 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 300 }, .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 301 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 302 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 303 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 304 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 305 }, - .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 306 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 302 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 303 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 304 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 305 }, + .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 306 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 307 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 308 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 309 }, + .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 310 }, .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 109 }, - .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 307 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 224 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 308 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 309 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 310 }, - .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 311 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 312 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 313 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 150 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 314 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 315 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 316 }, - .{ .char = 'k', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 318 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 319 }, - .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 320 }, + .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 311 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 226 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 312 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 313 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 314 }, + .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 315 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 316 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 317 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 318 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 151 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 319 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 320 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 321 }, + .{ .char = 'k', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 323 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 324 }, + .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 325 }, .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 }, - .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 321 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 322 }, - .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 324 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 325 }, - .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 326 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 327 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 328 }, + .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 326 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 327 }, + .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 329 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 330 }, + .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 331 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 332 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 333 }, .{ .char = 'l', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 329 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 330 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 331 }, - .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 332 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 333 }, - .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 334 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 335 }, - .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 336 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 336 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 334 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 335 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 336 }, + .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 337 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 338 }, + .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 339 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 340 }, + .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 341 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 341 }, .{ .char = 'r', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 337 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 338 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 339 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 340 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 341 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 342 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 343 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 344 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 345 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 346 }, .{ .char = 'c', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 342 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 344 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 266 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 200 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 345 }, - .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 346 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 347 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 189 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 348 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 349 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 347 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 349 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 269 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 201 }, .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 350 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 351 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 352 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 353 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 354 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 355 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 171 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 356 }, + .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 351 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 352 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 190 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 353 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 354 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 355 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 356 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 357 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 358 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 359 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 360 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 172 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 361 }, .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 101 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 357 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 362 }, .{ .char = 'a', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 358 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 359 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 360 }, - .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 361 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 362 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 363 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 364 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 331 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 365 }, - .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 366 }, - .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 367 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 368 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 253 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 369 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 370 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 363 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 364 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 365 }, + .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 366 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 367 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 368 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 369 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 336 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 370 }, + .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 371 }, + .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 372 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 373 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 256 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 374 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 375 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 194 }, .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 125 }, - .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 371 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 372 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 260 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 373 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 170 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 374 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 375 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 376 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 377 }, - .{ .char = 'q', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 378 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 379 }, - .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 380 }, - .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 381 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 383 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 384 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 385 }, - .{ .char = '6', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 386 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 170 }, + .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 376 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 377 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 263 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 378 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 171 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 379 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 380 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 381 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 382 }, + .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 383 }, + .{ .char = 'q', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 384 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 385 }, + .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 386 }, .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 387 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 389 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 185 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 390 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 391 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 392 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 315 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 393 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 394 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 389 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 390 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 391 }, + .{ .char = '6', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 392 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 171 }, + .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 393 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 395 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 186 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 396 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 397 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 398 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 320 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 399 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 400 }, .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 335 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 395 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 396 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 397 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 398 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 399 }, - .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 400 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 331 }, - .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 401 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 340 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 401 }, .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 402 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 403 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 404 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 405 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 406 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 403 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 404 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 405 }, + .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 406 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 336 }, + .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 407 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 408 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 409 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 410 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 411 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 412 }, .{ .char = 'i', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 407 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 408 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 409 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 410 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 411 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 412 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 413 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 413 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 414 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 415 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 416 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 417 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 418 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 419 }, .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 193 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 414 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 355 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 415 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 416 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 417 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 418 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 419 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 420 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 421 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 422 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 423 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 424 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 425 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 426 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 427 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 428 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 250 }, - .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 429 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 430 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 431 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 432 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 433 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 434 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 435 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 437 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 438 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 439 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 440 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 189 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 441 }, - .{ .char = '4', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 442 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 443 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 444 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 445 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 295 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 447 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 448 }, - .{ .char = 'p', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 194 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 420 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 360 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 421 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 422 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 423 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 424 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 425 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 426 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 427 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 428 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 429 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 430 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 431 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 432 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 433 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 434 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 253 }, + .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 435 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 436 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 437 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 438 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 439 }, .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 440 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 449 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 450 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 451 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 452 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 453 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 454 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 441 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 442 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 444 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 445 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 446 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 447 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 190 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 448 }, + .{ .char = '4', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 449 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 450 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 451 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 452 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 298 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 454 }, .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 455 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 357 }, + .{ .char = 'p', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 447 }, .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 456 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 457 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 458 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 459 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 460 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 461 }, - .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 462 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 463 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 464 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 465 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 466 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 467 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 383 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 331 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 457 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 458 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 459 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 460 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 461 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 462 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 362 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 463 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 464 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 465 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 466 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 467 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 468 }, + .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 469 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 470 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 471 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 472 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 473 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 474 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 389 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 336 }, .{ .char = 'w', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, - .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 468 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 469 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 470 }, + .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 475 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 476 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 477 }, .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 101 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 471 }, - .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 472 }, - .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 473 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 474 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 475 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 250 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 476 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 477 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 427 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 478 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 479 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 480 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 481 }, - .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 482 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 305 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 483 }, - .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 484 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 485 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 478 }, + .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 479 }, + .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 480 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 481 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 482 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 253 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 483 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 484 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 433 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 485 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 486 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 487 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 488 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 489 }, + .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 490 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 309 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 491 }, + .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 492 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 493 }, .{ .char = 'g', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 486 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 487 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 489 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 490 }, - .{ .char = 'e', .end_of_word = true, .end_of_list = false, .number = 1, .child_index = 0 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 260 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 491 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 492 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 150 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 493 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 179 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 101 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 494 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 495 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 496 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 494 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 495 }, .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 497 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 498 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 498 }, + .{ .char = 'e', .end_of_word = true, .end_of_list = false, .number = 1, .child_index = 0 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 263 }, .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 499 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 500 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 501 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 502 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 503 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 306 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 504 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 505 }, - .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 506 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 170 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 507 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 508 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 509 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 510 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 512 }, - .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 513 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 514 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 173 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 515 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 516 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 517 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 518 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 519 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 520 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 444 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 521 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 522 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 523 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 524 }, - .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 525 }, - .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 526 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 527 }, - .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 193 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 250 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 528 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 529 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 530 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 531 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 440 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 532 }, - .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 533 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 534 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 235 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 535 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 536 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 500 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 151 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 501 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 180 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 101 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 502 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 503 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 504 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 505 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 506 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 507 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 508 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 509 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 510 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 511 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 310 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 512 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 513 }, + .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 514 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 171 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 515 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 516 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 517 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 518 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 520 }, + .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 521 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 522 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 174 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 523 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 524 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 525 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 526 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 527 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 528 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 529 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 451 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 530 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 531 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 532 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 533 }, + .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 534 }, + .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 535 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 536 }, + .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 194 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 253 }, .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 537 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 538 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 539 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 540 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 542 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 538 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 539 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 540 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 447 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 541 }, + .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 542 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 543 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 238 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 544 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 545 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 546 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 547 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 548 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 549 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 551 }, .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 101 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 518 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 543 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 544 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 545 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 546 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 547 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 548 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 549 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 550 }, - .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 551 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 552 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 150 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 173 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 553 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 554 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 555 }, - .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 556 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 557 }, - .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 331 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 558 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 }, - .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 560 }, - .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 561 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 562 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 563 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 564 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 565 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 566 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 567 }, - .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 568 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 569 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 570 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 571 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 526 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 552 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 553 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 554 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 555 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 556 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 557 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 558 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 }, + .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 306 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 560 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 561 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 151 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 174 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 562 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 563 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 564 }, + .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 565 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 566 }, + .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 336 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 567 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 568 }, + .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 569 }, + .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 570 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 571 }, .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 572 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 573 }, - .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 574 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 575 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 573 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 574 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 575 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 576 }, + .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 577 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 578 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 579 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 580 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 581 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 582 }, + .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 583 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 584 }, .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 576 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 577 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 578 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 579 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 193 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 580 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 581 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 582 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 583 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 584 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 585 }, - .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 586 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 587 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 588 }, - .{ .char = 'h', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 585 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 586 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 587 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 588 }, .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 589 }, - .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 590 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 266 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 591 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 590 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 591 }, .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 592 }, .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 593 }, - .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 5, .child_index = 594 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 595 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 596 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 597 }, - .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 598 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 599 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 600 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 601 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 602 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 421 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 603 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 604 }, - .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 150 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 392 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 605 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 606 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 607 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 608 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 150 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 609 }, - .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 610 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 611 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 612 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 613 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 614 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 615 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 616 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 620 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 621 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 622 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 623 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 624 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 193 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 625 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 626 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 594 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 595 }, + .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 596 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 597 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 598 }, + .{ .char = 'h', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 599 }, + .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 600 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 269 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 601 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 602 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 603 }, + .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 5, .child_index = 604 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 605 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 606 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 607 }, + .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 608 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 609 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 610 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 611 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 612 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 427 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 613 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 614 }, + .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 151 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 615 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 398 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 616 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 617 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 618 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 619 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 151 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 620 }, + .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 621 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 622 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 623 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 624 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 625 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 626 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 627 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 631 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 632 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 633 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 634 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 635 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 194 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 636 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 637 }, .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 627 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 628 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 629 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 630 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 631 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 621 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 632 }, - .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 633 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 634 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 635 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 636 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 348 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 637 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 638 }, - .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 639 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 640 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 641 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 638 }, + .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 486 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 639 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 640 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 641 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 642 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 632 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 643 }, + .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 644 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 645 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 646 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 647 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 353 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 648 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 649 }, + .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 650 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 651 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 652 }, .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 101 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 642 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 643 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 372 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 644 }, - .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 645 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 646 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 647 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 648 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 584 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 509 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 649 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 650 }, - .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 651 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 652 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 653 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 654 }, - .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 655 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 656 }, - .{ .char = 'k', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 397 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 657 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 266 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 658 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 300 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 653 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 654 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 377 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 655 }, + .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 656 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 657 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 658 }, .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 659 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 660 }, - .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 193 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 306 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 661 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 594 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 517 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 660 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 661 }, .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 662 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 663 }, - .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 664 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 229 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 665 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 666 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 350 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 667 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 668 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 669 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 670 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 158 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 671 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 663 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 664 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 665 }, + .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 666 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 667 }, + .{ .char = 'k', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 403 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 668 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 269 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 669 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 303 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 670 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 671 }, + .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 194 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 310 }, .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 672 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 673 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 207 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 674 }, - .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 675 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 676 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 633 }, - .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 677 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 678 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 679 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 680 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 219 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 586 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 681 }, - .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 682 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 683 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 684 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 685 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 686 }, + .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 673 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 674 }, + .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 675 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 231 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 676 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 677 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 355 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 678 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 679 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 680 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 681 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 159 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 682 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 683 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 684 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 208 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 685 }, + .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 686 }, .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 687 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 688 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 689 }, - .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 690 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 173 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 691 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 644 }, + .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 688 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 689 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 690 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 691 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 220 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 596 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 692 }, + .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 693 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 694 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 695 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 696 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 697 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 698 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 699 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 700 }, + .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 701 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 174 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 702 }, .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 }, }; pub const data = blk: { - @setEvalBranchQuota(1053); + @setEvalBranchQuota(1071); break :blk [_]Properties{ .{ .tag = .aarch64_sve_pcs, .gnu = true }, .{ .tag = .aarch64_vector_pcs, .gnu = true }, @@ -1062,6 +1075,7 @@ pub const data = blk: { .{ .tag = .selectany, .gnu = true, .declspec = true }, .{ .tag = .sentinel, .gnu = true }, .{ .tag = .simd, .gnu = true }, + .{ .tag = .single, .gnu = true }, .{ .tag = .spectre, .declspec = true }, .{ .tag = .stack_protect, .gnu = true }, .{ .tag = .stdcall, .gnu = true }, @@ -1075,6 +1089,7 @@ pub const data = blk: { .{ .tag = .transparent_union, .gnu = true }, .{ .tag = .unavailable, .gnu = true }, .{ .tag = .uninitialized, .gnu = true }, + .{ .tag = .unsafe_indexable, .gnu = true }, .{ .tag = .unsequenced, .c23 = true }, .{ .tag = .unused, .gnu = true }, .{ .tag = .used, .gnu = true }, diff --git a/lib/compiler/aro/aro/Builtins.zig b/lib/compiler/aro/aro/Builtins.zig @@ -264,7 +264,6 @@ fn createType(desc: TypeDescription, it: *TypeDescription.TypeIterator, comp: *C _ = address_space; // TODO: handle address space const pointer_qt = try comp.type_store.put(comp.gpa, .{ .pointer = .{ .child = builder.finish() catch unreachable, - .decayed = null, } }); builder.@"const" = null; diff --git a/lib/compiler/aro/aro/Builtins/common.zig b/lib/compiler/aro/aro/Builtins/common.zig @@ -751,6 +751,8 @@ pub const Tag = enum(u16) { _Block_object_assign, __builtin_usubl_overflow, __builtin_usubll_overflow, __builtin_va_arg, + __builtin_va_arg_pack, + __builtin_va_arg_pack_len, __builtin_va_copy, __builtin_va_end, __builtin_va_start, @@ -1436,7 +1438,7 @@ pub const longest_name = 41; /// If found, returns the index of the node within the `dafsa` array. /// Otherwise, returns `null`. pub fn findInList(first_child_index: u16, char: u8) ?u16 { - @setEvalBranchQuota(2744); + @setEvalBranchQuota(2748); var index = first_child_index; while (true) { if (dafsa[index].char == char) return index; @@ -1531,7 +1533,7 @@ const Node = packed struct { const dafsa = [_]Node{ .{ .char = 0, .end_of_word = false, .end_of_list = true, .number = 0, .child_index = 1 }, - .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 1016, .child_index = 19 }, + .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 1018, .child_index = 19 }, .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 25, .child_index = 31 }, .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 36 }, .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 82, .child_index = 38 }, @@ -1553,7 +1555,7 @@ const dafsa = [_]Node{ .{ .char = 'E', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 102 }, .{ .char = 'I', .end_of_word = false, .end_of_list = false, .number = 29, .child_index = 103 }, .{ .char = 'R', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 104 }, - .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 938, .child_index = 105 }, + .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 940, .child_index = 105 }, .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 123 }, .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 11, .child_index = 125 }, .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 127 }, @@ -1637,7 +1639,7 @@ const dafsa = [_]Node{ .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 238 }, .{ .char = 'G', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 239 }, .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 34, .child_index = 240 }, - .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 694, .child_index = 245 }, + .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 696, .child_index = 245 }, .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 19, .child_index = 246 }, .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 248 }, .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 249 }, @@ -1775,7 +1777,7 @@ const dafsa = [_]Node{ .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 398 }, .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 399 }, .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 30, .child_index = 400 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 694, .child_index = 401 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 696, .child_index = 401 }, .{ .char = '1', .end_of_word = false, .end_of_list = false, .number = 17, .child_index = 402 }, .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 403 }, .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 404 }, @@ -1931,7 +1933,7 @@ const dafsa = [_]Node{ .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 523 }, .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 524 }, .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 30, .child_index = 525 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 694, .child_index = 526 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 696, .child_index = 526 }, .{ .char = '1', .end_of_word = false, .end_of_list = true, .number = 17, .child_index = 527 }, .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 528 }, .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 529 }, @@ -2056,7 +2058,7 @@ const dafsa = [_]Node{ .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 610 }, .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 611 }, .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 30, .child_index = 612 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 694, .child_index = 613 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 696, .child_index = 613 }, .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 17, .child_index = 614 }, .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 615 }, .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 616 }, @@ -2143,7 +2145,7 @@ const dafsa = [_]Node{ .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 658 }, .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 }, .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 30, .child_index = 659 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 694, .child_index = 660 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 696, .child_index = 660 }, .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 17, .child_index = 661 }, .{ .char = 'i', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 662 }, .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 663 }, @@ -2190,7 +2192,7 @@ const dafsa = [_]Node{ .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 700 }, .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 701 }, .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 30, .child_index = 702 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 694, .child_index = 703 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 696, .child_index = 703 }, .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 17, .child_index = 704 }, .{ .char = 'f', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 705 }, @@ -2233,7 +2235,7 @@ const dafsa = [_]Node{ .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 740 }, .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 741 }, .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 30, .child_index = 742 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 694, .child_index = 754 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 696, .child_index = 754 }, .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 17, .child_index = 755 }, .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 756 }, .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 640 }, @@ -2284,7 +2286,7 @@ const dafsa = [_]Node{ .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 799 }, .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 802 }, .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 804 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 694, .child_index = 805 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 696, .child_index = 805 }, .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 17, .child_index = 825 }, .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 826 }, .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 12, .child_index = 827 }, @@ -2353,7 +2355,7 @@ const dafsa = [_]Node{ .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 76, .child_index = 940 }, .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 23, .child_index = 952 }, .{ .char = 'u', .end_of_word = false, .end_of_list = false, .number = 12, .child_index = 957 }, - .{ .char = 'v', .end_of_word = false, .end_of_list = false, .number = 12, .child_index = 961 }, + .{ .char = 'v', .end_of_word = false, .end_of_list = false, .number = 14, .child_index = 961 }, .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 99 }, .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 17, .child_index = 966 }, .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 512 }, @@ -2491,7 +2493,7 @@ const dafsa = [_]Node{ .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 1140 }, .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 1154 }, .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1157 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 1158 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 1158 }, .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1159 }, .{ .char = 'f', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1160 }, .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 174 }, @@ -2688,7 +2690,7 @@ const dafsa = [_]Node{ .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1387 }, .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1388 }, .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1371 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1389 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1389 }, .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1393 }, .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 174 }, .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 176 }, @@ -2919,7 +2921,7 @@ const dafsa = [_]Node{ .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1574 }, .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1575 }, .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1576 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1577 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 1577 }, .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 509 }, .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 510 }, .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 511 }, @@ -3107,1047 +3109,1054 @@ const dafsa = [_]Node{ .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1728 }, .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1729 }, .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1730 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1604 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1731 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1732 }, - .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1733 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1731 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1732 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1733 }, + .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1734 }, .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 236 }, .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 857 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1734 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1735 }, .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 863 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1735 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1736 }, .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 867 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 1736 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1735 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 1737 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 13, .child_index = 1739 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 25, .child_index = 1740 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1741 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1742 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1743 }, - .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1744 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1745 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1746 }, - .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1747 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 1737 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1736 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 1738 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 13, .child_index = 1740 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 25, .child_index = 1741 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1742 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1743 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1744 }, + .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1745 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1746 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1747 }, + .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1748 }, .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 567 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1748 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1749 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1749 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1750 }, .{ .char = '6', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 633 }, .{ .char = '6', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 633 }, .{ .char = 'g', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 1750 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1751 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1752 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1753 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1754 }, - .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 10, .child_index = 1755 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 1751 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1752 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1753 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1754 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1755 }, + .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 10, .child_index = 1756 }, .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 569 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1756 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1757 }, .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1208 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1757 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1759 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1761 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1758 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1760 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1762 }, .{ .char = 'o', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 572 }, - .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1762 }, + .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1763 }, .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 649 }, - .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1763 }, + .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1764 }, .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 641 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1764 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1765 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1766 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1767 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1768 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1770 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1771 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1772 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1773 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1774 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1771 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1775 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1777 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1777 }, - .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1778 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1779 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1780 }, - .{ .char = 'a', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1782 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1783 }, - .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1784 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1785 }, - .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1786 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1765 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1766 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1767 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1768 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1769 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1771 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1772 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1773 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1774 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1775 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1772 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1776 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1778 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1778 }, + .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1779 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1780 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1781 }, + .{ .char = 'a', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1783 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1784 }, + .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1785 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1786 }, + .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1787 }, .{ .char = '1', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 632 }, - .{ .char = '3', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1787 }, + .{ .char = '3', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1788 }, .{ .char = '6', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 633 }, - .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1788 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1789 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1790 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1791 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1792 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1793 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1794 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1795 }, - .{ .char = '2', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1796 }, + .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1789 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1790 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1791 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1792 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1793 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1794 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1795 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1796 }, + .{ .char = '2', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1797 }, .{ .char = '6', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1797 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1798 }, .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 236 }, .{ .char = 's', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1798 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1799 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1800 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1801 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1803 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1804 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1805 }, - .{ .char = '2', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1796 }, - .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 1806 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1807 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1808 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1809 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1810 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1811 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1812 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1813 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1814 }, - .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1815 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1816 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1817 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1818 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1819 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1751 }, - .{ .char = 's', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 1820 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1822 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1823 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1799 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1800 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1801 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1802 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1804 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1805 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1806 }, + .{ .char = '2', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1797 }, + .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 1807 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1808 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1809 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1810 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1811 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1812 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1813 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1814 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1815 }, + .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1816 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1817 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1818 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1819 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1820 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1752 }, + .{ .char = 's', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 1821 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1823 }, .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1824 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1825 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1825 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1826 }, .{ .char = 'a', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1479 }, .{ .char = 'd', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1479 }, - .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1826 }, - .{ .char = 'y', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 1827 }, - .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 1827 }, - .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1828 }, - .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1829 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1830 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1831 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1832 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1833 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1834 }, + .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1827 }, + .{ .char = 'y', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 1828 }, + .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 1828 }, + .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1829 }, + .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1830 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1831 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1832 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1833 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1834 }, .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1835 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1836 }, - .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1837 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1836 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1837 }, + .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1838 }, .{ .char = 'y', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 1278 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1838 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1839 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 1840 }, - .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1841 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1842 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 9, .child_index = 1843 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1844 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1839 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1840 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 1841 }, + .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1842 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1843 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 9, .child_index = 1844 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1845 }, .{ .char = 'o', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1479 }, .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1674 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 1845 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 1847 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 1846 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 1848 }, .{ .char = 'f', .end_of_word = true, .end_of_list = false, .number = 3, .child_index = 1489 }, .{ .char = 'l', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1458 }, .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1327 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 1848 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 1849 }, .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1479 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1849 }, .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1850 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1851 }, .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 287 }, - .{ .char = 's', .end_of_word = true, .end_of_list = true, .number = 8, .child_index = 1851 }, + .{ .char = 's', .end_of_word = true, .end_of_list = true, .number = 8, .child_index = 1852 }, .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 419 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1854 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1855 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1856 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1857 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1858 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1859 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1860 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1861 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1855 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1856 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1857 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1858 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1859 }, + .{ .char = 'g', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 1860 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1861 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1862 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1863 }, .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 448 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1862 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 1863 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 1864 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1865 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 13, .child_index = 1866 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 25, .child_index = 1872 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1883 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1884 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1885 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1864 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 1865 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 1866 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1867 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 13, .child_index = 1868 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 25, .child_index = 1874 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1885 }, .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1886 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1887 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1888 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1889 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1887 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1888 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1889 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1890 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1891 }, .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 657 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1890 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 1891 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1892 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 1893 }, .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 571 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1892 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1893 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1894 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 10, .child_index = 1895 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1896 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1894 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1895 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1896 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 10, .child_index = 1897 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1898 }, .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 448 }, .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 448 }, .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 453 }, .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 447 }, .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 510 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1897 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1898 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1899 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1900 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1901 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1902 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1774 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1903 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1904 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1774 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1905 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1906 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1903 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1905 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1903 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1775 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1899 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1900 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1901 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1902 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1903 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1904 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1775 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1905 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1906 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1775 }, .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1907 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1835 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1908 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1908 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1905 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1907 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1905 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1776 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1909 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1836 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1910 }, .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 281 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1909 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1911 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1912 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1911 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1913 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1914 }, .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 301 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1915 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1917 }, .{ .char = '2', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1916 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1917 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1918 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1919 }, - .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1920 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1921 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1922 }, - .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1923 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1918 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1919 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1920 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1921 }, + .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1922 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1923 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1924 }, + .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1925 }, .{ .char = '8', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1924 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1925 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1926 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1927 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1928 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1929 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1930 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1931 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1932 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1933 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1934 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1926 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1927 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1928 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1929 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1930 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1931 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1932 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1933 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1934 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1935 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1936 }, .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1513 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1935 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1936 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1937 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1937 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1938 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1939 }, .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 698 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1938 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1939 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1940 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1941 }, .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1241 }, - .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1940 }, - .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1941 }, + .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1942 }, + .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1943 }, .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 998 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1942 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1943 }, - .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1944 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1944 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1945 }, + .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1946 }, .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 640 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1945 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1947 }, .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1525 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1946 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1947 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1949 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1948 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1949 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1951 }, .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1318 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1950 }, - .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1951 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1952 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1953 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1952 }, + .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1953 }, .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1954 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1955 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1955 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1956 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1957 }, .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 486 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1956 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1957 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1958 }, - .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1959 }, - .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 1960 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1961 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1962 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 9, .child_index = 1963 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1950 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 1967 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1968 }, - .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1969 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1958 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1959 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1960 }, + .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1961 }, + .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 1962 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1963 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1964 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 9, .child_index = 1965 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1952 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 1969 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1970 }, + .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1971 }, .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1479 }, .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1280 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1922 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1924 }, .{ .char = 'f', .end_of_word = true, .end_of_list = false, .number = 3, .child_index = 1489 }, .{ .char = 'l', .end_of_word = true, .end_of_list = false, .number = 1, .child_index = 0 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1970 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1971 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1972 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1973 }, - .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1974 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1975 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1976 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1977 }, - .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1978 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1972 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1973 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1974 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1975 }, + .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1976 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1977 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1978 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1979 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1980 }, + .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1981 }, .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 1979 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1980 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1981 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 1982 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1983 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1984 }, .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1579 }, .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1580 }, .{ .char = 'f', .end_of_word = false, .end_of_list = false, .number = 7, .child_index = 1587 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1982 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1985 }, .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1583 }, .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1588 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1983 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1985 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1986 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1988 }, .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 791 }, .{ .char = 'f', .end_of_word = false, .end_of_list = false, .number = 8, .child_index = 792 }, .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 794 }, .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 795 }, .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 797 }, .{ .char = 'o', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 798 }, - .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 1986 }, + .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 1989 }, .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1586 }, .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 804 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1988 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1995 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1996 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1997 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1991 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1998 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1999 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2000 }, .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1998 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1999 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2000 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2001 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2002 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2003 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2004 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 10, .child_index = 2005 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2001 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2002 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2003 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2004 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2005 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2006 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2007 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 10, .child_index = 2008 }, .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 791 }, .{ .char = 'b', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, - .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2006 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2007 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2008 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2009 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2010 }, - .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2011 }, - .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2012 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2011 }, - .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2011 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2013 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2014 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2015 }, - .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2016 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2017 }, + .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2009 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2010 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2011 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2012 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2013 }, + .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2014 }, + .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2015 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2014 }, + .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2014 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2016 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2017 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2018 }, + .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2019 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2020 }, .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1519 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2018 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2019 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2020 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2021 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2022 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2021 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2022 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2023 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2024 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2025 }, .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 503 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2023 }, - .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2024 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2025 }, - .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2026 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2026 }, + .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2027 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2028 }, + .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2029 }, .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 5, .child_index = 1295 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2027 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2028 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2030 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2031 }, .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 281 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2029 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2032 }, .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 554 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2030 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2031 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2032 }, - .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2033 }, - .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2034 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2035 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2036 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2037 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2038 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2039 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2033 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2034 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2035 }, + .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2036 }, + .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2037 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2038 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2039 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2040 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2041 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2042 }, .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 419 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2040 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2041 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2042 }, - .{ .char = 'q', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2043 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2044 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2045 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2046 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2047 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2048 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2049 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2050 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2051 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2052 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2053 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2054 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1745 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2055 }, - .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2056 }, - .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 2057 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2059 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2060 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2063 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2064 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1757 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 2065 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2043 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2044 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2045 }, + .{ .char = 'q', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2046 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2047 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2048 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2049 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2050 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2051 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2052 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2053 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2054 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2055 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2056 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2057 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1746 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2058 }, + .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2059 }, + .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 2060 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2062 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2063 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2066 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2067 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1758 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 2068 }, .{ .char = 'o', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 572 }, .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 649 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2068 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2069 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1923 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2071 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2072 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1925 }, .{ .char = 'i', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 352 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2070 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2071 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2072 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2073 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1982 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2073 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2074 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2075 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2076 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1985 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2077 }, .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1661 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2074 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2075 }, - .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 2076 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2077 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2078 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2078 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2079 }, + .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 2080 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2081 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2082 }, .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 236 }, .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 851 }, .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 851 }, .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 854 }, .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 864 }, .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 865 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 12, .child_index = 2079 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1759 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2081 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2082 }, - .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2083 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2084 }, - .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2085 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2086 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2087 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2088 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2089 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2090 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2091 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2092 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2093 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2094 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2095 }, - .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 10, .child_index = 2096 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2097 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 12, .child_index = 2083 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1760 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2085 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2086 }, + .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2087 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2088 }, + .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2089 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2090 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2091 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2092 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2093 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2094 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2095 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2096 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2097 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2098 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2099 }, + .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 10, .child_index = 2100 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2101 }, .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 476 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2098 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2099 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2100 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2101 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2011 }, - .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2102 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2102 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2103 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2104 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2105 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2014 }, + .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2106 }, .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 447 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2103 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2104 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2105 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2106 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2107 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2108 }, - .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2109 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2110 }, - .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2111 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2112 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2107 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2108 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2109 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2110 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2111 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2112 }, + .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2113 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2114 }, + .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2115 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2116 }, .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 281 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2113 }, - .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2114 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2115 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2117 }, + .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2118 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2119 }, .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 568 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2116 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2117 }, - .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2118 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2119 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2120 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2120 }, .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2121 }, + .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2122 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2123 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2124 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2125 }, .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 335 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2122 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2126 }, .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 437 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2123 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2124 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2127 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2128 }, .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 448 }, - .{ .char = 'r', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2125 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1822 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2126 }, + .{ .char = 'r', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2129 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1823 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2130 }, .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1423 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2041 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2127 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2128 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2129 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2044 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2131 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2132 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2133 }, .{ .char = 'r', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1479 }, .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1689 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2130 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2131 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2132 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2133 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2135 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2134 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2135 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2136 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2137 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2139 }, .{ .char = 'g', .end_of_word = true, .end_of_list = false, .number = 1, .child_index = 0 }, .{ .char = 'l', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 695 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2136 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2137 }, - .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2138 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2139 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2141 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2142 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2143 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2144 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2140 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2141 }, + .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2142 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2143 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2145 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2146 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2147 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2148 }, .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 640 }, - .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2145 }, - .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2146 }, - .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2147 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2148 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1974 }, - .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2149 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2150 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2151 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 2152 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2157 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2108 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2161 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2161 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2162 }, + .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2149 }, + .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2150 }, + .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2151 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2152 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1976 }, + .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2153 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2154 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2155 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2156 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 2157 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2162 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2112 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2166 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2166 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2167 }, .{ .char = 'r', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 974 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2163 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1759 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2082 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2168 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1760 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2086 }, .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 974 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2164 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2169 }, .{ .char = 'h', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 974 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2165 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2166 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2167 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2168 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2170 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2171 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2172 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2173 }, .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 }, - .{ .char = 'E', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2169 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2170 }, - .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 10, .child_index = 2171 }, + .{ .char = 'E', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2174 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2175 }, + .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 10, .child_index = 2176 }, .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 }, - .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2176 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2177 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2178 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2179 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2180 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2181 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2182 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2183 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2184 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2185 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2157 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2186 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2187 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 572 }, + .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2181 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2182 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2183 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2184 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2185 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2186 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2187 }, .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2188 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2189 }, - .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2190 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2191 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2192 }, - .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2193 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2194 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2195 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2196 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2197 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2198 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2199 }, - .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2200 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1943 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2201 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2202 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2203 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2204 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2205 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2206 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2207 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2208 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2209 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2210 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2211 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2212 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2213 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2214 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2215 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2216 }, - .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2141 }, - .{ .char = 'x', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2217 }, - .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2217 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2157 }, - .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2145 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2218 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2219 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2189 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2190 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2162 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2191 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2192 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 572 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2193 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2194 }, + .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2195 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2196 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2197 }, + .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2198 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2199 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2200 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2201 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2202 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2203 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2204 }, + .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2205 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1945 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2206 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2207 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2208 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2209 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2210 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2211 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2212 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2213 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2214 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2215 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2216 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2217 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2218 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2219 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2220 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2221 }, + .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2145 }, + .{ .char = 'x', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2222 }, + .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2222 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2162 }, + .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2149 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2223 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2224 }, .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2220 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2225 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2226 }, .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1757 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1759 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1758 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1760 }, .{ .char = 'o', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 572 }, - .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1762 }, + .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1763 }, .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 649 }, .{ .char = '1', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 632 }, - .{ .char = '3', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1787 }, + .{ .char = '3', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1788 }, .{ .char = '6', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 633 }, .{ .char = '8', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, .{ .char = 'd', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 974 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2161 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2166 }, .{ .char = 'b', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 974 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2221 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2222 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2227 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2228 }, .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 314 }, .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1421 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2223 }, - .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2224 }, - .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2225 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2229 }, + .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2230 }, + .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2231 }, .{ .char = '1', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 632 }, .{ .char = '8', .end_of_word = true, .end_of_list = false, .number = 1, .child_index = 0 }, - .{ .char = 'A', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2226 }, - .{ .char = 'P', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2035 }, - .{ .char = 'S', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2227 }, - .{ .char = 'M', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2228 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2229 }, - .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2230 }, + .{ .char = 'A', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2232 }, + .{ .char = 'P', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2038 }, + .{ .char = 'S', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2233 }, + .{ .char = 'M', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2234 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2235 }, + .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2236 }, .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 512 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2231 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2232 }, - .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2233 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2234 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2235 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2236 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2237 }, - .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2238 }, - .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2239 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2237 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2238 }, + .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2239 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2240 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2241 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2242 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2243 }, + .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2244 }, + .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2245 }, .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 649 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2240 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2246 }, .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 335 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2241 }, - .{ .char = 'j', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2242 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2243 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2244 }, - .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2245 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2201 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2246 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2247 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2248 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2247 }, + .{ .char = 'j', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2248 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2249 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2250 }, + .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2251 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2206 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2252 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2253 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2254 }, .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 566 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2249 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1752 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2250 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2251 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2252 }, - .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2253 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2254 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2231 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2255 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2256 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2257 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2258 }, - .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2259 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2260 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2261 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2262 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2263 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2264 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2265 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2266 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2267 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2268 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2269 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2255 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1753 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2256 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2257 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2258 }, + .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2259 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2260 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2237 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2261 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2262 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2263 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2264 }, + .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2265 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2266 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2267 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2268 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2269 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2270 }, + .{ .char = 'k', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2271 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2272 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2273 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2274 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2275 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2276 }, .{ .char = '1', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 632 }, .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1430 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2270 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2271 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2277 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2278 }, .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2272 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2279 }, .{ .char = 'w', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2273 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2274 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2275 }, - .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2276 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2277 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2278 }, - .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 2279 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2280 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2281 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2282 }, + .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2283 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2284 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2285 }, + .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 2286 }, .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2281 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2282 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2288 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2289 }, .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1546 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2283 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2284 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2296 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2290 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2291 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2303 }, .{ .char = 'm', .end_of_word = true, .end_of_list = true, .number = 5, .child_index = 1295 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2297 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2298 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2299 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2304 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2305 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2306 }, .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2300 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2301 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2303 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2304 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2305 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2306 }, - .{ .char = 'h', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2307 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2308 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2309 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2310 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2197 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2307 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2308 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2310 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2311 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2312 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2313 }, + .{ .char = 'h', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2314 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2315 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2316 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2317 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2202 }, .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 561 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2312 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2313 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2314 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2315 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2316 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2317 }, - .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2319 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2319 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2320 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2171 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2321 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2322 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2323 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2324 }, + .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2326 }, .{ .char = 'b', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 1434 }, - .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2320 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2321 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2322 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2323 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2324 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2325 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2326 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2327 }, - .{ .char = 'f', .end_of_word = true, .end_of_list = false, .number = 2, .child_index = 2225 }, + .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2327 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2328 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2329 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2330 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2331 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2332 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2333 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2334 }, + .{ .char = 'f', .end_of_word = true, .end_of_list = false, .number = 2, .child_index = 2231 }, .{ .char = 'l', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 486 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2328 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2329 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2330 }, - .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2335 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 2336 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2339 }, - .{ .char = 'f', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2340 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2342 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2343 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2345 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2346 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2347 }, - .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 2349 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2352 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2354 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2355 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2356 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2357 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2358 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2335 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2336 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2337 }, + .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2342 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 2343 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2346 }, + .{ .char = 'f', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2347 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2349 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2350 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2352 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2353 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2354 }, + .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 2356 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2359 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2361 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2362 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2363 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2364 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2365 }, .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1583 }, .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1588 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2359 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2366 }, .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 450 }, - .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2360 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2361 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2362 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2363 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2364 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2367 }, + .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2367 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2368 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2369 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2370 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2371 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2374 }, .{ .char = 'p', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2368 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2369 }, - .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2370 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2371 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2372 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 8, .child_index = 2373 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2374 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2375 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2376 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2377 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2378 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2379 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2380 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2381 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2382 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2383 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2375 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2376 }, + .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2377 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2378 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2379 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 8, .child_index = 2380 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2381 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2382 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2383 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2384 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2385 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2386 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2387 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2388 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2389 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2390 }, .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 447 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2384 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2391 }, .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 335 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2385 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2386 }, - .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2387 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2388 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2389 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2390 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2392 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2393 }, + .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2394 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2395 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2396 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2397 }, .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 706 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2391 }, - .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2393 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2394 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2395 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2397 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2398 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2399 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2400 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2401 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2398 }, + .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2400 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2401 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2402 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2404 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2405 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2406 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2407 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2408 }, .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 567 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2403 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2404 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2410 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2411 }, .{ .char = 'q', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 276 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2405 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2404 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2406 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2407 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2408 }, - .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2409 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2410 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2411 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2412 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2413 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2414 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2415 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2416 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2417 }, - .{ .char = 'g', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2418 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2419 }, - .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2363 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2420 }, - .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2421 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2422 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2412 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2411 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2413 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2414 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2415 }, + .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2416 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2417 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2418 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2419 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2420 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2421 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2422 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2423 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2424 }, + .{ .char = 'g', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2425 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2426 }, + .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2370 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2427 }, + .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2428 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2429 }, .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 974 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2423 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2424 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2425 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2426 }, - .{ .char = 'C', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2427 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2428 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2429 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2430 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2431 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2432 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2433 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2434 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2435 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2430 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2431 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2432 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2433 }, + .{ .char = 'C', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2434 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2435 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2436 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2437 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2438 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2439 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2440 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2441 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2442 }, .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 335 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2436 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2443 }, .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 447 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2437 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2438 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2439 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2440 }, - .{ .char = 's', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2441 }, - .{ .char = 'p', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 2442 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2444 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2445 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2446 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2447 }, + .{ .char = 's', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2448 }, + .{ .char = 'p', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 2449 }, .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 649 }, .{ .char = 'a', .end_of_word = true, .end_of_list = false, .number = 1, .child_index = 0 }, .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 448 }, - .{ .char = 'g', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 2442 }, - .{ .char = 'x', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 2444 }, - .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 2444 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2446 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2447 }, + .{ .char = 'g', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 2449 }, + .{ .char = 'x', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 2451 }, + .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 2451 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2453 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2454 }, .{ .char = 'w', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2448 }, - .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2441 }, - .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2436 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2449 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2450 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2455 }, + .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2448 }, + .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2443 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2456 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2457 }, .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 572 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2451 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2452 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2453 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2454 }, - .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2455 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2456 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2457 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2458 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2459 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2460 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2461 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2462 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2463 }, - .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2464 }, - .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 768 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2374 }, - .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 8, .child_index = 2465 }, - .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2467 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2468 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2469 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2458 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2459 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2460 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2461 }, + .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2462 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2463 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2464 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2465 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2466 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2467 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2468 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2469 }, .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2470 }, - .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2471 }, - .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2472 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2473 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2474 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2475 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2476 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2477 }, - .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2478 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2479 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2480 }, - .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1751 }, + .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2471 }, + .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 768 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2381 }, + .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 8, .child_index = 2472 }, + .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2474 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2475 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2476 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2477 }, + .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2478 }, + .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2479 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2480 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2481 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2482 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2483 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2484 }, + .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2485 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2486 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2487 }, + .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1752 }, .{ .char = 'h', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, - .{ .char = '1', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2481 }, + .{ .char = '1', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2488 }, .{ .char = '2', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2262 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2268 }, .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 561 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2482 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2483 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2484 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2489 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2490 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2491 }, .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 555 }, - .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2485 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2486 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2487 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2488 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2489 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2490 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2491 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2492 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2493 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2494 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2495 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2496 }, + .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2492 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2493 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2494 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2495 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2496 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2497 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2498 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2499 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2500 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2501 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2502 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2503 }, .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 450 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2025 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2497 }, - .{ .char = '6', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 2498 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2499 }, - .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 2502 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2506 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2507 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2508 }, - .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2509 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2510 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2511 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2512 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2513 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2514 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2515 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2028 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2504 }, + .{ .char = '6', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 2505 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2506 }, + .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 2509 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2513 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2514 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2515 }, + .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2516 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2517 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2518 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2519 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2520 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2521 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2522 }, .{ .char = '2', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2516 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2517 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2523 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2524 }, .{ .char = '0', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, - .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2518 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2519 }, - .{ .char = 'd', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2520 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2521 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2522 }, - .{ .char = 'j', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2523 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2524 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2525 }, - .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2526 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2527 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2528 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2529 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2530 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2531 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2532 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2533 }, - .{ .char = '4', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 2534 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2535 }, + .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2525 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2526 }, + .{ .char = 'd', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2527 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2528 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2529 }, + .{ .char = 'j', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2530 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2531 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2532 }, + .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2533 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2534 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2535 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2536 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2537 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2538 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2539 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2540 }, + .{ .char = '4', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 2541 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2542 }, .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 486 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2536 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2543 }, .{ .char = '1', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 632 }, .{ .char = '6', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 633 }, .{ .char = '8', .end_of_word = true, .end_of_list = false, .number = 1, .child_index = 0 }, - .{ .char = 'P', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2537 }, - .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2538 }, - .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2539 }, - .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2041 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2540 }, + .{ .char = 'P', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2544 }, + .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2545 }, + .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2546 }, + .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2044 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2547 }, .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 512 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1974 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2541 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2542 }, - .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2543 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1976 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2548 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2549 }, + .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2550 }, .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 301 }, - .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2544 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2545 }, + .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2551 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2552 }, .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 461 }, .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 567 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2546 }, - .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2547 }, - .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2548 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2549 }, - .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2550 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1973 }, - .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2551 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2553 }, + .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2554 }, + .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2555 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2556 }, + .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2557 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1975 }, + .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2558 }, .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 181 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2552 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2553 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2554 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2555 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2556 }, - .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2557 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2499 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2558 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2559 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2560 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2561 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2562 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2563 }, + .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2564 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2506 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2565 }, .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 640 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2559 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2560 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2561 }, - .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2015 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2565 }, - .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2566 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2566 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2567 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2568 }, + .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2018 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2572 }, + .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2573 }, .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 438 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2567 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2568 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2574 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2575 }, .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 314 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2569 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2570 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2252 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2571 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2572 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1751 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2573 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2576 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2577 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2258 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2578 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2579 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1752 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2580 }, .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 567 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2574 }, - .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2575 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2576 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2581 }, + .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2582 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2583 }, .{ .char = 'q', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2577 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2578 }, - .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2579 }, - .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2580 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2584 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2585 }, + .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2586 }, + .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2587 }, .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 511 }, .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 411 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2581 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2387 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2093 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2582 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2583 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2072 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2584 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1834 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2585 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2586 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2587 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2588 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2590 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2591 }, - .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2592 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2588 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2394 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2097 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2589 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2590 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2075 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2591 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1835 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2592 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2593 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2594 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2595 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2597 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2598 }, + .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2599 }, .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 572 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2151 }, - .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1745 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2593 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2156 }, + .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1746 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2600 }, .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 }, - .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2594 }, - .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2595 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2596 }, - .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2597 }, + .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2601 }, + .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2602 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2603 }, + .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2604 }, .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 756 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2598 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2599 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2600 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 437 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2601 }, - .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2602 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2603 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2604 }, - .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2605 }, - .{ .char = 'S', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2606 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2605 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2606 }, .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2607 }, - .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2608 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2609 }, - .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2610 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 437 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2608 }, + .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2609 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2610 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2611 }, + .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2612 }, + .{ .char = 'S', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2613 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2614 }, + .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2615 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2616 }, + .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2617 }, .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1185 }, - .{ .char = 'r', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2611 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2612 }, + .{ .char = 'r', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2618 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2619 }, .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 639 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2189 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2194 }, .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 554 }, - .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2613 }, + .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2620 }, .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 449 }, - .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2045 }, - .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2614 }, - .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2041 }, + .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2048 }, + .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2621 }, + .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2044 }, }; pub const data = blk: { - @setEvalBranchQuota(12348); + @setEvalBranchQuota(12366); break :blk [_]Properties{ .{ .param_str = "vv*vC*iC", .header = .blocks, .language = .all_languages, .attributes = .{ .lib_function_without_prefix = true } }, .{ .param_str = "vvC*iC", .header = .blocks, .language = .all_languages, .attributes = .{ .lib_function_without_prefix = true } }, @@ -4892,6 +4901,8 @@ pub const data = blk: { .{ .param_str = "bULiCULiCULi*", .attributes = .{ .const_evaluable = true } }, .{ .param_str = "bULLiCULLiCULLi*", .attributes = .{ .const_evaluable = true } }, .{ .param_str = "v.", .attributes = .{ .custom_typecheck = true } }, + .{ .param_str = "v", .attributes = .{ .custom_typecheck = true } }, + .{ .param_str = "i", .attributes = .{ .custom_typecheck = true } }, .{ .param_str = "vAA", .attributes = .{ .lib_function_with_builtin_prefix = true } }, .{ .param_str = "vA", .attributes = .{ .lib_function_with_builtin_prefix = true } }, .{ .param_str = "vA.", .attributes = .{ .custom_typecheck = true } }, diff --git a/lib/compiler/aro/aro/Builtins/eval.zig b/lib/compiler/aro/aro/Builtins/eval.zig @@ -1,16 +1,19 @@ const std = @import("std"); +const assert = std.debug.assert; + const backend = @import("../../backend.zig"); const Interner = backend.Interner; + const Builtins = @import("../Builtins.zig"); const Parser = @import("../Parser.zig"); const Tree = @import("../Tree.zig"); const TypeStore = @import("../TypeStore.zig"); -const Type = TypeStore.Type; const QualType = TypeStore.QualType; +const Type = TypeStore.Type; const Value = @import("../Value.zig"); fn makeNan(comptime T: type, str: []const u8) T { - const UnsignedSameSize = std.meta.Int(.unsigned, @bitSizeOf(T)); + const UnsignedSameSize = @Int(.unsigned, @bitSizeOf(T)); const parsed = std.fmt.parseUnsigned(UnsignedSameSize, str[0 .. str.len - 1], 0) catch 0; const bits: switch (T) { f32 => u23, @@ -24,7 +27,6 @@ fn makeNan(comptime T: type, str: []const u8) T { pub fn eval(expanded: Builtins.Expanded, p: *Parser, args: []const Tree.Node.Index) !Value { if (!expanded.attributes.const_evaluable) return .{}; - switch (expanded.tag) { .common => |tag| switch (tag) { .__builtin_inff, @@ -47,12 +49,12 @@ pub fn eval(expanded: Builtins.Expanded, p: *Parser, args: []const Tree.Node.Ind return Value.intern(p.comp, .{ .float = f }); }, .__builtin_isinf => blk: { - if (args.len == 0) break :blk; + assert(args.len == 1); const val = p.tree.value_map.get(args[0]) orelse break :blk; return Value.fromBool(val.isInf(p.comp)); }, .__builtin_isinf_sign => blk: { - if (args.len == 0) break :blk; + assert(args.len == 1); const val = p.tree.value_map.get(args[0]) orelse break :blk; switch (val.isInfSign(p.comp)) { .unknown => {}, @@ -62,12 +64,12 @@ pub fn eval(expanded: Builtins.Expanded, p: *Parser, args: []const Tree.Node.Ind } }, .__builtin_isnan => blk: { - if (args.len == 0) break :blk; + assert(args.len == 1); const val = p.tree.value_map.get(args[0]) orelse break :blk; return Value.fromBool(val.isNan(p.comp)); }, .__builtin_nan => blk: { - if (args.len == 0) break :blk; + assert(args.len == 1); const val = p.getDecayedStringLiteral(args[0]) orelse break :blk; const bytes = p.comp.interner.get(val.ref()).bytes; @@ -80,6 +82,12 @@ pub fn eval(expanded: Builtins.Expanded, p: *Parser, args: []const Tree.Node.Ind }; return Value.intern(p.comp, .{ .float = f }); }, + .__builtin_constant_p => { + assert(args.len == 1); + const arg = args[0]; + const val = p.tree.value_map.get(arg) orelse return Value.fromBool(p.isAddressOfStringLiteral(arg)); + return Value.fromBool(!val.isPointer(p.comp)); + }, else => {}, }, else => {}, diff --git a/lib/compiler/aro/aro/CodeGen.zig b/lib/compiler/aro/aro/CodeGen.zig @@ -2,7 +2,7 @@ const std = @import("std"); const Allocator = std.mem.Allocator; const assert = std.debug.assert; -const backend = @import("backend"); +const backend = @import("../backend.zig"); const Interner = backend.Interner; const Ir = backend.Ir; const Builder = Ir.Builder; @@ -867,6 +867,8 @@ fn genExpr(c: *CodeGen, node_index: Node.Index) Error!Ir.Ref { .imag_expr, .real_expr, .sizeof_expr, + .builtin_va_arg_pack, + .builtin_va_arg_pack_len, => return c.fail("TODO CodeGen.genExpr {s}\n", .{@tagName(node)}), else => unreachable, // Not an expression. } diff --git a/lib/compiler/aro/aro/Compilation.zig b/lib/compiler/aro/aro/Compilation.zig @@ -71,34 +71,23 @@ pub const Environment = struct { /// used for __DATE__, __TIME__, and __TIMESTAMP__ provided: u64, - pub const default: @This() = .{ .provided = 0 }; + pub const default: SourceEpoch = .{ .provided = 0 }; }; - pub fn loadAll(allocator: std.mem.Allocator, environ_map: *const std.process.Environ.Map) !Environment { + /// Load all of the environment variables from an environ map. Does not copy values. + pub fn loadAll(environ_map: *const std.process.Environ.Map) Environment { var env: Environment = .{}; - errdefer env.deinit(allocator); inline for (@typeInfo(@TypeOf(env)).@"struct".fields) |field| { std.debug.assert(@field(env, field.name) == null); var env_var_buf: [field.name.len]u8 = undefined; const env_var_name = std.ascii.upperString(&env_var_buf, field.name); - const val: ?[]const u8 = if (environ_map.get(env_var_name)) |v| try allocator.dupe(u8, v) else null; - @field(env, field.name) = val; + @field(env, field.name) = environ_map.get(env_var_name); } return env; } - /// Use this only if environment slices were allocated with `allocator` (such as via `loadAll`) - pub fn deinit(self: *Environment, allocator: std.mem.Allocator) void { - inline for (@typeInfo(@TypeOf(self.*)).@"struct".fields) |field| { - if (@field(self, field.name)) |slice| { - allocator.free(slice); - } - } - self.* = undefined; - } - pub fn sourceEpoch(self: *const Environment, io: Io) !SourceEpoch { const max_timestamp = 253402300799; // Dec 31 9999 23:59:59 @@ -148,7 +137,7 @@ gpa: Allocator, /// Allocations in this arena live all the way until `Compilation.deinit`. arena: Allocator, io: Io, -cwd: Io.Dir, +cwd: std.Io.Dir, diagnostics: *Diagnostics, sources: std.StringArrayHashMapUnmanaged(Source) = .empty, @@ -175,37 +164,48 @@ pragma_handlers: std.StringArrayHashMapUnmanaged(*Pragma) = .empty, /// Used by MS extensions which allow searching for includes relative to the directory of the main source file. ms_cwd_source_id: ?Source.Id = null, -pub fn init(gpa: Allocator, arena: Allocator, io: Io, diagnostics: *Diagnostics, cwd: Io.Dir) Compilation { - return .{ - .gpa = gpa, - .arena = arena, - .io = io, - .diagnostics = diagnostics, - .cwd = cwd, - }; -} - -/// Initialize Compilation with default environment, -/// pragma handlers and emulation mode set to target. -pub fn initDefault( +pub const InitOptions = struct { gpa: Allocator, arena: Allocator, io: Io, diagnostics: *Diagnostics, - cwd: Io.Dir, - environ_map: *const std.process.Environ.Map, -) !Compilation { + + /// Used to initiate `Compilation.Environment`, values are not copied. + environ_map: ?*const std.process.Environ.Map, + /// Defaults to `std.Io.Dir.cwd()` + cwd: ?std.Io.Dir = null, + + add_default_pragma_handlers: bool = true, + + pub const testing: InitOptions = .{ + .gpa = std.testing.allocator, + .arena = undefined, + .io = std.testing.io, + .diagnostics = undefined, + .environ_map = null, + .add_default_pragma_handlers = false, + }; +}; + +/// Initialize Compilation with default environment, +/// pragma handlers and emulation mode set to target. +pub fn init(options: InitOptions) !Compilation { var comp: Compilation = .{ - .gpa = gpa, - .arena = arena, - .io = io, - .diagnostics = diagnostics, - .environment = try Environment.loadAll(gpa, environ_map), - .cwd = cwd, + .gpa = options.gpa, + .arena = options.arena, + .io = options.io, + .diagnostics = options.diagnostics, + .cwd = options.cwd orelse .cwd(), }; errdefer comp.deinit(); - try comp.addDefaultPragmaHandlers(); - comp.langopts.setEmulatedCompiler(comp.target.systemCompiler()); + + if (options.environ_map) |map| { + comp.environment = .loadAll(map); + } + + if (options.add_default_pragma_handlers) { + try comp.addDefaultPragmaHandlers(); + } return comp; } @@ -228,7 +228,6 @@ pub fn deinit(comp: *Compilation) void { comp.builtins.deinit(gpa); comp.string_interner.deinit(gpa); comp.interner.deinit(gpa); - comp.environment.deinit(gpa); comp.type_store.deinit(gpa); comp.* = undefined; } @@ -275,17 +274,18 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void { } try w.writeAll( + \\#define __ARO_EMULATE_NO__ 0 \\#define __ARO_EMULATE_CLANG__ 1 \\#define __ARO_EMULATE_GCC__ 2 \\#define __ARO_EMULATE_MSVC__ 3 \\ ); - const emulated = switch (comp.langopts.emulate) { + try w.print("#define __ARO_EMULATE__ {s}\n", .{switch (comp.langopts.emulate) { + .no => "__ARO_EMULATE_NO__", .clang => "__ARO_EMULATE_CLANG__", .gcc => "__ARO_EMULATE_GCC__", .msvc => "__ARO_EMULATE_MSVC__", - }; - try w.print("#define __ARO_EMULATE__ {s}\n", .{emulated}); + }}); if (comp.langopts.emulate == .msvc) { try w.writeAll("#define _MSC_VER 1933\n"); @@ -375,6 +375,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void { .watchos, => { try define(w, "__APPLE__"); + try w.writeAll("#define __APPLE_CC__ 6000\n"); const version = target.os.version_range.semver.min; var version_buf: [8]u8 = undefined; @@ -647,6 +648,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void { try define(w, "__ppc__"); try define(w, "__PPC__"); try define(w, "_ARCH_PPC"); + try w.print("#define _CALL_ELF {d}\n", .{target.ppcElfVersion()}); }, .powerpc64, .powerpc64le, @@ -661,7 +663,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void { try define(w, "__PPC64__"); try define(w, "_ARCH_PPC"); try define(w, "_ARCH_PPC64"); - try w.writeAll("#define _CALL_ELF 2\n"); + try w.print("#define _CALL_ELF {d}\n", .{target.ppcElfVersion()}); }, .sparc64 => { try defineStd(w, "sparc", is_gnu); @@ -686,8 +688,19 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void { try define(w, "__thumb__"); } }, - .aarch64, .aarch64_be => { + .aarch64, .aarch64_be => |arch| { try define(w, "__aarch64__"); + switch (arch) { + .aarch64 => { + try define(w, "__AARCH64EL__"); + }, + .aarch64_be => { + try define(w, "__AARCH64EB__"); + try define(w, "__AARCH_BIG_ENDIAN"); + try define(w, "__ARM_BIG_ENDIAN"); + }, + else => unreachable, + } if (target.os.tag.isDarwin()) { try define(w, "__AARCH64_SIMD__"); if (ptr_width == 32) { @@ -839,6 +852,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void { } }, .riscv32, .riscv32be, .riscv64, .riscv64be => { + try define(w, "__riscv"); try w.print("#define __riscv_xlen {d}\n", .{ptr_width}); }, else => {}, @@ -910,6 +924,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void { \\#define __ATOMIC_CHAR16_T_LOCK_FREE 1 \\#define __ATOMIC_CHAR32_T_LOCK_FREE 1 \\#define __ATOMIC_WCHAR_T_LOCK_FREE 1 + \\#define __ATOMIC_WINT_T_LOCK_FREE 1 \\#define __ATOMIC_SHORT_LOCK_FREE 1 \\#define __ATOMIC_INT_LOCK_FREE 1 \\#define __ATOMIC_LONG_LOCK_FREE 1 @@ -922,7 +937,15 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void { } // types - if (comp.getCharSignedness() == .unsigned) try w.writeAll("#define __CHAR_UNSIGNED__ 1\n"); + if (comp.getCharSignedness() == .unsigned) { + try w.writeAll("#define __CHAR_UNSIGNED__ 1\n"); + } + if (comp.type_store.wchar.signedness(comp) == .unsigned) { + try w.writeAll("#define __WCHAR_UNSIGNED__ 1\n"); + } + if (comp.type_store.wint.signedness(comp) == .unsigned) { + try w.writeAll("#define __WINT_UNSIGNED__ 1\n"); + } try w.writeAll("#define __CHAR_BIT__ 8\n"); // int maxs @@ -933,7 +956,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void { try comp.generateIntMaxAndWidth(w, "LONG", .long); try comp.generateIntMaxAndWidth(w, "LONG_LONG", .long_long); try comp.generateIntMaxAndWidth(w, "WCHAR", comp.type_store.wchar); - // try comp.generateIntMax(w, "WINT", comp.type_store.wchar); + try comp.generateIntMaxAndWidth(w, "WINT", comp.type_store.wint); try comp.generateIntMaxAndWidth(w, "INTMAX", comp.type_store.intmax); try comp.generateIntMaxAndWidth(w, "SIZE", comp.type_store.size); try comp.generateIntMaxAndWidth(w, "UINTMAX", try comp.type_store.intmax.makeIntUnsigned(comp)); @@ -957,7 +980,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void { try comp.generateSizeofType(w, "__SIZEOF_PTRDIFF_T__", comp.type_store.ptrdiff); try comp.generateSizeofType(w, "__SIZEOF_SIZE_T__", comp.type_store.size); try comp.generateSizeofType(w, "__SIZEOF_WCHAR_T__", comp.type_store.wchar); - // try comp.generateSizeofType(w, "__SIZEOF_WINT_T__", .void_pointer); + try comp.generateSizeofType(w, "__SIZEOF_WINT_T__", comp.type_store.wint); if (target.hasInt128()) { try comp.generateSizeofType(w, "__SIZEOF_INT128__", .int128); @@ -968,14 +991,15 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void { try comp.generateTypeMacro(w, "__UINTPTR_TYPE__", try comp.type_store.intptr.makeIntUnsigned(comp)); try comp.generateTypeMacro(w, "__INTMAX_TYPE__", comp.type_store.intmax); - try comp.generateSuffixMacro("__INTMAX", w, comp.type_store.intptr); + try comp.generateIntLiteralMacros("__INTMAX", w, comp.type_store.intptr); try comp.generateTypeMacro(w, "__UINTMAX_TYPE__", try comp.type_store.intmax.makeIntUnsigned(comp)); - try comp.generateSuffixMacro("__UINTMAX", w, try comp.type_store.intptr.makeIntUnsigned(comp)); + try comp.generateIntLiteralMacros("__UINTMAX", w, try comp.type_store.intptr.makeIntUnsigned(comp)); try comp.generateTypeMacro(w, "__PTRDIFF_TYPE__", comp.type_store.ptrdiff); try comp.generateTypeMacro(w, "__SIZE_TYPE__", comp.type_store.size); try comp.generateTypeMacro(w, "__WCHAR_TYPE__", comp.type_store.wchar); + try comp.generateTypeMacro(w, "__WINT_TYPE__", comp.type_store.wint); try comp.generateTypeMacro(w, "__CHAR16_TYPE__", comp.type_store.uint_least16_t); try comp.generateTypeMacro(w, "__CHAR32_TYPE__", comp.type_store.uint_least32_t); @@ -1167,8 +1191,10 @@ fn generateTypeMacro(comp: *const Compilation, w: *Io.Writer, name: []const u8, } pub fn float80Type(comp: *const Compilation) ?QualType { - if (comp.langopts.emulate != .gcc) return null; - return comp.target.float80Type(); + return switch (comp.langopts.emulate) { + .no, .gcc => comp.target.float80Type(), + .msvc, .clang => null, + }; } /// Smallest integer type with at least N bits @@ -1292,8 +1318,14 @@ fn generateFmt(comp: *const Compilation, prefix: []const u8, w: *Io.Writer, qt: } } -fn generateSuffixMacro(comp: *const Compilation, prefix: []const u8, w: *Io.Writer, qt: QualType) !void { - return w.print("#define {s}_C_SUFFIX__ {s}\n", .{ prefix, qt.intValueSuffix(comp) }); +fn generateIntLiteralMacros(comp: *const Compilation, prefix: []const u8, w: *Io.Writer, qt: QualType) !void { + const suffix = qt.intValueSuffix(comp); + try w.print("#define {s}_C_SUFFIX__ {s}\n", .{ prefix, suffix }); + if (suffix.len == 0) { + try w.print("#define {s}_C(c) c\n", .{prefix}); + } else { + try w.print("#define {s}_C(c) c##{s}\n", .{ prefix, suffix }); + } } /// Generate the following for a type: @@ -1322,7 +1354,7 @@ fn generateExactWidthType(comp: *Compilation, w: *Io.Writer, original_qt: QualTy const prefix = full[0 .. full.len - suffix.len]; // remove "_TYPE__" try comp.generateFmt(prefix, w, qt); - try comp.generateSuffixMacro(prefix, w, qt); + try comp.generateIntLiteralMacros(prefix, w, qt); } pub fn hasFloat128(comp: *const Compilation) bool { @@ -1414,7 +1446,7 @@ pub fn maxArrayBytes(comp: *const Compilation) u64 { pub fn fixedEnumTagType(comp: *const Compilation) ?QualType { switch (comp.langopts.emulate) { .msvc => return .int, - .clang => if (comp.target.os.tag == .windows and comp.target.abi == .msvc) return .int, + .no, .clang => if (comp.target.os.tag == .windows and comp.target.abi == .msvc) return .int, .gcc => {}, } return null; @@ -1424,6 +1456,10 @@ pub fn getCharSignedness(comp: *const Compilation) std.builtin.Signedness { return comp.langopts.char_signedness_override orelse comp.target.cCharSignedness(); } +pub fn hasClangStyleBoundsSafety(comp: *const Compilation) bool { + return comp.langopts.bounds_safety == .clang; +} + pub fn getSource(comp: *const Compilation, id: Source.Id) Source { if (id.alias) { return comp.source_aliases.items[@intFromEnum(id.index)]; @@ -1643,14 +1679,12 @@ fn addSourceFromPathExtra(comp: *Compilation, path: []const u8, kind: Source.Kin return error.FileNotFound; } - const io = comp.io; - - const file = try comp.cwd.openFile(io, path, .{}); - defer file.close(io); + const file = try comp.cwd.openFile(comp.io, path, .{}); + defer file.close(comp.io); return comp.addSourceFromFile(file, path, kind); } -pub fn addSourceFromFile(comp: *Compilation, file: Io.File, path: []const u8, kind: Source.Kind) !Source { +pub fn addSourceFromFile(comp: *Compilation, file: std.Io.File, path: []const u8, kind: Source.Kind) !Source { const contents = try comp.getFileContents(file, .unlimited); errdefer comp.gpa.free(contents); return comp.addSourceFromOwnedBuffer(path, contents, kind); @@ -1718,8 +1752,7 @@ pub fn initSearchPath(comp: *Compilation, includes: []const Include, verbose: bo } } fn addToSearchPath(comp: *Compilation, include: Include, verbose: bool) !void { - const io = comp.io; - comp.cwd.access(io, include.path, .{}) catch { + comp.cwd.access(comp.io, include.path, .{}) catch { if (verbose) { std.debug.print("ignoring nonexistent directory \"{s}\"\n", .{include.path}); return; @@ -1979,14 +2012,12 @@ fn getPathContents(comp: *Compilation, path: []const u8, limit: Io.Limit) ![]u8 return error.FileNotFound; } - const io = comp.io; - - const file = try comp.cwd.openFile(io, path, .{}); - defer file.close(io); + const file = try comp.cwd.openFile(comp.io, path, .{}); + defer file.close(comp.io); return comp.getFileContents(file, limit); } -fn getFileContents(comp: *Compilation, file: Io.File, limit: Io.Limit) ![]u8 { +fn getFileContents(comp: *Compilation, file: std.Io.File, limit: Io.Limit) ![]u8 { var file_buf: [4096]u8 = undefined; var file_reader = file.reader(comp.io, &file_buf); @@ -2168,9 +2199,8 @@ pub fn locSlice(comp: *const Compilation, loc: Source.Location) []const u8 { } pub fn getSourceMTimeUncached(comp: *const Compilation, source_id: Source.Id) ?u64 { - const io = comp.io; const source = comp.getSource(source_id); - if (comp.cwd.statFile(io, source.path, .{})) |stat| { + if (comp.cwd.statFile(comp.io, source.path, .{})) |stat| { return std.math.cast(u64, stat.mtime.toSeconds()); } else |_| { return null; @@ -2257,10 +2287,9 @@ pub const Diagnostic = struct { test "addSourceFromBuffer" { const Test = struct { fn addSourceFromBuffer(str: []const u8, expected: []const u8, warning_count: u32, splices: []const u32) !void { - var arena: std.heap.ArenaAllocator = .init(std.testing.allocator); - defer arena.deinit(); var diagnostics: Diagnostics = .{ .output = .ignore }; - var comp = Compilation.init(std.testing.allocator, arena.allocator(), std.testing.io, &diagnostics, Io.Dir.cwd()); + var comp = try Compilation.init(.testing); + comp.diagnostics = &diagnostics; defer comp.deinit(); const source = try comp.addSourceFromBuffer("path", str); @@ -2271,10 +2300,8 @@ test "addSourceFromBuffer" { } fn withAllocationFailures(allocator: std.mem.Allocator) !void { - var arena: std.heap.ArenaAllocator = .init(allocator); - defer arena.deinit(); - var diagnostics: Diagnostics = .{ .output = .ignore }; - var comp = Compilation.init(allocator, arena.allocator(), std.testing.io, &diagnostics, Io.Dir.cwd()); + var comp = try Compilation.init(.testing); + comp.gpa = allocator; defer comp.deinit(); _ = try comp.addSourceFromBuffer("path", "spliced\\\nbuffer\n"); @@ -2320,7 +2347,8 @@ test "addSourceFromBuffer - exhaustive check for carriage return elimination" { var buf: [alphabet.len]u8 = @splat(alphabet[0]); var diagnostics: Diagnostics = .{ .output = .ignore }; - var comp = Compilation.init(std.testing.allocator, arena.allocator(), std.testing.io, &diagnostics, Io.Dir.cwd()); + var comp = try Compilation.init(.testing); + comp.diagnostics = &diagnostics; defer comp.deinit(); var source_count: u32 = 0; @@ -2346,9 +2374,8 @@ test "addSourceFromBuffer - exhaustive check for carriage return elimination" { test "ignore BOM at beginning of file" { const BOM = "\xEF\xBB\xBF"; const Test = struct { - fn run(arena: Allocator, buf: []const u8) !void { - var diagnostics: Diagnostics = .{ .output = .ignore }; - var comp = Compilation.init(std.testing.allocator, arena, std.testing.io, &diagnostics, Io.Dir.cwd()); + fn run(buf: []const u8) !void { + var comp = try Compilation.init(.testing); defer comp.deinit(); const source = try comp.addSourceFromBuffer("file.c", buf); @@ -2357,19 +2384,15 @@ test "ignore BOM at beginning of file" { } }; - var arena_state: std.heap.ArenaAllocator = .init(std.testing.allocator); - defer arena_state.deinit(); - const arena = arena_state.allocator(); - - try Test.run(arena, BOM); - try Test.run(arena, BOM ++ "x"); - try Test.run(arena, "x" ++ BOM); - try Test.run(arena, BOM ++ " "); - try Test.run(arena, BOM ++ "\n"); - try Test.run(arena, BOM ++ "\\"); - - try Test.run(arena, BOM[0..1] ++ "x"); - try Test.run(arena, BOM[0..2] ++ "x"); - try Test.run(arena, BOM[1..] ++ "x"); - try Test.run(arena, BOM[2..] ++ "x"); + try Test.run(BOM); + try Test.run(BOM ++ "x"); + try Test.run("x" ++ BOM); + try Test.run(BOM ++ " "); + try Test.run(BOM ++ "\n"); + try Test.run(BOM ++ "\\"); + + try Test.run(BOM[0..1] ++ "x"); + try Test.run(BOM[0..2] ++ "x"); + try Test.run(BOM[1..] ++ "x"); + try Test.run(BOM[2..] ++ "x"); } diff --git a/lib/compiler/aro/aro/Diagnostics.zig b/lib/compiler/aro/aro/Diagnostics.zig @@ -24,21 +24,21 @@ pub const Message = struct { @"fatal error", }; - pub fn write(msg: Message, t: std.Io.Terminal, details: bool) std.Io.Terminal.SetColorError!void { - const w = t.writer; - try t.setColor(.bold); + pub fn write(msg: Message, term: std.Io.Terminal, details: bool) std.Io.Terminal.SetColorError!void { + const w = term.writer; + try term.setColor(.bold); if (msg.location) |loc| { try w.print("{s}:{d}:{d}: ", .{ loc.path, loc.line_no, loc.col }); } switch (msg.effective_kind) { - .@"fatal error", .@"error" => try t.setColor(.bright_red), - .note => try t.setColor(.bright_cyan), - .warning => try t.setColor(.bright_magenta), + .@"fatal error", .@"error" => try term.setColor(.bright_red), + .note => try term.setColor(.bright_cyan), + .warning => try term.setColor(.bright_magenta), .off => unreachable, } try w.print("{s}: ", .{@tagName(msg.effective_kind)}); - try t.setColor(.white); + try term.setColor(.white); try w.writeAll(msg.text); if (msg.opt) |some| { if (msg.effective_kind == .@"error" and msg.kind != .@"error") { @@ -56,17 +56,17 @@ pub const Message = struct { if (!details or msg.location == null) { try w.writeAll("\n"); - try t.setColor(.reset); + try term.setColor(.reset); } else { const loc = msg.location.?; const trailer = if (loc.end_with_splice) "\\ " else ""; - try t.setColor(.reset); + try term.setColor(.reset); try w.print("\n{s}{s}\n", .{ loc.line, trailer }); try w.splatByteAll(' ', loc.width); - try t.setColor(.bold); - try t.setColor(.bright_green); + try term.setColor(.bold); + try term.setColor(.bright_green); try w.writeAll("^\n"); - try t.setColor(.reset); + try term.setColor(.reset); } try w.flush(); } @@ -199,6 +199,10 @@ pub const Option = enum { @"pragma-once-outside-header", @"underlying-atomic-qualifier-ignored", @"underlying-cv-qualifier-ignored", + @"bounds-attributes-redundant", + @"file-name-extension", + @"base-file-extension", + @"include-level-extension", /// GNU extensions pub const gnu = [_]Option{ @@ -541,11 +545,11 @@ fn addMessage(d: *Diagnostics, msg: Message) Compilation.Error!void { switch (d.output) { .ignore => {}, - .to_writer => |t| { - var new_mode = t.mode; - if (d.color == false) new_mode = .no_color; - if (d.color == true and new_mode == .no_color) new_mode = .escape_codes; - msg.write(.{ .writer = t.writer, .mode = new_mode }, d.details) catch { + .to_writer => |terminal| { + var mode = terminal.mode; + if (d.color == false) mode = .no_color; + if (d.color == true and mode == .no_color) mode = .escape_codes; + msg.write(.{ .mode = mode, .writer = terminal.writer }, d.details) catch { return error.FatalError; }; }, diff --git a/lib/compiler/aro/aro/Driver.zig b/lib/compiler/aro/aro/Driver.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const Io = std.Io; const mem = std.mem; const Allocator = mem.Allocator; const process = std.process; @@ -9,6 +8,7 @@ const Assembly = backend.Assembly; const Ir = backend.Ir; const Object = backend.Object; +const Attribute = @import("Attribute.zig"); const Compilation = @import("Compilation.zig"); const Diagnostics = @import("Diagnostics.zig"); const DepFile = @import("DepFile.zig"); @@ -52,6 +52,7 @@ implicit_includes: std.ArrayList(Source) = .empty, /// List of includes that will be used to construct the compilation's search path includes: std.ArrayList(Compilation.Include) = .empty, link_objects: std.ArrayList([]const u8) = .empty, +macro_prefix_map: std.ArrayList(struct { []const u8, []const u8 }) = .empty, output_name: ?[]const u8 = null, sysroot: ?[]const u8 = null, resource_dir: ?[]const u8 = null, @@ -134,9 +135,8 @@ strip: bool = false, unwindlib: ?[]const u8 = null, pub fn deinit(d: *Driver) void { - const io = d.comp.io; for (d.link_objects.items[d.link_objects.items.len - d.temp_file_count ..]) |obj| { - Io.Dir.deleteFileAbsolute(io, obj) catch {}; + std.Io.Dir.deleteFileAbsolute(d.comp.io, obj) catch {}; d.comp.gpa.free(obj); } d.inputs.deinit(d.comp.gpa); @@ -144,6 +144,7 @@ pub fn deinit(d: *Driver) void { d.implicit_includes.deinit(d.comp.gpa); d.includes.deinit(d.comp.gpa); d.link_objects.deinit(d.comp.gpa); + d.macro_prefix_map.deinit(d.comp.gpa); d.* = undefined; } @@ -177,6 +178,10 @@ pub const usage = \\ -darwin-target-variant-triple \\ Specify the darwin target variant triple \\ -fapple-kext Use Apple's kernel extensions ABI + \\ -fexperimental-bounds-safety + \\ Enable experimental clang-style bounds safety attributes (INCOMPLETE) + \\ -fno-experimental-bounds-safety + \\ Disable experimental clang-style bounds safety attributes \\ -fchar8_t Enable char8_t (enabled by default in C23 and later) \\ -fno-char8_t Disable char8_t (disabled by default for pre-C23) \\ -fcolor-diagnostics Enable colors in diagnostics @@ -218,6 +223,8 @@ pub const usage = \\ -fuse-line-directives Use `#line <num>` linemarkers in preprocessed output \\ -fno-use-line-directives \\ Use `# <num>` linemarkers in preprocessed output + \\ -fvisibility=[default|hidden|internal|protected] + \\ Set the default ELF image symbol visibility to the specified option—all symbols are marked with this unless overridden within the code \\ -iquote <dir> Add directory to QUOTE include search path \\ -I <dir> Add directory to include search path \\ -idirafter <dir> Add directory to AFTER include search path @@ -375,6 +382,17 @@ pub fn parseArgs( d.use_line_directives = false; } else if (mem.eql(u8, arg, "-fapple-kext")) { d.apple_kext = true; + } else if (option(arg, "-fvisibility=")) |visibility| { + d.comp.langopts.default_symbol_visibility = Attribute.visibilityFromString(visibility) orelse + return d.fatal("unsupported value '{s}'' in '{s}'", .{ visibility, arg }); + } else if (option(arg, "-frandom-seed=")) |_| { + // Ignore + } else if (option(arg, "-fmacro-prefix-map=")) |kv| { + const pair = mem.cutScalar(u8, kv, '=') orelse { + try d.err("invalid argument '{s}' to '-fmacro-prefix-map=", .{kv}); + continue; + }; + try d.macro_prefix_map.append(gpa, pair); } else if (option(arg, "-mcmodel=")) |cmodel| { d.comp.cmodel = std.meta.stringToEnum(std.builtin.CodeModel, cmodel) orelse return d.fatal("unsupported machine code model: '{s}'", .{arg}); @@ -415,6 +433,10 @@ pub fn parseArgs( d.dependencies.file = path; } else if (mem.eql(u8, arg, "-MV")) { d.dependencies.format = .nmake; + } else if (mem.eql(u8, arg, "-fexperimental-bounds-safety")) { + d.comp.langopts.bounds_safety = .clang; + } else if (mem.eql(u8, arg, "-fno-experimental-bounds-safety")) { + d.comp.langopts.bounds_safety = .none; } else if (mem.eql(u8, arg, "-fchar8_t")) { d.comp.langopts.has_char8_t_override = true; } else if (mem.eql(u8, arg, "-fno-char8_t")) { @@ -635,6 +657,42 @@ pub fn parseArgs( d.output_name = file; } else if (option(arg, "--sysroot=")) |sysroot| { d.sysroot = sysroot; + } else if (mem.eql(u8, arg, "--sysroot")) { + i += 1; + if (i >= args.len) { + try d.err("expected argument after --sysroot", .{}); + continue; + } + d.sysroot = args[i]; + } else if (mem.startsWith(u8, arg, "-isysroot")) { + var path = arg["-isysroot".len..]; + if (path.len == 0) { + i += 1; + if (i >= args.len) { + try d.err("expected argument after -isysroot", .{}); + continue; + } + path = args[i]; + } + d.sysroot = path; + } else if (mem.eql(u8, arg, "-rpath")) { + i += 1; + if (i >= args.len) { + try d.err("expected argument after -rpath", .{}); + continue; + } + // ignore for now + } else if (mem.startsWith(u8, arg, "-L")) { + var path = arg["-L".len..]; + if (path.len == 0) { + i += 1; + if (i >= args.len) { + try d.err("expected argument after -L", .{}); + continue; + } + path = args[i]; + } + // ignore for now } else if (mem.eql(u8, arg, "-Wp,-v")) { // TODO this is not how this argument should work d.verbose_search_path = true; @@ -706,6 +764,10 @@ pub fn parseArgs( d.comp.langopts.preserve_comments = true; d.comp.langopts.preserve_comments_in_macros = true; comment_arg = arg; + } else if (option(arg, "-fuse-ld=")) |linker_name| { + d.use_linker = linker_name; + } else if (mem.eql(u8, arg, "-fuse-ld=")) { + d.use_linker = null; } else if (option(arg, "--ld-path=")) |linker_path| { d.linker_path = linker_path; } else if (mem.eql(u8, arg, "-r")) { @@ -810,6 +872,7 @@ pub fn parseArgs( .clang => try d.diagnostics.set("clang", .off), .gcc => try d.diagnostics.set("gnu", .off), .msvc => try d.diagnostics.set("microsoft", .off), + .no => {}, } } if (d.comp.langopts.preserve_comments and !d.only_preprocess) { @@ -1063,20 +1126,22 @@ pub fn printDiagnosticsStats(d: *Driver) void { } } -pub fn detectConfig(d: *Driver, file: Io.File) std.Io.tty.Config { +pub fn detectMode(d: *Driver, file: std.Io.File) std.Io.Cancelable!std.Io.Terminal.Mode { if (d.diagnostics.color == false) return .no_color; const force_color = d.diagnostics.color == true; - if (file.supportsAnsiEscapeCodes()) return .escape_codes; - if (@import("builtin").os.tag == .windows and file.isTty()) { - var info: std.os.windows.CONSOLE_SCREEN_BUFFER_INFO = undefined; - if (std.os.windows.kernel32.GetConsoleScreenBufferInfo(file.handle, &info) == std.os.windows.FALSE) { - return if (force_color) .escape_codes else .no_color; + const io = d.comp.io; + if (try file.supportsAnsiEscapeCodes(io)) return .escape_codes; + if (@import("builtin").os.tag == .windows and try file.isTty(io)) { + var get_console_info = std.os.windows.CONSOLE.USER_IO.GET_SCREEN_BUFFER_INFO; + switch (try get_console_info.operate(io, file)) { + .SUCCESS => return .{ .windows_api = .{ + .io = io, + .file = file, + .reset_attributes = get_console_info.Data.wAttributes, + } }, + else => {}, } - return .{ .windows_api = .{ - .handle = file.handle, - .reset_attributes = info.wAttributes, - } }; } return if (force_color) .escape_codes else .no_color; @@ -1105,13 +1170,13 @@ pub fn errorDescription(e: anyerror) []const u8 { /// The entry point of the Aro compiler. /// **MAY call `exit` if `fast_exit` is set.** -pub fn main(d: *Driver, tc: *Toolchain, args: []const []const u8, comptime fast_exit: bool, asm_gen_fn: ?AsmCodeGenFn) Compilation.Error!void { +pub fn main(d: *Driver, tc: *Toolchain, args: []const []const u8, comptime fast_exit: bool, asm_gen_fn: ?AsmCodeGenFn) (Compilation.Error || std.Io.Cancelable)!void { const user_macros = macros: { var macro_buf: std.ArrayList(u8) = .empty; defer macro_buf.deinit(d.comp.gpa); var stdout_buf: [256]u8 = undefined; - var stdout = Io.File.stdout().writer(&stdout_buf); + var stdout = std.Io.File.stdout().writer(d.comp.io, &stdout_buf); if (parseArgs(d, &stdout.interface, &macro_buf, args) catch |er| switch (er) { error.WriteFailed => return d.fatal("failed to write to stdout: {s}", .{errorDescription(er)}), error.OutOfMemory => return error.OutOfMemory, @@ -1217,14 +1282,13 @@ pub fn getDepFileName(d: *Driver, source: Source, buf: *[std.fs.max_name_bytes]u } fn getRandomFilename(d: *Driver, buf: *[std.fs.max_name_bytes]u8, extension: []const u8) ![]const u8 { - const io = d.comp.io; const random_bytes_count = 12; - const sub_path_len = comptime std.base64.url_safe.Encoder.calcSize(random_bytes_count); + const sub_path_len = comptime std.fs.base64_encoder.calcSize(random_bytes_count); var random_bytes: [random_bytes_count]u8 = undefined; - io.random(&random_bytes); + d.comp.io.random(&random_bytes); var random_name: [sub_path_len]u8 = undefined; - _ = std.base64.url_safe.Encoder.encode(&random_name, &random_bytes); + _ = std.fs.base64_encoder.encode(&random_name, &random_bytes); const fmt_template = "/tmp/{s}{s}"; const fmt_args = .{ @@ -1251,12 +1315,11 @@ fn getOutFileName(d: *Driver, source: Source, buf: *[std.fs.max_name_bytes]u8) ! } fn invokeAssembler(d: *Driver, tc: *Toolchain, input_path: []const u8, output_path: []const u8) !void { - const io = d.comp.io; var assembler_path_buf: [std.fs.max_path_bytes]u8 = undefined; const assembler_path = try tc.getAssemblerPath(&assembler_path_buf); const argv = [_][]const u8{ assembler_path, input_path, "-o", output_path }; - var child = std.process.spawn(io, .{ + var child = std.process.spawn(d.comp.io, .{ .argv = &argv, // TODO handle better .stdin = .inherit, @@ -1265,8 +1328,8 @@ fn invokeAssembler(d: *Driver, tc: *Toolchain, input_path: []const u8, output_pa }) catch |er| { return d.fatal("unable to spawn linker: {s}", .{errorDescription(er)}); }; - const term = child.wait(io) catch |er| { - return d.fatal("unable to wait linker: {s}", .{errorDescription(er)}); + const term = child.wait(d.comp.io) catch |er| { + return d.fatal("error waiting for linker: {s}", .{errorDescription(er)}); }; switch (term) { .exited => |code| if (code != 0) { @@ -1289,13 +1352,16 @@ fn processSource( comptime fast_exit: bool, asm_gen_fn: ?AsmCodeGenFn, ) !void { - const gpa = d.comp.gpa; - d.comp.generated_buf.items.len = 0; + const comp = d.comp; + const io = comp.io; + const gpa = comp.gpa; + comp.generated_buf.items.len = 0; const prev_total = d.diagnostics.errors; - const io = d.comp.io; - - var pp = try Preprocessor.initDefault(d.comp); + var pp = try Preprocessor.init(comp, .{ + .base_file = source.id, + .path_replacements = d.macro_prefix_map.items, + }); defer pp.deinit(); var name_buf: [std.fs.max_name_bytes]u8 = undefined; @@ -1304,8 +1370,8 @@ fn processSource( if (opt_dep_file) |*dep_file| pp.dep_file = dep_file; - if (d.comp.langopts.ms_extensions) { - d.comp.ms_cwd_source_id = source.id; + if (comp.langopts.ms_extensions) { + comp.ms_cwd_source_id = source.id; } const dump_mode = d.debug_dump_letters.getPreprocessorDumpMode(); if (d.verbose_pp) pp.verbose = true; @@ -1333,10 +1399,10 @@ fn processSource( const dep_file_name = try d.getDepFileName(source, writer_buf[0..std.fs.max_name_bytes]); const file = if (dep_file_name) |path| - d.comp.cwd.createFile(io, path, .{}) catch |er| + comp.cwd.createFile(io, path, .{}) catch |er| return d.fatal("unable to create dependency file '{s}': {s}", .{ path, errorDescription(er) }) else - Io.File.stdout(); + std.Io.File.stdout(); defer if (dep_file_name != null) file.close(io); var file_writer = file.writer(io, &writer_buf); @@ -1358,10 +1424,10 @@ fn processSource( } const file = if (d.output_name) |some| - d.comp.cwd.createFile(io, some, .{}) catch |er| + comp.cwd.createFile(io, some, .{}) catch |er| return d.fatal("unable to create output file '{s}': {s}", .{ some, errorDescription(er) }) else - Io.File.stdout(); + std.Io.File.stdout(); defer if (d.output_name != null) file.close(io); var file_writer = file.writer(io, &writer_buf); @@ -1376,8 +1442,11 @@ fn processSource( defer tree.deinit(); if (d.verbose_ast) { - var stdout = Io.File.stdout().writer(&writer_buf); - tree.dump(d.detectConfig(stdout.file), &stdout.interface) catch {}; + var stdout = std.Io.File.stdout().writer(io, &writer_buf); + tree.dump(.{ + .mode = try d.detectMode(stdout.file), + .writer = &stdout.interface, + }) catch {}; } d.printDiagnosticsStats(); @@ -1392,10 +1461,10 @@ fn processSource( return; } - if (d.comp.target.ofmt != .elf or d.comp.target.cpu.arch != .x86_64) { + if (comp.target.ofmt != .elf or comp.target.cpu.arch != .x86_64) { return d.fatal( "unsupported target {s}-{s}-{s}, currently only x86-64 elf is supported", - .{ @tagName(d.comp.target.cpu.arch), @tagName(d.comp.target.os.tag), @tagName(d.comp.target.abi) }, + .{ @tagName(comp.target.cpu.arch), @tagName(comp.target.os.tag), @tagName(comp.target.abi) }, ); } @@ -1407,15 +1476,15 @@ fn processSource( .{}, ); - const assembly = try asm_fn(d.comp.target.toZigTarget(), &tree); + const assembly = try asm_fn(comp.target.toZigTarget(), &tree); defer assembly.deinit(gpa); if (d.only_preprocess_and_compile) { - const out_file = d.comp.cwd.createFile(io, out_file_name, .{}) catch |er| + const out_file = comp.cwd.createFile(io, out_file_name, .{}) catch |er| return d.fatal("unable to create output file '{s}': {s}", .{ out_file_name, errorDescription(er) }); defer out_file.close(io); - assembly.writeToFile(out_file) catch |er| + assembly.writeToFile(io, out_file) catch |er| return d.fatal("unable to write to output file '{s}': {s}", .{ out_file_name, errorDescription(er) }); if (fast_exit) std.process.exit(0); // Not linking, no need for cleanup. return; @@ -1425,10 +1494,10 @@ fn processSource( // then assemble to out_file_name var assembly_name_buf: [std.fs.max_name_bytes]u8 = undefined; const assembly_out_file_name = try d.getRandomFilename(&assembly_name_buf, ".s"); - const out_file = d.comp.cwd.createFile(io, assembly_out_file_name, .{}) catch |er| + const out_file = comp.cwd.createFile(io, assembly_out_file_name, .{}) catch |er| return d.fatal("unable to create output file '{s}': {s}", .{ assembly_out_file_name, errorDescription(er) }); defer out_file.close(io); - assembly.writeToFile(out_file) catch |er| + assembly.writeToFile(io, out_file) catch |er| return d.fatal("unable to write to output file '{s}': {s}", .{ assembly_out_file_name, errorDescription(er) }); try d.invokeAssembler(tc, assembly_out_file_name, out_file_name); if (d.only_compile) { @@ -1440,8 +1509,11 @@ fn processSource( defer ir.deinit(gpa); if (d.verbose_ir) { - var stdout = Io.File.stdout().writer(&writer_buf); - ir.dump(gpa, d.detectConfig(stdout.file), &stdout.interface) catch {}; + var stdout = std.Io.File.stdout().writer(io, &writer_buf); + ir.dump(gpa, .{ + .mode = try d.detectMode(stdout.file), + .writer = &stdout.interface, + }) catch {}; } var render_errors: Ir.Renderer.ErrorList = .{}; @@ -1494,8 +1566,9 @@ fn dumpLinkerArgs(w: *std.Io.Writer, items: []const []const u8) !void { /// The entry point of the Aro compiler. /// **MAY call `exit` if `fast_exit` is set.** pub fn invokeLinker(d: *Driver, tc: *Toolchain, comptime fast_exit: bool) Compilation.Error!void { - const gpa = d.comp.gpa; - const io = d.comp.io; + const comp = d.comp; + const io = comp.io; + const gpa = comp.gpa; var argv: std.ArrayList([]const u8) = .empty; defer argv.deinit(gpa); @@ -1507,7 +1580,7 @@ pub fn invokeLinker(d: *Driver, tc: *Toolchain, comptime fast_exit: bool) Compil if (d.verbose_linker_args) { var stdout_buf: [4096]u8 = undefined; - var stdout = Io.File.stdout().writer(&stdout_buf); + var stdout = std.Io.File.stdout().writer(io, &stdout_buf); dumpLinkerArgs(&stdout.interface, argv.items) catch { return d.fatal("unable to dump linker args: {s}", .{errorDescription(stdout.err.?)}); }; @@ -1521,8 +1594,9 @@ pub fn invokeLinker(d: *Driver, tc: *Toolchain, comptime fast_exit: bool) Compil }) catch |er| { return d.fatal("unable to spawn linker: {s}", .{errorDescription(er)}); }; + const term = child.wait(io) catch |er| { - return d.fatal("unable to wait linker: {s}", .{errorDescription(er)}); + return d.fatal("error waiting for linker: {s}", .{errorDescription(er)}); }; switch (term) { .exited => |code| if (code != 0) { @@ -1541,7 +1615,7 @@ pub fn invokeLinker(d: *Driver, tc: *Toolchain, comptime fast_exit: bool) Compil fn exitWithCleanup(d: *Driver, code: u8) noreturn { for (d.link_objects.items[d.link_objects.items.len - d.temp_file_count ..]) |obj| { - std.fs.deleteFileAbsolute(obj) catch {}; + std.Io.Dir.deleteFileAbsolute(d.comp.io, obj) catch {}; } std.process.exit(code); } diff --git a/lib/compiler/aro/aro/Driver/Filesystem.zig b/lib/compiler/aro/aro/Driver/Filesystem.zig @@ -1,241 +0,0 @@ -const builtin = @import("builtin"); -const is_windows = builtin.os.tag == .windows; - -const std = @import("std"); -const Io = std.Io; -const mem = std.std.mem; - -fn readFileFake(entries: []const Filesystem.Entry, path: []const u8, buf: []u8) ?[]const u8 { - @branchHint(.cold); - for (entries) |entry| { - if (mem.eql(u8, entry.path, path)) { - const len = @min(entry.contents.len, buf.len); - @memcpy(buf[0..len], entry.contents[0..len]); - return buf[0..len]; - } - } - return null; -} - -fn findProgramByNameFake(entries: []const Filesystem.Entry, name: []const u8, path: ?[]const u8, buf: []u8) ?[]const u8 { - @branchHint(.cold); - if (mem.indexOfScalar(u8, name, '/') != null) { - @memcpy(buf[0..name.len], name); - return buf[0..name.len]; - } - const path_env = path orelse return null; - var fib = std.heap.FixedBufferAllocator.init(buf); - - var it = mem.tokenizeScalar(u8, path_env, std.fs.path.delimiter); - while (it.next()) |path_dir| { - defer fib.reset(); - const full_path = std.fs.path.join(fib.allocator(), &.{ path_dir, name }) catch continue; - if (canExecuteFake(entries, full_path)) return full_path; - } - - return null; -} - -fn canExecuteFake(entries: []const Filesystem.Entry, path: []const u8) bool { - @branchHint(.cold); - for (entries) |entry| { - if (mem.eql(u8, entry.path, path)) { - return entry.executable; - } - } - return false; -} - -fn existsFake(entries: []const Filesystem.Entry, path: []const u8) bool { - @branchHint(.cold); - var buf: [std.fs.max_path_bytes]u8 = undefined; - var fib = std.heap.FixedBufferAllocator.init(&buf); - const resolved = std.fs.path.resolvePosix(fib.allocator(), &.{path}) catch return false; - for (entries) |entry| { - if (mem.eql(u8, entry.path, resolved)) return true; - } - return false; -} - -fn canExecutePosix(io: Io, path: []const u8) bool { - Io.Dir.accessAbsolute(io, path, .{ .execute = true }) catch return false; - // Todo: ensure path is not a directory - return true; -} - -/// TODO -fn canExecuteWindows(path: []const u8) bool { - _ = path; - return true; -} - -/// TODO -fn findProgramByNameWindows(allocator: std.mem.Allocator, name: []const u8, path: ?[]const u8, buf: []u8) ?[]const u8 { - _ = path; - _ = buf; - _ = name; - _ = allocator; - return null; -} - -/// TODO: does WASI need special handling? -fn findProgramByNamePosix(name: []const u8, path: ?[]const u8, buf: []u8) ?[]const u8 { - if (mem.indexOfScalar(u8, name, '/') != null) { - @memcpy(buf[0..name.len], name); - return buf[0..name.len]; - } - const path_env = path orelse return null; - var fib = std.heap.FixedBufferAllocator.init(buf); - - var it = mem.tokenizeScalar(u8, path_env, std.fs.path.delimiter); - while (it.next()) |path_dir| { - defer fib.reset(); - const full_path = std.fs.path.join(fib.allocator(), &.{ path_dir, name }) catch continue; - if (canExecutePosix(full_path)) return full_path; - } - - return null; -} - -pub const Filesystem = union(enum) { - real: std.Io.Dir, - fake: []const Entry, - - const Entry = struct { - path: []const u8, - contents: []const u8 = "", - executable: bool = false, - }; - - const FakeDir = struct { - entries: []const Entry, - path: []const u8, - - fn iterate(self: FakeDir) FakeDir.Iterator { - return .{ - .entries = self.entries, - .base = self.path, - }; - } - - const Iterator = struct { - entries: []const Entry, - base: []const u8, - i: usize = 0, - - fn next(self: *@This()) !?std.Io.Dir.Entry { - while (self.i < self.entries.len) { - const entry = self.entries[self.i]; - self.i += 1; - if (entry.path.len == self.base.len) continue; - if (std.mem.startsWith(u8, entry.path, self.base)) { - const remaining = entry.path[self.base.len + 1 ..]; - if (std.mem.indexOfScalar(u8, remaining, std.fs.path.sep) != null) continue; - const extension = std.fs.path.extension(remaining); - const kind: std.Io.Dir.Entry.Kind = if (extension.len == 0) .directory else .file; - return .{ .name = remaining, .kind = kind }; - } - } - return null; - } - }; - }; - - const Dir = union(enum) { - dir: std.Io.Dir, - fake: FakeDir, - - pub fn iterate(self: Dir) Iterator { - return switch (self) { - .dir => |dir| .{ .iterator = dir.iterate() }, - .fake => |fake| .{ .fake = fake.iterate() }, - }; - } - - pub fn close(self: *Dir, io: Io) void { - switch (self.*) { - .dir => |*d| d.close(io), - .fake => {}, - } - } - }; - - const Iterator = union(enum) { - iterator: std.Io.Dir.Iterator, - fake: FakeDir.Iterator, - - pub fn next(self: *Iterator) std.Io.Dir.Iterator.Error!?std.Io.Dir.Entry { - return switch (self.*) { - .iterator => |*it| it.next(), - .fake => |*it| it.next(), - }; - } - }; - - pub fn exists(fs: Filesystem, io: Io, path: []const u8) bool { - switch (fs) { - .real => |cwd| { - cwd.access(io, path, .{}) catch return false; - return true; - }, - .fake => |paths| return existsFake(paths, path), - } - } - - pub fn joinedExists(fs: Filesystem, parts: []const []const u8) bool { - var buf: [std.fs.max_path_bytes]u8 = undefined; - var fib = std.heap.FixedBufferAllocator.init(&buf); - const joined = std.fs.path.join(fib.allocator(), parts) catch return false; - return fs.exists(joined); - } - - pub fn canExecute(fs: Filesystem, path: []const u8) bool { - return switch (fs) { - .real => if (is_windows) canExecuteWindows(path) else canExecutePosix(path), - .fake => |entries| canExecuteFake(entries, path), - }; - } - - /// Search for an executable named `name` using platform-specific logic - /// If it's found, write the full path to `buf` and return a slice of it - /// Otherwise retun null - pub fn findProgramByName(fs: Filesystem, allocator: std.mem.Allocator, name: []const u8, path: ?[]const u8, buf: []u8) ?[]const u8 { - std.debug.assert(name.len > 0); - return switch (fs) { - .real => if (is_windows) findProgramByNameWindows(allocator, name, path, buf) else findProgramByNamePosix(name, path, buf), - .fake => |entries| findProgramByNameFake(entries, name, path, buf), - }; - } - - /// Read the file at `path` into `buf`. - /// Returns null if any errors are encountered - /// Otherwise returns a slice of `buf`. If the file is larger than `buf` partial contents are returned - pub fn readFile(fs: Filesystem, io: Io, path: []const u8, buf: []u8) ?[]const u8 { - return switch (fs) { - .real => |cwd| { - const file = cwd.openFile(io, path, .{}) catch return null; - defer file.close(io); - - const bytes_read = file.readAll(buf) catch return null; - return buf[0..bytes_read]; - }, - .fake => |entries| readFileFake(entries, path, buf), - }; - } - - pub fn openDir(fs: Filesystem, io: Io, dir_name: []const u8) std.Io.Dir.OpenError!Dir { - return switch (fs) { - .real => |cwd| .{ .dir = try cwd.openDir(io, dir_name, .{ .access_sub_paths = false, .iterate = true }) }, - .fake => |entries| .{ .fake = .{ .entries = entries, .path = dir_name } }, - }; - } -}; - -test "Fake filesystem" { - const fs: Filesystem = .{ .fake = &.{ - .{ .path = "/usr/bin" }, - } }; - try std.testing.expect(fs.exists("/usr/bin")); - try std.testing.expect(fs.exists("/usr/bin/foo/..")); - try std.testing.expect(!fs.exists("/usr/bin/bar")); -} diff --git a/lib/compiler/aro/aro/Driver/GCCDetector.zig b/lib/compiler/aro/aro/Driver/GCCDetector.zig @@ -0,0 +1,635 @@ +const std = @import("std"); + +const system_defaults = @import("system_defaults"); + +const GCCVersion = @import("GCCVersion.zig"); +const Multilib = @import("Multilib.zig"); +const Target = @import("../Target.zig"); +const Toolchain = @import("../Toolchain.zig"); + +const GCCDetector = @This(); + +is_valid: bool = false, +install_path: []const u8 = "", +parent_lib_path: []const u8 = "", +version: GCCVersion = .{}, +gcc_triple: []const u8 = "", +selected: Multilib = .{}, +biarch_sibling: ?Multilib = null, + +pub fn deinit(self: *GCCDetector) void { + if (!self.is_valid) return; +} + +pub fn appendToolPath(self: *const GCCDetector, tc: *Toolchain) !void { + if (!self.is_valid) return; + return tc.addPathFromComponents(&.{ + self.parent_lib_path, + "..", + self.gcc_triple, + "bin", + }, .program); +} + +fn addDefaultGCCPrefixes(prefixes: *std.ArrayList([]const u8), tc: *const Toolchain) !void { + const sysroot = tc.getSysroot(); + const target = tc.getTarget(); + if (sysroot.len == 0 and target.os.tag == .linux and tc.exists("/opt/rh")) { + prefixes.appendAssumeCapacity("/opt/rh/gcc-toolset-12/root/usr"); + prefixes.appendAssumeCapacity("/opt/rh/gcc-toolset-11/root/usr"); + prefixes.appendAssumeCapacity("/opt/rh/gcc-toolset-10/root/usr"); + prefixes.appendAssumeCapacity("/opt/rh/devtoolset-12/root/usr"); + prefixes.appendAssumeCapacity("/opt/rh/devtoolset-11/root/usr"); + prefixes.appendAssumeCapacity("/opt/rh/devtoolset-10/root/usr"); + prefixes.appendAssumeCapacity("/opt/rh/devtoolset-9/root/usr"); + prefixes.appendAssumeCapacity("/opt/rh/devtoolset-8/root/usr"); + prefixes.appendAssumeCapacity("/opt/rh/devtoolset-7/root/usr"); + prefixes.appendAssumeCapacity("/opt/rh/devtoolset-6/root/usr"); + prefixes.appendAssumeCapacity("/opt/rh/devtoolset-4/root/usr"); + prefixes.appendAssumeCapacity("/opt/rh/devtoolset-3/root/usr"); + prefixes.appendAssumeCapacity("/opt/rh/devtoolset-2/root/usr"); + } + if (sysroot.len == 0) { + prefixes.appendAssumeCapacity("/usr"); + } else { + var usr_path = try tc.driver.comp.arena.alloc(u8, 4 + sysroot.len); + @memcpy(usr_path[0..4], "/usr"); + @memcpy(usr_path[4..], sysroot); + prefixes.appendAssumeCapacity(usr_path); + } +} + +fn collectLibDirsAndTriples( + tc: *Toolchain, + lib_dirs: *std.ArrayList([]const u8), + triple_aliases: *std.ArrayList([]const u8), + biarch_libdirs: *std.ArrayList([]const u8), + biarch_triple_aliases: *std.ArrayList([]const u8), +) !void { + const AArch64LibDirs: [2][]const u8 = .{ "/lib64", "/lib" }; + const AArch64Triples: [4][]const u8 = .{ "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-redhat-linux", "aarch64-suse-linux" }; + const AArch64beLibDirs: [1][]const u8 = .{"/lib"}; + const AArch64beTriples: [2][]const u8 = .{ "aarch64_be-none-linux-gnu", "aarch64_be-linux-gnu" }; + + const ARMLibDirs: [1][]const u8 = .{"/lib"}; + const ARMTriples: [1][]const u8 = .{"arm-linux-gnueabi"}; + const ARMHFTriples: [4][]const u8 = .{ "arm-linux-gnueabihf", "armv7hl-redhat-linux-gnueabi", "armv6hl-suse-linux-gnueabi", "armv7hl-suse-linux-gnueabi" }; + + const ARMebLibDirs: [1][]const u8 = .{"/lib"}; + const ARMebTriples: [1][]const u8 = .{"armeb-linux-gnueabi"}; + const ARMebHFTriples: [2][]const u8 = .{ "armeb-linux-gnueabihf", "armebv7hl-redhat-linux-gnueabi" }; + + const AVRLibDirs: [1][]const u8 = .{"/lib"}; + const AVRTriples: [1][]const u8 = .{"avr"}; + + const CSKYLibDirs: [1][]const u8 = .{"/lib"}; + const CSKYTriples: [3][]const u8 = .{ "csky-linux-gnuabiv2", "csky-linux-uclibcabiv2", "csky-elf-noneabiv2" }; + + const X86_64LibDirs: [2][]const u8 = .{ "/lib64", "/lib" }; + const X86_64Triples: [11][]const u8 = .{ + "x86_64-linux-gnu", "x86_64-unknown-linux-gnu", + "x86_64-pc-linux-gnu", "x86_64-redhat-linux6E", + "x86_64-redhat-linux", "x86_64-suse-linux", + "x86_64-manbo-linux-gnu", "x86_64-linux-gnu", + "x86_64-slackware-linux", "x86_64-unknown-linux", + "x86_64-amazon-linux", + }; + const X32Triples: [2][]const u8 = .{ "x86_64-linux-gnux32", "x86_64-pc-linux-gnux32" }; + const X32LibDirs: [2][]const u8 = .{ "/libx32", "/lib" }; + const X86LibDirs: [2][]const u8 = .{ "/lib32", "/lib" }; + const X86Triples: [9][]const u8 = .{ + "i586-linux-gnu", "i686-linux-gnu", "i686-pc-linux-gnu", + "i386-redhat-linux6E", "i686-redhat-linux", "i386-redhat-linux", + "i586-suse-linux", "i686-montavista-linux", "i686-gnu", + }; + + const LoongArch64LibDirs: [2][]const u8 = .{ "/lib64", "/lib" }; + const LoongArch64Triples: [2][]const u8 = .{ "loongarch64-linux-gnu", "loongarch64-unknown-linux-gnu" }; + + const M68kLibDirs: [1][]const u8 = .{"/lib"}; + const M68kTriples: [3][]const u8 = .{ "m68k-linux-gnu", "m68k-unknown-linux-gnu", "m68k-suse-linux" }; + + const MIPSLibDirs: [2][]const u8 = .{ "/libo32", "/lib" }; + const MIPSTriples: [5][]const u8 = .{ + "mips-linux-gnu", "mips-mti-linux", + "mips-mti-linux-gnu", "mips-img-linux-gnu", + "mipsisa32r6-linux-gnu", + }; + const MIPSELLibDirs: [2][]const u8 = .{ "/libo32", "/lib" }; + const MIPSELTriples: [3][]const u8 = .{ "mipsel-linux-gnu", "mips-img-linux-gnu", "mipsisa32r6el-linux-gnu" }; + + const MIPS64LibDirs: [2][]const u8 = .{ "/lib64", "/lib" }; + const MIPS64Triples: [6][]const u8 = .{ + "mips64-linux-gnu", "mips-mti-linux-gnu", + "mips-img-linux-gnu", "mips64-linux-gnuabi64", + "mipsisa64r6-linux-gnu", "mipsisa64r6-linux-gnuabi64", + }; + const MIPS64ELLibDirs: [2][]const u8 = .{ "/lib64", "/lib" }; + const MIPS64ELTriples: [6][]const u8 = .{ + "mips64el-linux-gnu", "mips-mti-linux-gnu", + "mips-img-linux-gnu", "mips64el-linux-gnuabi64", + "mipsisa64r6el-linux-gnu", "mipsisa64r6el-linux-gnuabi64", + }; + + const MIPSN32LibDirs: [1][]const u8 = .{"/lib32"}; + const MIPSN32Triples: [2][]const u8 = .{ "mips64-linux-gnuabin32", "mipsisa64r6-linux-gnuabin32" }; + const MIPSN32ELLibDirs: [1][]const u8 = .{"/lib32"}; + const MIPSN32ELTriples: [2][]const u8 = .{ "mips64el-linux-gnuabin32", "mipsisa64r6el-linux-gnuabin32" }; + + const MSP430LibDirs: [1][]const u8 = .{"/lib"}; + const MSP430Triples: [1][]const u8 = .{"msp430-elf"}; + + const PPCLibDirs: [2][]const u8 = .{ "/lib32", "/lib" }; + const PPCTriples: [5][]const u8 = .{ + "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe", + // On 32-bit PowerPC systems running SUSE Linux, gcc is configured as a + // 64-bit compiler which defaults to "-m32", hence "powerpc64-suse-linux". + "powerpc64-suse-linux", "powerpc-montavista-linuxspe", + }; + const PPCLELibDirs: [2][]const u8 = .{ "/lib32", "/lib" }; + const PPCLETriples: [3][]const u8 = .{ "powerpcle-linux-gnu", "powerpcle-unknown-linux-gnu", "powerpcle-linux-musl" }; + + const PPC64LibDirs: [2][]const u8 = .{ "/lib64", "/lib" }; + const PPC64Triples: [4][]const u8 = .{ + "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu", + "powerpc64-suse-linux", "ppc64-redhat-linux", + }; + const PPC64LELibDirs: [2][]const u8 = .{ "/lib64", "/lib" }; + const PPC64LETriples: [5][]const u8 = .{ + "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu", + "powerpc64le-none-linux-gnu", "powerpc64le-suse-linux", + "ppc64le-redhat-linux", + }; + + const RISCV32LibDirs: [2][]const u8 = .{ "/lib32", "/lib" }; + const RISCV32Triples: [3][]const u8 = .{ "riscv32-unknown-linux-gnu", "riscv32-linux-gnu", "riscv32-unknown-elf" }; + const RISCV64LibDirs: [2][]const u8 = .{ "/lib64", "/lib" }; + const RISCV64Triples: [3][]const u8 = .{ + "riscv64-unknown-linux-gnu", + "riscv64-linux-gnu", + "riscv64-unknown-elf", + }; + + const SPARCv8LibDirs: [2][]const u8 = .{ "/lib32", "/lib" }; + const SPARCv8Triples: [2][]const u8 = .{ "sparc-linux-gnu", "sparcv8-linux-gnu" }; + const SPARCv9LibDirs: [2][]const u8 = .{ "/lib64", "/lib" }; + const SPARCv9Triples: [2][]const u8 = .{ "sparc64-linux-gnu", "sparcv9-linux-gnu" }; + + const SystemZLibDirs: [2][]const u8 = .{ "/lib64", "/lib" }; + const SystemZTriples: [5][]const u8 = .{ + "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu", + "s390x-suse-linux", "s390x-redhat-linux", + }; + const target = tc.getTarget(); + if (target.os.tag == .illumos) { + // TODO + return; + } + if (target.abi.isAndroid()) { + const AArch64AndroidTriples: [1][]const u8 = .{"aarch64-linux-android"}; + const ARMAndroidTriples: [1][]const u8 = .{"arm-linux-androideabi"}; + const MIPSELAndroidTriples: [1][]const u8 = .{"mipsel-linux-android"}; + const MIPS64ELAndroidTriples: [1][]const u8 = .{"mips64el-linux-android"}; + const X86AndroidTriples: [1][]const u8 = .{"i686-linux-android"}; + const X86_64AndroidTriples: [1][]const u8 = .{"x86_64-linux-android"}; + + switch (target.cpu.arch) { + .aarch64 => { + lib_dirs.appendSliceAssumeCapacity(&AArch64LibDirs); + triple_aliases.appendSliceAssumeCapacity(&AArch64AndroidTriples); + }, + .arm, + .thumb, + => { + lib_dirs.appendSliceAssumeCapacity(&ARMLibDirs); + triple_aliases.appendSliceAssumeCapacity(&ARMAndroidTriples); + }, + .mipsel => { + lib_dirs.appendSliceAssumeCapacity(&MIPSELLibDirs); + triple_aliases.appendSliceAssumeCapacity(&MIPSELAndroidTriples); + biarch_libdirs.appendSliceAssumeCapacity(&MIPS64ELLibDirs); + biarch_triple_aliases.appendSliceAssumeCapacity(&MIPS64ELAndroidTriples); + }, + .mips64el => { + lib_dirs.appendSliceAssumeCapacity(&MIPS64ELLibDirs); + triple_aliases.appendSliceAssumeCapacity(&MIPS64ELAndroidTriples); + biarch_libdirs.appendSliceAssumeCapacity(&MIPSELLibDirs); + biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSELAndroidTriples); + }, + .x86_64 => { + lib_dirs.appendSliceAssumeCapacity(&X86_64LibDirs); + triple_aliases.appendSliceAssumeCapacity(&X86_64AndroidTriples); + biarch_libdirs.appendSliceAssumeCapacity(&X86LibDirs); + biarch_triple_aliases.appendSliceAssumeCapacity(&X86AndroidTriples); + }, + .x86 => { + lib_dirs.appendSliceAssumeCapacity(&X86LibDirs); + triple_aliases.appendSliceAssumeCapacity(&X86AndroidTriples); + biarch_libdirs.appendSliceAssumeCapacity(&X86_64LibDirs); + biarch_triple_aliases.appendSliceAssumeCapacity(&X86_64AndroidTriples); + }, + else => {}, + } + return; + } + switch (target.cpu.arch) { + .aarch64 => { + lib_dirs.appendSliceAssumeCapacity(&AArch64LibDirs); + triple_aliases.appendSliceAssumeCapacity(&AArch64Triples); + biarch_libdirs.appendSliceAssumeCapacity(&AArch64LibDirs); + biarch_triple_aliases.appendSliceAssumeCapacity(&AArch64Triples); + }, + .aarch64_be => { + lib_dirs.appendSliceAssumeCapacity(&AArch64beLibDirs); + triple_aliases.appendSliceAssumeCapacity(&AArch64beTriples); + biarch_libdirs.appendSliceAssumeCapacity(&AArch64beLibDirs); + biarch_triple_aliases.appendSliceAssumeCapacity(&AArch64beTriples); + }, + .arm, .thumb => { + lib_dirs.appendSliceAssumeCapacity(&ARMLibDirs); + if (target.abi == .gnueabihf) { + triple_aliases.appendSliceAssumeCapacity(&ARMHFTriples); + } else { + triple_aliases.appendSliceAssumeCapacity(&ARMTriples); + } + }, + .armeb, .thumbeb => { + lib_dirs.appendSliceAssumeCapacity(&ARMebLibDirs); + if (target.abi == .gnueabihf) { + triple_aliases.appendSliceAssumeCapacity(&ARMebHFTriples); + } else { + triple_aliases.appendSliceAssumeCapacity(&ARMebTriples); + } + }, + .avr => { + lib_dirs.appendSliceAssumeCapacity(&AVRLibDirs); + triple_aliases.appendSliceAssumeCapacity(&AVRTriples); + }, + .csky => { + lib_dirs.appendSliceAssumeCapacity(&CSKYLibDirs); + triple_aliases.appendSliceAssumeCapacity(&CSKYTriples); + }, + .x86_64 => { + if (target.abi == .gnux32 or target.abi == .muslx32) { + lib_dirs.appendSliceAssumeCapacity(&X32LibDirs); + triple_aliases.appendSliceAssumeCapacity(&X32Triples); + biarch_libdirs.appendSliceAssumeCapacity(&X86_64LibDirs); + biarch_triple_aliases.appendSliceAssumeCapacity(&X86_64Triples); + } else { + lib_dirs.appendSliceAssumeCapacity(&X86_64LibDirs); + triple_aliases.appendSliceAssumeCapacity(&X86_64Triples); + biarch_libdirs.appendSliceAssumeCapacity(&X32LibDirs); + biarch_triple_aliases.appendSliceAssumeCapacity(&X32Triples); + } + biarch_libdirs.appendSliceAssumeCapacity(&X86LibDirs); + biarch_triple_aliases.appendSliceAssumeCapacity(&X86Triples); + }, + .x86 => { + lib_dirs.appendSliceAssumeCapacity(&X86LibDirs); + }, + .loongarch64 => { + lib_dirs.appendSliceAssumeCapacity(&LoongArch64LibDirs); + triple_aliases.appendSliceAssumeCapacity(&LoongArch64Triples); + }, + .m68k => { + lib_dirs.appendSliceAssumeCapacity(&M68kLibDirs); + triple_aliases.appendSliceAssumeCapacity(&M68kTriples); + }, + .mips => { + lib_dirs.appendSliceAssumeCapacity(&MIPSLibDirs); + triple_aliases.appendSliceAssumeCapacity(&MIPSTriples); + biarch_libdirs.appendSliceAssumeCapacity(&MIPS64LibDirs); + biarch_triple_aliases.appendSliceAssumeCapacity(&MIPS64Triples); + biarch_libdirs.appendSliceAssumeCapacity(&MIPSN32LibDirs); + biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSN32Triples); + }, + .mipsel => { + lib_dirs.appendSliceAssumeCapacity(&MIPSELLibDirs); + triple_aliases.appendSliceAssumeCapacity(&MIPSELTriples); + triple_aliases.appendSliceAssumeCapacity(&MIPSTriples); + biarch_libdirs.appendSliceAssumeCapacity(&MIPS64ELLibDirs); + biarch_triple_aliases.appendSliceAssumeCapacity(&MIPS64ELTriples); + biarch_libdirs.appendSliceAssumeCapacity(&MIPSN32ELLibDirs); + biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSN32ELTriples); + }, + .mips64 => { + lib_dirs.appendSliceAssumeCapacity(&MIPS64LibDirs); + triple_aliases.appendSliceAssumeCapacity(&MIPS64Triples); + biarch_libdirs.appendSliceAssumeCapacity(&MIPSLibDirs); + biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSTriples); + biarch_libdirs.appendSliceAssumeCapacity(&MIPSN32LibDirs); + biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSN32Triples); + }, + .mips64el => { + lib_dirs.appendSliceAssumeCapacity(&MIPS64ELLibDirs); + triple_aliases.appendSliceAssumeCapacity(&MIPS64ELTriples); + biarch_libdirs.appendSliceAssumeCapacity(&MIPSELLibDirs); + biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSELTriples); + biarch_libdirs.appendSliceAssumeCapacity(&MIPSN32ELLibDirs); + biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSN32ELTriples); + biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSTriples); + }, + .msp430 => { + lib_dirs.appendSliceAssumeCapacity(&MSP430LibDirs); + triple_aliases.appendSliceAssumeCapacity(&MSP430Triples); + }, + .powerpc => { + lib_dirs.appendSliceAssumeCapacity(&PPCLibDirs); + triple_aliases.appendSliceAssumeCapacity(&PPCTriples); + biarch_libdirs.appendSliceAssumeCapacity(&PPC64LibDirs); + biarch_triple_aliases.appendSliceAssumeCapacity(&PPC64Triples); + }, + .powerpcle => { + lib_dirs.appendSliceAssumeCapacity(&PPCLELibDirs); + triple_aliases.appendSliceAssumeCapacity(&PPCLETriples); + biarch_libdirs.appendSliceAssumeCapacity(&PPC64LELibDirs); + biarch_triple_aliases.appendSliceAssumeCapacity(&PPC64LETriples); + }, + .powerpc64 => { + lib_dirs.appendSliceAssumeCapacity(&PPC64LibDirs); + triple_aliases.appendSliceAssumeCapacity(&PPC64Triples); + biarch_libdirs.appendSliceAssumeCapacity(&PPCLibDirs); + biarch_triple_aliases.appendSliceAssumeCapacity(&PPCTriples); + }, + .powerpc64le => { + lib_dirs.appendSliceAssumeCapacity(&PPC64LELibDirs); + triple_aliases.appendSliceAssumeCapacity(&PPC64LETriples); + biarch_libdirs.appendSliceAssumeCapacity(&PPCLELibDirs); + biarch_triple_aliases.appendSliceAssumeCapacity(&PPCLETriples); + }, + .riscv32 => { + lib_dirs.appendSliceAssumeCapacity(&RISCV32LibDirs); + triple_aliases.appendSliceAssumeCapacity(&RISCV32Triples); + biarch_libdirs.appendSliceAssumeCapacity(&RISCV64LibDirs); + biarch_triple_aliases.appendSliceAssumeCapacity(&RISCV64Triples); + }, + .riscv64 => { + lib_dirs.appendSliceAssumeCapacity(&RISCV64LibDirs); + triple_aliases.appendSliceAssumeCapacity(&RISCV64Triples); + biarch_libdirs.appendSliceAssumeCapacity(&RISCV32LibDirs); + biarch_triple_aliases.appendSliceAssumeCapacity(&RISCV32Triples); + }, + .sparc => { + lib_dirs.appendSliceAssumeCapacity(&SPARCv8LibDirs); + triple_aliases.appendSliceAssumeCapacity(&SPARCv8Triples); + biarch_libdirs.appendSliceAssumeCapacity(&SPARCv9LibDirs); + biarch_triple_aliases.appendSliceAssumeCapacity(&SPARCv9Triples); + }, + .sparc64 => { + lib_dirs.appendSliceAssumeCapacity(&SPARCv9LibDirs); + triple_aliases.appendSliceAssumeCapacity(&SPARCv9Triples); + biarch_libdirs.appendSliceAssumeCapacity(&SPARCv8LibDirs); + biarch_triple_aliases.appendSliceAssumeCapacity(&SPARCv8Triples); + }, + .s390x => { + lib_dirs.appendSliceAssumeCapacity(&SystemZLibDirs); + triple_aliases.appendSliceAssumeCapacity(&SystemZTriples); + }, + else => {}, + } +} + +pub fn discover(self: *GCCDetector, tc: *Toolchain) !void { + var path_buf: [std.fs.max_path_bytes]u8 = undefined; + var fib = std.heap.FixedBufferAllocator.init(&path_buf); + + const target = tc.getTarget(); + const biarch_variant_target = if (target.ptrBitWidth() == 32) + target.get64BitArchVariant() + else + target.get32BitArchVariant(); + + var candidate_lib_dirs_buffer: [16][]const u8 = undefined; + var candidate_lib_dirs = std.ArrayList([]const u8).initBuffer(&candidate_lib_dirs_buffer); + + var candidate_triple_aliases_buffer: [16][]const u8 = undefined; + var candidate_triple_aliases = std.ArrayList([]const u8).initBuffer(&candidate_triple_aliases_buffer); + + var candidate_biarch_lib_dirs_buffer: [16][]const u8 = undefined; + var candidate_biarch_lib_dirs = std.ArrayList([]const u8).initBuffer(&candidate_biarch_lib_dirs_buffer); + + var candidate_biarch_triple_aliases_buffer: [20][]const u8 = undefined; + var candidate_biarch_triple_aliases = std.ArrayList([]const u8).initBuffer(&candidate_biarch_triple_aliases_buffer); + + try collectLibDirsAndTriples( + tc, + &candidate_lib_dirs, + &candidate_triple_aliases, + &candidate_biarch_lib_dirs, + &candidate_biarch_triple_aliases, + ); + + var target_buf: [64]u8 = undefined; + const triple_str = target.toLLVMTriple(&target_buf); + candidate_triple_aliases.appendAssumeCapacity(triple_str); + + // Also include the multiarch variant if it's different. + var biarch_buf: [64]u8 = undefined; + if (biarch_variant_target) |*biarch_target| { + const biarch_triple_str = biarch_target.toLLVMTriple(&biarch_buf); + if (!std.mem.eql(u8, biarch_triple_str, triple_str)) { + candidate_triple_aliases.appendAssumeCapacity(biarch_triple_str); + } + } + + var prefixes_buf: [16][]const u8 = undefined; + var prefixes = std.ArrayList([]const u8).initBuffer(&prefixes_buf); + const gcc_toolchain_dir = gccToolchainDir(tc); + if (gcc_toolchain_dir.len != 0) { + const adjusted = if (gcc_toolchain_dir[gcc_toolchain_dir.len - 1] == '/') + gcc_toolchain_dir[0 .. gcc_toolchain_dir.len - 1] + else + gcc_toolchain_dir; + prefixes.appendAssumeCapacity(adjusted); + } else { + const sysroot = tc.getSysroot(); + if (sysroot.len > 0) { + prefixes.appendAssumeCapacity(sysroot); + try addDefaultGCCPrefixes(&prefixes, tc); + } + + if (sysroot.len == 0) { + try addDefaultGCCPrefixes(&prefixes, tc); + } + // TODO: Special-case handling for Gentoo + } + + const v0 = GCCVersion.parse("0.0.0"); + for (prefixes.items) |prefix| { + if (!tc.exists(prefix)) continue; + + for (candidate_lib_dirs.items) |suffix| { + defer fib.reset(); + const lib_dir = std.fs.path.join(fib.allocator(), &.{ prefix, suffix }) catch continue; + if (!tc.exists(lib_dir)) continue; + + const gcc_dir_exists = tc.joinedExists(&.{ lib_dir, "/gcc" }); + const gcc_cross_dir_exists = tc.joinedExists(&.{ lib_dir, "/gcc-cross" }); + + try self.scanLibDirForGCCTriple(tc, target, lib_dir, triple_str, false, gcc_dir_exists, gcc_cross_dir_exists); + for (candidate_triple_aliases.items) |candidate| { + try self.scanLibDirForGCCTriple(tc, target, lib_dir, candidate, false, gcc_dir_exists, gcc_cross_dir_exists); + } + } + for (candidate_biarch_lib_dirs.items) |suffix| { + const lib_dir = std.fs.path.join(fib.allocator(), &.{ prefix, suffix }) catch continue; + if (!tc.exists(lib_dir)) continue; + + const gcc_dir_exists = tc.joinedExists(&.{ lib_dir, "/gcc" }); + const gcc_cross_dir_exists = tc.joinedExists(&.{ lib_dir, "/gcc-cross" }); + for (candidate_biarch_triple_aliases.items) |candidate| { + try self.scanLibDirForGCCTriple(tc, target, lib_dir, candidate, true, gcc_dir_exists, gcc_cross_dir_exists); + } + } + if (self.version.order(v0) == .gt) break; + } +} + +fn findBiarchMultilibs( + tc: *const Toolchain, + result: *Multilib.Detected, + target: *const Target, + path: [2][]const u8, + needs_biarch_suffix: bool, +) !bool { + const suff64 = if (target.os.tag == .illumos) switch (target.cpu.arch) { + .x86, .x86_64 => "/amd64", + .sparc => "/sparcv9", + else => "/64", + } else "/64"; + + const alt_64 = Multilib.init(suff64, suff64, &.{ "-m32", "+m64", "-mx32" }); + const alt_32 = Multilib.init("/32", "/32", &.{ "+m32", "-m64", "-mx32" }); + const alt_x32 = Multilib.init("/x32", "/x32", &.{ "-m32", "-m64", "+mx32" }); + + const multilib_filter = Multilib.Filter{ + .base = path, + .file = "crtbegin.o", + }; + + const Want = enum { + want32, + want64, + wantx32, + }; + const is_x32 = target.abi == .gnux32 or target.abi == .muslx32; + const target_ptr_width = target.ptrBitWidth(); + const want: Want = if (target_ptr_width == 32 and multilib_filter.exists(alt_32, tc)) + .want64 + else if (target_ptr_width == 64 and is_x32 and multilib_filter.exists(alt_x32, tc)) + .want64 + else if (target_ptr_width == 64 and !is_x32 and multilib_filter.exists(alt_64, tc)) + .want32 + else if (target_ptr_width == 32) + if (needs_biarch_suffix) .want64 else .want32 + else if (is_x32) + if (needs_biarch_suffix) .want64 else .wantx32 + else if (needs_biarch_suffix) .want32 else .want64; + + const default = switch (want) { + .want32 => Multilib.init("", "", &.{ "+m32", "-m64", "-mx32" }), + .want64 => Multilib.init("", "", &.{ "-m32", "+m64", "-mx32" }), + .wantx32 => Multilib.init("", "", &.{ "-m32", "-m64", "+mx32" }), + }; + result.multilib_buf[result.multilib_count..][0..4].* = .{ + default, + alt_64, + alt_32, + alt_x32, + }; + result.multilib_count += 4; + + result.filter(multilib_filter, tc); + return result.select(&.{ + if (target_ptr_width == 64 and !is_x32) "+m64" else "-m64", + if (target_ptr_width == 32) "+m32" else "-m32", + if (target_ptr_width == 64 and is_x32) "+mx32" else "-mx32", + }); +} + +fn scanGCCForMultilibs( + self: *GCCDetector, + tc: *const Toolchain, + target: *const Target, + path: [2][]const u8, + needs_biarch_suffix: bool, +) !bool { + var detected: Multilib.Detected = .{}; + if (target.cpu.arch == .csky) { + // TODO + } else if (target.cpu.arch.isMIPS()) { + // TODO + } else if (target.cpu.arch.isRISCV()) { + // TODO + } else if (target.cpu.arch == .msp430) { + // TODO + } else if (target.cpu.arch == .avr) { + // No multilibs + } else if (!try findBiarchMultilibs(tc, &detected, target, path, needs_biarch_suffix)) { + return false; + } + self.selected = detected.selected; + self.biarch_sibling = detected.biarch_sibling; + return true; +} + +fn scanLibDirForGCCTriple( + self: *GCCDetector, + tc: *const Toolchain, + target: *const Target, + lib_dir: []const u8, + candidate_triple: []const u8, + needs_biarch_suffix: bool, + gcc_dir_exists: bool, + gcc_cross_dir_exists: bool, +) !void { + var path_buf: [std.fs.max_path_bytes]u8 = undefined; + var fib = std.heap.FixedBufferAllocator.init(&path_buf); + const comp = tc.driver.comp; + const arena = comp.arena; + const io = comp.io; + for (0..2) |i| { + if (i == 0 and !gcc_dir_exists) continue; + if (i == 1 and !gcc_cross_dir_exists) continue; + defer fib.reset(); + + const base: []const u8 = if (i == 0) "gcc" else "gcc-cross"; + var lib_suffix_buf: [64]u8 = undefined; + var suffix_buf_fib = std.heap.FixedBufferAllocator.init(&lib_suffix_buf); + const lib_suffix = std.fs.path.join(suffix_buf_fib.allocator(), &.{ base, candidate_triple }) catch continue; + + const dir_name = std.fs.path.join(fib.allocator(), &.{ lib_dir, lib_suffix }) catch continue; + var parent_dir = comp.cwd.openDir(io, dir_name, .{ .access_sub_paths = false, .iterate = true }) catch continue; + defer parent_dir.close(io); + + var it = parent_dir.iterate(); + while (it.next(io) catch continue) |entry| { + if (entry.kind != .directory) continue; + + const version_text = entry.name; + const candidate_version = GCCVersion.parse(version_text); + if (candidate_version.major != -1) { + // TODO: cache path so we're not repeatedly scanning + } + if (candidate_version.isLessThan(4, 1, 1, "")) continue; + switch (candidate_version.order(self.version)) { + .lt, .eq => continue, + .gt => {}, + } + + if (!try self.scanGCCForMultilibs(tc, target, .{ dir_name, version_text }, needs_biarch_suffix)) continue; + + self.version = candidate_version; + self.gcc_triple = try arena.dupe(u8, candidate_triple); + self.install_path = try std.fs.path.join(arena, &.{ lib_dir, lib_suffix, version_text }); + self.parent_lib_path = try std.fs.path.join(arena, &.{ self.install_path, "..", "..", ".." }); + self.is_valid = true; + } + } +} + +fn gccToolchainDir(tc: *const Toolchain) []const u8 { + const sysroot = tc.getSysroot(); + if (sysroot.len != 0) return ""; + return system_defaults.gcc_install_prefix; +} diff --git a/lib/compiler/aro/aro/LangOpts.zig b/lib/compiler/aro/aro/LangOpts.zig @@ -7,16 +7,22 @@ pub const Compiler = enum { clang, gcc, msvc, + no, pub fn defaultGccVersion(self: Compiler) u32 { return switch (self) { .clang => 4 * 10_000 + 2 * 100 + 1, - .gcc => 7 * 10_000 + 1 * 100 + 0, + .no, .gcc => 7 * 10_000 + 1 * 100 + 0, .msvc => 0, }; } }; +pub const BoundsSafety = enum { + none, + clang, +}; + /// The floating-point evaluation method for intermediate results within a single expression pub const FPEvalMethod = enum(i8) { /// The evaluation method cannot be determined or is inconsistent for this target. @@ -116,7 +122,7 @@ pub const Standard = enum { const LangOpts = @This(); -emulate: Compiler = .clang, +emulate: Compiler = .no, standard: Standard = .default, /// -fshort-enums option, makes enums only take up as much space as they need to hold all the values. short_enums: bool = false, @@ -149,6 +155,10 @@ preserve_comments_in_macros: bool = false, /// e.g. 4.2.1 == 40201 gnuc_version: ?u32 = null, +bounds_safety: BoundsSafety = .none, + +default_symbol_visibility: std.builtin.SymbolVisibility = .default, + pub fn setStandard(self: *LangOpts, name: []const u8) error{InvalidStandard}!void { self.standard = Standard.NameMap.get(name) orelse return error.InvalidStandard; } diff --git a/lib/compiler/aro/aro/Parser.zig b/lib/compiler/aro/aro/Parser.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const Io = std.Io; const mem = std.mem; const Allocator = mem.Allocator; const assert = std.debug.assert; @@ -204,6 +203,11 @@ string_ids: struct { sigjmp_buf: StringId, ucontext_t: StringId, }, +va_arg_pack_ctx: packed struct { + valid: bool = false, + variadic: bool = false, + typed: bool = false, +} = .{}, /// Checks codepoint for various pedantic warnings /// Returns true if diagnostic issued @@ -212,7 +216,7 @@ fn checkIdentifierCodepointWarnings(p: *Parser, codepoint: u21, loc: Source.Loca const prev_total = p.diagnostics.total; var sf = std.heap.stackFallback(1024, p.comp.gpa); - var allocating: Io.Writer.Allocating = .init(sf.get()); + var allocating: std.Io.Writer.Allocating = .init(sf.get()); defer allocating.deinit(); if (!char_info.isC99IdChar(codepoint)) { @@ -426,7 +430,7 @@ pub fn err(p: *Parser, tok_i: TokenIndex, diagnostic: Diagnostic, args: anytype) if (p.diagnostics.effectiveKind(diagnostic) == .off) return; var sf = std.heap.stackFallback(1024, p.comp.gpa); - var allocating: Io.Writer.Allocating = .init(sf.get()); + var allocating: std.Io.Writer.Allocating = .init(sf.get()); defer allocating.deinit(); p.formatArgs(&allocating.writer, diagnostic.fmt, args) catch return error.OutOfMemory; @@ -448,7 +452,7 @@ pub fn err(p: *Parser, tok_i: TokenIndex, diagnostic: Diagnostic, args: anytype) }, p.pp.expansionSlice(tok_i), true); } -fn formatArgs(p: *Parser, w: *Io.Writer, fmt: []const u8, args: anytype) !void { +fn formatArgs(p: *Parser, w: *std.Io.Writer, fmt: []const u8, args: anytype) !void { var i: usize = 0; inline for (std.meta.fields(@TypeOf(args))) |arg_info| { const arg = @field(args, arg_info.name); @@ -477,13 +481,13 @@ fn formatArgs(p: *Parser, w: *Io.Writer, fmt: []const u8, args: anytype) !void { try w.writeAll(fmt[i..]); } -fn formatTokenId(w: *Io.Writer, fmt: []const u8, tok_id: Tree.Token.Id) !usize { +fn formatTokenId(w: *std.Io.Writer, fmt: []const u8, tok_id: Tree.Token.Id) !usize { const i = Diagnostics.templateIndex(w, fmt, "{tok_id}"); try w.writeAll(tok_id.symbol()); return i; } -fn formatQualType(p: *Parser, w: *Io.Writer, fmt: []const u8, qt: QualType) !usize { +fn formatQualType(p: *Parser, w: *std.Io.Writer, fmt: []const u8, qt: QualType) !usize { const i = Diagnostics.templateIndex(w, fmt, "{qt}"); try w.writeByte('\''); try qt.print(p.comp, w); @@ -502,7 +506,7 @@ fn formatQualType(p: *Parser, w: *Io.Writer, fmt: []const u8, qt: QualType) !usi return i; } -fn formatResult(p: *Parser, w: *Io.Writer, fmt: []const u8, res: Result) !usize { +fn formatResult(p: *Parser, w: *std.Io.Writer, fmt: []const u8, res: Result) !usize { const i = Diagnostics.templateIndex(w, fmt, "{value}"); switch (res.val.opt_ref) { .none => try w.writeAll("(none)"), @@ -525,7 +529,7 @@ const Normalized = struct { return .{ .str = str }; } - pub fn format(ctx: Normalized, w: *Io.Writer, fmt: []const u8) !usize { + pub fn format(ctx: Normalized, w: *std.Io.Writer, fmt: []const u8) !usize { const i = Diagnostics.templateIndex(w, fmt, "{normalized}"); var it: std.unicode.Utf8Iterator = .{ .bytes = ctx.str, @@ -559,7 +563,7 @@ const Codepoint = struct { return .{ .codepoint = codepoint }; } - pub fn format(ctx: Codepoint, w: *Io.Writer, fmt: []const u8) !usize { + pub fn format(ctx: Codepoint, w: *std.Io.Writer, fmt: []const u8) !usize { const i = Diagnostics.templateIndex(w, fmt, "{codepoint}"); try w.print("{X:0>4}", .{ctx.codepoint}); return i; @@ -573,7 +577,7 @@ const Escaped = struct { return .{ .str = str }; } - pub fn format(ctx: Escaped, w: *Io.Writer, fmt: []const u8) !usize { + pub fn format(ctx: Escaped, w: *std.Io.Writer, fmt: []const u8) !usize { const i = Diagnostics.templateIndex(w, fmt, "{s}"); try std.zig.stringEscape(ctx.str, w); return i; @@ -740,6 +744,11 @@ fn getNode(p: *Parser, node: Node.Index, comptime tag: std.meta.Tag(Tree.Node)) } } +pub fn isAddressOfStringLiteral(p: *Parser, node: Node.Index) bool { + const addr_of = p.getNode(node, .addr_of_expr) orelse return false; + return p.nodeIs(addr_of.operand, .string_literal_expr); +} + fn pragma(p: *Parser) Compilation.Error!bool { var found_pragma = false; while (p.eatToken(.keyword_pragma)) |_| { @@ -1070,14 +1079,15 @@ fn decl(p: *Parser) Error!bool { try p.attributeSpecifier(); + const decl_spec_start = p.tok_i; var decl_spec = (try p.declSpec()) orelse blk: { if (p.func.qt != null) { p.tok_i = first_tok; return false; } - switch (p.tok_ids[first_tok]) { + switch (p.tok_ids[decl_spec_start]) { .asterisk, .l_paren => {}, - .identifier, .extended_identifier => switch (p.tok_ids[first_tok + 1]) { + .identifier, .extended_identifier => switch (p.tok_ids[decl_spec_start + 1]) { .identifier, .extended_identifier => { // The most likely reason for `identifier identifier` is // an unknown type name. @@ -1087,7 +1097,7 @@ fn decl(p: *Parser) Error!bool { }, else => {}, }, - else => if (p.tok_i != first_tok) { + else => if (p.tok_i != decl_spec_start) { try p.err(p.tok_i, .expected_ident_or_l_paren, .{}); return error.ParsingFailed; } else return false, @@ -1167,6 +1177,7 @@ fn decl(p: *Parser) Error!bool { // Collect old style parameter declarations. if (init_d.d.old_style_func != null) { + try p.err(init_d.d.name, .def_no_proto_deprecated, .{}); const param_buf_top = p.param_buf.items.len; defer p.param_buf.items.len = param_buf_top; @@ -1340,7 +1351,7 @@ fn decl(p: *Parser) Error!bool { if (init_d.d.old_style_func) |tok_i| try p.err(tok_i, .invalid_old_style_params, .{}); if (decl_spec.storage_class == .typedef) { - try decl_spec.validateDecl(p); + try decl_spec.validateDecl(p, init_d.asm_label); try p.tree.setNode(.{ .typedef = .{ .name_tok = init_d.d.name, .qt = init_d.d.qt, @@ -1357,7 +1368,7 @@ fn decl(p: *Parser) Error!bool { .definition = null, } }, @intFromEnum(decl_node)); } else { - try decl_spec.validateDecl(p); + try decl_spec.validateDecl(p, init_d.asm_label); var node_qt = init_d.d.qt; if (p.func.qt == null and decl_spec.storage_class != .@"extern") { if (node_qt.get(p.comp, .array)) |array_ty| { @@ -1454,7 +1465,7 @@ fn decl(p: *Parser) Error!bool { return true; } -fn staticAssertMessage(p: *Parser, cond_node: Node.Index, maybe_message: ?Result, allocating: *Io.Writer.Allocating) !?[]const u8 { +fn staticAssertMessage(p: *Parser, cond_node: Node.Index, maybe_message: ?Result, allocating: *std.Io.Writer.Allocating) !?[]const u8 { const w = &allocating.writer; const cond = cond_node.get(&p.tree); @@ -1527,7 +1538,7 @@ fn staticAssert(p: *Parser) Error!bool { } else { if (!res.val.toBool(p.comp)) { var sf = std.heap.stackFallback(1024, gpa); - var allocating: Io.Writer.Allocating = .init(sf.get()); + var allocating: std.Io.Writer.Allocating = .init(sf.get()); defer allocating.deinit(); if (p.staticAssertMessage(res_node, str, &allocating) catch return error.OutOfMemory) |message| { @@ -1597,13 +1608,16 @@ pub const DeclSpec = struct { if (d.constexpr) |tok_i| try p.err(tok_i, .illegal_storage_on_func, .{}); } - fn validateDecl(d: DeclSpec, p: *Parser) Error!void { + fn validateDecl(d: DeclSpec, p: *Parser, asm_label: ?Node.Index) Error!void { if (d.@"inline") |tok_i| try p.err(tok_i, .func_spec_non_func, .{"inline"}); // TODO move to attribute validation if (d.noreturn) |tok_i| try p.err(tok_i, .func_spec_non_func, .{"_Noreturn"}); switch (d.storage_class) { - .auto => std.debug.assert(!p.comp.langopts.standard.atLeast(.c23)), - .register => if (p.func.qt == null) try p.err(p.tok_i, .illegal_storage_on_global, .{}), + .auto => { + std.debug.assert(!p.comp.langopts.standard.atLeast(.c23)); + try p.err(p.tok_i, .auto_on_global, .{}); + }, + .register => if (p.func.qt == null and asm_label == null) try p.err(p.tok_i, .register_on_global, .{}), else => {}, } } @@ -1787,7 +1801,11 @@ fn storageClassSpec(p: *Parser, d: *DeclSpec) Error!bool { return p.tok_i != start; } -const InitDeclarator = struct { d: Declarator, initializer: ?Result = null }; +const InitDeclarator = struct { + d: Declarator, + initializer: ?Result = null, + asm_label: ?Node.Index = null, +}; /// attribute /// : attrIdentifier @@ -1829,18 +1847,18 @@ fn attribute(p: *Parser, kind: Attribute.Kind, namespace: ?[]const u8) Error!?Te if (try p.eatIdentifier()) |ident| { if (try Attribute.diagnoseIdent(attr, &arguments, ident, p)) { p.skipTo(.r_paren); - return error.ParsingFailed; + return null; } } else { try p.err(name_tok, .attribute_requires_identifier, .{name}); - return error.ParsingFailed; + return null; } } else { const arg_start = p.tok_i; const first_expr = try p.expect(assignExpr); if (try p.diagnose(attr, &arguments, arg_idx, first_expr, arg_start)) { p.skipTo(.r_paren); - return error.ParsingFailed; + return null; } } arg_idx += 1; @@ -1851,7 +1869,7 @@ fn attribute(p: *Parser, kind: Attribute.Kind, namespace: ?[]const u8) Error!?Te const arg_expr = try p.expect(assignExpr); if (try p.diagnose(attr, &arguments, arg_idx, arg_expr, arg_start)) { p.skipTo(.r_paren); - return error.ParsingFailed; + return null; } } }, @@ -1861,9 +1879,9 @@ fn attribute(p: *Parser, kind: Attribute.Kind, namespace: ?[]const u8) Error!?Te try p.err(name_tok, .attribute_not_enough_args, .{ @tagName(attr), required_count, }); - return error.ParsingFailed; + return null; } - return TentativeAttribute{ .attr = .{ .tag = attr, .args = arguments, .syntax = kind.toSyntax() }, .tok = name_tok }; + return .{ .attr = .{ .tag = attr, .args = arguments, .syntax = kind.toSyntax() }, .tok = name_tok }; } fn diagnose(p: *Parser, attr: Attribute.Tag, arguments: *Attribute.Arguments, arg_idx: u32, res: Result, arg_start: TokenIndex) !bool { @@ -1995,12 +2013,12 @@ fn initDeclarator(p: *Parser, decl_spec: *DeclSpec, attr_buf_top: usize, decl_no defer p.attr_buf.len = this_attr_buf_top; const gpa = p.comp.gpa; - var init_d = InitDeclarator{ + var init_d: InitDeclarator = .{ .d = (try p.declarator(decl_spec.qt, .normal)) orelse return null, }; try p.attributeSpecifierExtra(init_d.d.name); - _ = try p.assembly(.decl_label); + init_d.asm_label = try p.assembly(.decl_label); try p.attributeSpecifierExtra(init_d.d.name); switch (init_d.d.declarator_type) { @@ -2276,14 +2294,13 @@ fn typeSpec(p: *Parser, builder: *TypeStore.Builder) Error!bool { }, .syntax = .keyword }, .tok = align_tok, }); - } else { + } else check: { const arg_start = p.tok_i; const res = try p.integerConstExpr(.no_const_decl_folding); if (!res.val.isZero(p.comp)) { var args = Attribute.initArguments(.aligned, align_tok); if (try p.diagnose(.aligned, &args, 0, res, arg_start)) { - p.skipTo(.r_paren); - return error.ParsingFailed; + break :check; } args.aligned.alignment.?.node = .pack(res.node); try p.attr_buf.append(gpa, .{ @@ -2562,7 +2579,7 @@ fn recordSpec(p: *Parser) Error!QualType { if (!any_incomplete) { const pragma_pack_value = switch (p.comp.langopts.emulate) { - .clang => starting_pragma_pack, + .clang, .no => starting_pragma_pack, .gcc => p.pragma_pack, // TODO: msvc considers `#pragma pack` on a per-field basis .msvc => p.pragma_pack, @@ -3542,7 +3559,6 @@ fn declarator( const pointer_qt = try p.comp.type_store.put(p.comp.gpa, .{ .pointer = .{ .child = d.qt, - .decayed = null, } }); d.qt = try builder.finishQuals(pointer_qt); } @@ -4141,7 +4157,10 @@ fn designation(p: *Parser, il: *InitList, init_qt: QualType, index_list: *IndexL const field = record_ty.fields[field_index]; if (field.name_tok == 0) if (field.qt.getRecord(p.comp)) |field_record_ty| { // Recurse into anonymous field if it has a field by the name. - if (!field_record_ty.hasField(p.comp, target_name)) continue; + if (!field_record_ty.hasField(p.comp, target_name)) { + field_index += 1; + continue; + } try index_list.append(gpa, field_index); cur_il = try il.find(gpa, field_index); record_ty = field_record_ty; @@ -4983,31 +5002,31 @@ fn assembly(p: *Parser, kind: enum { global, decl_label, stmt }) Error!?Node.Ind }; const l_paren = try p.expectToken(.l_paren); - var result_node: ?Node.Index = null; - switch (kind) { - .decl_label => { + const res = switch (kind) { + .decl_label => blk: { const asm_str = try p.asmStr(); const str = try p.removeNull(asm_str.val); const attr = Attribute{ .tag = .asm_label, .args = .{ .asm_label = .{ .name = str } }, .syntax = .keyword }; try p.attr_buf.append(p.comp.gpa, .{ .attr = attr, .tok = asm_tok }); + break :blk asm_str.node; }, - .global => { + .global => blk: { const asm_str = try p.asmStr(); try p.checkAsmStr(asm_str.val, l_paren); - result_node = try p.addNode(.{ + break :blk try p.addNode(.{ .global_asm = .{ .asm_tok = asm_tok, .asm_str = asm_str.node, }, }); }, - .stmt => result_node = try p.gnuAsmStmt(quals, asm_tok, l_paren), - } + .stmt => try p.gnuAsmStmt(quals, asm_tok, l_paren), + }; try p.expectClosing(l_paren, .r_paren); if (kind != .decl_label) _ = try p.expectToken(.semicolon); - return result_node; + return res; } /// Same as stringLiteral but errors on unicode and wide string literals @@ -5253,7 +5272,6 @@ fn stmt(p: *Parser) Error!Node.Index { if (!goto_expr.qt.isInvalid() and !goto_expr.qt.isPointer(p.comp)) { const result_qt = try p.comp.type_store.put(gpa, .{ .pointer = .{ .child = .{ .@"const" = true, ._index = .void }, - .decayed = null, } }); if (!goto_expr.qt.isRealInt(p.comp)) { try p.err(expr_tok, .incompatible_arg, .{ goto_expr.qt, result_qt }); @@ -5905,6 +5923,7 @@ const CallExpr = union(enum) { .__builtin_reduce_xor, .__builtin_reduce_max, .__builtin_reduce_min, + .__builtin_constant_p, => 1, .__builtin_complex, @@ -5922,13 +5941,15 @@ const CallExpr = union(enum) { .__c11_atomic_store, .__atomic_store, + .__atomic_store_n, + .__atomic_load, .__c11_atomic_exchange, - .__atomic_exchange, .__c11_atomic_fetch_add, .__c11_atomic_fetch_sub, .__c11_atomic_fetch_or, .__c11_atomic_fetch_xor, .__c11_atomic_fetch_and, + .__c11_atomic_fetch_nand, .__atomic_fetch_add, .__atomic_fetch_sub, .__atomic_fetch_and, @@ -5948,6 +5969,9 @@ const CallExpr = union(enum) { .__atomic_exchange_n, => 3, + .__atomic_exchange, + => 4, + .__c11_atomic_compare_exchange_strong, .__c11_atomic_compare_exchange_weak, => 5, @@ -5964,25 +5988,13 @@ const CallExpr = union(enum) { fn returnType(self: CallExpr, p: *Parser, args: []const Node.Index, func_qt: QualType) !QualType { if (self == .standard) { + if (func_qt.isInvalid()) return .invalid; return if (func_qt.get(p.comp, .func)) |func_ty| func_ty.return_type else .invalid; } const builtin = self.builtin; const func_ty = func_qt.get(p.comp, .func).?; return switch (builtin.expanded.tag) { .common => |tag| switch (tag) { - .__c11_atomic_exchange => { - if (args.len != 4) return .invalid; // wrong number of arguments; already an error - const second_param = args[2]; - return second_param.qt(&p.tree); - }, - .__c11_atomic_load => { - if (args.len != 3) return .invalid; // wrong number of arguments; already an error - const first_param = args[1]; - const qt = first_param.qt(&p.tree); - if (!qt.isPointer(p.comp)) return .invalid; - return qt.childType(p.comp); - }, - .__atomic_fetch_add, .__atomic_add_fetch, .__c11_atomic_fetch_add, @@ -6008,15 +6020,38 @@ const CallExpr = union(enum) { .__c11_atomic_fetch_nand, .__atomic_exchange_n, + .__c11_atomic_exchange, + => { + const second_param = args[1].qt(&p.tree); + return second_param; + }, + + .__sync_fetch_and_add, + .__sync_fetch_and_and, + .__sync_fetch_and_nand, + .__sync_fetch_and_or, + .__sync_fetch_and_sub, + .__sync_fetch_and_xor, + + .__sync_add_and_fetch, + .__sync_and_and_fetch, + .__sync_nand_and_fetch, + .__sync_or_and_fetch, + .__sync_sub_and_fetch, + .__sync_xor_and_fetch, + + .__sync_swap, + .__sync_lock_test_and_set, + .__sync_val_compare_and_swap, => { - if (args.len != 3) return .invalid; // wrong number of arguments; already an error - const second_param = args[2]; - return second_param.qt(&p.tree); + if (args.len < 2) return .invalid; + const second_param = args[1].qt(&p.tree); + return second_param; }, .__builtin_complex => { - if (args.len < 1) return .invalid; // not enough arguments; already an error - const last_param = args[args.len - 1]; - return try last_param.qt(&p.tree).toComplex(p.comp); + const last_param = args[args.len - 1].qt(&p.tree); + if (last_param.isInvalid()) return .invalid; + return try last_param.toComplex(p.comp); }, .__atomic_compare_exchange, .__atomic_compare_exchange_n, @@ -6027,9 +6062,8 @@ const CallExpr = union(enum) { .__c11_atomic_compare_exchange_strong, .__c11_atomic_compare_exchange_weak, => { - if (args.len != 6) return .invalid; // wrong number of arguments - const third_param = args[3]; - return third_param.qt(&p.tree); + const third_param = args[2].qt(&p.tree); + return third_param; }, .__builtin_elementwise_abs, @@ -6058,13 +6092,12 @@ const CallExpr = union(enum) { .__builtin_elementwise_sub_sat, .__builtin_elementwise_fma, .__builtin_elementwise_popcount, + .__builtin_nondeterministic_value, => { - if (args.len < 1) return .invalid; // not enough arguments; already an error - const last_param = args[args.len - 1]; - return last_param.qt(&p.tree); + const first_param = args[0].qt(&p.tree); + return first_param; }, - .__builtin_nontemporal_load, .__builtin_reduce_add, .__builtin_reduce_mul, .__builtin_reduce_and, @@ -6073,30 +6106,19 @@ const CallExpr = union(enum) { .__builtin_reduce_max, .__builtin_reduce_min, => { - if (args.len < 1) return .invalid; // not enough arguments; already an error - const last_param = args[args.len - 1]; - return last_param.qt(&p.tree).childType(p.comp); + const first_param = args[0].qt(&p.tree); + if (first_param.isInvalid()) return .invalid; + const vector_ty = first_param.get(p.comp, .vector) orelse return .invalid; + return vector_ty.elem; }, - .__sync_add_and_fetch, - .__sync_and_and_fetch, - .__sync_fetch_and_add, - .__sync_fetch_and_and, - .__sync_fetch_and_nand, - .__sync_fetch_and_or, - .__sync_fetch_and_sub, - .__sync_fetch_and_xor, - .__sync_lock_test_and_set, - .__sync_nand_and_fetch, - .__sync_or_and_fetch, - .__sync_sub_and_fetch, - .__sync_swap, - .__sync_xor_and_fetch, - .__sync_val_compare_and_swap, .__atomic_load_n, + .__c11_atomic_load, + .__builtin_nontemporal_load, => { - if (args.len < 1) return .invalid; // not enough arguments; already an error - const first_param = args[0]; - return first_param.qt(&p.tree).childType(p.comp); + const first_param = args[0].qt(&p.tree); + if (first_param.isInvalid()) return .invalid; + if (!first_param.isPointer(p.comp)) return .invalid; + return first_param.childType(p.comp); }, else => func_ty.return_type, }, @@ -6104,9 +6126,16 @@ const CallExpr = union(enum) { }; } - fn finish(self: CallExpr, p: *Parser, func_qt: QualType, list_buf_top: usize, l_paren: TokenIndex) Error!Result { + fn finish( + self: CallExpr, + p: *Parser, + func_qt: QualType, + list_buf_top: usize, + l_paren: TokenIndex, + args_ok: bool, + ) Error!Result { const args = p.list_buf.items[list_buf_top..]; - const return_qt = try self.returnType(p, args, func_qt); + const return_qt: QualType = if (args_ok) try self.returnType(p, args, func_qt) else .invalid; switch (self) { .standard => |func_node| return .{ .qt = return_qt, @@ -6118,7 +6147,7 @@ const CallExpr = union(enum) { } }), }, .builtin => |builtin| return .{ - .val = try evalBuiltin(builtin.expanded, p, args), + .val = if (args_ok) try evalBuiltin(builtin.expanded, p, args) else .{}, .qt = return_qt, .node = try p.addNode(.{ .builtin_call_expr = .{ .builtin_tok = builtin.builtin_tok, @@ -6283,14 +6312,12 @@ pub const Result = struct { if (!adjusted_elem_qt.eqlQualified(a_elem, p.comp)) { a.qt = try p.comp.type_store.put(gpa, .{ .pointer = .{ .child = adjusted_elem_qt, - .decayed = null, } }); try a.implicitCast(p, .bitcast, tok); } if (!adjusted_elem_qt.eqlQualified(b_elem, p.comp)) { b.qt = try p.comp.type_store.put(gpa, .{ .pointer = .{ .child = adjusted_elem_qt, - .decayed = null, } }); try b.implicitCast(p, .bitcast, tok); } @@ -6478,6 +6505,7 @@ pub const Result = struct { .add => { // if both aren't arithmetic one should be pointer and the other an integer if (a_sk.isPointer() == b_sk.isPointer() or a_sk.isInt() == b_sk.isInt()) return a.invalidBinTy(tok, b, p); + try p.boundsSafetyCheckPointerArithmetic(a.qt, b.qt, tok, a.node); if (a_sk == .void_pointer or b_sk == .void_pointer) try p.err(tok, .gnu_pointer_arith, .{}); @@ -6496,6 +6524,7 @@ pub const Result = struct { .sub => { // if both aren't arithmetic then either both should be pointers or just the left one. if (!a_sk.isPointer() or !(b_sk.isPointer() or b_sk.isInt())) return a.invalidBinTy(tok, b, p); + try p.boundsSafetyCheckPointerArithmetic(a.qt, b.qt, tok, a.node); if (a_sk == .void_pointer) try p.err(tok, .gnu_pointer_arith, .{}); @@ -7087,14 +7116,14 @@ pub const Result = struct { } else if (dest_sk.isPointer()) { if (src_sk.isPointer()) { cast_kind = .bitcast; + } else if (src_sk == .bool) { + cast_kind = .bool_to_pointer; } else if (src_sk.isInt()) { if (!src_sk.isReal()) { res.qt = res.qt.toReal(p.comp); try res.implicitCast(p, .complex_int_to_real, l_paren); } cast_kind = .int_to_pointer; - } else if (src_sk == .bool) { - cast_kind = .bool_to_pointer; } else if (res.qt.is(p.comp, .array)) { cast_kind = .array_to_pointer; } else if (res.qt.is(p.comp, .func)) { @@ -7497,7 +7526,16 @@ fn issueDeclaredConstHereNote(p: *Parser, decl_ref: Tree.Node.DeclRef, var_name: try p.err(location, .declared_const_here, .{var_name}); } -fn issueConstAssignmetDiagnostics(p: *Parser, node_idx: Node.Index, tok: TokenIndex) Compilation.Error!void { +fn issueBoundsDeclaredHereNote(p: *Parser, decl_ref: Tree.Node.DeclRef, var_name: []const u8, bounds: Type.Pointer.Bounds) Compilation.Error!void { + const location = switch (decl_ref.decl.get(&p.tree)) { + .variable => |variable| variable.name_tok, + .param => |param| param.name_tok, + else => return, + }; + try p.err(location, .pointer_bounds_declared_here, .{ var_name, @tagName(bounds) }); +} + +fn issueConstAssignmentDiagnostics(p: *Parser, node_idx: Node.Index, tok: TokenIndex) Compilation.Error!void { if (p.unwrapNestedOperation(node_idx)) |unwrapped| { const name = p.tokSlice(unwrapped.name_tok); try p.err(tok, .const_var_assignment, .{ name, unwrapped.qt }); @@ -7530,7 +7568,7 @@ fn assignExpr(p: *Parser) Error!?Result { var is_const: bool = undefined; if (!p.tree.isLvalExtra(lhs.node, &is_const) or is_const) { - try p.issueConstAssignmetDiagnostics(lhs.node, tok); + try p.issueConstAssignmentDiagnostics(lhs.node, tok); lhs.qt = .invalid; } @@ -8226,7 +8264,7 @@ fn builtinChooseExpr(p: *Parser) Error!Result { return cond; } -/// vaStart : __builtin_va_arg '(' assignExpr ',' typeName ')' +/// vaArg : __builtin_va_arg '(' assignExpr ',' typeName ')' fn builtinVaArg(p: *Parser, builtin_tok: TokenIndex) Error!Result { const l_paren = try p.expectToken(.l_paren); const va_list_tok = p.tok_i; @@ -8258,6 +8296,62 @@ fn builtinVaArg(p: *Parser, builtin_tok: TokenIndex) Error!Result { }; } +/// vaArgPack : __builtin_va_arg_pack '(' ')' +fn builtinVaArgPack(p: *Parser, builtin_tok: TokenIndex) Error!Result { + const l_paren = try p.expectToken(.l_paren); + try p.expectClosing(l_paren, .r_paren); + + var res_qt: QualType = .invalid; + if (!try p.checkVaPackFunc(builtin_tok, "__builtin_va_arg_pack")) { + // Only add one error. + } else if (!p.va_arg_pack_ctx.valid) { + try p.err(builtin_tok, .va_pack_non_call, .{}); + } else if (!p.va_arg_pack_ctx.variadic) { + try p.err(builtin_tok, .va_pack_non_variadic_call, .{}); + } else if (p.va_arg_pack_ctx.typed) { + try p.err(builtin_tok, .va_pack_non_variadic_arg, .{}); + } else { + res_qt = .void; + } + return .{ + .qt = res_qt, + .node = try p.addNode(.{ + .builtin_va_arg_pack = .{ .builtin_tok = builtin_tok }, + }), + }; +} + +/// vaArgPackLen : __builtin_va_arg_pack_len '(' ')' +fn builtinVaArgPackLen(p: *Parser, builtin_tok: TokenIndex) Error!Result { + const l_paren = try p.expectToken(.l_paren); + try p.expectClosing(l_paren, .r_paren); + + _ = try p.checkVaPackFunc(builtin_tok, "__builtin_va_arg_pack_len"); + + return .{ + .qt = .int, + .node = try p.addNode(.{ + .builtin_va_arg_pack_len = .{ + .builtin_tok = builtin_tok, + }, + }), + }; +} + +fn checkVaPackFunc(p: *Parser, builtin_tok: TokenIndex, va_func_name: []const u8) !bool { + const func_qt, _ = (try p.checkVaFunc(builtin_tok, va_func_name)) orelse return false; + + var it = Attribute.Iterator.initType(func_qt, p.comp); + while (it.next()) |item| switch (item[0].tag) { + .always_inline, .gnu_inline => break, + else => {}, + } else { + try p.err(builtin_tok, .va_func_not_always_inline, .{va_func_name}); + return false; + } + return true; +} + const OffsetKind = enum { bits, bytes }; /// offsetof @@ -8504,7 +8598,6 @@ fn unExpr(p: *Parser) Error!?Result { operand.qt = try p.comp.type_store.put(gpa, .{ .pointer = .{ .child = operand.qt, - .decayed = null, } }); } if (p.getNode(operand.node, .decl_ref_expr)) |decl_ref| { @@ -8596,6 +8689,9 @@ fn unExpr(p: *Parser) Error!?Result { try p.err(tok, .not_assignable, .{}); return error.ParsingFailed; } + if (operand.qt.get(p.comp, .pointer)) |pointer| { + try p.checkPtrArithmeticAllowed(pointer, p.tok_i, operand.node); + } try operand.usualUnaryConversion(p, tok); if (operand.val.is(.int, p.comp) or operand.val.is(.int, p.comp)) { @@ -8624,6 +8720,9 @@ fn unExpr(p: *Parser) Error!?Result { try p.err(tok, .not_assignable, .{}); return error.ParsingFailed; } + if (operand.qt.get(p.comp, .pointer)) |pointer| { + try p.checkPtrArithmeticAllowed(pointer, p.tok_i, operand.node); + } try operand.usualUnaryConversion(p, tok); if (operand.val.is(.int, p.comp) or operand.val.is(.int, p.comp)) { @@ -8826,7 +8925,7 @@ fn unExpr(p: *Parser) Error!?Result { } else switch (p.comp.langopts.emulate) { .msvc => {}, // Doesn't support `_Complex` or `__imag` in the first place .gcc => operand.val = .zero, - .clang => { + .clang, .no => { if (operand.val.is(.int, p.comp) or operand.val.is(.float, p.comp)) { operand.val = .zero; } else { @@ -8886,7 +8985,7 @@ fn compoundLiteral(p: *Parser, qt_opt: ?QualType, opt_l_paren: ?TokenIndex) Erro try p.err(tok, .invalid_compound_literal_storage_class, .{@tagName(d.storage_class)}); d.storage_class = .none; }, - .register => if (p.func.qt == null) try p.err(p.tok_i, .illegal_storage_on_global, .{}), + .register => if (p.func.qt == null) try p.err(p.tok_i, .register_on_global_compound_literal, .{}), else => {}, } @@ -8968,6 +9067,9 @@ fn suffixExpr(p: *Parser, lhs: Result) Error!?Result { try p.err(p.tok_i, .not_assignable, .{}); return error.ParsingFailed; } + if (operand.qt.get(p.comp, .pointer)) |pointer| { + try p.checkPtrArithmeticAllowed(pointer, p.tok_i, operand.node); + } try operand.usualUnaryConversion(p, p.tok_i); try operand.un(p, .post_inc_expr, p.tok_i); @@ -8989,6 +9091,9 @@ fn suffixExpr(p: *Parser, lhs: Result) Error!?Result { try p.err(p.tok_i, .not_assignable, .{}); return error.ParsingFailed; } + if (operand.qt.get(p.comp, .pointer)) |pointer| { + try p.checkPtrArithmeticAllowed(pointer, p.tok_i, operand.node); + } try operand.usualUnaryConversion(p, p.tok_i); try operand.un(p, .post_dec_expr, p.tok_i); @@ -9003,6 +9108,7 @@ fn suffixExpr(p: *Parser, lhs: Result) Error!?Result { const array_before_conversion = lhs; const index_before_conversion = index; var ptr = lhs; + try ptr.lvalConversion(p, l_bracket); try index.lvalConversion(p, l_bracket); if (ptr.qt.get(p.comp, .pointer)) |pointer_ty| { @@ -9176,14 +9282,7 @@ fn checkVaStartArg(p: *Parser, builtin_tok: TokenIndex, first_after: TokenIndex, return error.ParsingFailed; } - const func_qt = p.func.qt orelse { - try p.err(builtin_tok, .va_start_not_in_func, .{}); - return; - }; - const func_ty = func_qt.get(p.comp, .func) orelse return; - if (func_ty.kind != .variadic or func_ty.params.len == 0) { - return p.err(builtin_tok, .va_start_fixed_args, .{}); - } + _, const func_ty = (try p.checkVaFunc(builtin_tok, "va_start")) orelse return; const last_param_name = func_ty.params[func_ty.params.len - 1].name; const decl_ref = p.getNode(arg.node, .decl_ref_expr); if (decl_ref == null or last_param_name != try p.comp.internString(p.tokSlice(decl_ref.?.name_tok))) { @@ -9191,6 +9290,19 @@ fn checkVaStartArg(p: *Parser, builtin_tok: TokenIndex, first_after: TokenIndex, } } +fn checkVaFunc(p: *Parser, builtin_tok: TokenIndex, va_func_name: []const u8) !?struct { QualType, Type.Func } { + const func_qt = p.func.qt orelse { + try p.err(builtin_tok, .va_func_not_in_func, .{va_func_name}); + return null; + }; + const func_ty = func_qt.get(p.comp, .func) orelse return null; + if (func_ty.kind != .variadic or func_ty.params.len == 0) { + try p.err(builtin_tok, .va_func_fixed_args, .{va_func_name}); + return null; + } + return .{ func_qt, func_ty }; +} + fn checkArithOverflowArg(p: *Parser, builtin_tok: TokenIndex, first_after: TokenIndex, param_tok: TokenIndex, arg: *Result, idx: u32) !void { _ = builtin_tok; _ = first_after; @@ -9320,7 +9432,7 @@ fn callExpr(p: *Parser, lhs: Result) Error!Result { // We cannot refer to the function type here because the pointer to // type_store.extra might get invalidated while parsing args. - const func_qt, const params_len, const func_kind = blk: { + const func_qt, const typed_params_len, const func_kind_base = blk: { var base_qt = lhs.qt; if (base_qt.get(p.comp, .pointer)) |pointer_ty| base_qt = pointer_ty.child; if (base_qt.isInvalid()) break :blk .{ base_qt, std.math.maxInt(usize), undefined }; @@ -9343,9 +9455,44 @@ fn callExpr(p: *Parser, lhs: Result) Error!Result { const call_expr = CallExpr.init(p, lhs.node, func.node); + const param_len_override = call_expr.paramCountOverride(); + const params_len = param_len_override orelse typed_params_len; + const func_kind = if (param_len_override != null) .normal else func_kind_base; + while (p.eatToken(.r_paren) == null) { const param_tok = p.tok_i; if (arg_count == params_len) first_after = p.tok_i; + + // Check for __builtin_va_arg_pack + { + var i = p.tok_i; + loop: switch (p.tok_ids[i]) { + .l_paren => { + i += 1; + continue :loop p.tok_ids[i]; + }, + .identifier => if (mem.eql(u8, p.tokSlice(i), "__builtin_va_arg_pack")) { + @branchHint(.cold); + p.va_arg_pack_ctx = .{ + .valid = true, + .variadic = func_kind != .normal, + .typed = arg_count < typed_params_len, + }; + defer p.va_arg_pack_ctx = .{}; + + const arg = try p.expect(assignExpr); + try p.list_buf.append(gpa, arg.node); + arg_count += 1; + if (p.eatToken(.comma)) |_| { + try p.err(i, .va_pack_non_final_arg, .{}); + continue; + } + try p.expectClosing(l_paren, .r_paren); + break; + }, + else => {}, + } + } var arg = try p.expect(assignExpr); if (call_expr.shouldPerformLvalConversion(arg_count)) { @@ -9353,7 +9500,7 @@ fn callExpr(p: *Parser, lhs: Result) Error!Result { } if ((arg.qt.hasIncompleteSize(p.comp) and !arg.qt.is(p.comp, .void)) or arg.qt.isInvalid()) return error.ParsingFailed; - if (arg_count >= params_len) { + if (arg_count >= typed_params_len) { if (call_expr.shouldPromoteVarArg(arg_count)) switch (arg.qt.base(p.comp).type) { .int => |int_ty| if (int_ty == .int) try arg.castToInt(p, arg.qt.promoteInt(p.comp), param_tok), .float => |float_ty| if (float_ty == .double) try arg.castToFloat(p, .double, param_tok), @@ -9407,19 +9554,23 @@ fn callExpr(p: *Parser, lhs: Result) Error!Result { } if (func_qt.isInvalid()) { // Skip argument count checks. - return try call_expr.finish(p, func_qt, list_buf_top, l_paren); + return try call_expr.finish(p, func_qt, list_buf_top, l_paren, false); } - if (call_expr.paramCountOverride()) |expected| { - if (expected != arg_count) { - try p.err(first_after, .expected_arguments, .{ expected, arg_count }); - } - } else switch (func_kind) { + const r_paren = p.tok_i - 1; + var args_ok = true; + switch (func_kind) { .normal => if (params_len != arg_count) { - try p.err(first_after, .expected_arguments, .{ params_len, arg_count }); + try p.err( + if (arg_count < params_len) r_paren else first_after, + .expected_arguments, + .{ params_len, arg_count }, + ); + args_ok = false; }, .variadic => if (arg_count < params_len) { - try p.err(first_after, .expected_at_least_arguments, .{ params_len, arg_count }); + try p.err(r_paren, .expected_at_least_arguments, .{ params_len, arg_count }); + args_ok = false; }, .old_style => if (params_len != arg_count) { if (params_len == 0) @@ -9429,10 +9580,60 @@ fn callExpr(p: *Parser, lhs: Result) Error!Result { }, } - return try call_expr.finish(p, func_qt, list_buf_top, l_paren); + return try call_expr.finish(p, func_qt, list_buf_top, l_paren, args_ok); +} + +fn boundsSafetyCheckArrayAccess(p: *Parser, lhs: Result, rhs: Result, l_bracket: TokenIndex) !void { + if (!p.comp.hasClangStyleBoundsSafety()) return; + + const ptr_res, const pointer, const index = if (lhs.qt.get(p.comp, .pointer)) |pointer| .{ lhs, pointer, rhs } else .{ rhs, rhs.qt.get(p.comp, .pointer).?, lhs }; + + switch (pointer.bounds) { + .c, .unsafe_indexable => {}, + .single => { + if (!index.val.isZero(p.comp)) { + try p.err(l_bracket, .single_requires_zero_index, .{}); + if (p.unwrapNestedOperation(ptr_res.node)) |unwrapped| { + const name = p.tokSlice(unwrapped.name_tok); + try p.issueBoundsDeclaredHereNote(unwrapped, name, pointer.bounds); + } + } + }, + } +} + +fn boundsSafetyCheckPointerArithmetic(p: *Parser, lhs: QualType, rhs: QualType, tok: TokenIndex, node: Tree.Node.Index) !void { + if (!p.comp.hasClangStyleBoundsSafety()) return; + + const pointer = if (rhs.isInt(p.comp)) + lhs.get(p.comp, .pointer) orelse return + else if (lhs.isInt(p.comp)) + rhs.get(p.comp, .pointer) orelse return + else + return; + + try p.checkPtrArithmeticAllowed(pointer, tok, node); +} + +fn checkPtrArithmeticAllowed(p: *Parser, pointer: Type.Pointer, tok: TokenIndex, node: Tree.Node.Index) !void { + if (!p.comp.hasClangStyleBoundsSafety()) return; + + switch (pointer.bounds) { + .c, .unsafe_indexable => {}, + .single => { + // clang issues this diagnostic even with a constant `0` operand + try p.err(tok, .pointer_arith_single, .{}); + if (p.unwrapNestedOperation(node)) |unwrapped| { + const name = p.tokSlice(unwrapped.name_tok); + try p.issueBoundsDeclaredHereNote(unwrapped, name, pointer.bounds); + } + }, + } } fn checkArrayBounds(p: *Parser, index: Result, array: Result, tok: TokenIndex) !void { + try p.boundsSafetyCheckArrayAccess(array, index, tok); + if (index.val.opt_ref == .none) return; const array_len = array.qt.arrayLen(p.comp) orelse return; @@ -9579,6 +9780,8 @@ fn primaryExpr(p: *Parser) Error!?Result { .common => |tag| switch (tag) { .__builtin_choose_expr => return try p.builtinChooseExpr(), .__builtin_va_arg => return try p.builtinVaArg(name_tok), + .__builtin_va_arg_pack => return try p.builtinVaArgPack(name_tok), + .__builtin_va_arg_pack_len => return try p.builtinVaArgPackLen(name_tok), .__builtin_offsetof => return try p.builtinOffsetof(name_tok, .bytes), .__builtin_bitoffsetof => return try p.builtinOffsetof(name_tok, .bits), .__builtin_types_compatible_p => return try p.typesCompatible(name_tok), @@ -9720,7 +9923,7 @@ fn primaryExpr(p: *Parser) Error!?Result { qt = some.qt; } else if (p.func.qt) |func_qt| { var sf = std.heap.stackFallback(1024, gpa); - var allocating: Io.Writer.Allocating = .init(sf.get()); + var allocating: std.Io.Writer.Allocating = .init(sf.get()); defer allocating.deinit(); func_qt.printNamed(p.tokSlice(p.func.name), p.comp, &allocating.writer) catch return error.OutOfMemory; @@ -10277,16 +10480,13 @@ fn fixedSizeInt(p: *Parser, base: u8, buf: []const u8, suffix: NumberSuffix, tok if (res.qt.intRankOrder(suffix_qt, p.comp).compare(.lt)) continue; const max_int = try Value.maxInt(res.qt, p.comp); if (interned_val.compare(.lte, max_int, p.comp)) break; - } else { - if (p.comp.langopts.emulate == .gcc) { - if (p.comp.target.hasInt128()) { - res.qt = .int128; - } else { - res.qt = .long_long; - } + } else switch (p.comp.langopts.emulate) { + .no, .gcc => if (p.comp.target.hasInt128()) { + res.qt = .int128; } else { - res.qt = .ulong_long; - } + res.qt = .long_long; + }, + .msvc, .clang => res.qt = .ulong_long, } res.node = try p.addNode(.{ .int_literal = .{ .qt = res.qt, .literal_tok = tok_i } }); @@ -10604,12 +10804,7 @@ fn genericSelection(p: *Parser) Error!?Result { } test "Node locations" { - var arena_state: std.heap.ArenaAllocator = .init(std.testing.allocator); - defer arena_state.deinit(); - const arena = arena_state.allocator(); - - var diagnostics: Diagnostics = .{ .output = .ignore }; - var comp = Compilation.init(std.testing.allocator, arena, std.testing.io, &diagnostics, Io.Dir.cwd()); + var comp = try Compilation.init(.testing); defer comp.deinit(); const file = try comp.addSourceFromBuffer("file.c", @@ -10621,7 +10816,7 @@ test "Node locations" { const builtin_macros = try comp.generateBuiltinMacros(.no_system_defines); - var pp = Preprocessor.init(&comp, .default); + var pp = try Preprocessor.init(&comp, .testing); defer pp.deinit(); try pp.addBuiltinMacros(); @@ -10633,7 +10828,6 @@ test "Node locations" { var tree = try Parser.parse(&pp); defer tree.deinit(); - try std.testing.expectEqual(0, comp.diagnostics.total); for (tree.root_decls.items[tree.root_decls.items.len - 3 ..], 0..) |node, i| { const slice = tree.tokSlice(node.tok(&tree)); const expected_slice = switch (i) { diff --git a/lib/compiler/aro/aro/Parser/Diagnostic.zig b/lib/compiler/aro/aro/Parser/Diagnostic.zig @@ -79,9 +79,9 @@ pub const expected_integer_constant_expr: Diagnostic = .{ }; pub const missing_type_specifier: Diagnostic = .{ - .fmt = "type specifier missing, defaults to 'int'", + .fmt = "type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int", .opt = .@"implicit-int", - .kind = .warning, + .kind = .@"error", }; pub const missing_type_specifier_c23: Diagnostic = .{ @@ -90,9 +90,9 @@ pub const missing_type_specifier_c23: Diagnostic = .{ }; pub const param_not_declared: Diagnostic = .{ - .fmt = "parameter '{s}' was not declared, defaults to 'int'", + .fmt = "parameter '{s}' was not declared, defaults to 'int'; ISO C99 and later do not support implicit int", .opt = .@"implicit-int", - .kind = .warning, + .kind = .@"error", .extension = true, }; @@ -216,8 +216,13 @@ pub const illegal_storage_on_func: Diagnostic = .{ .kind = .@"error", }; -pub const illegal_storage_on_global: Diagnostic = .{ - .fmt = "illegal storage class on global variable", +pub const auto_on_global: Diagnostic = .{ + .fmt = "'auto' specified on global variable", + .kind = .@"error", +}; + +pub const register_on_global: Diagnostic = .{ + .fmt = "register name not specified for global variable", .kind = .@"error", }; @@ -1507,13 +1512,38 @@ pub const builtin_must_be_called: Diagnostic = .{ .kind = .@"error", }; -pub const va_start_not_in_func: Diagnostic = .{ - .fmt = "'va_start' cannot be used outside a function", +pub const va_func_not_in_func: Diagnostic = .{ + .fmt = "'{s}' cannot be used outside a function", + .kind = .@"error", +}; + +pub const va_func_fixed_args: Diagnostic = .{ + .fmt = "'{s}' used in a function with fixed args", + .kind = .@"error", +}; + +pub const va_func_not_always_inline: Diagnostic = .{ + .fmt = "'{s}' used in a function that is not always inlined", + .kind = .@"error", +}; + +pub const va_pack_non_call: Diagnostic = .{ + .fmt = "'__va_arg_pack' used outside a call", + .kind = .@"error", +}; + +pub const va_pack_non_variadic_call: Diagnostic = .{ + .fmt = "'__va_arg_pack' passed to non-variadic function", + .kind = .@"error", +}; + +pub const va_pack_non_variadic_arg: Diagnostic = .{ + .fmt = "'__va_arg_pack' passed as non-variadic argument", .kind = .@"error", }; -pub const va_start_fixed_args: Diagnostic = .{ - .fmt = "'va_start' used in a function with fixed args", +pub const va_pack_non_final_arg: Diagnostic = .{ + .fmt = "'__va_arg_pack' is not the final argument", .kind = .@"error", }; @@ -2258,11 +2288,11 @@ pub const unterminated_char_literal_error: Diagnostic = .{ .kind = .@"error", }; -// pub const def_no_proto_deprecated: Diagnostic = .{ -// .fmt = "a function definition without a prototype is deprecated in all versions of C and is not supported in C23", -// .kind = .warning, -// .opt = .@"deprecated-non-prototype", -// }; +pub const def_no_proto_deprecated: Diagnostic = .{ + .fmt = "a function definition without a prototype is deprecated in all versions of C and is not supported in C23", + .kind = .warning, + .opt = .@"deprecated-non-prototype", +}; pub const passing_args_to_kr: Diagnostic = .{ .fmt = "passing arguments to a function without a prototype is deprecated in all versions of C and is not supported in C23", @@ -2296,6 +2326,11 @@ pub const invalid_compound_literal_storage_class: Diagnostic = .{ .kind = .@"error", }; +pub const register_on_global_compound_literal: Diagnostic = .{ + .fmt = "file scope compound literal specifies 'register'", + .kind = .@"error", +}; + pub const identifier_not_normalized: Diagnostic = .{ .fmt = "'{normalized}' is not in NFC", .kind = .warning, @@ -2465,10 +2500,9 @@ pub const declared_const_here: Diagnostic = .{ .kind = .note, }; -pub const nonnull_not_applicable: Diagnostic = .{ - .fmt = "'nonnull' attribute only applies to functions, methods, and parameters", - .kind = .warning, - .opt = .@"ignored-attributes", +pub const pointer_bounds_declared_here: Diagnostic = .{ + .fmt = "pointer '{s}' declared {s} here", + .kind = .note, }; pub const mixing_decimal_floats: Diagnostic = .{ @@ -2480,3 +2514,29 @@ pub const invalid_attribute_location: Diagnostic = .{ .fmt = "{s} cannot appear here", .kind = .@"error", }; + +pub const attribute_requires_pointer: Diagnostic = .{ + .fmt = "'{s}' attribute only applies to pointer arguments", + .kind = .@"error", +}; + +pub const single_requires_zero_index: Diagnostic = .{ + .fmt = "array subscript on single pointer must use a constant index of 0 to be in bounds", + .kind = .@"error", +}; + +pub const pointer_arith_single: Diagnostic = .{ + .fmt = "pointer arithmetic on single pointer is out of bounds; consider adding '__counted_by'", + .kind = .@"error", +}; + +pub const redundant_bounds_annotation: Diagnostic = .{ + .fmt = "pointer annotated with {s} multiple times. Annotate only once to remove this warning", + .kind = .warning, + .opt = .@"bounds-attributes-redundant", +}; + +pub const multiple_bounds_annotations: Diagnostic = .{ + .fmt = "pointer cannot have more than one bound attribute", + .kind = .@"error", +}; diff --git a/lib/compiler/aro/aro/Preprocessor.zig b/lib/compiler/aro/aro/Preprocessor.zig @@ -1,6 +1,6 @@ const std = @import("std"); -const Io = std.Io; const mem = std.mem; +const path = std.Io.Dir.path; const Allocator = mem.Allocator; const assert = std.debug.assert; @@ -79,12 +79,15 @@ pub const Macro = struct { }); const Object = enum { + base_file, file, + file_basename, line, counter, date, time, timestamp, + include_level, }; const Func = enum { @@ -216,8 +219,6 @@ pub const Macro = struct { } }; -const Preprocessor = @This(); - const ExpansionEntry = struct { idx: Tree.TokenIndex, locs: [*]Source.Location, @@ -228,6 +229,8 @@ const TokenState = struct { expansion_entries_len: usize, }; +const Preprocessor = @This(); + comp: *Compilation, diagnostics: *Diagnostics, @@ -275,6 +278,12 @@ m_times: std.AutoHashMapUnmanaged(Source.Id, u64) = .empty, /// The dependency file tracking all includes and embeds. dep_file: ?*DepFile = null, +/// Path prefixes to replace when expanding __FILE__ +path_replacements: []const struct { []const u8, []const u8 } = &.{}, + +/// File used for __BASE_FILE__ macro. +base_file: Source.Id, + pub const parse = Parser.parse; pub const Linemarkers = enum { @@ -286,21 +295,22 @@ pub const Linemarkers = enum { numeric_directives, }; -pub fn init(comp: *Compilation, source_epoch: SourceEpoch) Preprocessor { - const pp: Preprocessor = .{ - .comp = comp, - .diagnostics = comp.diagnostics, - .arena = .init(comp.gpa), - .hideset = .{ .comp = comp }, - .source_epoch = source_epoch, +pub const InitOptions = struct { + base_file: Source.Id, + + source_epoch: ?SourceEpoch = null, + add_builtin_macros: bool = true, + path_replacements: []const struct { []const u8, []const u8 } = &.{}, + + pub const testing: InitOptions = .{ + .base_file = undefined, + .source_epoch = .default, + .add_builtin_macros = false, }; - comp.pragmaEvent(.before_preprocess); - return pp; -} +}; -/// Initialize Preprocessor with builtin macros. -pub fn initDefault(comp: *Compilation) !Preprocessor { - const source_epoch: SourceEpoch = comp.environment.sourceEpoch(comp.io) catch |er| switch (er) { +pub fn init(comp: *Compilation, options: InitOptions) !Preprocessor { + const source_epoch: SourceEpoch = options.source_epoch orelse comp.environment.sourceEpoch(comp.io) catch |er| switch (er) { error.InvalidEpoch => blk: { const diagnostic: Diagnostic = .invalid_source_epoch; try comp.diagnostics.add(.{ .text = diagnostic.fmt, .kind = diagnostic.kind, .opt = diagnostic.opt, .location = null }); @@ -308,9 +318,18 @@ pub fn initDefault(comp: *Compilation) !Preprocessor { }, }; - var pp = init(comp, source_epoch); + var pp: Preprocessor = .{ + .comp = comp, + .diagnostics = comp.diagnostics, + .arena = .init(comp.gpa), + .hideset = .{ .comp = comp }, + .source_epoch = source_epoch, + .base_file = options.base_file, + .path_replacements = options.path_replacements, + }; errdefer pp.deinit(); - try pp.addBuiltinMacros(); + comp.pragmaEvent(.before_preprocess); + if (options.add_builtin_macros) try pp.addBuiltinMacros(); return pp; } @@ -339,7 +358,7 @@ pub fn addBuiltinMacros(pp: *Preprocessor) !void { try pp.addBuiltinMacro("__is_identifier", .{ .func = .is_identifier }); try pp.addBuiltinMacro("_Pragma", .{ .func = .pragma_operator }); - if (pp.comp.langopts.emulate == .clang) { + if (pp.comp.langopts.emulate == .no or pp.comp.langopts.emulate == .clang) { try pp.addBuiltinMacro("__is_target_arch", .{ .func = .is_target_arch }); try pp.addBuiltinMacro("__is_target_vendor", .{ .func = .is_target_vendor }); try pp.addBuiltinMacro("__is_target_os", .{ .func = .is_target_os }); @@ -359,6 +378,12 @@ pub fn addBuiltinMacros(pp: *Preprocessor) !void { try pp.addBuiltinMacro("__DATE__", .{ .obj = .date }); try pp.addBuiltinMacro("__TIME__", .{ .obj = .time }); try pp.addBuiltinMacro("__TIMESTAMP__", .{ .obj = .timestamp }); + + if (pp.comp.langopts.emulate == .no or pp.comp.langopts.emulate == .clang) { + try pp.addBuiltinMacro("__BASE_FILE__", .{ .obj = .base_file }); + try pp.addBuiltinMacro("__FILE_NAME__", .{ .obj = .file_basename }); + try pp.addBuiltinMacro("__INCLUDE_LEVEL__", .{ .obj = .include_level }); + } } pub fn deinit(pp: *Preprocessor) void { @@ -395,7 +420,7 @@ fn mTime(pp: *Preprocessor, source_id: Source.Id) !u64 { return gop.value_ptr.*; } -pub fn expansionSlice(pp: *Preprocessor, tok: Tree.TokenIndex) []Source.Location { +pub fn expansionSlice(pp: *const Preprocessor, tok: Tree.TokenIndex) []Source.Location { const S = struct { fn orderTokenIndex(context: Tree.TokenIndex, item: Tree.TokenIndex) std.math.Order { return std.math.order(context, item); @@ -1065,13 +1090,11 @@ fn fatalNotFound(pp: *Preprocessor, tok: TokenWithExpansionLocs, filename: []con fn verboseLog(pp: *Preprocessor, raw: RawToken, comptime fmt: []const u8, args: anytype) void { @branchHint(.cold); - const comp = pp.comp; - const io = comp.io; - const source = comp.getSource(raw.source); + const source = pp.comp.getSource(raw.source); const line_col = source.lineCol(.{ .id = raw.source, .line = raw.line, .byte_offset = raw.start }); var stderr_buf: [4096]u8 = undefined; - var stderr = Io.File.stderr().writer(io, &stderr_buf); + var stderr = std.Io.File.stderr().writer(pp.comp.io, &stderr_buf); const w = &stderr.interface; w.print("{s}:{d}:{d}: ", .{ source.path, line_col.line_no, line_col.col }) catch return; @@ -1435,7 +1458,37 @@ fn expandObjMacro(pp: *Preprocessor, simple_macro: *const Macro) Error!ExpandBuf .file => { const start = pp.comp.generated_buf.items.len; const source = pp.comp.getSource(pp.expansion_source_loc.id); - try pp.comp.generated_buf.print(gpa, "\"{f}\"\n", .{fmtEscapes(source.path)}); + for (pp.path_replacements) |replacement| { + if (mem.cutPrefix(u8, source.path, replacement[0])) |rest| { + try pp.comp.generated_buf.print(gpa, "\"{f}{f}\"", .{ fmtEscapes(replacement[1]), fmtEscapes(rest) }); + break; + } + } else { + try pp.comp.generated_buf.print(gpa, "\"{f}\"\n", .{fmtEscapes(source.path)}); + } + + buf.appendAssumeCapacity(try pp.makeGeneratedToken(start, .string_literal, tok)); + }, + .base_file => { + try pp.err(pp.expansion_source_loc, .base_file_is_clang_extension, .{}); + const start = pp.comp.generated_buf.items.len; + const base_file = pp.comp.getSource(pp.base_file); + for (pp.path_replacements) |replacement| { + if (mem.cutPrefix(u8, base_file.path, replacement[0])) |rest| { + try pp.comp.generated_buf.print(gpa, "\"{f}{f}\"", .{ fmtEscapes(replacement[1]), fmtEscapes(rest) }); + } + } else { + try pp.comp.generated_buf.print(gpa, "\"{f}\"", .{fmtEscapes(base_file.path)}); + } + + buf.appendAssumeCapacity(try pp.makeGeneratedToken(start, .string_literal, tok)); + }, + .file_basename => { + try pp.err(pp.expansion_source_loc, .file_name_is_clang_extension, .{}); + const start = pp.comp.generated_buf.items.len; + const source = pp.comp.getSource(pp.expansion_source_loc.id); + const basename = path.basename(source.path); + try pp.comp.generated_buf.print(gpa, "\"{f}\"", .{fmtEscapes(basename)}); buf.appendAssumeCapacity(try pp.makeGeneratedToken(start, .string_literal, tok)); }, @@ -1472,6 +1525,13 @@ fn expandObjMacro(pp: *Preprocessor, simple_macro: *const Macro) Error!ExpandBuf try pp.writeDateTimeStamp(.fromBuiltin(builtin_kind), timestamp); buf.appendAssumeCapacity(try pp.makeGeneratedToken(start, .string_literal, tok)); }, + .include_level => { + try pp.err(pp.expansion_source_loc, .include_level_is_clang_extension, .{}); + const start = pp.comp.generated_buf.items.len; + try pp.comp.generated_buf.print(gpa, "{d}\n", .{pp.include_depth}); + + buf.appendAssumeCapacity(try pp.makeGeneratedToken(start, .pp_num, tok)); + }, }, else => buf.appendAssumeCapacity(tok), } @@ -1828,7 +1888,11 @@ fn handleBuiltinMacro(pp: *Preprocessor, builtin: Macro.Builtin.Func, param_toks features.hasFeature(pp.comp, ident_str) else features.hasExtension(pp.comp, ident_str), - .has_builtin => Builtins.fromName(pp.comp, ident_str) != null or (pp.comp.langopts.emulate == .clang and Macro.Builtin.has_builtin_special_cases.has(ident_str)), + + .has_builtin => Builtins.fromName(pp.comp, ident_str) != null or + ((pp.comp.langopts.emulate == .no or pp.comp.langopts.emulate == .clang) and + Macro.Builtin.has_builtin_special_cases.has(ident_str)), + .is_target_arch => pp.comp.isTargetArch(ident_str), .is_target_os => pp.comp.isTargetOs(ident_str), .is_target_vendor => pp.comp.isTargetVendor(ident_str), @@ -1972,7 +2036,7 @@ fn expandFuncMacro( }, .macro_param_no_expand => { if (tok_i + 1 < func_macro.tokens.len and func_macro.tokens[tok_i + 1].id == .hash_hash) { - hideset = pp.hideset.get(tokFromRaw(func_macro.tokens[tok_i + 1]).loc); + hideset = .none; } const slice = getPasteArgs(args.items[raw.end]); const raw_loc = Source.Location{ .id = raw.source, .byte_offset = raw.start, .line = raw.line }; @@ -1980,7 +2044,7 @@ fn expandFuncMacro( }, .macro_param => { if (tok_i + 1 < func_macro.tokens.len and func_macro.tokens[tok_i + 1].id == .hash_hash) { - hideset = pp.hideset.get(tokFromRaw(func_macro.tokens[tok_i + 1]).loc); + hideset = .none; } const arg = expanded_args.items[raw.end]; const raw_loc = Source.Location{ .id = raw.source, .byte_offset = raw.start, .line = raw.line }; @@ -2330,9 +2394,10 @@ fn expandFuncMacro( for (buf.items) |*tok| { try tok.addExpansionLocation(gpa, &.{macro_tok.loc}); try tok.addExpansionLocation(gpa, macro_expansion_locs); - const tok_hidelist = pp.hideset.get(tok.loc); - const new_hidelist = try pp.hideset.@"union"(tok_hidelist, hideset); - try pp.hideset.put(tok.loc, new_hidelist); + if (tok.id.shouldTrackHideset(.func)) { + const new_hideset = try pp.hideset.@"union"(pp.hideset.get(tok.loc), hideset); + try pp.hideset.put(tok.loc, new_hideset); + } } return buf; @@ -2698,9 +2763,10 @@ fn expandMacroExhaustive( try tok.addExpansionLocation(gpa, &.{macro_tok.loc}); try tok.addExpansionLocation(gpa, macro_expansion_locs); - const tok_hidelist = pp.hideset.get(tok.loc); - const new_hidelist = try pp.hideset.@"union"(tok_hidelist, hs); - try pp.hideset.put(tok.loc, new_hidelist); + if (tok.id.shouldTrackHideset(.obj)) { + const new_hideset = try pp.hideset.@"union"(pp.hideset.get(tok.loc), hs); + try pp.hideset.put(tok.loc, new_hideset); + } if (tok.id == .keyword_defined and eval_ctx == .expr) { if (macro.is_func) { @@ -2914,7 +2980,10 @@ fn pasteTokens(pp: *Preprocessor, lhs_toks: *ExpandBuf, rhs_toks: []const TokenW .placemarker else pasted_token.id; - try lhs_toks.append(gpa, try pp.makeGeneratedToken(start, pasted_id, lhs)); + + const hideset = try pp.hideset.intersection(pp.hideset.get(lhs.loc), pp.hideset.get(rhs.loc)); + const generated_token = try pp.makeGeneratedTokenExtra(start, pasted_id, lhs, hideset); + try lhs_toks.append(gpa, generated_token); if (next.id != .nl and next.id != .eof) { try pp.err(lhs, .pasting_formed_invalid, .{pp.comp.generated_buf.items[start..end]}); @@ -2924,7 +2993,7 @@ fn pasteTokens(pp: *Preprocessor, lhs_toks: *ExpandBuf, rhs_toks: []const TokenW try bufCopyTokens(gpa, lhs_toks, rhs_toks[rhs_rest..], &.{}); } -fn makeGeneratedToken(pp: *Preprocessor, start: usize, id: Token.Id, source: TokenWithExpansionLocs) !TokenWithExpansionLocs { +fn makeGeneratedTokenExtra(pp: *Preprocessor, start: usize, id: Token.Id, source: TokenWithExpansionLocs, hideset: Hideset.Index) !TokenWithExpansionLocs { const gpa = pp.comp.gpa; var pasted_token = TokenWithExpansionLocs{ .id = id, .loc = .{ .id = .generated, @@ -2934,9 +3003,15 @@ fn makeGeneratedToken(pp: *Preprocessor, start: usize, id: Token.Id, source: Tok pp.generated_line += 1; try pasted_token.addExpansionLocation(gpa, &.{source.loc}); try pasted_token.addExpansionLocation(gpa, source.expansionSlice()); + try pp.hideset.put(pasted_token.loc, hideset); + return pasted_token; } +fn makeGeneratedToken(pp: *Preprocessor, start: usize, id: Token.Id, source: TokenWithExpansionLocs) !TokenWithExpansionLocs { + return pp.makeGeneratedTokenExtra(start, id, source, pp.hideset.get(source.loc)); +} + /// Defines a new macro and warns if it is a duplicate fn defineMacro(pp: *Preprocessor, define_tok: RawToken, name_tok: TokenWithExpansionLocs, macro: Macro) Error!void { const name_str = pp.expandedSlice(name_tok); @@ -3898,16 +3973,14 @@ test "Preserve pragma tokens sometimes" { const gpa = std.testing.allocator; const Test = struct { fn runPreprocessor(source_text: []const u8) ![]const u8 { - var arena: std.heap.ArenaAllocator = .init(gpa); - defer arena.deinit(); - var diagnostics: Diagnostics = .{ .output = .ignore }; - var comp = Compilation.init(gpa, arena.allocator(), std.testing.io, &diagnostics, Io.Dir.cwd()); + var comp = try Compilation.init(.testing); + comp.diagnostics = &diagnostics; defer comp.deinit(); try comp.addDefaultPragmaHandlers(); - var pp = Preprocessor.init(&comp, .default); + var pp = try Preprocessor.init(&comp, .testing); defer pp.deinit(); pp.preserve_whitespace = true; @@ -3966,12 +4039,10 @@ test "destringify" { try std.testing.expectEqualStrings(destringified, pp.char_buf.items); } }; - var arena: std.heap.ArenaAllocator = .init(gpa); - defer arena.deinit(); - var diagnostics: Diagnostics = .{ .output = .ignore }; - var comp = Compilation.init(gpa, arena.allocator(), std.testing.io, &diagnostics, Io.Dir.cwd()); + var comp = try Compilation.init(.testing); defer comp.deinit(); - var pp = Preprocessor.init(&comp, .default); + + var pp = try Preprocessor.init(&comp, .testing); defer pp.deinit(); try Test.testDestringify(&pp, "hello\tworld\n", "hello\tworld\n"); @@ -4026,20 +4097,20 @@ test "Include guards" { }; } - fn testIncludeGuard(gpa: std.mem.Allocator, comptime template: []const u8, tok_id: RawToken.Id, expected_guards: u32) !void { - var arena_state: std.heap.ArenaAllocator = .init(gpa); - defer arena_state.deinit(); - const arena = arena_state.allocator(); + fn testIncludeGuard(comptime template: []const u8, tok_id: RawToken.Id, expected_guards: u32) !void { + const gpa = std.testing.allocator; var diagnostics: Diagnostics = .{ .output = .ignore }; - var comp = Compilation.init(gpa, arena, std.testing.io, &diagnostics, Io.Dir.cwd()); + var comp = try Compilation.init(.testing); + comp.diagnostics = &diagnostics; defer comp.deinit(); - var pp = Preprocessor.init(&comp, .default); + var pp = try Preprocessor.init(&comp, .testing); defer pp.deinit(); - const path = try std.fs.path.join(arena, &.{ ".", "bar.h" }); + const file_path = try path.join(gpa, &.{ ".", "bar.h" }); + defer gpa.free(file_path); - _ = try comp.addSourceFromBuffer(path, "int bar = 5;\n"); + _ = try comp.addSourceFromBuffer(file_path, "int bar = 5;\n"); var buf: std.ArrayList(u8) = .empty; defer buf.deinit(gpa); @@ -4074,14 +4145,14 @@ test "Include guards" { \\#endif ; const expected_guards: u32 = if (Test.pairsWithIfndef(tag)) 0 else 1; - try Test.testIncludeGuard(std.testing.allocator, inside_ifndef_template, tag, expected_guards); + try Test.testIncludeGuard(inside_ifndef_template, tag, expected_guards); const outside_ifndef_template = \\#ifndef FOO \\#endif \\#{s}{s} ; - try Test.testIncludeGuard(std.testing.allocator, outside_ifndef_template, tag, 0); + try Test.testIncludeGuard(outside_ifndef_template, tag, 0); } } } diff --git a/lib/compiler/aro/aro/Preprocessor/Diagnostic.zig b/lib/compiler/aro/aro/Preprocessor/Diagnostic.zig @@ -472,3 +472,24 @@ pub const pragma_once_in_main_file: Diagnostic = .{ .kind = .warning, .opt = .@"pragma-once-outside-header", }; + +pub const file_name_is_clang_extension: Diagnostic = .{ + .fmt = "__FILE_NAME__ is a clang extension", + .opt = .@"file-name-extension", + .kind = .off, + .extension = true, +}; + +pub const base_file_is_clang_extension: Diagnostic = .{ + .fmt = "__BASE_FILE__ is a clang extension", + .opt = .@"base-file-extension", + .kind = .off, + .extension = true, +}; + +pub const include_level_is_clang_extension: Diagnostic = .{ + .fmt = "__INCLUDE_LEVEL__ is a clang extension", + .opt = .@"include-level-extension", + .kind = .off, + .extension = true, +}; diff --git a/lib/compiler/aro/aro/Target.zig b/lib/compiler/aro/aro/Target.zig @@ -229,7 +229,7 @@ pub fn intMaxType(target: *const Target) QualType { => return .long, .x86_64 => switch (target.os.tag) { - .windows, .openbsd => {}, + .windows, .openbsd, .uefi => {}, else => switch (target.abi) { .gnux32, .muslx32 => {}, else => return .long, @@ -546,18 +546,10 @@ pub fn systemCompiler(target: *const Target) LangOpts.Compiler { } pub fn hasFloat128(target: *const Target) bool { - if (target.cpu.arch.isWasm()) return true; if (target.os.tag.isDarwin()) return false; - if (target.cpu.arch.isPowerPC()) return std.Target.powerpc.featureSetHas(target.cpu.features, .float128); - return switch (target.os.tag) { - .dragonfly, - .haiku, - .linux, - .openbsd, - .illumos, - => target.cpu.arch.isX86(), - else => false, - }; + if (target.os.tag == .windows) return false; + if (target.cpu.arch.isX86()) return true; + return target.cTypeBitSize(.longdouble) == 128; } pub fn hasInt128(target: *const Target) bool { @@ -1238,6 +1230,7 @@ pub fn toLLVMTriple(target: *const Target, buf: []u8) []const u8 { .other, .plan9, .vita, + .psp, => "unknown", }; writer.writeAll(llvm_os) catch unreachable; @@ -1356,6 +1349,18 @@ pub fn isPIEDefault(target: *const Target) DefaultPIStatus { }; } +pub fn ppcElfVersion(target: *const Target) u32 { + std.debug.assert(target.cpu.arch.isPowerPC()); + return switch (target.cpu.arch) { + .powerpc64le => 2, + .powerpc64 => if ((target.os.isAtLeast(.freebsd, .{ .major = 13, .minor = 0, .patch = 0 }) orelse false) or target.os.tag == .openbsd or target.abi.isMusl()) + 2 + else + 1, + else => 1, + }; +} + pub fn isPICdefault(target: *const Target) DefaultPIStatus { return switch (target.os.tag) { .haiku, diff --git a/lib/compiler/aro/aro/Tokenizer.zig b/lib/compiler/aro/aro/Tokenizer.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const Io = std.Io; const assert = std.debug.assert; const Compilation = @import("Compilation.zig"); @@ -891,6 +890,14 @@ pub const Token = struct { else => false, }; } + + pub fn shouldTrackHideset(id: Id, context: enum { func, obj }) bool { + return switch (id) { + .identifier, .extended_identifier => true, + .r_paren => context == .func, + else => false, + }; + } }; /// double underscore and underscore + capital letter identifiers @@ -938,6 +945,18 @@ pub const Token = struct { .keyword_unaligned, .keyword_unaligned2, => if (langopts.ms_extensions) kw else .identifier, + + .keyword_float32, + .keyword_float64, + .keyword_float128, + .keyword_float32x, + .keyword_float64x, + .keyword_float128x, + .keyword_dfloat32, + .keyword_dfloat64, + .keyword_dfloat128, + .keyword_dfloat64x, + => if (langopts.emulate == .clang) .identifier else kw, else => kw, }; } @@ -2008,11 +2027,11 @@ test "operators" { test "keywords" { try expectTokens( \\auto __auto_type break case char const continue default do - \\double else enum extern float for goto if int - \\long register return short signed sizeof static - \\struct switch typedef union unsigned void volatile - \\while _Bool _Complex _Imaginary inline restrict _Alignas - \\_Alignof _Atomic _Generic _Noreturn _Static_assert _Thread_local + \\double else enum extern float for goto if int + \\long register return short signed sizeof static + \\struct switch typedef union unsigned void volatile + \\while _Bool _Complex _Imaginary inline restrict _Alignas + \\_Alignof _Atomic _Generic _Noreturn _Static_assert _Thread_local \\__attribute __attribute__ \\ , &.{ @@ -2324,13 +2343,13 @@ test "Universal character names" { test "Tokenizer fuzz test" { const Context = struct { - fn testOne(_: @This(), input_bytes: []const u8) anyerror!void { - var arena: std.heap.ArenaAllocator = .init(std.testing.allocator); - defer arena.deinit(); - var comp = Compilation.init(std.testing.allocator, arena.allocator(), std.testing.io, undefined, Io.Dir.cwd()); + fn testOne(_: @This(), smith: *std.testing.Smith) anyerror!void { + var comp = try Compilation.init(.testing); defer comp.deinit(); - const source = try comp.addSourceFromBuffer("fuzz.c", input_bytes); + var buf: [256]u8 = undefined; + const contents_len = smith.slice(&buf); + const source = try comp.addSourceFromBuffer("fuzz.c", buf[0..contents_len]); var tokenizer: Tokenizer = .{ .buf = source.buf, @@ -2350,9 +2369,7 @@ test "Tokenizer fuzz test" { } fn expectTokensExtra(contents: []const u8, expected_tokens: []const Token.Id, langopts: ?LangOpts) !void { - var arena: std.heap.ArenaAllocator = .init(std.testing.allocator); - defer arena.deinit(); - var comp = Compilation.init(std.testing.allocator, arena.allocator(), std.testing.io, undefined, Io.Dir.cwd()); + var comp = try Compilation.init(.testing); defer comp.deinit(); if (langopts) |provided| { comp.langopts = provided; diff --git a/lib/compiler/aro/aro/Toolchain.zig b/lib/compiler/aro/aro/Toolchain.zig @@ -495,9 +495,9 @@ pub fn addSystemIncludeDir(tc: *const Toolchain, path: []const u8) !void { pub fn addBuiltinIncludeDir(tc: *const Toolchain) !void { const d = tc.driver; const comp = d.comp; + const io = comp.io; const gpa = comp.gpa; const arena = comp.arena; - const io = comp.io; try d.includes.ensureUnusedCapacity(gpa, 1); if (d.resource_dir) |resource_dir| { const path = try std.fs.path.join(arena, &.{ resource_dir, "include" }); @@ -524,14 +524,12 @@ pub fn addBuiltinIncludeDir(tc: *const Toolchain) !void { /// Otherwise returns a slice of `buf`. If the file is larger than `buf` partial contents are returned pub fn readFile(tc: *const Toolchain, path: []const u8, buf: []u8) ?[]const u8 { const comp = tc.driver.comp; - const io = comp.io; - return comp.cwd.readFile(io, path, buf) catch null; + return comp.cwd.readFile(comp.io, path, buf) catch null; } pub fn exists(tc: *const Toolchain, path: []const u8) bool { const comp = tc.driver.comp; - const io = comp.io; - comp.cwd.access(io, path, .{}) catch return false; + comp.cwd.access(comp.io, path, .{}) catch return false; return true; } @@ -549,8 +547,7 @@ pub fn canExecute(tc: *const Toolchain, path: []const u8) bool { } const comp = tc.driver.comp; - const io = comp.io; - comp.cwd.access(io, path, .{ .execute = true }) catch return false; + comp.cwd.access(comp.io, path, .{ .execute = true }) catch return false; // Todo: ensure path is not a directory return true; } diff --git a/lib/compiler/aro/aro/Tree.zig b/lib/compiler/aro/aro/Tree.zig @@ -34,7 +34,7 @@ pub const TokenWithExpansionLocs = struct { expansion_locs: ?[*]Source.Location = null, pub fn expansionSlice(tok: TokenWithExpansionLocs) []const Source.Location { - const locs = tok.expansion_locs orelse return &[0]Source.Location{}; + const locs = tok.expansion_locs orelse return &.{}; var i: usize = 0; while (locs[i].id.index != .unused) : (i += 1) {} return locs[0..i]; @@ -243,6 +243,8 @@ pub const Node = union(enum) { builtin_choose_expr: Conditional, builtin_convertvector: Convertvector, builtin_shufflevector: Shufflevector, + builtin_va_arg_pack: VaArgPack, + builtin_va_arg_pack_len: VaArgPack, /// C23 bool literal `true` / `false` bool_literal: Literal, @@ -633,6 +635,10 @@ pub const Node = union(enum) { indexes: []const Node.Index, }; + pub const VaArgPack = struct { + builtin_tok: TokenIndex, + }; + pub const Literal = struct { literal_tok: TokenIndex, qt: QualType, @@ -1689,6 +1695,16 @@ pub const Node = union(enum) { .indexes = @ptrCast(tree.extra.items[node_data[1] + 2 ..][0..node_data[2]]), }, }, + .builtin_va_arg_pack => .{ + .builtin_va_arg_pack = .{ + .builtin_tok = node_tok, + }, + }, + .builtin_va_arg_pack_len => .{ + .builtin_va_arg_pack_len = .{ + .builtin_tok = node_tok, + }, + }, .array_init_expr_two => .{ .array_init_expr = .{ .l_brace_tok = node_tok, @@ -1797,7 +1813,9 @@ pub const Node = union(enum) { .global_asm, .generic_association_expr, .generic_default_expr, + .builtin_va_arg_pack, => null, + .builtin_va_arg_pack_len => .int, .builtin_types_compatible_p => .int, else => { // If a node is typed the type is stored in data[0]. @@ -1963,6 +1981,8 @@ pub const Node = union(enum) { builtin_types_compatible_p, builtin_convertvector, builtin_shufflevector, + builtin_va_arg_pack, + builtin_va_arg_pack_len, array_init_expr, array_init_expr_two, struct_init_expr, @@ -2789,6 +2809,14 @@ pub fn setNode(tree: *Tree, node: Node, index: usize) !void { tree.extra.appendAssumeCapacity(@intFromEnum(builtin.rhs)); tree.extra.appendSliceAssumeCapacity(@ptrCast(builtin.indexes)); }, + .builtin_va_arg_pack => |builtin| { + repr.tag = .builtin_va_arg_pack; + repr.tok = builtin.builtin_tok; + }, + .builtin_va_arg_pack_len => |builtin| { + repr.tag = .builtin_va_arg_pack_len; + repr.tok = builtin.builtin_tok; + }, .array_init_expr => |init| { repr.data[0] = @bitCast(init.container_qt); if (init.items.len > 2) { @@ -3000,12 +3028,12 @@ pub fn tokSlice(tree: *const Tree, tok_i: TokenIndex) []const u8 { return tree.comp.locSlice(loc); } -pub fn dump(tree: *const Tree, config: std.Io.tty.Config, w: *std.Io.Writer) std.Io.tty.Config.SetColorError!void { +pub fn dump(tree: *const Tree, term: std.Io.Terminal) std.Io.Terminal.SetColorError!void { for (tree.root_decls.items) |i| { - try tree.dumpNode(i, 0, config, w); - try w.writeByte('\n'); + try tree.dumpNode(i, 0, term); + try term.writer.writeByte('\n'); } - try w.flush(); + try term.writer.flush(); } fn dumpFieldAttributes(tree: *const Tree, attributes: []const Attribute, level: u32, w: *std.Io.Writer) !void { @@ -3052,25 +3080,26 @@ fn dumpNode( tree: *const Tree, node_index: Node.Index, level: u32, - config: std.Io.tty.Config, - w: *std.Io.Writer, + term: std.Io.Terminal, ) !void { const delta = 2; const half = delta / 2; - const TYPE = std.Io.tty.Color.bright_magenta; - const TAG = std.Io.tty.Color.bright_cyan; - const IMPLICIT = std.Io.tty.Color.bright_blue; - const NAME = std.Io.tty.Color.bright_red; - const LITERAL = std.Io.tty.Color.bright_green; - const ATTRIBUTE = std.Io.tty.Color.bright_yellow; + const TYPE = std.Io.Terminal.Color.bright_magenta; + const TAG = std.Io.Terminal.Color.bright_cyan; + const IMPLICIT = std.Io.Terminal.Color.bright_blue; + const NAME = std.Io.Terminal.Color.bright_red; + const LITERAL = std.Io.Terminal.Color.bright_green; + const ATTRIBUTE = std.Io.Terminal.Color.bright_yellow; + + const w = term.writer; const node = node_index.get(tree); try w.splatByteAll(' ', level); - if (config == .no_color) { + if (term.mode == .no_color) { if (node.isImplicit()) try w.writeAll("implicit "); } else { - try config.setColor(w, if (node.isImplicit()) IMPLICIT else TAG); + try term.setColor(if (node.isImplicit()) IMPLICIT else TAG); } try w.print("{s}", .{@tagName(node)}); @@ -3078,36 +3107,36 @@ fn dumpNode( try w.writeAll(": "); switch (node) { .cast => |cast| { - try config.setColor(w, .white); + try term.setColor(.white); try w.print("({s}) ", .{@tagName(cast.kind)}); }, else => {}, } - try config.setColor(w, TYPE); + try term.setColor(TYPE); try w.writeByte('\''); try qt.dump(tree.comp, w); try w.writeByte('\''); } if (tree.isLval(node_index)) { - try config.setColor(w, ATTRIBUTE); + try term.setColor(ATTRIBUTE); try w.writeAll(" lvalue"); } if (tree.isBitfield(node_index)) { - try config.setColor(w, ATTRIBUTE); + try term.setColor(ATTRIBUTE); try w.writeAll(" bitfield"); } if (node == .asm_stmt) { const quals = node.asm_stmt.quals; - try config.setColor(w, ATTRIBUTE); + try term.setColor(ATTRIBUTE); if (quals.@"inline") try w.writeAll(" inline"); if (quals.@"volatile") try w.writeAll(" volatile"); if (quals.goto) try w.writeAll(" goto"); } if (tree.value_map.get(node_index)) |val| { - try config.setColor(w, LITERAL); + try term.setColor(LITERAL); try w.writeAll(" (value: "); if (try val.print(node_index.qt(tree), tree.comp, w)) |nested| switch (nested) { .pointer => |ptr| { @@ -3127,15 +3156,15 @@ fn dumpNode( try w.writeByte(')'); } if (node == .return_stmt and node.return_stmt.operand == .implicit and node.return_stmt.operand.implicit) { - try config.setColor(w, IMPLICIT); + try term.setColor(IMPLICIT); try w.writeAll(" (value: 0)"); } try w.writeAll("\n"); - try config.setColor(w, .reset); + try term.setColor(.reset); if (node_index.qtOrNull(tree)) |qt| { - try config.setColor(w, ATTRIBUTE); + try term.setColor(ATTRIBUTE); var it = Attribute.Iterator.initType(qt, tree.comp); while (it.next()) |item| { const attr, _ = item; @@ -3143,56 +3172,56 @@ fn dumpNode( try w.print("attr: {s}", .{@tagName(attr.tag)}); try tree.dumpAttribute(attr, w); } - try config.setColor(w, .reset); + try term.setColor(.reset); } switch (node) { .empty_decl => {}, .global_asm => |@"asm"| { - try tree.dumpNode(@"asm".asm_str, level + delta, config, w); + try tree.dumpNode(@"asm".asm_str, level + delta, term); }, .static_assert => |assert| { try w.splatByteAll(' ', level + 1); try w.writeAll("condition:\n"); - try tree.dumpNode(assert.cond, level + delta, config, w); + try tree.dumpNode(assert.cond, level + delta, term); if (assert.message) |some| { try w.splatByteAll(' ', level + 1); try w.writeAll("diagnostic:\n"); - try tree.dumpNode(some, level + delta, config, w); + try tree.dumpNode(some, level + delta, term); } }, .function => |function| { try w.splatByteAll(' ', level + half); - try config.setColor(w, ATTRIBUTE); + try term.setColor(ATTRIBUTE); if (function.static) try w.writeAll("static "); if (function.@"inline") try w.writeAll("inline "); - try config.setColor(w, .reset); + try term.setColor(.reset); try w.writeAll("name: "); - try config.setColor(w, NAME); + try term.setColor(NAME); try w.print("{s}\n", .{tree.tokSlice(function.name_tok)}); - try config.setColor(w, .reset); + try term.setColor(.reset); if (function.body) |body| { try w.splatByteAll(' ', level + half); try w.writeAll("body:\n"); - try tree.dumpNode(body, level + delta, config, w); + try tree.dumpNode(body, level + delta, term); } if (function.definition) |definition| { try w.splatByteAll(' ', level + half); try w.writeAll("definition: "); - try config.setColor(w, NAME); + try term.setColor(NAME); try w.print("0x{X}\n", .{@intFromEnum(definition)}); - try config.setColor(w, .reset); + try term.setColor(.reset); } }, .typedef => |typedef| { try w.splatByteAll(' ', level + half); try w.writeAll("name: "); - try config.setColor(w, NAME); + try term.setColor(NAME); try w.print("{s}\n", .{tree.tokSlice(typedef.name_tok)}); - try config.setColor(w, .reset); + try term.setColor(.reset); }, .param => |param| { try w.splatByteAll(' ', level + half); @@ -3200,21 +3229,21 @@ fn dumpNode( switch (param.storage_class) { .auto => {}, .register => { - try config.setColor(w, ATTRIBUTE); + try term.setColor(ATTRIBUTE); try w.writeAll("register "); - try config.setColor(w, .reset); + try term.setColor(.reset); }, } try w.writeAll("name: "); - try config.setColor(w, NAME); + try term.setColor(NAME); try w.print("{s}\n", .{tree.tokSlice(param.name_tok)}); - try config.setColor(w, .reset); + try term.setColor(.reset); }, .variable => |variable| { try w.splatByteAll(' ', level + half); - try config.setColor(w, ATTRIBUTE); + try term.setColor(ATTRIBUTE); switch (variable.storage_class) { .auto => {}, .static => try w.writeAll("static "), @@ -3222,37 +3251,37 @@ fn dumpNode( .register => try w.writeAll("register "), } if (variable.thread_local) try w.writeAll("thread_local "); - try config.setColor(w, .reset); + try term.setColor(.reset); try w.writeAll("name: "); - try config.setColor(w, NAME); + try term.setColor(NAME); try w.print("{s}\n", .{tree.tokSlice(variable.name_tok)}); - try config.setColor(w, .reset); + try term.setColor(.reset); if (variable.initializer) |some| { - try config.setColor(w, .reset); + try term.setColor(.reset); try w.splatByteAll(' ', level + half); try w.writeAll("init:\n"); - try tree.dumpNode(some, level + delta, config, w); + try tree.dumpNode(some, level + delta, term); } if (variable.definition) |definition| { try w.splatByteAll(' ', level + half); try w.writeAll("definition: "); - try config.setColor(w, NAME); + try term.setColor(NAME); try w.print("0x{X}\n", .{@intFromEnum(definition)}); - try config.setColor(w, .reset); + try term.setColor(.reset); } }, .enum_field => |field| { try w.splatByteAll(' ', level + half); try w.writeAll("name: "); - try config.setColor(w, NAME); + try term.setColor(NAME); try w.print("{s}\n", .{tree.tokSlice(field.name_tok)}); - try config.setColor(w, .reset); + try term.setColor(.reset); if (field.init) |some| { try w.splatByteAll(' ', level + half); try w.writeAll("init:\n"); - try tree.dumpNode(some, level + delta, config, w); + try tree.dumpNode(some, level + delta, term); } }, .record_field => |field| { @@ -3260,26 +3289,26 @@ fn dumpNode( if (name_tok_id == .identifier or name_tok_id == .extended_identifier) { try w.splatByteAll(' ', level + half); try w.writeAll("name: "); - try config.setColor(w, NAME); + try term.setColor(NAME); try w.print("{s}\n", .{tree.tokSlice(field.name_or_first_tok)}); - try config.setColor(w, .reset); + try term.setColor(.reset); } if (field.bit_width) |some| { try w.splatByteAll(' ', level + half); try w.writeAll("bits:\n"); - try tree.dumpNode(some, level + delta, config, w); + try tree.dumpNode(some, level + delta, term); } }, .compound_stmt => |compound| { for (compound.body, 0..) |stmt, i| { if (i != 0) try w.writeByte('\n'); - try tree.dumpNode(stmt, level + delta, config, w); + try tree.dumpNode(stmt, level + delta, term); } }, .enum_decl => |decl| { for (decl.fields, 0..) |field, i| { if (i != 0) try w.writeByte('\n'); - try tree.dumpNode(field, level + delta, config, w); + try tree.dumpNode(field, level + delta, term); } }, .struct_decl, .union_decl => |decl| { @@ -3291,7 +3320,7 @@ fn dumpNode( var field_i: u32 = 0; for (decl.fields, 0..) |field_node, i| { if (i != 0) try w.writeByte('\n'); - try tree.dumpNode(field_node, level + delta, config, w); + try tree.dumpNode(field_node, level + delta, term); if (field_node.get(tree) != .record_field) continue; if (fields.len == 0) continue; @@ -3301,32 +3330,32 @@ fn dumpNode( if (field_attributes.len == 0) continue; - try config.setColor(w, ATTRIBUTE); + try term.setColor(ATTRIBUTE); try tree.dumpFieldAttributes(field_attributes, level + delta + half, w); - try config.setColor(w, .reset); + try term.setColor(.reset); } }, .array_init_expr, .struct_init_expr => |init| { for (init.items, 0..) |item, i| { if (i != 0) try w.writeByte('\n'); - try tree.dumpNode(item, level + delta, config, w); + try tree.dumpNode(item, level + delta, term); } }, .union_init_expr => |init| { try w.splatByteAll(' ', level + half); try w.writeAll("field index: "); - try config.setColor(w, LITERAL); + try term.setColor(LITERAL); try w.print("{d}\n", .{init.field_index}); - try config.setColor(w, .reset); + try term.setColor(.reset); if (init.initializer) |some| { - try tree.dumpNode(some, level + delta, config, w); + try tree.dumpNode(some, level + delta, term); } }, .compound_literal_expr => |literal| { if (literal.storage_class != .auto or literal.thread_local) { try w.splatByteAll(' ', level + half - 1); - try config.setColor(w, ATTRIBUTE); + try term.setColor(ATTRIBUTE); switch (literal.storage_class) { .auto => {}, .static => try w.writeAll(" static"), @@ -3334,137 +3363,138 @@ fn dumpNode( } if (literal.thread_local) try w.writeAll(" thread_local"); try w.writeByte('\n'); - try config.setColor(w, .reset); + try term.setColor(.reset); } - try tree.dumpNode(literal.initializer, level + half, config, w); + try tree.dumpNode(literal.initializer, level + half, term); }, .labeled_stmt => |labeled| { try w.splatByteAll(' ', level + half); try w.writeAll("label: "); - try config.setColor(w, LITERAL); + try term.setColor(LITERAL); try w.print("{s}\n", .{tree.tokSlice(labeled.label_tok)}); - try config.setColor(w, .reset); + try term.setColor(.reset); try w.splatByteAll(' ', level + half); try w.writeAll("stmt:\n"); - try tree.dumpNode(labeled.body, level + delta, config, w); + try tree.dumpNode(labeled.body, level + delta, term); }, .case_stmt => |case| { try w.splatByteAll(' ', level + half); if (case.end) |some| { try w.writeAll("range start:\n"); - try tree.dumpNode(case.start, level + delta, config, w); + try tree.dumpNode(case.start, level + delta, term); try w.splatByteAll(' ', level + half); try w.writeAll("range end:\n"); - try tree.dumpNode(some, level + delta, config, w); + try tree.dumpNode(some, level + delta, term); } else { try w.writeAll("value:\n"); - try tree.dumpNode(case.start, level + delta, config, w); + try tree.dumpNode(case.start, level + delta, term); } try w.splatByteAll(' ', level + half); try w.writeAll("stmt:\n"); - try tree.dumpNode(case.body, level + delta, config, w); + try tree.dumpNode(case.body, level + delta, term); }, .default_stmt => |default| { try w.splatByteAll(' ', level + half); try w.writeAll("stmt:\n"); - try tree.dumpNode(default.body, level + delta, config, w); + try tree.dumpNode(default.body, level + delta, term); }, .binary_cond_expr, .cond_expr, .builtin_choose_expr => |conditional| { try w.splatByteAll(' ', level + half); try w.writeAll("cond:\n"); - try tree.dumpNode(conditional.cond, level + delta, config, w); + try tree.dumpNode(conditional.cond, level + delta, term); try w.splatByteAll(' ', level + half); try w.writeAll("then:\n"); - try tree.dumpNode(conditional.then_expr, level + delta, config, w); + try tree.dumpNode(conditional.then_expr, level + delta, term); try w.splatByteAll(' ', level + half); try w.writeAll("else:\n"); - try tree.dumpNode(conditional.else_expr, level + delta, config, w); + try tree.dumpNode(conditional.else_expr, level + delta, term); }, .builtin_types_compatible_p => |call| { try w.splatByteAll(' ', level + half); try w.writeAll("lhs: "); - try config.setColor(w, TYPE); + try term.setColor(TYPE); try call.lhs.dump(tree.comp, w); try w.writeByte('\n'); - try config.setColor(w, .reset); + try term.setColor(.reset); try w.splatByteAll(' ', level + half); try w.writeAll("rhs: "); - try config.setColor(w, TYPE); + try term.setColor(TYPE); try call.rhs.dump(tree.comp, w); try w.writeByte('\n'); - try config.setColor(w, .reset); + try term.setColor(.reset); }, .builtin_convertvector => |convert| { try w.splatByteAll(' ', level + half); try w.writeAll("operand:\n"); - try tree.dumpNode(convert.operand, level + delta, config, w); + try tree.dumpNode(convert.operand, level + delta, term); }, .builtin_shufflevector => |shuffle| { try w.splatByteAll(' ', level + half); try w.writeAll("lhs:\n"); - try tree.dumpNode(shuffle.lhs, level + delta, config, w); + try tree.dumpNode(shuffle.lhs, level + delta, term); try w.splatByteAll(' ', level + half); try w.writeAll("rhs:\n"); - try tree.dumpNode(shuffle.rhs, level + delta, config, w); + try tree.dumpNode(shuffle.rhs, level + delta, term); if (shuffle.indexes.len > 0) { try w.splatByteAll(' ', level + half); try w.writeAll("indexes:\n"); for (shuffle.indexes) |index| { - try tree.dumpNode(index, level + delta, config, w); + try tree.dumpNode(index, level + delta, term); } } }, + .builtin_va_arg_pack, .builtin_va_arg_pack_len => {}, .if_stmt => |@"if"| { try w.splatByteAll(' ', level + half); try w.writeAll("cond:\n"); - try tree.dumpNode(@"if".cond, level + delta, config, w); + try tree.dumpNode(@"if".cond, level + delta, term); try w.splatByteAll(' ', level + half); try w.writeAll("then:\n"); - try tree.dumpNode(@"if".then_body, level + delta, config, w); + try tree.dumpNode(@"if".then_body, level + delta, term); if (@"if".else_body) |some| { try w.splatByteAll(' ', level + half); try w.writeAll("else:\n"); - try tree.dumpNode(some, level + delta, config, w); + try tree.dumpNode(some, level + delta, term); } }, .switch_stmt => |@"switch"| { try w.splatByteAll(' ', level + half); try w.writeAll("cond:\n"); - try tree.dumpNode(@"switch".cond, level + delta, config, w); + try tree.dumpNode(@"switch".cond, level + delta, term); try w.splatByteAll(' ', level + half); try w.writeAll("body:\n"); - try tree.dumpNode(@"switch".body, level + delta, config, w); + try tree.dumpNode(@"switch".body, level + delta, term); }, .while_stmt => |@"while"| { try w.splatByteAll(' ', level + half); try w.writeAll("cond:\n"); - try tree.dumpNode(@"while".cond, level + delta, config, w); + try tree.dumpNode(@"while".cond, level + delta, term); try w.splatByteAll(' ', level + half); try w.writeAll("body:\n"); - try tree.dumpNode(@"while".body, level + delta, config, w); + try tree.dumpNode(@"while".body, level + delta, term); }, .do_while_stmt => |do| { try w.splatByteAll(' ', level + half); try w.writeAll("cond:\n"); - try tree.dumpNode(do.cond, level + delta, config, w); + try tree.dumpNode(do.cond, level + delta, term); try w.splatByteAll(' ', level + half); try w.writeAll("body:\n"); - try tree.dumpNode(do.body, level + delta, config, w); + try tree.dumpNode(do.body, level + delta, term); }, .for_stmt => |@"for"| { switch (@"for".init) { @@ -3472,48 +3502,48 @@ fn dumpNode( try w.splatByteAll(' ', level + half); try w.writeAll("decl:\n"); for (decls) |decl| { - try tree.dumpNode(decl, level + delta, config, w); + try tree.dumpNode(decl, level + delta, term); try w.writeByte('\n'); } }, .expr => |expr| if (expr) |some| { try w.splatByteAll(' ', level + half); try w.writeAll("init:\n"); - try tree.dumpNode(some, level + delta, config, w); + try tree.dumpNode(some, level + delta, term); }, } if (@"for".cond) |some| { try w.splatByteAll(' ', level + half); try w.writeAll("cond:\n"); - try tree.dumpNode(some, level + delta, config, w); + try tree.dumpNode(some, level + delta, term); } if (@"for".incr) |some| { try w.splatByteAll(' ', level + half); try w.writeAll("incr:\n"); - try tree.dumpNode(some, level + delta, config, w); + try tree.dumpNode(some, level + delta, term); } try w.splatByteAll(' ', level + half); try w.writeAll("body:\n"); - try tree.dumpNode(@"for".body, level + delta, config, w); + try tree.dumpNode(@"for".body, level + delta, term); }, .addr_of_label => |addr| { try w.splatByteAll(' ', level + half); try w.writeAll("label: "); - try config.setColor(w, LITERAL); + try term.setColor(LITERAL); try w.print("{s}\n", .{tree.tokSlice(addr.label_tok)}); - try config.setColor(w, .reset); + try term.setColor(.reset); }, .goto_stmt => |goto| { try w.splatByteAll(' ', level + half); try w.writeAll("label: "); - try config.setColor(w, LITERAL); + try term.setColor(LITERAL); try w.print("{s}\n", .{tree.tokSlice(goto.label_tok)}); - try config.setColor(w, .reset); + try term.setColor(.reset); }, .computed_goto_stmt => |goto| { try w.splatByteAll(' ', level + half); try w.writeAll("expr:\n"); - try tree.dumpNode(goto.expr, level + delta, config, w); + try tree.dumpNode(goto.expr, level + delta, term); }, .continue_stmt, .break_stmt, .null_stmt => {}, .return_stmt => |ret| { @@ -3521,43 +3551,43 @@ fn dumpNode( .expr => |expr| { try w.splatByteAll(' ', level + half); try w.writeAll("expr:\n"); - try tree.dumpNode(expr, level + delta, config, w); + try tree.dumpNode(expr, level + delta, term); }, .implicit => {}, .none => {}, } }, .asm_stmt => |@"asm"| { - try tree.dumpNode(@"asm".asm_str, level + delta, config, w); + try tree.dumpNode(@"asm".asm_str, level + delta, term); const write_operand = struct { fn write_operand( - _w: *std.Io.Writer, _level: u32, - _config: std.Io.tty.Config, + _term: std.Io.Terminal, _tree: *const Tree, operands: []const Node.AsmStmt.Operand, - ) std.Io.tty.Config.SetColorError!void { + ) std.Io.Terminal.SetColorError!void { + const _w = _term.writer; for (operands) |operand| { if (operand.name != 0) { try _w.splatByteAll(' ', _level + delta); try _w.writeAll("asm name: "); - try _config.setColor(_w, NAME); + try _term.setColor(NAME); try _w.writeAll(_tree.tokSlice(operand.name)); try _w.writeByte('\n'); - try _config.setColor(_w, .reset); + try _term.setColor(.reset); } try _w.splatByteAll(' ', _level + delta); try _w.writeAll("constraint: "); const constraint_val = _tree.value_map.get(operand.constraint).?; - try _config.setColor(_w, LITERAL); + try _term.setColor(LITERAL); _ = try constraint_val.print(operand.constraint.qt(_tree), _tree.comp, _w); try _w.writeByte('\n'); - try _tree.dumpNode(operand.expr, _level + delta, _config, _w); + try _tree.dumpNode(operand.expr, _level + delta, _term); } - try _config.setColor(_w, .reset); + try _term.setColor(.reset); } }.write_operand; @@ -3565,18 +3595,18 @@ fn dumpNode( try w.splatByteAll(' ', level + half); try w.writeAll("ouputs:\n"); - try write_operand(w, level, config, tree, @"asm".outputs); + try write_operand(level, term, tree, @"asm".outputs); } if (@"asm".inputs.len > 0) { try w.splatByteAll(' ', level + half); try w.writeAll("inputs:\n"); - try write_operand(w, level, config, tree, @"asm".inputs); + try write_operand(level, term, tree, @"asm".inputs); } if (@"asm".clobbers.len > 0) { try w.splatByteAll(' ', level + half); try w.writeAll("clobbers:\n"); - try config.setColor(w, LITERAL); + try term.setColor(LITERAL); for (@"asm".clobbers) |clobber| { const clobber_val = tree.value_map.get(clobber).?; @@ -3584,41 +3614,41 @@ fn dumpNode( _ = try clobber_val.print(clobber.qt(tree), tree.comp, w); try w.writeByte('\n'); } - try config.setColor(w, .reset); + try term.setColor(.reset); } if (@"asm".labels.len > 0) { try w.splatByteAll(' ', level + half); try w.writeAll("labels:\n"); for (@"asm".labels) |label| { - try tree.dumpNode(label, level + delta, config, w); + try tree.dumpNode(label, level + delta, term); } } }, .call_expr => |call| { try w.splatByteAll(' ', level + half); try w.writeAll("callee:\n"); - try tree.dumpNode(call.callee, level + delta, config, w); + try tree.dumpNode(call.callee, level + delta, term); if (call.args.len > 0) { try w.splatByteAll(' ', level + half); try w.writeAll("args:\n"); for (call.args) |arg| { - try tree.dumpNode(arg, level + delta, config, w); + try tree.dumpNode(arg, level + delta, term); } } }, .builtin_call_expr => |call| { try w.splatByteAll(' ', level + half); try w.writeAll("name: "); - try config.setColor(w, NAME); + try term.setColor(NAME); try w.print("{s}\n", .{tree.tokSlice(call.builtin_tok)}); - try config.setColor(w, .reset); + try term.setColor(.reset); if (call.args.len > 0) { try w.splatByteAll(' ', level + half); try w.writeAll("args:\n"); for (call.args) |arg| { - try tree.dumpNode(arg, level + delta, config, w); + try tree.dumpNode(arg, level + delta, term); } } }, @@ -3655,13 +3685,13 @@ fn dumpNode( => |bin| { try w.splatByteAll(' ', level + 1); try w.writeAll("lhs:\n"); - try tree.dumpNode(bin.lhs, level + delta, config, w); + try tree.dumpNode(bin.lhs, level + delta, term); try w.splatByteAll(' ', level + 1); try w.writeAll("rhs:\n"); - try tree.dumpNode(bin.rhs, level + delta, config, w); + try tree.dumpNode(bin.rhs, level + delta, term); }, - .cast => |cast| try tree.dumpNode(cast.operand, level + delta, config, w), + .cast => |cast| try tree.dumpNode(cast.operand, level + delta, term), .addr_of_expr, .deref_expr, .plus_expr, @@ -3680,21 +3710,21 @@ fn dumpNode( => |un| { try w.splatByteAll(' ', level + 1); try w.writeAll("operand:\n"); - try tree.dumpNode(un.operand, level + delta, config, w); + try tree.dumpNode(un.operand, level + delta, term); }, .decl_ref_expr, .enumeration_ref => |dr| { try w.splatByteAll(' ', level + 1); try w.writeAll("name: "); - try config.setColor(w, NAME); + try term.setColor(NAME); try w.print("{s}\n", .{tree.tokSlice(dr.name_tok)}); - try config.setColor(w, .reset); + try term.setColor(.reset); }, .builtin_ref => |dr| { try w.splatByteAll(' ', level + 1); try w.writeAll("name: "); - try config.setColor(w, NAME); + try term.setColor(NAME); try w.print("{s}\n", .{tree.tokSlice(dr.name_tok)}); - try config.setColor(w, .reset); + try term.setColor(.reset); }, .bool_literal, .nullptr_literal, @@ -3706,7 +3736,7 @@ fn dumpNode( .member_access_expr, .member_access_ptr_expr => |access| { try w.splatByteAll(' ', level + 1); try w.writeAll("lhs:\n"); - try tree.dumpNode(access.base, level + delta, config, w); + try tree.dumpNode(access.base, level + delta, term); var base_qt = access.base.qt(tree); if (base_qt.get(tree.comp, .pointer)) |some| base_qt = some.child; @@ -3714,61 +3744,61 @@ fn dumpNode( try w.splatByteAll(' ', level + 1); try w.writeAll("name: "); - try config.setColor(w, NAME); + try term.setColor(NAME); try w.print("{s}\n", .{fields[access.member_index].name.lookup(tree.comp)}); - try config.setColor(w, .reset); + try term.setColor(.reset); }, .array_access_expr => |access| { try w.splatByteAll(' ', level + 1); try w.writeAll("base:\n"); - try tree.dumpNode(access.base, level + delta, config, w); + try tree.dumpNode(access.base, level + delta, term); try w.splatByteAll(' ', level + 1); try w.writeAll("index:\n"); - try tree.dumpNode(access.index, level + delta, config, w); + try tree.dumpNode(access.index, level + delta, term); }, .sizeof_expr, .alignof_expr => |type_info| { if (type_info.expr) |some| { try w.splatByteAll(' ', level + 1); try w.writeAll("expr:\n"); - try tree.dumpNode(some, level + delta, config, w); + try tree.dumpNode(some, level + delta, term); } else { try w.splatByteAll(' ', level + half); try w.writeAll("operand type: "); - try config.setColor(w, TYPE); + try term.setColor(TYPE); try type_info.operand_qt.dump(tree.comp, w); try w.writeByte('\n'); - try config.setColor(w, .reset); + try term.setColor(.reset); } }, .generic_expr => |generic| { try w.splatByteAll(' ', level + 1); try w.writeAll("controlling:\n"); - try tree.dumpNode(generic.controlling, level + delta, config, w); + try tree.dumpNode(generic.controlling, level + delta, term); try w.splatByteAll(' ', level + 1); try w.writeAll("chosen:\n"); - try tree.dumpNode(generic.chosen, level + delta, config, w); + try tree.dumpNode(generic.chosen, level + delta, term); if (generic.rest.len > 0) { try w.splatByteAll(' ', level + 1); try w.writeAll("rest:\n"); for (generic.rest) |expr| { - try tree.dumpNode(expr, level + delta, config, w); + try tree.dumpNode(expr, level + delta, term); } } }, .generic_association_expr => |assoc| { - try tree.dumpNode(assoc.expr, level + delta, config, w); + try tree.dumpNode(assoc.expr, level + delta, term); }, .generic_default_expr => |default| { - try tree.dumpNode(default.expr, level + delta, config, w); + try tree.dumpNode(default.expr, level + delta, term); }, .array_filler_expr => |filler| { try w.splatByteAll(' ', level + 1); try w.writeAll("count: "); - try config.setColor(w, LITERAL); + try term.setColor(LITERAL); try w.print("{d}\n", .{filler.count}); - try config.setColor(w, .reset); + try term.setColor(.reset); }, .struct_forward_decl, .union_forward_decl, diff --git a/lib/compiler/aro/aro/TypeStore.zig b/lib/compiler/aro/aro/TypeStore.zig @@ -219,9 +219,9 @@ pub const QualType = packed struct(u32) { .float_dfloat64 => return .{ .float = .dfloat64 }, .float_dfloat128 => return .{ .float = .dfloat128 }, .float_dfloat64x => return .{ .float = .dfloat64x }, - .void_pointer => return .{ .pointer = .{ .child = .void, .decayed = null } }, - .char_pointer => return .{ .pointer = .{ .child = .char, .decayed = null } }, - .int_pointer => return .{ .pointer = .{ .child = .int, .decayed = null } }, + .void_pointer => return .{ .pointer = .{ .child = .void } }, + .char_pointer => return .{ .pointer = .{ .child = .char } }, + .int_pointer => return .{ .pointer = .{ .child = .int } }, else => {}, } @@ -280,7 +280,7 @@ pub const QualType = packed struct(u32) { }, .pointer => .{ .pointer = .{ .child = @bitCast(repr.data[0]), - .decayed = null, + .bounds = @enumFromInt(repr.data[1]), } }, .pointer_decayed => .{ .pointer = .{ .child = @bitCast(repr.data[0]), @@ -800,7 +800,6 @@ pub const QualType = packed struct(u32) { return comp.type_store.put(comp.gpa, .{ .pointer = .{ .child = qt, - .decayed = null, } }); }, else => return qt, @@ -1013,6 +1012,15 @@ pub const QualType = packed struct(u32) { return qt.scalarKind(comp).isPointer(); } + /// Function or function pointer + pub fn isCallable(qt: QualType, comp: *const Compilation) bool { + return switch (qt.base(comp).type) { + .func => true, + .pointer => |ptr| ptr.child.is(comp, .func), + else => false, + }; + } + pub fn eqlQualified(a_qt: QualType, b_qt: QualType, comp: *const Compilation) bool { if (a_qt.@"const" != b_qt.@"const") return false; if (a_qt.@"volatile" != b_qt.@"volatile") return false; @@ -1632,7 +1640,25 @@ pub const Type = union(enum) { pub const Pointer = struct { child: QualType, - decayed: ?QualType, + decayed: ?QualType = null, + bounds: Bounds = .c, + + pub const Bounds = enum { + /// C pointer with no bounds attribute + c, + /// No pointer arithmetic or non-zero indexing + single, + /// Explicitly specified as a traditional C pointer + unsafe_indexable, + + pub fn fromTag(tag: Attribute.Tag) Bounds { + return switch (tag) { + .single => .single, + .unsafe_indexable => .unsafe_indexable, + else => unreachable, + }; + } + }; }; pub const Array = struct { @@ -1784,6 +1810,7 @@ attributes: std.ArrayList(Attribute) = .empty, anon_name_arena: std.heap.ArenaAllocator.State = .{}, wchar: QualType = .invalid, +wint: QualType = .invalid, uint_least16_t: QualType = .invalid, uint_least32_t: QualType = .invalid, ptrdiff: QualType = .invalid, @@ -1918,10 +1945,12 @@ pub fn set(ts: *TypeStore, gpa: std.mem.Allocator, ty: Type, index: usize) !void .pointer => |pointer| { repr.data[0] = @bitCast(pointer.child); if (pointer.decayed) |array| { + std.debug.assert(pointer.bounds == .c); repr.tag = .pointer_decayed; repr.data[1] = @bitCast(array); } else { repr.tag = .pointer; + repr.data[1] = @intFromEnum(pointer.bounds); } }, .array => |array| { @@ -2070,17 +2099,44 @@ pub fn set(ts: *TypeStore, gpa: std.mem.Allocator, ty: Type, index: usize) !void pub fn initNamedTypes(ts: *TypeStore, comp: *Compilation) !void { const os = comp.target.os.tag; - ts.wchar = switch (comp.target.cpu.arch) { - .xcore => .uchar, - .ve, .msp430 => .uint, - .arm, .armeb, .thumb, .thumbeb => if (os != .windows and os != .netbsd and os != .openbsd) .uint else .int, - .aarch64, .aarch64_be => if (!os.isDarwin() and os != .netbsd) .uint else .int, - .x86_64, .x86 => if (os == .windows) .ushort else .int, - else => .int, + const arch = comp.target.cpu.arch; + ts.wchar = switch (os) { + .openbsd, .netbsd => .int, + .ps4, .ps5 => .ushort, + .uefi => .ushort, + .windows => .ushort, + .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => .int, + else => switch (arch) { + .aarch64, .aarch64_be => .uint, + .arm, .armeb, .thumb, .thumbeb => .uint, + .ve, .msp430 => .uint, + .x86_64, .x86 => .int, + .xcore => .uchar, + else => .int, + }, + }; + + ts.wint = switch (os) { + .fuchsia => .uint, + .linux => .uint, + .openbsd => .int, + .uefi => .ushort, + .windows => .ushort, + else => switch (arch) { + .csky => .uint, + .loongarch32, .loongarch64 => .uint, + .riscv32, .riscv32be, .riscv64, .riscv64be => .uint, + .ve => .uint, + .xcore => .uint, + .xtensa, .xtensaeb => .uint, + else => .int, + }, }; const ptr_width = comp.target.ptrBitWidth(); - ts.ptrdiff = if (os == .windows and ptr_width == 64) + ts.ptrdiff = if (arch == .wasm32) + .long + else if (os == .windows and ptr_width == 64) .long_long else switch (ptr_width) { 16 => .int, @@ -2089,7 +2145,9 @@ pub fn initNamedTypes(ts: *TypeStore, comp: *Compilation) !void { else => unreachable, }; - ts.size = if (os == .windows and ptr_width == 64) + ts.size = if (arch == .wasm32) + .ulong + else if (os == .windows and ptr_width == 64) .ulong_long else switch (ptr_width) { 16 => .uint, @@ -2206,9 +2264,9 @@ fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType { }; const struct_qt = switch (kind) { - .aarch64_va_list => blk: { + .aarch64_va_list => { var record: Type.Record = .{ - .name = try comp.internString("__va_list_tag"), + .name = try comp.internString("__va_list"), .decl_node = undefined, // TODO .layout = null, .fields = &.{}, @@ -2226,11 +2284,11 @@ fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType { record.layout = record_layout.compute(&fields, qt, comp, null) catch unreachable; try ts.set(comp.gpa, .{ .@"struct" = record }, @intFromEnum(qt._index)); - break :blk qt; + return qt; }, - .arm_va_list => blk: { + .arm_va_list => { var record: Type.Record = .{ - .name = try comp.internString("__va_list_tag"), + .name = try comp.internString("__va_list"), .decl_node = undefined, // TODO .layout = null, .fields = &.{}, @@ -2244,7 +2302,7 @@ fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType { record.layout = record_layout.compute(&fields, qt, comp, null) catch unreachable; try ts.set(comp.gpa, .{ .@"struct" = record }, @intFromEnum(qt._index)); - break :blk qt; + return qt; }, .hexagon_va_list => blk: { var record: Type.Record = .{ @@ -2330,7 +2388,7 @@ fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType { break :blk qt; }, - .xtensa_va_list => blk: { + .xtensa_va_list => { var record: Type.Record = .{ .name = try comp.internString("__va_list_tag"), .decl_node = undefined, // TODO @@ -2348,7 +2406,7 @@ fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType { record.layout = record_layout.compute(&fields, qt, comp, null) catch unreachable; try ts.set(comp.gpa, .{ .@"struct" = record }, @intFromEnum(qt._index)); - break :blk qt; + return qt; }, }; @@ -2830,7 +2888,7 @@ pub const Builder = struct { } fn duplicateSpec(b: *Builder, source_tok: TokenIndex, spec: []const u8) !void { - if (b.parser.comp.langopts.emulate != .clang) return b.cannotCombine(source_tok); + if (b.parser.comp.langopts.emulate == .gcc) return b.cannotCombine(source_tok); try b.parser.err(b.parser.tok_i, .duplicate_decl_spec, .{spec}); } diff --git a/lib/compiler/aro/aro/Value.zig b/lib/compiler/aro/aro/Value.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const Io = std.Io; const assert = std.debug.assert; const BigIntConst = std.math.big.int.Const; const BigIntMutable = std.math.big.int.Mutable; @@ -9,8 +8,8 @@ const BigIntSpace = Interner.Tag.Int.BigIntSpace; const annex_g = @import("annex_g.zig"); const Compilation = @import("Compilation.zig"); -const Target = @import("Target.zig"); const QualType = @import("TypeStore.zig").QualType; +const Target = @import("Target.zig"); const Value = @This(); @@ -77,11 +76,7 @@ test "minUnsignedBits" { } }; - var arena_state: std.heap.ArenaAllocator = .init(std.testing.allocator); - defer arena_state.deinit(); - const arena = arena_state.allocator(); - - var comp = Compilation.init(std.testing.allocator, arena, std.testing.io, undefined, Io.Dir.cwd()); + var comp = try Compilation.init(.testing); defer comp.deinit(); const target_query = try std.Target.Query.parse(.{ .arch_os_abi = "x86_64-linux-gnu" }); comp.target = .fromZigTarget(try std.zig.system.resolveTargetQuery(std.testing.io, target_query)); @@ -116,11 +111,7 @@ test "minSignedBits" { } }; - var arena_state: std.heap.ArenaAllocator = .init(std.testing.allocator); - defer arena_state.deinit(); - const arena = arena_state.allocator(); - - var comp = Compilation.init(std.testing.allocator, arena, std.testing.io, undefined, Io.Dir.cwd()); + var comp = try Compilation.init(.testing); defer comp.deinit(); const target_query = try std.Target.Query.parse(.{ .arch_os_abi = "x86_64-linux-gnu" }); comp.target = .fromZigTarget(try std.zig.system.resolveTargetQuery(std.testing.io, target_query)); @@ -465,6 +456,11 @@ pub fn isNan(v: Value, comp: *const Compilation) bool { }; } +pub fn isPointer(v: Value, comp: *const Compilation) bool { + if (v.opt_ref == .none) return false; + return comp.interner.get(v.ref()) == .pointer; +} + /// Converts value to zero or one; /// `.none` value remains unchanged. pub fn boolCast(v: *Value, comp: *const Compilation) void { @@ -1044,9 +1040,9 @@ fn twosCompIntLimit(limit: std.math.big.int.TwosCompIntLimit, qt: QualType, comp const mag_bits: usize = @intCast(qt.bitSizeof(comp)); switch (mag_bits) { inline 8, 16, 32, 64 => |bits| { - if (limit == .min) return Value.int(@as(i64, std.math.minInt(std.meta.Int(.signed, bits))), comp); + if (limit == .min) return Value.int(@as(i64, std.math.minInt(@Int(.signed, bits))), comp); return switch (signedness) { - inline else => |sign| Value.int(std.math.maxInt(std.meta.Int(sign, bits)), comp), + inline else => |sign| Value.int(std.math.maxInt(@Int(sign, bits)), comp), }; }, else => {}, @@ -1081,7 +1077,7 @@ const NestedPrint = union(enum) { }, }; -pub fn printPointer(offset: Value, base: []const u8, comp: *const Compilation, w: *Io.Writer) Io.Writer.Error!void { +pub fn printPointer(offset: Value, base: []const u8, comp: *const Compilation, w: *std.Io.Writer) std.Io.Writer.Error!void { try w.writeByte('&'); try w.writeAll(base); if (!offset.isZero(comp)) { @@ -1090,7 +1086,7 @@ pub fn printPointer(offset: Value, base: []const u8, comp: *const Compilation, w } } -pub fn print(v: Value, qt: QualType, comp: *const Compilation, w: *Io.Writer) Io.Writer.Error!?NestedPrint { +pub fn print(v: Value, qt: QualType, comp: *const Compilation, w: *std.Io.Writer) std.Io.Writer.Error!?NestedPrint { if (qt.is(comp, .bool)) { try w.writeAll(if (v.isZero(comp)) "false" else "true"); return null; @@ -1117,7 +1113,7 @@ pub fn print(v: Value, qt: QualType, comp: *const Compilation, w: *Io.Writer) Io return null; } -pub fn printString(bytes: []const u8, qt: QualType, comp: *const Compilation, w: *Io.Writer) Io.Writer.Error!void { +pub fn printString(bytes: []const u8, qt: QualType, comp: *const Compilation, w: *std.Io.Writer) std.Io.Writer.Error!void { const size: Compilation.CharUnitSize = @enumFromInt(qt.childType(comp).sizeof(comp)); const without_null = bytes[0 .. bytes.len - @intFromEnum(size)]; try w.writeByte('"'); diff --git a/lib/compiler/aro/aro/features.zig b/lib/compiler/aro/aro/features.zig @@ -44,6 +44,7 @@ pub fn hasFeature(comp: *Compilation, ext: []const u8) bool { .c_generic_selections = comp.langopts.standard.atLeast(.c11), .c_static_assert = comp.langopts.standard.atLeast(.c11), .c_thread_local = comp.langopts.standard.atLeast(.c11) and comp.target.isTlsSupported(), + .bounds_attributes = comp.langopts.bounds_safety == .clang, }; inline for (@typeInfo(@TypeOf(list)).@"struct".fields) |f| { if (std.mem.eql(u8, f.name, ext)) return @field(list, f.name); diff --git a/lib/compiler/aro/aro/pragmas/once.zig b/lib/compiler/aro/aro/pragmas/once.zig @@ -35,7 +35,6 @@ fn deinit(pragma: *Pragma, comp: *Compilation) void { var self: *Once = @fieldParentPtr("pragma", pragma); self.pragma_once.deinit(comp.gpa); comp.gpa.destroy(self); - pragma.* = undefined; } fn preprocessorHandler(pragma: *Pragma, pp: *Preprocessor, start_idx: TokenIndex) Pragma.Error!void { diff --git a/lib/compiler/aro/aro/record_layout.zig b/lib/compiler/aro/aro/record_layout.zig @@ -332,7 +332,7 @@ const SysVContext = struct { } } } else { - std.debug.assert(self.comp.langopts.emulate == .clang); + std.debug.assert(self.comp.langopts.emulate == .no or self.comp.langopts.emulate == .clang); // On Clang, the alignment requested by annotations is not respected if it is // larger than the value of #pragma pack. See test case 0083. @@ -569,7 +569,7 @@ const MsvcContext = struct { pub fn compute(fields: []Type.Record.Field, qt: QualType, comp: *const Compilation, pragma_pack: ?u8) Error!Type.Record.Layout { switch (comp.langopts.emulate) { - .gcc, .clang => { + .no, .gcc, .clang => { var context = SysVContext.init(qt, comp, pragma_pack); try context.layoutFields(fields); @@ -620,7 +620,7 @@ fn computeLayout(qt: QualType, comp: *const Compilation) RecordLayout { else => { const type_align = qt.alignof(comp) * BITS_PER_BYTE; return .{ - .size_bits = qt.bitSizeofOrNull(comp) orelse 0, + .size_bits = BITS_PER_BYTE * (qt.sizeofOrNull(comp) orelse 0), .pointer_alignment_bits = type_align, .field_alignment_bits = type_align, .required_alignment_bits = BITS_PER_BYTE, diff --git a/lib/compiler/aro/assembly_backend/x86_64.zig b/lib/compiler/aro/assembly_backend/x86_64.zig @@ -5,15 +5,14 @@ const assert = std.debug.assert; const aro = @import("aro"); const Assembly = aro.Assembly; const Compilation = aro.Compilation; -const Node = Tree.Node; const Source = aro.Source; const Tree = aro.Tree; const QualType = aro.QualType; const Value = aro.Value; - -const AsmCodeGen = @This(); const Error = aro.Compilation.Error; +const Node = Tree.Node; +const AsmCodeGen = @This(); tree: *const Tree, comp: *Compilation, text: *std.Io.Writer, @@ -58,7 +57,7 @@ fn serializeFloat(comptime T: type, value: T, w: *std.Io.Writer) !void { }, else => { const size = @bitSizeOf(T); - const storage_unit = std.enums.fromInt(StorageUnit, size).?; + const storage_unit = std.enums.fromInt(StorageUnit, size) orelse unreachable; const IntTy = @Int(.unsigned, size); const int_val: IntTy = @bitCast(value); return serializeInt(int_val, storage_unit, w); diff --git a/lib/compiler/aro/backend/Assembly.zig b/lib/compiler/aro/backend/Assembly.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const Io = std.Io; const Allocator = std.mem.Allocator; data: []const u8, @@ -12,7 +11,7 @@ pub fn deinit(self: *const Assembly, gpa: Allocator) void { gpa.free(self.text); } -pub fn writeToFile(self: Assembly, io: Io, file: Io.File) !void { +pub fn writeToFile(self: Assembly, io: std.Io, file: std.Io.File) !void { var file_writer = file.writer(io, &.{}); var buffers = [_][]const u8{ self.data, self.text }; diff --git a/lib/compiler/aro/backend/Interner.zig b/lib/compiler/aro/backend/Interner.zig @@ -102,13 +102,13 @@ pub const Key = union(enum) { .float => |repr| switch (repr) { inline else => |data| std.hash.autoHash( &hasher, - @as(std.meta.Int(.unsigned, @bitSizeOf(@TypeOf(data))), @bitCast(data)), + @as(@Int(.unsigned, @bitSizeOf(@TypeOf(data))), @bitCast(data)), ), }, .complex => |repr| switch (repr) { inline else => |data| std.hash.autoHash( &hasher, - @as(std.meta.Int(.unsigned, @bitSizeOf(@TypeOf(data))), @bitCast(data)), + @as(@Int(.unsigned, @bitSizeOf(@TypeOf(data))), @bitCast(data)), ), }, .int => |repr| { diff --git a/lib/compiler/aro/backend/Ir.zig b/lib/compiler/aro/backend/Ir.zig @@ -374,24 +374,27 @@ pub fn deinit(ir: *Ir, gpa: std.mem.Allocator) void { ir.* = undefined; } -const TYPE = std.Io.tty.Color.bright_magenta; -const INST = std.Io.tty.Color.bright_cyan; -const REF = std.Io.tty.Color.bright_blue; -const LITERAL = std.Io.tty.Color.bright_green; -const ATTRIBUTE = std.Io.tty.Color.bright_yellow; +const TYPE = std.Io.Terminal.Color.bright_magenta; +const INST = std.Io.Terminal.Color.bright_cyan; +const REF = std.Io.Terminal.Color.bright_blue; +const LITERAL = std.Io.Terminal.Color.bright_green; +const ATTRIBUTE = std.Io.Terminal.Color.bright_yellow; const RefMap = std.AutoArrayHashMapUnmanaged(Ref, void); -pub fn dump(ir: *const Ir, gpa: Allocator, config: std.Io.tty.Config, w: *std.Io.Writer) !void { +pub const DumpError = std.Io.Terminal.SetColorError || std.mem.Allocator.Error; + +pub fn dump(ir: *const Ir, gpa: Allocator, term: std.Io.Terminal) DumpError!void { for (ir.decls.keys(), ir.decls.values()) |name, *decl| { - try ir.dumpDecl(decl, gpa, name, config, w); + try ir.dumpDecl(decl, gpa, name, term); } - try w.flush(); + try term.writer.flush(); } -fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8, config: std.Io.tty.Config, w: *std.Io.Writer) !void { +fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8, term: std.Io.Terminal) !void { const tags = decl.instructions.items(.tag); const data = decl.instructions.items(.data); + const w = term.writer; var ref_map: RefMap = .empty; defer ref_map.deinit(gpa); @@ -402,10 +405,10 @@ fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8, const ret_inst = decl.body.items[decl.body.items.len - 1]; const ret_operand = data[@intFromEnum(ret_inst)].un; const ret_ty = decl.instructions.items(.ty)[@intFromEnum(ret_operand)]; - try ir.writeType(ret_ty, config, w); - try config.setColor(w, REF); + try ir.writeType(ret_ty, term); + try term.setColor(REF); try w.print(" @{s}", .{name}); - try config.setColor(w, .reset); + try term.setColor(.reset); try w.writeAll("("); var arg_count: u32 = 0; @@ -414,8 +417,8 @@ fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8, if (tags[@intFromEnum(ref)] != .arg) break; if (arg_count != 0) try w.writeAll(", "); try ref_map.put(gpa, ref, {}); - try ir.writeRef(decl, &ref_map, ref, config, w); - try config.setColor(w, .reset); + try ir.writeRef(decl, &ref_map, ref, term); + try term.setColor(.reset); } try w.writeAll(") {\n"); for (decl.body.items[arg_count..]) |ref| { @@ -432,7 +435,7 @@ fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8, .arg, .constant, .symbol => unreachable, .label => { const label_index = label_map.getIndex(ref).?; - try config.setColor(w, REF); + try term.setColor(REF); try w.print("{s}.{d}:\n", .{ data[i].label, label_index }); }, // .label_val => { @@ -441,35 +444,35 @@ fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8, // }, .jmp => { const un = data[i].un; - try config.setColor(w, INST); + try term.setColor(INST); try w.writeAll(" jmp "); - try writeLabel(decl, &label_map, un, config, w); + try writeLabel(decl, &label_map, un, term); try w.writeByte('\n'); }, .branch => { const br = data[i].branch; - try config.setColor(w, INST); + try term.setColor(INST); try w.writeAll(" branch "); - try ir.writeRef(decl, &ref_map, br.cond, config, w); - try config.setColor(w, .reset); + try ir.writeRef(decl, &ref_map, br.cond, term); + try term.setColor(.reset); try w.writeAll(", "); - try writeLabel(decl, &label_map, br.then, config, w); - try config.setColor(w, .reset); + try writeLabel(decl, &label_map, br.then, term); + try term.setColor(.reset); try w.writeAll(", "); - try writeLabel(decl, &label_map, br.@"else", config, w); + try writeLabel(decl, &label_map, br.@"else", term); try w.writeByte('\n'); }, .select => { const br = data[i].branch; - try ir.writeNewRef(gpa, decl, &ref_map, ref, config, w); + try ir.writeNewRef(gpa, decl, &ref_map, ref, term); try w.writeAll("select "); - try ir.writeRef(decl, &ref_map, br.cond, config, w); - try config.setColor(w, .reset); + try ir.writeRef(decl, &ref_map, br.cond, term); + try term.setColor(.reset); try w.writeAll(", "); - try ir.writeRef(decl, &ref_map, br.then, config, w); - try config.setColor(w, .reset); + try ir.writeRef(decl, &ref_map, br.then, term); + try term.setColor(.reset); try w.writeAll(", "); - try ir.writeRef(decl, &ref_map, br.@"else", config, w); + try ir.writeRef(decl, &ref_map, br.@"else", term); try w.writeByte('\n'); }, // .jmp_val => { @@ -478,91 +481,91 @@ fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8, // }, .@"switch" => { const @"switch" = data[i].@"switch"; - try config.setColor(w, INST); + try term.setColor(INST); try w.writeAll(" switch "); - try ir.writeRef(decl, &ref_map, @"switch".target, config, w); - try config.setColor(w, .reset); + try ir.writeRef(decl, &ref_map, @"switch".target, term); + try term.setColor(.reset); try w.writeAll(" {"); for (@"switch".case_vals[0..@"switch".cases_len], @"switch".case_labels) |val_ref, label_ref| { try w.writeAll("\n "); - try ir.writeValue(val_ref, config, w); - try config.setColor(w, .reset); + try ir.writeValue(val_ref, term); + try term.setColor(.reset); try w.writeAll(" => "); - try writeLabel(decl, &label_map, label_ref, config, w); - try config.setColor(w, .reset); + try writeLabel(decl, &label_map, label_ref, term); + try term.setColor(.reset); } - try config.setColor(w, LITERAL); + try term.setColor(LITERAL); try w.writeAll("\n default "); - try config.setColor(w, .reset); + try term.setColor(.reset); try w.writeAll("=> "); - try writeLabel(decl, &label_map, @"switch".default, config, w); - try config.setColor(w, .reset); + try writeLabel(decl, &label_map, @"switch".default, term); + try term.setColor(.reset); try w.writeAll("\n }\n"); }, .call => { const call = data[i].call; - try ir.writeNewRef(gpa, decl, &ref_map, ref, config, w); + try ir.writeNewRef(gpa, decl, &ref_map, ref, term); try w.writeAll("call "); - try ir.writeRef(decl, &ref_map, call.func, config, w); - try config.setColor(w, .reset); + try ir.writeRef(decl, &ref_map, call.func, term); + try term.setColor(.reset); try w.writeAll("("); for (call.args(), 0..) |arg, arg_i| { if (arg_i != 0) try w.writeAll(", "); - try ir.writeRef(decl, &ref_map, arg, config, w); - try config.setColor(w, .reset); + try ir.writeRef(decl, &ref_map, arg, term); + try term.setColor(.reset); } try w.writeAll(")\n"); }, .alloc => { const alloc = data[i].alloc; - try ir.writeNewRef(gpa, decl, &ref_map, ref, config, w); + try ir.writeNewRef(gpa, decl, &ref_map, ref, term); try w.writeAll("alloc "); - try config.setColor(w, ATTRIBUTE); + try term.setColor(ATTRIBUTE); try w.writeAll("size "); - try config.setColor(w, LITERAL); + try term.setColor(LITERAL); try w.print("{d}", .{alloc.size}); - try config.setColor(w, ATTRIBUTE); + try term.setColor(ATTRIBUTE); try w.writeAll(" align "); - try config.setColor(w, LITERAL); + try term.setColor(LITERAL); try w.print("{d}", .{alloc.@"align"}); try w.writeByte('\n'); }, .phi => { - try ir.writeNewRef(gpa, decl, &ref_map, ref, config, w); + try ir.writeNewRef(gpa, decl, &ref_map, ref, term); try w.writeAll("phi"); - try config.setColor(w, .reset); + try term.setColor(.reset); try w.writeAll(" {"); for (data[i].phi.inputs()) |input| { try w.writeAll("\n "); - try writeLabel(decl, &label_map, input.label, config, w); - try config.setColor(w, .reset); + try writeLabel(decl, &label_map, input.label, term); + try term.setColor(.reset); try w.writeAll(" => "); - try ir.writeRef(decl, &ref_map, input.value, config, w); - try config.setColor(w, .reset); + try ir.writeRef(decl, &ref_map, input.value, term); + try term.setColor(.reset); } - try config.setColor(w, .reset); + try term.setColor(.reset); try w.writeAll("\n }\n"); }, .store => { const bin = data[i].bin; - try config.setColor(w, INST); + try term.setColor(INST); try w.writeAll(" store "); - try ir.writeRef(decl, &ref_map, bin.lhs, config, w); - try config.setColor(w, .reset); + try ir.writeRef(decl, &ref_map, bin.lhs, term); + try term.setColor(.reset); try w.writeAll(", "); - try ir.writeRef(decl, &ref_map, bin.rhs, config, w); + try ir.writeRef(decl, &ref_map, bin.rhs, term); try w.writeByte('\n'); }, .ret => { - try config.setColor(w, INST); + try term.setColor(INST); try w.writeAll(" ret "); - if (data[i].un != .none) try ir.writeRef(decl, &ref_map, data[i].un, config, w); + if (data[i].un != .none) try ir.writeRef(decl, &ref_map, data[i].un, term); try w.writeByte('\n'); }, .load => { - try ir.writeNewRef(gpa, decl, &ref_map, ref, config, w); + try ir.writeNewRef(gpa, decl, &ref_map, ref, term); try w.writeAll("load "); - try ir.writeRef(decl, &ref_map, data[i].un, config, w); + try ir.writeRef(decl, &ref_map, data[i].un, term); try w.writeByte('\n'); }, .bit_or, @@ -583,12 +586,12 @@ fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8, .mod, => { const bin = data[i].bin; - try ir.writeNewRef(gpa, decl, &ref_map, ref, config, w); + try ir.writeNewRef(gpa, decl, &ref_map, ref, term); try w.print("{s} ", .{@tagName(tag)}); - try ir.writeRef(decl, &ref_map, bin.lhs, config, w); - try config.setColor(w, .reset); + try ir.writeRef(decl, &ref_map, bin.lhs, term); + try term.setColor(.reset); try w.writeAll(", "); - try ir.writeRef(decl, &ref_map, bin.rhs, config, w); + try ir.writeRef(decl, &ref_map, bin.rhs, term); try w.writeByte('\n'); }, .bit_not, @@ -598,33 +601,34 @@ fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8, .sext, => { const un = data[i].un; - try ir.writeNewRef(gpa, decl, &ref_map, ref, config, w); + try ir.writeNewRef(gpa, decl, &ref_map, ref, term); try w.print("{s} ", .{@tagName(tag)}); - try ir.writeRef(decl, &ref_map, un, config, w); + try ir.writeRef(decl, &ref_map, un, term); try w.writeByte('\n'); }, .label_addr, .jmp_val => {}, } } - try config.setColor(w, .reset); + try term.setColor(.reset); try w.writeAll("}\n\n"); } -fn writeType(ir: Ir, ty_ref: Interner.Ref, config: std.Io.tty.Config, w: *std.Io.Writer) !void { +fn writeType(ir: Ir, ty_ref: Interner.Ref, term: std.Io.Terminal) !void { + const w = term.writer; const ty = ir.interner.get(ty_ref); - try config.setColor(w, TYPE); + try term.setColor(TYPE); switch (ty) { .ptr_ty, .noreturn_ty, .void_ty, .func_ty => try w.writeAll(@tagName(ty)), .int_ty => |bits| try w.print("i{d}", .{bits}), .float_ty => |bits| try w.print("f{d}", .{bits}), .array_ty => |info| { try w.print("[{d} * ", .{info.len}); - try ir.writeType(info.child, .no_color, w); + try ir.writeType(info.child, .{ .mode = .no_color, .writer = w }); try w.writeByte(']'); }, .vector_ty => |info| { try w.print("<{d} * ", .{info.len}); - try ir.writeType(info.child, .no_color, w); + try ir.writeType(info.child, .{ .mode = .no_color, .writer = w }); try w.writeByte('>'); }, .record_ty => |elems| { @@ -632,7 +636,7 @@ fn writeType(ir: Ir, ty_ref: Interner.Ref, config: std.Io.tty.Config, w: *std.Io try w.writeAll("{ "); for (elems, 0..) |elem, i| { if (i != 0) try w.writeAll(", "); - try ir.writeType(elem, config, w); + try ir.writeType(elem, .{ .mode = .no_color, .writer = w }); } try w.writeAll(" }"); }, @@ -640,8 +644,9 @@ fn writeType(ir: Ir, ty_ref: Interner.Ref, config: std.Io.tty.Config, w: *std.Io } } -fn writeValue(ir: Ir, val: Interner.Ref, config: std.Io.tty.Config, w: *std.Io.Writer) !void { - try config.setColor(w, LITERAL); +fn writeValue(ir: Ir, val: Interner.Ref, term: std.Io.Terminal) !void { + const w = term.writer; + try term.setColor(LITERAL); const key = ir.interner.get(val); switch (key) { .null => return w.writeAll("nullptr_t"), @@ -656,43 +661,46 @@ fn writeValue(ir: Ir, val: Interner.Ref, config: std.Io.tty.Config, w: *std.Io.W } } -fn writeRef(ir: Ir, decl: *const Decl, ref_map: *RefMap, ref: Ref, config: std.Io.tty.Config, w: *std.Io.Writer) !void { +fn writeRef(ir: Ir, decl: *const Decl, ref_map: *RefMap, ref: Ref, term: std.Io.Terminal) !void { + const w = term.writer; assert(ref != .none); const index = @intFromEnum(ref); const ty_ref = decl.instructions.items(.ty)[index]; if (decl.instructions.items(.tag)[index] == .constant) { - try ir.writeType(ty_ref, config, w); + try ir.writeType(ty_ref, term); const v_ref = decl.instructions.items(.data)[index].constant; try w.writeByte(' '); - try ir.writeValue(v_ref, config, w); + try ir.writeValue(v_ref, term); return; } else if (decl.instructions.items(.tag)[index] == .symbol) { const name = decl.instructions.items(.data)[index].label; - try ir.writeType(ty_ref, config, w); - try config.setColor(w, REF); + try ir.writeType(ty_ref, term); + try term.setColor(REF); try w.print(" @{s}", .{name}); return; } - try ir.writeType(ty_ref, config, w); - try config.setColor(w, REF); + try ir.writeType(ty_ref, term); + try term.setColor(REF); const ref_index = ref_map.getIndex(ref).?; try w.print(" %{d}", .{ref_index}); } -fn writeNewRef(ir: Ir, gpa: Allocator, decl: *const Decl, ref_map: *RefMap, ref: Ref, config: std.Io.tty.Config, w: *std.Io.Writer) !void { +fn writeNewRef(ir: Ir, gpa: Allocator, decl: *const Decl, ref_map: *RefMap, ref: Ref, term: std.Io.Terminal) !void { + const w = term.writer; try ref_map.put(gpa, ref, {}); try w.writeAll(" "); - try ir.writeRef(decl, ref_map, ref, config, w); - try config.setColor(w, .reset); + try ir.writeRef(decl, ref_map, ref, term); + try term.setColor(.reset); try w.writeAll(" = "); - try config.setColor(w, INST); + try term.setColor(INST); } -fn writeLabel(decl: *const Decl, label_map: *RefMap, ref: Ref, config: std.Io.tty.Config, w: *std.Io.Writer) !void { +fn writeLabel(decl: *const Decl, label_map: *RefMap, ref: Ref, term: std.Io.Terminal) !void { + const w = term.writer; assert(ref != .none); const index = @intFromEnum(ref); const label = decl.instructions.items(.data)[index].label; - try config.setColor(w, REF); + try term.setColor(REF); const label_index = label_map.getIndex(ref).?; try w.print("{s}.{d}", .{ label, label_index }); } diff --git a/lib/compiler/aro/backend/Ir/x86/Renderer.zig b/lib/compiler/aro/backend/Ir/x86/Renderer.zig @@ -21,17 +21,17 @@ const RegisterManager = zig.RegisterManager(Renderer, Register, Ir.Ref, abi.allo const RegisterBitSet = RegisterManager.RegisterBitSet; const RegisterClass = struct { const gp: RegisterBitSet = blk: { - var set = RegisterBitSet.empty; + var set = RegisterBitSet.initEmpty(); for (abi.allocatable_regs, 0..) |reg, index| if (reg.class() == .general_purpose) set.set(index); break :blk set; }; const x87: RegisterBitSet = blk: { - var set = RegisterBitSet.empty; + var set = RegisterBitSet.initEmpty(); for (abi.allocatable_regs, 0..) |reg, index| if (reg.class() == .x87) set.set(index); break :blk set; }; const sse: RegisterBitSet = blk: { - var set = RegisterBitSet.empty; + var set = RegisterBitSet.initEmpty(); for (abi.allocatable_regs, 0..) |reg, index| if (reg.class() == .sse) set.set(index); break :blk set; }; diff --git a/lib/compiler/aro/include/ptrcheck.h b/lib/compiler/aro/include/ptrcheck.h @@ -0,0 +1,49 @@ +#pragma once + +#if defined(__has_feature) && __has_feature(bounds_attributes) + #define __has_ptrcheck 1 +#else + #define __has_ptrcheck 0 +#endif + +#if __has_ptrcheck + +#define __single __attribute__((__single__)) +#define __unsafe_indexable __attribute__((__unsafe_indexable__)) + +#else + +#define __single +#define __unsafe_indexable +#define __counted_by(N) +#define __counted_by_or_null(N) +#define __sized_by(N) +#define __sized_by_or_null(N) +#define __ended_by(E) + +#define __terminated_by(T) +#define __null_terminated + +/* __ptrcheck_abi_assume_indexable and __ptrcheck_abi_assume_bidi_indexable intentionally not defined */ +#define __ptrcheck_abi_assume_single() +#define __ptrcheck_abi_assume_unsafe_indexable() + +#define __unsafe_forge_bidi_indexable(T, P, S) ((T)(P)) +#define __unsafe_forge_single(T, P) ((T)(P)) +#define __unsafe_forge_terminated_by(T, P, E) ((T)(P)) +#define __unsafe_forge_null_terminated(T, P) ((T)(P)) + +#define __terminated_by_to_indexable(P) (P) +#define __unsafe_terminated_by_to_indexable(P) (P) +#define __null_terminated_to_indexable(P) (P) +#define __unsafe_null_terminated_to_indexable(P) (P) +#define __unsafe_terminated_by_from_indexable(T, P, ...) (P) +#define __unsafe_null_terminated_from_indexable(P, ...) (P) + +#define __array_decay_dicards_count_in_parameters + +#define __ptrcheck_unavailable +#define __ptrcheck_unavailable_r(REPLACEMENT) + + +#endif diff --git a/lib/compiler/aro/main.zig b/lib/compiler/aro/main.zig @@ -1,8 +1,9 @@ const std = @import("std"); -const Io = std.Io; -const Allocator = mem.Allocator; const mem = std.mem; const process = std.process; +const Allocator = mem.Allocator; +const build_options = @import("build_options"); + const aro = @import("aro"); const Compilation = aro.Compilation; const Diagnostics = aro.Diagnostics; @@ -11,14 +12,15 @@ const Toolchain = aro.Toolchain; const assembly_backend = @import("assembly_backend"); var debug_allocator: std.heap.DebugAllocator(.{ - .stack_trace_frames = 0, + .stack_trace_frames = if (build_options.debug_allocations and std.debug.sys_can_stack_trace) 10 else 0, + .resize_stack_traces = build_options.debug_allocations, // A unique value so that when a default-constructed - // DebugAllocator is incorrectly passed to testing allocator, or + // GeneralPurposeAllocator is incorrectly passed to testing allocator, or // vice versa, panic occurs. .canary = @truncate(0xc647026dc6875134), }) = .{}; -pub fn main(init: std.process.Init.Minimal) u8 { +pub fn main(init: process.Init.Minimal) u8 { const gpa = if (@import("builtin").link_libc) std.heap.c_allocator else @@ -31,7 +33,10 @@ pub fn main(init: std.process.Init.Minimal) u8 { defer arena_instance.deinit(); const arena = arena_instance.allocator(); - var threaded: std.Io.Threaded = .init(gpa, .{}); + var threaded: std.Io.Threaded = .init(gpa, .{ + .argv0 = .init(init.args), + .environ = init.environ, + }); defer threaded.deinit(); const io = threaded.io(); @@ -43,7 +48,11 @@ pub fn main(init: std.process.Init.Minimal) u8 { return 1; }; - const aro_name = process.executablePathAlloc(io, gpa) catch { + var environ_map = std.process.Environ.createMap(init.environ, gpa) catch |err| + std.process.fatal("failed to parse environment variables: {t}", .{err}); + defer environ_map.deinit(); + + const aro_name = std.process.executableDirPathAlloc(io, gpa) catch { std.debug.print("unable to find Aro executable path\n", .{}); if (fast_exit) process.exit(1); return 1; @@ -51,15 +60,21 @@ pub fn main(init: std.process.Init.Minimal) u8 { defer gpa.free(aro_name); var stderr_buf: [1024]u8 = undefined; - var stderr = Io.File.stderr().writer(&stderr_buf); + var stderr = std.Io.File.stderr().writer(io, &stderr_buf); var diagnostics: Diagnostics = .{ .output = .{ .to_writer = .{ - .color = .detect(stderr.file), + .mode = std.Io.Terminal.Mode.detect(io, stderr.file, false, false) catch .no_color, .writer = &stderr.interface, } }, }; - var comp = Compilation.initDefault(gpa, arena, io, &diagnostics, Io.Dir.cwd()) catch |er| switch (er) { + var comp = Compilation.init(.{ + .gpa = gpa, + .arena = arena, + .io = io, + .diagnostics = &diagnostics, + .environ_map = &environ_map, + }) catch |er| switch (er) { error.OutOfMemory => { std.debug.print("out of memory\n", .{}); if (fast_exit) process.exit(1); @@ -85,6 +100,7 @@ pub fn main(init: std.process.Init.Minimal) u8 { if (fast_exit) process.exit(1); return 1; }, + error.Canceled => unreachable, }; if (fast_exit) process.exit(@intFromBool(comp.diagnostics.errors != 0)); return @intFromBool(diagnostics.errors != 0); diff --git a/lib/compiler/resinator/main.zig b/lib/compiler/resinator/main.zig @@ -143,7 +143,13 @@ pub fn main(init: std.process.Init.Minimal) !void { if (!zig_integration) io.unlockStderr(); } - var comp = aro.Compilation.init(aro_arena, aro_arena, io, &diagnostics, Io.Dir.cwd()); + var comp = try aro.Compilation.init(.{ + .gpa = aro_arena, + .arena = aro_arena, + .io = io, + .diagnostics = &diagnostics, + .environ_map = &environ_map, + }); defer comp.deinit(); var argv: std.ArrayList([]const u8) = .empty; diff --git a/lib/compiler/resinator/preprocess.zig b/lib/compiler/resinator/preprocess.zig @@ -14,8 +14,6 @@ pub fn preprocess( argv: []const []const u8, maybe_dependencies: ?*Dependencies, ) PreprocessError!void { - try comp.addDefaultPragmaHandlers(); - var driver: aro.Driver = .{ .comp = comp, .diagnostics = comp.diagnostics, .aro_name = "arocc" }; defer driver.deinit(); @@ -47,7 +45,7 @@ pub fn preprocess( if (hasAnyErrors(comp)) return error.GeneratedSourceError; comp.generated_buf.items.len = 0; - var pp = aro.Preprocessor.initDefault(comp) catch |err| switch (err) { + var pp = aro.Preprocessor.init(comp, .{ .base_file = source.id }) catch |err| switch (err) { error.FatalError => return error.GeneratedSourceError, error.OutOfMemory => |e| return e, }; diff --git a/lib/compiler/translate-c/MacroTranslator.zig b/lib/compiler/translate-c/MacroTranslator.zig @@ -266,7 +266,8 @@ fn parseCNumLit(mt: *MacroTranslator) ParseError!ZigNode { const lit_bytes = mt.tokSlice(); mt.i += 1; - var bytes = try std.ArrayList(u8).initCapacity(arena, lit_bytes.len + 3); + // +3 for prefix and +2 for suffix + var bytes = try std.ArrayList(u8).initCapacity(arena, lit_bytes.len + 3 + 2); const prefix = aro.Tree.Token.NumberPrefix.fromString(lit_bytes); switch (prefix) { @@ -350,13 +351,21 @@ fn parseCNumLit(mt: *MacroTranslator) ParseError!ZigNode { if (is_float) { const type_node = try ZigTag.type.create(arena, switch (suffix) { .F16 => "f16", - .F => "f32", - .None => "f64", - .L => "c_longdouble", + .F, .F32 => "f32", + .None, .F32x, .F64 => "f64", + .L, .F64x => "c_longdouble", .W => "f80", .Q, .F128 => "f128", - else => unreachable, + else => { + try mt.fail("TODO: float literal suffix: '{s}'", .{suffix_str}); + return error.ParseError; + }, }); + if (bytes.getLast() == '.') { + bytes.appendAssumeCapacity('0'); + } else if (mem.findAny(u8, bytes.items, ".eEpP") == null) { + bytes.appendSliceAssumeCapacity(".0"); + } const rhs = try ZigTag.float_literal.create(arena, bytes.items); return ZigTag.as.create(arena, .{ .lhs = type_node, .rhs = rhs }); } else { @@ -582,6 +591,7 @@ fn escapeUnprintables(mt: *MacroTranslator) ![]const u8 { fn parseCPrimaryExpr(mt: *MacroTranslator, scope: *Scope) ParseError!ZigNode { const arena = mt.t.arena; + const gpa = mt.t.gpa; const tok = mt.peek(); switch (tok) { .char_literal, @@ -646,6 +656,51 @@ fn parseCPrimaryExpr(mt: *MacroTranslator, scope: *Scope) ParseError!ZigNode { } return identifier; }, + .keyword_generic => { + mt.i += 1; + + try mt.expect(.l_paren); + const param = try mt.parseCCondExpr(scope); + const typeof_param = try ZigTag.typeof.create(arena, param); + try mt.expect(.comma); + + var cases: std.ArrayList(ZigNode) = .empty; + defer cases.deinit(gpa); + var has_default = false; + while (true) { + const case = if (mt.eat(.keyword_default)) blk: { + has_default = true; + try mt.expect(.colon); + const expr = try mt.parseCCondExpr(scope); + break :blk try ZigTag.switch_else.create(arena, expr); + } else blk: { + const case_type = try mt.parseCTypeName(scope) orelse { + try mt.fail("unable to translate C expr: expected type instead got '{s}'", .{mt.peek().symbol()}); + return error.ParseError; + }; + try mt.expect(.colon); + const expr = try mt.parseCCondExpr(scope); + break :blk try ZigTag.switch_prong.create(arena, .{ + .cases = try arena.dupe(ZigNode, &.{case_type}), + .cond = expr, + }); + }; + try cases.append(gpa, case); + if (!mt.eat(.comma)) break; + } + try mt.expect(.r_paren); + + if (!has_default) try cases.append(gpa, try ZigTag.switch_else.create( + arena, + try ZigTag.@"comptime".create(arena, ZigTag.@"unreachable".init()), + )); + + const sw = try ZigTag.@"switch".create(arena, .{ + .cond = typeof_param, + .cases = try arena.dupe(ZigNode, cases.items), + }); + return sw; + }, else => {}, } @@ -678,8 +733,10 @@ fn macroIntToBool(mt: *MacroTranslator, node: ZigNode) !ZigNode { } fn parseCCondExpr(mt: *MacroTranslator, scope: *Scope) ParseError!ZigNode { - const node = try mt.parseCOrExpr(scope); - if (!mt.eat(.question_mark)) return node; + const condition = try mt.parseCOrExpr(scope); + if (!mt.eat(.question_mark)) return condition; + const bool_ty = try ZigTag.type.create(mt.t.arena, "bool"); + const node = try mt.t.createHelperCallNode(.cast, &.{ bool_ty, condition }); const then_body = try mt.parseCOrExpr(scope); try mt.expect(.colon); @@ -1135,6 +1192,8 @@ fn parseCPostfixExpr(mt: *MacroTranslator, scope: *Scope, type_name: ?ZigNode) P .string_literal_utf_8, .string_literal_utf_32, .string_literal_wide, + .macro_param, + .macro_param_no_expand, => {}, .identifier, .extended_identifier => { if (mt.t.global_scope.blank_macros.contains(mt.tokSlice())) { @@ -1160,8 +1219,13 @@ fn parseCPostfixExprInner(mt: *MacroTranslator, scope: *Scope, type_name: ?ZigNo mt.i += 1; const tok = mt.tokens[mt.i]; if (tok.id == .macro_param or tok.id == .macro_param_no_expand) { - try mt.fail("unable to translate C expr: field access using macro parameter", .{}); - return error.ParseError; + const param = mt.macro.params[tok.end]; + mt.i += 1; + + const mangled_name = scope.getAlias(param) orelse param; + const field_name = try ZigTag.identifier.create(arena, mangled_name); + node = try ZigTag.field_builtin.create(arena, .{ .lhs = node, .rhs = field_name }); + continue; } const field_name = mt.tokSlice(); try mt.expect(.identifier); @@ -1172,8 +1236,13 @@ fn parseCPostfixExprInner(mt: *MacroTranslator, scope: *Scope, type_name: ?ZigNo mt.i += 1; const tok = mt.tokens[mt.i]; if (tok.id == .macro_param or tok.id == .macro_param_no_expand) { - try mt.fail("unable to translate C expr: field access using macro parameter", .{}); - return error.ParseError; + const param = mt.macro.params[tok.end]; + mt.i += 1; + + const mangled_name = scope.getAlias(param) orelse param; + const field_name = try ZigTag.identifier.create(arena, mangled_name); + node = try ZigTag.field_builtin.create(arena, .{ .lhs = node, .rhs = field_name }); + continue; } const field_name = mt.tokSlice(); try mt.expect(.identifier); diff --git a/lib/compiler/translate-c/PatternList.zig b/lib/compiler/translate-c/PatternList.zig @@ -65,10 +65,7 @@ const templates = [_]Template{ .{ "CAST_OR_CALL(X, Y) ((X)(Y))", .CAST_OR_CALL }, .{ - \\wl_container_of(ptr, sample, member) \ - \\(__typeof__(sample))((char *)(ptr) - \ - \\ offsetof(__typeof__(*sample), member)) - , + "wl_container_of(ptr, sample, member) (__typeof__(sample))((char *)(ptr) - offsetof(__typeof__(*sample), member))", .WL_CONTAINER_OF, }, @@ -267,11 +264,6 @@ test "Macro matching" { try helper.checkMacro(allocator, pattern_list, "BAR(Z) (Z ## LL)", .LL_SUFFIX); try helper.checkMacro(allocator, pattern_list, "BAR(Z) (Z ## UL)", .UL_SUFFIX); try helper.checkMacro(allocator, pattern_list, "BAR(Z) (Z ## ULL)", .ULL_SUFFIX); - try helper.checkMacro(allocator, pattern_list, - \\container_of(a, b, c) \ - \\(__typeof__(b))((char *)(a) - \ - \\ offsetof(__typeof__(*b), c)) - , .WL_CONTAINER_OF); try helper.checkMacro(allocator, pattern_list, "NO_MATCH(X, Y) (X + Y)", null); try helper.checkMacro(allocator, pattern_list, "CAST_OR_CALL(X, Y) (X)(Y)", .CAST_OR_CALL); diff --git a/lib/compiler/translate-c/Scope.zig b/lib/compiler/translate-c/Scope.zig @@ -18,7 +18,22 @@ pub const ContainerMemberFns = struct { container_decl_ptr: *ast.Node, member_fns: std.ArrayList(*ast.Payload.Func) = .empty, }; -pub const ContainerMemberFnsHashMap = std.AutoArrayHashMapUnmanaged(aro.QualType, ContainerMemberFns); +pub const ContainerMemberFnsHashMap = std.ArrayHashMapUnmanaged( + aro.QualType, + ContainerMemberFns, + struct { + pub fn hash(self: @This(), key: aro.QualType) u32 { + const auto_hash = std.array_hash_map.getAutoHashFn(aro.QualType, @This()); + return auto_hash(self, key.unqualified()); + } + + pub fn eql(self: @This(), a: aro.QualType, b: aro.QualType, b_index: usize) bool { + const auto_eql = std.array_hash_map.getAutoEqlFn(aro.QualType, @This()); + return auto_eql(self, a.unqualified(), b.unqualified(), b_index); + } + }, + false, +); id: Id, parent: ?*Scope, @@ -254,7 +269,12 @@ pub const Root = struct { var member_names: std.StringArrayHashMapUnmanaged(void) = .empty; defer member_names.deinit(gpa); - for (root.container_member_fns_map.values()) |members| { + for (root.container_member_fns_map.keys(), root.container_member_fns_map.values()) |container_qt, members| { + // Get the container name + const container_name = root.translator.unnamed_typedefs.get(container_qt) orelse + container_qt.getRecord(root.translator.comp).?.name.lookup(root.translator.comp); + std.debug.assert(container_name.len > 0); + member_names.clearRetainingCapacity(); const decls_ptr = switch (members.container_decl_ptr.tag()) { .@"struct", .@"union" => blk_record: { @@ -274,7 +294,7 @@ pub const Root = struct { members.container_decl_ptr.* = container_decl; break :blk_opaque &container_decl.castTag(.@"opaque").?.data.decls; }, - else => return, + else => continue, }; const old_decls = decls_ptr.*; @@ -299,9 +319,26 @@ pub const Root = struct { for (members.member_fns.items) |func| { const func_name = func.data.name.?; - const func_name_trimmed = std.mem.trimEnd(u8, func_name, "_"); - const last_idx = std.mem.findLast(u8, func_name_trimmed, "_") orelse continue; - const func_name_alias = func_name[last_idx + 1 ..]; + const func_name_alias = blk: { + // Try multiple candidate prefixes to extract the alias + // 1. typedef struct { ... } foo; -> foo_get_bar() extracts "get_bar" + // 2. typedef struct _foo foo; -> foo_get_bar() extracts "get_bar" + const container_name_trimmed = std.mem.trimStart(u8, container_name, "_"); + const suffix = std.mem.cutPrefix(u8, func_name, container_name_trimmed); + // Check suffix starts with '_' to avoid invalid aliases like "1_get_bar" from foo1_get_bar() + if (suffix) |alias| if (alias.len > 0 and alias[0] == '_') { + const alias_trimmed = std.mem.trimStart(u8, alias, "_"); + if (alias_trimmed.len > 0) break :blk alias_trimmed; + }; + + // Doesn't match any prefix - fallback to trimming trailing underscores and using last segment + const func_name_trimmed = std.mem.trimEnd(u8, func_name, "_"); + const last_idx = std.mem.findLast(u8, func_name_trimmed, "_") orelse continue; + break :blk func_name[last_idx + 1 ..]; + }; + + // Skip if the alias conflicts with an existing type + if (root.contains(func_name_alias)) continue; const member_name_slot = try member_names.getOrPutValue(gpa, func_name_alias, {}); if (member_name_slot.found_existing) continue; func_ref_vars[count] = try ast.Node.Tag.pub_var_simple.create(arena, .{ diff --git a/lib/compiler/translate-c/Translator.zig b/lib/compiler/translate-c/Translator.zig @@ -19,10 +19,63 @@ const MacroTranslator = @import("MacroTranslator.zig"); const PatternList = @import("PatternList.zig"); const Scope = @import("Scope.zig"); +const AnonymousRecordFieldNames = struct { + pub const Key = struct { + parent: QualType, + field: QualType, + }; + + pub const Context = struct { + pub fn hash(ctx: Context, key: Key) u64 { + const auto_hash = std.hash_map.getAutoHashFn(Key, Context); + return auto_hash(ctx, .{ + .parent = key.parent.unqualified(), + .field = key.field.unqualified(), + }); + } + + pub fn eql(ctx: Context, a: Key, b: Key) bool { + const auto_eql = std.hash_map.getAutoEqlFn(Key, Context); + return auto_eql(ctx, .{ + .parent = a.parent.unqualified(), + .field = a.field.unqualified(), + }, .{ + .parent = b.parent.unqualified(), + .field = b.field.unqualified(), + }); + } + }; +}; + +pub const QualTypeHashContext = struct { + pub fn hash(ctx: QualTypeHashContext, key: QualType) u64 { + const auto_hash = std.hash_map.getAutoHashFn(QualType, QualTypeHashContext); + return auto_hash(ctx, key.unqualified()); + } + + pub fn eql(ctx: QualTypeHashContext, a: QualType, b: QualType) bool { + const auto_eql = std.hash_map.getAutoEqlFn(QualType, QualTypeHashContext); + return auto_eql(ctx, a.unqualified(), b.unqualified()); + } +}; + pub const Error = std.mem.Allocator.Error; pub const MacroProcessingError = Error || error{UnexpectedMacroToken}; pub const TypeError = Error || error{UnsupportedType}; -pub const TransError = TypeError || error{UnsupportedTranslation}; +pub const TransError = TypeError || error{ UnsupportedTranslation, SelfReferential }; + +/// Control when to treat a trailing array as a flexible array member. +/// Mirrors the -fstrict-flex-arrays=<n> compiler flag. +pub const StrictFlexArraysLevel = enum { + /// Any trailing array member is a flexible array. + @"0", + /// Trailing arrays of size 0, 1, or undefined are flexible. + @"1", + /// Trailing arrays of size 0 or undefined are flexible (default). + @"2", + /// Only trailing arrays of undefined size are flexible. + @"3", +}; const Translator = @This(); @@ -33,6 +86,17 @@ comp: *aro.Compilation, /// The Preprocessor that produced the source for `tree`. pp: *const aro.Preprocessor, +/// Should static functions be translated as `pub`. +pub_static: bool, +/// Should function bodies be translated. +func_bodies: bool, +/// Should macro names of literals be preserved. +keep_macro_literals: bool, +/// Should struct fields be default initialized. +default_init: bool, +/// Control when to treat a trailing array as a flexible array member. +strict_flex_arrays: StrictFlexArraysLevel, + gpa: mem.Allocator, arena: mem.Allocator, @@ -44,14 +108,16 @@ mangle_count: u32 = 0, /// Table of declarations for enum, struct, union and typedef types. type_decls: std.AutoArrayHashMapUnmanaged(Node.Index, []const u8) = .empty, /// Table of record decls that have been demoted to opaques. -opaque_demotes: std.AutoHashMapUnmanaged(QualType, void) = .empty, +opaque_demotes: std.HashMapUnmanaged(QualType, void, QualTypeHashContext, std.hash_map.default_max_load_percentage) = .empty, /// Table of unnamed enums and records that are child types of typedefs. -unnamed_typedefs: std.AutoHashMapUnmanaged(QualType, []const u8) = .empty, +unnamed_typedefs: std.HashMapUnmanaged(QualType, []const u8, QualTypeHashContext, std.hash_map.default_max_load_percentage) = .empty, /// Table of anonymous record to generated field names. -anonymous_record_field_names: std.AutoHashMapUnmanaged(struct { - parent: QualType, - field: QualType, -}, []const u8) = .empty, +anonymous_record_field_names: std.HashMapUnmanaged( + AnonymousRecordFieldNames.Key, + []const u8, + AnonymousRecordFieldNames.Context, + std.hash_map.default_max_load_percentage, +) = .empty, /// This one is different than the root scope's name table. This contains /// a list of names that we found by visiting all the top level decls without @@ -75,6 +141,10 @@ typedefs: std.StringArrayHashMapUnmanaged(void) = .empty, /// The lhs lval of a compound assignment expression. compound_assign_dummy: ?ZigNode = null, +/// Set of variables whose initializers are currently being translated. +/// Used to detect self-referential initializers. +wip_var_inits: std.AutoHashMapUnmanaged(Node.Index, void) = .empty, + pub fn getMangle(t: *Translator) u32 { t.mangle_count += 1; return t.mangle_count; @@ -98,10 +168,9 @@ fn maybeSuppressResult(t: *Translator, used: ResultUsed, result: ZigNode) TransE pub fn addTopLevelDecl(t: *Translator, name: []const u8, decl_node: ZigNode) !void { const gop = try t.global_scope.sym_table.getOrPut(t.gpa, name); - if (!gop.found_existing) { - gop.value_ptr.* = decl_node; - try t.global_scope.nodes.append(t.gpa, decl_node); - } + if (gop.found_existing) return; // Any duplicate decls are equivalent + gop.value_ptr.* = decl_node; + try t.global_scope.nodes.append(t.gpa, decl_node); } fn fail( @@ -172,6 +241,12 @@ pub const Options = struct { comp: *aro.Compilation, pp: *const aro.Preprocessor, tree: *const aro.Tree, + module_libs: bool, + pub_static: bool, + func_bodies: bool, + keep_macro_literals: bool, + default_init: bool, + strict_flex_arrays: StrictFlexArraysLevel, }; pub fn translate(options: Options) mem.Allocator.Error![]u8 { @@ -188,6 +263,11 @@ pub fn translate(options: Options) mem.Allocator.Error![]u8 { .comp = options.comp, .pp = options.pp, .tree = options.tree, + .pub_static = options.pub_static, + .func_bodies = options.func_bodies, + .keep_macro_literals = options.keep_macro_literals, + .default_init = options.default_init, + .strict_flex_arrays = options.strict_flex_arrays, }; translator.global_scope.* = Scope.Root.init(&translator); defer { @@ -200,6 +280,7 @@ pub fn translate(options: Options) mem.Allocator.Error![]u8 { translator.anonymous_record_field_names.deinit(gpa); translator.typedefs.deinit(gpa); translator.global_scope.deinit(); + translator.wip_var_inits.deinit(gpa); } try translator.prepopulateGlobalNameTable(); @@ -227,7 +308,6 @@ pub fn translate(options: Options) mem.Allocator.Error![]u8 { \\pub const __builtin = @import("std").zig.c_translation.builtins; \\pub const __helpers = @import("std").zig.c_translation.helpers; \\ - \\ ) catch return error.OutOfMemory; var zig_ast = try ast.render(gpa, translator.global_scope.nodes.items); @@ -261,10 +341,12 @@ fn prepopulateGlobalNameTable(t: *Translator) !void { const gop = try t.unnamed_typedefs.getOrPut(t.gpa, base.qt); if (gop.found_existing) { // One typedef can declare multiple names. - // TODO Don't put this one in `decl_table` so it's processed later. + // Don't put this one in `decl_table` so it's processed later. continue; } gop.value_ptr.* = decl_name; + try t.type_decls.put(t.gpa, decl, decl_name); + try t.typedefs.put(t.gpa, decl_name, {}); }, .struct_decl, @@ -344,15 +426,26 @@ fn transDecl(t: *Translator, scope: *Scope, decl: Node.Index) !void { try t.transRecordDecl(scope, record_decl.container_qt); }, + .struct_forward_decl, .union_forward_decl => |record_decl| { + if (record_decl.definition) |some| { + return t.transDecl(scope, some); + } + try t.transRecordDecl(scope, record_decl.container_qt); + }, + .enum_decl => |enum_decl| { try t.transEnumDecl(scope, enum_decl.container_qt); }, + .enum_forward_decl => |enum_decl| { + if (enum_decl.definition) |some| { + return t.transDecl(scope, some); + } + try t.transEnumDecl(scope, enum_decl.container_qt); + }, + .enum_field, .record_field, - .struct_forward_decl, - .union_forward_decl, - .enum_forward_decl, => return, .function => |function| { @@ -364,7 +457,7 @@ fn transDecl(t: *Translator, scope: *Scope, decl: Node.Index) !void { .variable => |variable| { if (variable.definition != null) return; - try t.transVarDecl(scope, variable); + try t.transVarDecl(scope, variable, decl); }, .static_assert => |static_assert| { try t.transStaticAssert(&t.global_scope.base, static_assert); @@ -531,13 +624,6 @@ fn transRecordDecl(t: *Translator, scope: *Scope, record_qt: QualType) Error!voi break :init ZigTag.opaque_literal.init(); } - // Demote record to opaque if it contains an opaque field - if (t.typeWasDemotedToOpaque(field.qt)) { - try t.opaque_demotes.put(t.gpa, base.qt, {}); - try t.warn(scope, field_loc, "{s} demoted to opaque type - has opaque field", .{container_kind_name}); - break :init ZigTag.opaque_literal.init(); - } - var field_name = field.name.lookup(t.comp); if (field.name_tok == 0) { field_name = try std.fmt.allocPrint(t.arena, "unnamed_{d}", .{unnamed_field_count}); @@ -548,23 +634,22 @@ fn transRecordDecl(t: *Translator, scope: *Scope, record_qt: QualType) Error!voi }, field_name); } - const field_alignment = if (has_alignment_attributes) - t.alignmentForField(record_ty, head_field_alignment, field_index) - else - null; - const field_type = field_type: { // Check if this is a flexible array member. flexible: { if (field_index != record_ty.fields.len - 1 and container_kind != .@"union") break :flexible; const array_ty = field.qt.get(t.comp, .array) orelse break :flexible; - if (array_ty.len != .incomplete and (array_ty.len != .fixed or array_ty.len.fixed != 0)) break :flexible; + if (!t.isFlexibleArrayLen(array_ty.len)) break :flexible; const elem_type = t.transType(scope, array_ty.elem, field_loc) catch |err| switch (err) { error.UnsupportedType => break :flexible, else => |e| return e, }; - const zero_array = try ZigTag.array_type.create(t.arena, .{ .len = 0, .elem_type = elem_type }); + const backing_array_len: usize = switch (array_ty.len) { + .fixed => |n| @intCast(n), + else => 0, + }; + const backing_array = try ZigTag.array_type.create(t.arena, .{ .len = backing_array_len, .elem_type = elem_type }); const member_name = field_name; field_name = try std.fmt.allocPrint(t.arena, "_{s}", .{field_name}); @@ -572,7 +657,7 @@ fn transRecordDecl(t: *Translator, scope: *Scope, record_qt: QualType) Error!voi const member = try t.createFlexibleMemberFn(member_name, field_name); try functions.append(t.gpa, member); - break :field_type zero_array; + break :field_type backing_array; } break :field_type t.transType(scope, field.qt, field_loc) catch |err| switch (err) { @@ -588,10 +673,22 @@ fn transRecordDecl(t: *Translator, scope: *Scope, record_qt: QualType) Error!voi }; }; + // Demote record to opaque if it contains an opaque field + if (t.typeWasDemotedToOpaque(field.qt)) { + try t.opaque_demotes.put(t.gpa, base.qt, {}); + try t.warn(scope, field_loc, "{s} demoted to opaque type - has opaque field", .{container_kind_name}); + break :init ZigTag.opaque_literal.init(); + } + + const field_alignment = if (has_alignment_attributes) + t.alignmentForField(record_ty, head_field_alignment, field_index) + else + null; + // C99 introduced designated initializers for structs. Omitted fields are implicitly // initialized to zero. Some C APIs are designed with this in mind. Defaulting to zero // values for translated struct fields permits Zig code to comfortably use such an API. - const default_value = if (container_kind == .@"struct") + const default_value = if (t.default_init and container_kind == .@"struct") try t.createZeroValueNode(field.qt, field_type, .no_as) else null; @@ -616,7 +713,7 @@ fn transRecordDecl(t: *Translator, scope: *Scope, record_qt: QualType) Error!voi .name = "_padding", .type = try ZigTag.type.create(t.arena, try std.fmt.allocPrint(t.arena, "u{d}", .{padding_bits})), .alignment = @divExact(alignment_bits, 8), - .default_value = if (container_kind == .@"struct") + .default_value = if (t.default_init and container_kind == .@"struct") ZigTag.zero_literal.init() else null, @@ -663,14 +760,12 @@ fn transRecordDecl(t: *Translator, scope: *Scope, record_qt: QualType) Error!voi fn transFnDecl(t: *Translator, scope: *Scope, function: Node.Function) Error!void { const func_ty = function.qt.get(t.comp, .func).?; - const is_pub = scope.id == .root; - const fn_name = t.tree.tokSlice(function.name_tok); if (scope.getAlias(fn_name) != null or t.global_scope.containsNow(fn_name)) return; // Avoid processing this decl twice const fn_decl_loc = function.name_tok; - const has_body = function.body != null and func_ty.kind != .variadic; + const has_body = function.body != null and func_ty.kind != .variadic and t.func_bodies; if (function.body != null and func_ty.kind == .variadic) { try t.warn(scope, function.name_tok, "TODO unable to translate variadic function, demoted to extern", .{}); } @@ -681,7 +776,7 @@ fn transFnDecl(t: *Translator, scope: *Scope, function: Node.Function) Error!voi .is_always_inline = is_always_inline, .is_extern = !has_body, .is_export = !function.static and has_body and !is_always_inline and !function.@"inline", - .is_pub = is_pub, + .is_pub = scope.id == .root and (!function.static or t.pub_static), .has_body = has_body, .cc = if (function.qt.getAttribute(t.comp, .calling_convention)) |some| switch (some.cc) { .c => .c, @@ -761,6 +856,7 @@ fn transFnDecl(t: *Translator, scope: *Scope, function: Node.Function) Error!voi t.transCompoundStmtInline(body_stmt, &block_scope) catch |err| switch (err) { error.OutOfMemory => |e| return e, + error.SelfReferential => unreachable, error.UnsupportedTranslation, error.UnsupportedType, => { @@ -777,7 +873,7 @@ fn transFnDecl(t: *Translator, scope: *Scope, function: Node.Function) Error!voi return t.addTopLevelDecl(fn_name, proto_node); } -fn transVarDecl(t: *Translator, scope: *Scope, variable: Node.Variable) Error!void { +fn transVarDecl(t: *Translator, scope: *Scope, variable: Node.Variable, decl_node: Node.Index) Error!void { const base_name = t.tree.tokSlice(variable.name_tok); const toplevel = scope.id == .root; const bs: *Scope.Block = if (!toplevel) try scope.findBlockScope(t) else undefined; @@ -815,24 +911,28 @@ fn transVarDecl(t: *Translator, scope: *Scope, variable: Node.Variable) Error!vo var is_const = variable.qt.@"const" or (array_ty != null and array_ty.?.elem.@"const"); var is_extern = variable.storage_class == .@"extern"; + var self_referential = false; const init_node = init: { if (variable.initializer) |init| { const maybe_literal = init.get(t.tree); + if (!toplevel) try t.wip_var_inits.putNoClobber(t.gpa, decl_node, {}); + defer _ = t.wip_var_inits.remove(decl_node); + const init_node = (if (maybe_literal == .string_literal_expr) t.transStringLiteralInitializer(init, maybe_literal.string_literal_expr, type_node) else t.transExprCoercing(scope, init, .used)) catch |err| switch (err) { + error.SelfReferential => { + self_referential = true; + break :init ZigTag.undefined_literal.init(); + }, error.UnsupportedTranslation, error.UnsupportedType => { return t.failDecl(scope, variable.name_tok, name, "unable to resolve var init expr", .{}); }, else => |e| return e, }; - if (!variable.qt.is(t.comp, .bool) and init_node.isBoolRes()) { - break :init try ZigTag.int_from_bool.create(t.arena, init_node); - } else { - break :init init_node; - } + break :init try t.toNonBool(init_node, variable.qt); } if (variable.storage_class == .@"extern") { if (array_ty != null and array_ty.?.len == .incomplete) { @@ -876,7 +976,7 @@ fn transVarDecl(t: *Translator, scope: *Scope, variable: Node.Variable) Error!vo const alignment: ?c_uint = variable.qt.requestedAlignment(t.comp) orelse null; var node = try ZigTag.var_decl.create(t.arena, .{ .is_pub = toplevel, - .is_const = is_const, + .is_const = is_const and !self_referential, .is_extern = is_extern, .is_export = toplevel and variable.storage_class == .auto and linkage == .strong, .is_threadlocal = variable.thread_local, @@ -894,6 +994,21 @@ fn transVarDecl(t: *Translator, scope: *Scope, variable: Node.Variable) Error!vo node = try ZigTag.wrapped_local.create(t.arena, .{ .name = name, .init = node }); } try scope.appendNode(node); + if (self_referential) { + const deferred_init = t.transExprCoercing(scope, variable.initializer.?, .used) catch |err| switch (err) { + error.SelfReferential => unreachable, + error.UnsupportedTranslation, error.UnsupportedType => { + return t.failDecl(scope, variable.name_tok, name, "unable to resolve var init expr", .{}); + }, + else => |e| return e, + }; + + const assign = try ZigTag.assign.create(t.arena, .{ + .lhs = try ZigTag.identifier.create(t.arena, name), + .rhs = try t.toNonBool(deferred_init, variable.qt), + }); + try scope.appendNode(assign); + } try bs.discardVariable(name); if (variable.qt.getAttribute(t.comp, .cleanup)) |cleanup_attr| { @@ -1001,6 +1116,7 @@ fn transEnumDecl(t: *Translator, scope: *Scope, enum_qt: QualType) Error!void { fn transStaticAssert(t: *Translator, scope: *Scope, static_assert: Node.StaticAssert) Error!void { const condition = t.transExpr(scope, static_assert.cond, .used) catch |err| switch (err) { + error.SelfReferential => unreachable, error.UnsupportedTranslation, error.UnsupportedType => { return try t.warn(&t.global_scope.base, static_assert.cond.tok(t.tree), "unable to translate _Static_assert condition", .{}); }, @@ -1084,21 +1200,17 @@ fn transType(t: *Translator, scope: *Scope, qt: QualType, source_loc: TokenIndex }, .float => |float_ty| switch (float_ty) { .fp16, .float16 => return ZigTag.type.create(t.arena, "f16"), - .float => return ZigTag.type.create(t.arena, "f32"), - .double => return ZigTag.type.create(t.arena, "f64"), - .long_double => return ZigTag.type.create(t.arena, "c_longdouble"), + .float, .float32 => return ZigTag.type.create(t.arena, "f32"), + .double, .float64, .float32x => return ZigTag.type.create(t.arena, "f64"), + .long_double, .float64x => return ZigTag.type.create(t.arena, "c_longdouble"), .float128 => return ZigTag.type.create(t.arena, "f128"), - .bf16, - .float32, - .float64, - .float32x, - .float64x, - .float128x, + .bf16 => return t.fail(error.UnsupportedType, source_loc, "TODO support bfloat16", .{}), .dfloat32, .dfloat64, .dfloat128, .dfloat64x, - => return t.fail(error.UnsupportedType, source_loc, "TODO support float type: '{s}'", .{try t.getTypeStr(qt)}), + => return t.fail(error.UnsupportedType, source_loc, "TODO support decimal float type: '{s}'", .{try t.getTypeStr(qt)}), + .float128x => unreachable, // Unsupported on all targets }, .pointer => |pointer_ty| { const child_qt = pointer_ty.child; @@ -1173,9 +1285,21 @@ fn transType(t: *Translator, scope: *Scope, qt: QualType, source_loc: TokenIndex return ZigTag.identifier.create(t.arena, name); }, .attributed => |attributed_ty| continue :loop attributed_ty.base.type(t.comp), - .typeof => |typeof_ty| continue :loop typeof_ty.base.type(t.comp), + .typeof => |typeof_ty| { + if (typeof_ty.expr) |expr| { + if (t.transExpr(scope, expr, .used)) |node| { + return ZigTag.typeof.create(t.arena, node); + } else |err| switch (err) { + error.SelfReferential => {}, + error.UnsupportedTranslation => {}, + error.UnsupportedType => {}, + error.OutOfMemory => return error.OutOfMemory, + } + } + continue :loop typeof_ty.base.type(t.comp); + }, .vector => |vector_ty| { - const len = try t.createNumberNode(vector_ty.len, .int); + const len = try t.createNumberNode(vector_ty.len); const elem_type = try t.transType(scope, vector_ty.elem, source_loc); return ZigTag.vector.create(t.arena, .{ .lhs = len, .rhs = elem_type }); }, @@ -1384,7 +1508,10 @@ fn transFnType( .is_var_args = switch (func_ty.kind) { .normal => false, .variadic => true, - .old_style => !ctx.is_export and !ctx.is_always_inline and !ctx.has_body, + .old_style => if (t.comp.target.cpu.arch.isWasm()) + false + else + !ctx.is_export and !ctx.is_always_inline and !ctx.has_body, }, .name = ctx.fn_name, .linksection_string = linksection_string, @@ -1468,7 +1595,7 @@ fn typeIsOpaque(t: *Translator, qt: QualType) bool { } fn typeWasDemotedToOpaque(t: *Translator, qt: QualType) bool { - return t.opaque_demotes.contains(qt); + return t.opaque_demotes.contains(qt.base(t.comp).qt); } fn typeHasWrappingOverflow(t: *Translator, qt: QualType) bool { @@ -1531,16 +1658,30 @@ fn transStmt(t: *Translator, scope: *Scope, stmt: Node.Index) TransError!ZigNode try t.transRecordDecl(scope, record_decl.container_qt); return ZigTag.declaration.init(); }, + .struct_forward_decl, .union_forward_decl => |record_decl| { + if (record_decl.definition) |some| { + return t.transStmt(scope, some); + } + try t.transRecordDecl(scope, record_decl.container_qt); + return ZigTag.declaration.init(); + }, .enum_decl => |enum_decl| { try t.transEnumDecl(scope, enum_decl.container_qt); return ZigTag.declaration.init(); }, + .enum_forward_decl => |enum_decl| { + if (enum_decl.definition) |some| { + return t.transStmt(scope, some); + } + try t.transEnumDecl(scope, enum_decl.container_qt); + return ZigTag.declaration.init(); + }, .function => |function| { try t.transFnDecl(scope, function); return ZigTag.declaration.init(); }, .variable => |variable| { - try t.transVarDecl(scope, variable); + try t.transVarDecl(scope, variable, stmt); return ZigTag.declaration.init(); }, .switch_stmt => |switch_stmt| return t.transSwitch(scope, switch_stmt), @@ -1562,7 +1703,10 @@ fn transCompoundStmtInline(t: *Translator, compound: Node.CompoundStmt, block: * const result = try t.transStmt(&block.base, stmt); switch (result.tag()) { .declaration, .empty_block => {}, - else => try block.statements.append(t.gpa, result), + else => { + try block.statements.append(t.gpa, result); + if (result.isNoreturn()) return; + }, } } } @@ -1578,12 +1722,9 @@ fn transReturnStmt(t: *Translator, scope: *Scope, return_stmt: Node.ReturnStmt) switch (return_stmt.operand) { .none => return ZigTag.return_void.init(), .expr => |operand| { - var rhs = try t.transExprCoercing(scope, operand, .used); + const rhs = try t.transExprCoercing(scope, operand, .used); const return_qt = scope.findBlockReturnType(); - if (rhs.isBoolRes() and !return_qt.is(t.comp, .bool)) { - rhs = try ZigTag.int_from_bool.create(t.arena, rhs); - } - return ZigTag.@"return".create(t.arena, rhs); + return ZigTag.@"return".create(t.arena, try t.toNonBool(rhs, return_qt)); }, .implicit => |zero| { if (zero) return ZigTag.@"return".create(t.arena, ZigTag.zero_literal.init()); @@ -1698,7 +1839,7 @@ fn transDoWhileStmt(t: *Translator, scope: *Scope, do_stmt: Node.DoWhileStmt) Tr }; var body_node = try t.transStmt(&loop_scope, do_stmt.body); - if (body_node.isNoreturn(true)) { + if (body_node.isNoreturn()) { // The body node ends in a noreturn statement. Simply put it in a while (true) // in case it contains breaks or continues. } else if (do_stmt.body.get(t.tree) == .compound_stmt) { @@ -1918,8 +2059,6 @@ fn transSwitchProngStmt( body: []const Node.Index, ) TransError!ZigNode { switch (stmt.get(t.tree)) { - .break_stmt => return ZigTag.@"break".init(), - .return_stmt => return t.transStmt(scope, stmt), .case_stmt, .default_stmt => unreachable, else => { var block_scope = try Scope.Block.init(t, scope, false); @@ -1940,15 +2079,6 @@ fn transSwitchProngStmtInline( ) TransError!void { for (body) |stmt| { switch (stmt.get(t.tree)) { - .return_stmt => { - const result = try t.transStmt(&block.base, stmt); - try block.statements.append(t.gpa, result); - return; - }, - .break_stmt => { - try block.statements.append(t.gpa, ZigTag.@"break".init()); - return; - }, .case_stmt => |case_stmt| { var sub = case_stmt.body; while (true) switch (sub.get(t.tree)) { @@ -1959,7 +2089,7 @@ fn transSwitchProngStmtInline( const result = try t.transStmt(&block.base, sub); assert(result.tag() != .declaration); try block.statements.append(t.gpa, result); - if (result.isNoreturn(true)) return; + if (result.isNoreturn()) return; }, .default_stmt => |default_stmt| { var sub = default_stmt.body; @@ -1971,18 +2101,16 @@ fn transSwitchProngStmtInline( const result = try t.transStmt(&block.base, sub); assert(result.tag() != .declaration); try block.statements.append(t.gpa, result); - if (result.isNoreturn(true)) return; - }, - .compound_stmt => |compound_stmt| { - const result = try t.transCompoundStmt(&block.base, compound_stmt); - try block.statements.append(t.gpa, result); - if (result.isNoreturn(true)) return; + if (result.isNoreturn()) return; }, else => { const result = try t.transStmt(&block.base, stmt); switch (result.tag()) { .declaration, .empty_block => {}, - else => try block.statements.append(t.gpa, result), + else => { + try block.statements.append(t.gpa, result); + if (result.isNoreturn()) return; + }, } }, } @@ -2015,7 +2143,14 @@ fn transExpr(t: *Translator, scope: *Scope, expr: Node.Index, used: ResultUsed) break :res try ZigTag.deref.create(t.arena, try t.transExpr(scope, deref_expr.operand, .used)); }, .bool_not_expr => |bool_not_expr| try ZigTag.not.create(t.arena, try t.transBoolExpr(scope, bool_not_expr.operand)), - .bit_not_expr => |bit_not_expr| try ZigTag.bit_not.create(t.arena, try t.transExpr(scope, bit_not_expr.operand, .used)), + .bit_not_expr => |bit_not_expr| try ZigTag.bit_not.create(t.arena, op: { + const operand = try t.transExpr(scope, bit_not_expr.operand, .used); + if (!operand.isBoolRes()) break :op operand; + + const casted = try ZigTag.int_from_bool.create(t.arena, operand); + const ty = try t.transType(scope, bit_not_expr.qt, bit_not_expr.op_tok); + break :op try ZigTag.as.create(t.arena, .{ .lhs = ty, .rhs = casted }); + }), .plus_expr => |plus_expr| return t.transExpr(scope, plus_expr.operand, used), .negate_expr => |negate_expr| res: { const operand_qt = negate_expr.operand.qt(t.tree); @@ -2109,8 +2244,8 @@ fn transExpr(t: *Translator, scope: *Scope, expr: Node.Index, used: ResultUsed) .shl_expr => |shl_expr| try t.transShiftExpr(scope, shl_expr, .shl), .shr_expr => |shr_expr| try t.transShiftExpr(scope, shr_expr, .shr), - .member_access_expr => |member_access| try t.transMemberAccess(scope, .normal, member_access, null), - .member_access_ptr_expr => |member_access| try t.transMemberAccess(scope, .ptr, member_access, null), + .member_access_expr => |member_access| try t.transMemberAccess(scope, .normal, member_access, null, .accessor), + .member_access_ptr_expr => |member_access| try t.transMemberAccess(scope, .ptr, member_access, null, .accessor), .array_access_expr => |array_access| try t.transArrayAccess(scope, array_access, null), .builtin_ref => unreachable, @@ -2195,6 +2330,10 @@ fn transExpr(t: *Translator, scope: *Scope, expr: Node.Index, used: ResultUsed) .builtin_convertvector => |convertvector| try t.transConvertvectorExpr(scope, convertvector), .builtin_shufflevector => |shufflevector| try t.transShufflevectorExpr(scope, shufflevector), + .builtin_va_arg_pack, .builtin_va_arg_pack_len => |va_arg_pack| { + return t.fail(error.UnsupportedTranslation, va_arg_pack.builtin_tok, "TODO va arg pack", .{}); + }, + .compound_stmt, .static_assert, .return_stmt, @@ -2293,6 +2432,12 @@ fn transBoolExpr(t: *Translator, scope: *Scope, expr: Node.Index) TransError!Zig return t.finishBoolExpr(expr.qt(t.tree), maybe_bool_res); } +fn toNonBool(t: *Translator, node: ZigNode, qt: QualType) Error!ZigNode { + if (!node.isBoolRes()) return node; + if (qt.is(t.comp, .bool)) return node; + return ZigTag.int_from_bool.create(t.arena, node); +} + fn finishBoolExpr(t: *Translator, qt: QualType, node: ZigNode) TransError!ZigNode { const sk = qt.scalarKind(t.comp); if (sk == .bool) return node; @@ -2385,8 +2530,22 @@ fn transCastExpr( else => {}, } - if (cast.operand.qt(t.tree).arrayLen(t.comp) == null) { - return try t.transExpr(scope, cast.operand, used); + // Flexible array members are translated as member functions returning + // [*c]T, so no address-of + @ptrCast wrapping is needed. + flexible: { + if (cast.operand.qt(t.tree).arrayLen(t.comp) == null) { + return try t.transExpr(scope, cast.operand, used); + } + + const member_index, const base_qt = switch (cast.operand.get(t.tree)) { + .member_access_expr => |ma| .{ ma.member_index, ma.base.qt(t.tree) }, + .member_access_ptr_expr => |ma| .{ ma.member_index, ma.base.qt(t.tree).childType(t.comp) }, + else => break :flexible, + }; + const record = base_qt.getRecord(t.comp) orelse break :flexible; + if (member_index != record.fields.len - 1 and base_qt.base(t.comp).type != .@"union") break :flexible; + const array_ty = record.fields[member_index].qt.get(t.comp, .array) orelse break :flexible; + if (t.isFlexibleArrayLen(array_ty.len)) return try t.transExpr(scope, cast.operand, used); } const sub_expr_node = try t.transExpr(scope, cast.operand, .used); @@ -2402,6 +2561,8 @@ fn transCastExpr( .lhs = try ZigTag.type.create(t.arena, "usize"), .rhs = try ZigTag.int_cast.create(t.arena, sub_expr_node), }); + } else if (sub_expr_node.isBoolRes()) { + sub_expr_node = try ZigTag.int_from_bool.create(t.arena, sub_expr_node); } break :int_to_pointer try ZigTag.ptr_from_int.create(t.arena, sub_expr_node); }, @@ -2560,6 +2721,8 @@ fn transPointerCastExpr(t: *Translator, scope: *Scope, expr: Node.Index) TransEr } fn transDeclRefExpr(t: *Translator, scope: *Scope, decl_ref: Node.DeclRef) TransError!ZigNode { + if (t.wip_var_inits.contains(decl_ref.decl)) return error.SelfReferential; + const name = t.tree.tokSlice(decl_ref.name_tok); const maybe_alias = scope.getAlias(name); const mangled_name = maybe_alias orelse name; @@ -2631,7 +2794,7 @@ fn transShiftExpr(t: *Translator, scope: *Scope, bin: Node.Binary, op_id: ZigTag // lhs >> @intCast(rh) const lhs = try t.transExpr(scope, bin.lhs, .used); - const rhs = try t.transExprCoercing(scope, bin.rhs, .used); + const rhs = try t.transExpr(scope, bin.rhs, .used); const rhs_casted = try ZigTag.int_cast.create(t.arena, rhs); return t.createBinOpNode(op_id, lhs, rhs_casted); @@ -2758,7 +2921,7 @@ fn transCommaExpr(t: *Translator, scope: *Scope, bin: Node.Binary, used: ResultU const rhs = try t.transExprCoercing(&block_scope.base, bin.rhs, .used); const break_node = try ZigTag.break_val.create(t.arena, .{ .label = block_scope.label, - .val = rhs, + .val = try t.toNonBool(rhs, bin.qt), }); try block_scope.statements.append(t.gpa, break_node); @@ -2768,14 +2931,10 @@ fn transCommaExpr(t: *Translator, scope: *Scope, bin: Node.Binary, used: ResultU fn transAssignExpr(t: *Translator, scope: *Scope, bin: Node.Binary, used: ResultUsed) !ZigNode { if (used == .unused) { const lhs = try t.transExpr(scope, bin.lhs, .used); - var rhs = try t.transExprCoercing(scope, bin.rhs, .used); + const rhs = try t.transExprCoercing(scope, bin.rhs, .used); const lhs_qt = bin.lhs.qt(t.tree); - if (rhs.isBoolRes() and !lhs_qt.is(t.comp, .bool)) { - rhs = try ZigTag.int_from_bool.create(t.arena, rhs); - } - - return t.createBinOpNode(.assign, lhs, rhs); + return t.createBinOpNode(.assign, lhs, try t.toNonBool(rhs, lhs_qt)); } var block_scope = try Scope.Block.init(t, scope, true); @@ -2783,13 +2942,12 @@ fn transAssignExpr(t: *Translator, scope: *Scope, bin: Node.Binary, used: Result const tmp = try block_scope.reserveMangledName("tmp"); - var rhs = try t.transExpr(&block_scope.base, bin.rhs, .used); + const rhs = try t.transExpr(&block_scope.base, bin.rhs, .used); const lhs_qt = bin.lhs.qt(t.tree); - if (rhs.isBoolRes() and !lhs_qt.is(t.comp, .bool)) { - rhs = try ZigTag.int_from_bool.create(t.arena, rhs); - } - - const tmp_decl = try ZigTag.var_simple.create(t.arena, .{ .name = tmp, .init = rhs }); + const tmp_decl = try ZigTag.var_simple.create(t.arena, .{ + .name = tmp, + .init = try t.toNonBool(rhs, lhs_qt), + }); try block_scope.statements.append(t.gpa, tmp_decl); const lhs = try t.transExprCoercing(&block_scope.base, bin.lhs, .used); @@ -3040,6 +3198,7 @@ fn transMemberAccess( kind: enum { normal, ptr }, member_access: Node.MemberAccess, opt_base: ?ZigNode, + flex_array_mode: enum { accessor, backing }, ) TransError!ZigNode { const base_info = switch (kind) { .normal => member_access.base.qt(t.tree), @@ -3068,8 +3227,14 @@ fn transMemberAccess( // Flexible array members are translated as member functions. if (member_access.member_index == record.fields.len - 1 or base_info.base(t.comp).type == .@"union") { if (field.qt.get(t.comp, .array)) |array_ty| { - if (array_ty.len == .incomplete or (array_ty.len == .fixed and array_ty.len.fixed == 0)) { - return ZigTag.call.create(t.arena, .{ .lhs = field_access, .args = &.{} }); + if (t.isFlexibleArrayLen(array_ty.len)) { + switch (flex_array_mode) { + .accessor => return ZigTag.call.create(t.arena, .{ .lhs = field_access, .args = &.{} }), + .backing => { + const backing_name = try std.fmt.allocPrint(t.arena, "_{s}", .{field_name}); + return ZigTag.field_access.create(t.arena, .{ .lhs = lhs, .field_name = backing_name }); + }, + } } } } @@ -3091,7 +3256,7 @@ fn transArrayAccess(t: *Translator, scope: *Scope, array_access: Node.ArrayAcces const index = index: { const index = try t.transExpr(scope, array_access.index, .used); const index_qt = array_access.index.qt(t.tree); - const maybe_bigger_than_usize = switch (index_qt.base(t.comp).type) { + const maybe_bigger_than_usize = type: switch (index_qt.base(t.comp).type) { .bool => { break :index try ZigTag.int_from_bool.create(t.arena, index); }, @@ -3100,6 +3265,7 @@ fn transArrayAccess(t: *Translator, scope: *Scope, array_access: Node.ArrayAcces else => false, }, .bit_int => |bit_int| bit_int.bits > t.comp.target.ptrBitWidth(), + .@"enum" => |e| if (e.tag) |tag| continue :type tag.base(t.comp).type else false, else => unreachable, }; @@ -3158,7 +3324,10 @@ fn transMemberDesignator(t: *Translator, scope: *Scope, arg: Node.Index) TransEr }, .member_access_expr => |access| { const base = try t.transMemberDesignator(scope, access.base); - return t.transMemberAccess(scope, .normal, access, base); + // In offsetof context, flexible array members must be accessed via + // the backing field (`_name`) rather than the accessor function, + // because you can't take the address of a function call result. + return t.transMemberAccess(scope, .normal, access, base, .backing); }, .cast => |cast| { assert(cast.kind == .array_to_pointer); @@ -3292,6 +3461,51 @@ fn transCall( const SuppressCast = enum { with_as, no_as }; +/// Attempt to translate literal as the name of the simple macro +/// it was expanded from. +fn checkLiteralMacro(t: *Translator, tok: TokenIndex, used: ResultUsed) !?ZigNode { + if (!t.keep_macro_literals) return null; + const expansion_locs = t.pp.expansionSlice(tok); + if (expansion_locs.len == 0) return null; + + const last_expand = expansion_locs[0]; + const source = t.comp.getSource(last_expand.id); + var tokenizer: aro.Tokenizer = .{ + .buf = source.buf, + .langopts = t.comp.langopts, + .source = last_expand.id, + .index = last_expand.byte_offset, + .splice_locs = &.{}, + }; + const name_tok = tokenizer.next(); + if (!name_tok.id.isMacroIdentifier()) return null; + + const name = t.pp.tokSlice(name_tok); + if (t.global_scope.containsNow(name)) return null; + const macro = t.pp.defines.get(name) orelse return null; + if (macro.is_func) return null; + if (macro.isBuiltin()) return null; + + var tok_count: u8 = 0; + for (macro.tokens) |macro_tok| { + switch (macro_tok.id) { + .invalid => continue, + .whitespace => continue, + .comment => continue, + .macro_ws => continue, + else => { + if (tok_count != 0) return null; + tok_count += 1; + }, + } + } + + if (t.checkTranslatableMacro(macro.tokens, macro.params) != null) return null; + + const ident = try ZigTag.identifier.create(t.arena, name); + return try t.maybeSuppressResult(used, ident); +} + fn transIntLiteral( t: *Translator, scope: *Scope, @@ -3299,6 +3513,7 @@ fn transIntLiteral( used: ResultUsed, suppress_as: SuppressCast, ) TransError!ZigNode { + if (try t.checkLiteralMacro(literal_index.tok(t.tree), used)) |node| return node; const val = t.tree.value_map.get(literal_index).?; const int_lit_node = try t.createIntNode(val); if (suppress_as == .no_as) { @@ -3325,6 +3540,7 @@ fn transCharLiteral( used: ResultUsed, suppress_as: SuppressCast, ) TransError!ZigNode { + if (try t.checkLiteralMacro(literal_index.tok(t.tree), used)) |node| return node; const val = t.tree.value_map.get(literal_index).?; const char_literal = literal_index.get(t.tree).char_literal; const narrow = char_literal.kind == .ascii or char_literal.kind == .utf8; @@ -3333,7 +3549,7 @@ fn transCharLiteral( // e.g. 'abcd' const int_value = val.toInt(u32, t.comp).?; const int_lit_node = if (char_literal.kind == .ascii and int_value > 255) - try t.createNumberNode(int_value, .int) + try t.createNumberNode(int_value) else try t.createCharLiteralNode(narrow, int_value); @@ -3357,12 +3573,16 @@ fn transFloatLiteral( used: ResultUsed, suppress_as: SuppressCast, ) TransError!ZigNode { + if (try t.checkLiteralMacro(literal_index.tok(t.tree), used)) |node| return node; const val = t.tree.value_map.get(literal_index).?; const float_literal = literal_index.get(t.tree).float_literal; var allocating: std.Io.Writer.Allocating = .init(t.gpa); defer allocating.deinit(); _ = val.print(float_literal.qt, t.comp, &allocating.writer) catch return error.OutOfMemory; + if (mem.findScalar(u8, allocating.written(), '.') == null) { + allocating.writer.writeAll(".0") catch return error.OutOfMemory; + } const float_lit_node = try ZigTag.float_literal.create(t.arena, try t.arena.dupe(u8, allocating.written())); if (suppress_as == .no_as) { @@ -3588,7 +3808,7 @@ fn transArrayInit( while (i < array_init.items.len) : (i += 1) { if (array_init.items[i].get(t.tree) == .array_filler_expr) break; const expr = try t.transExprCoercing(scope, array_init.items[i], .used); - try val_list.append(t.gpa, expr); + try val_list.append(t.gpa, try t.toNonBool(expr, array_item_qt)); } const array_type = try ZigTag.array_type.create(t.arena, .{ .elem_type = array_item_type, @@ -3638,7 +3858,7 @@ fn transUnionInit( const field_init = try t.arena.create(ast.Payload.ContainerInit.Initializer); field_init.* = .{ .name = field_name, - .value = try t.transExprCoercing(scope, init_expr, .used), + .value = try t.toNonBool(try t.transExprCoercing(scope, init_expr, .used), field.qt), }; const container_init = try ZigTag.container_init.create(t.arena, .{ .lhs = union_type, @@ -3669,7 +3889,7 @@ fn transStructInit( }).? else field.name.lookup(t.comp); init.* = .{ .name = field_name, - .value = try t.transExprCoercing(scope, field_expr, .used), + .value = try t.toNonBool(try t.transExprCoercing(scope, field_expr, .used), field.qt), }; } @@ -3766,7 +3986,7 @@ fn transConvertvectorExpr( for (items, 0..dest_vec_ty.len) |*item, i| { const value = try ZigTag.array_access.create(t.arena, .{ .lhs = tmp_ident, - .rhs = try t.createNumberNode(i, .int), + .rhs = try t.createNumberNode(i), }); if (src_elem_sk == .float and dest_elem_sk == .float) { @@ -3812,7 +4032,7 @@ fn transShufflevectorExpr( const mask_len = shufflevector.indexes.len; const mask_type = try ZigTag.vector.create(t.arena, .{ - .lhs = try t.createNumberNode(mask_len, .int), + .lhs = try t.createNumberNode(mask_len), .rhs = try ZigTag.type.create(t.arena, "i32"), }); @@ -3882,16 +4102,9 @@ fn createIntNode(t: *Translator, int: aro.Value) !ZigNode { return res; } -fn createNumberNode(t: *Translator, num: anytype, num_kind: enum { int, float }) !ZigNode { - const fmt_s = switch (@typeInfo(@TypeOf(num))) { - .int, .comptime_int => "{d}", - else => "{s}", - }; - const str = try std.fmt.allocPrint(t.arena, fmt_s, .{num}); - if (num_kind == .float) - return ZigTag.float_literal.create(t.arena, str) - else - return ZigTag.integer_literal.create(t.arena, str); +fn createNumberNode(t: *Translator, num: anytype) !ZigNode { + const str = try std.fmt.allocPrint(t.arena, "{d}", .{num}); + return ZigTag.integer_literal.create(t.arena, str); } fn createCharLiteralNode(t: *Translator, narrow: bool, val: u32) TransError!ZigNode { @@ -3953,6 +4166,25 @@ fn vectorTypeInfo(t: *Translator, vec_node: ZigNode, field: []const u8) TransErr return ZigTag.field_access.create(t.arena, .{ .lhs = vector_type_info, .field_name = field }); } +/// Returns true if the given array length qualifies as a flexible array member +/// under the current -fstrict-flex-arrays level. +fn isFlexibleArrayLen(t: *const Translator, len: anytype) bool { + return switch (t.strict_flex_arrays) { + .@"0" => true, + .@"1" => switch (len) { + .incomplete => true, + .fixed => |n| n <= 1, + else => false, + }, + .@"2" => switch (len) { + .incomplete => true, + .fixed => |n| n == 0, + else => false, + }, + .@"3" => len == .incomplete, + }; +} + /// Build a getter function for a flexible array field in a C record /// e.g. `T items[]` or `T items[0]`. The generated function returns a [*c] pointer /// to the flexible array with the correct const and volatile qualifiers @@ -3961,7 +4193,13 @@ fn createFlexibleMemberFn( member_name: []const u8, field_name: []const u8, ) Error!ZigNode { - const self_param_name = "self"; + // Use `_self` instead of the conventional `self` to avoid the Zig error + // "function parameter shadows declaration of 'self'". + // `processContainerMemberFns` merges C functions matching a struct's name + // prefix into the struct as `pub const` aliases (e.g. `foo_self()` becomes + // `pub const self = __root.foo_self`). A parameter also named `self` would + // then shadow that declaration, which Zig rejects. + const self_param_name = "_self"; const self_param = try ZigTag.identifier.create(t.arena, self_param_name); const self_type = try ZigTag.typeof.create(t.arena, self_param); diff --git a/lib/compiler/translate-c/ast.zig b/lib/compiler/translate-c/ast.zig @@ -50,6 +50,7 @@ pub const Node = extern union { break_val, @"return", field_access, + field_builtin, array_access, call, var_decl, @@ -371,6 +372,7 @@ pub const Node = extern union { .div_exact, .offset_of, .static_assert, + .field_builtin, => Payload.BinOp, .integer_literal, @@ -455,14 +457,14 @@ pub const Node = extern union { return .{ .ptr_otherwise = payload }; } - pub fn isNoreturn(node: Node, break_counts: bool) bool { - switch (node.tag()) { + pub fn isNoreturn(node: Node) bool { + return switch (node.tag()) { .block => { const block_node = node.castTag(.block).?; if (block_node.data.stmts.len == 0) return false; const last = block_node.data.stmts[block_node.data.stmts.len - 1]; - return last.isNoreturn(break_counts); + return last.isNoreturn(); }, .@"switch" => { const switch_node = node.castTag(.@"switch").?; @@ -475,15 +477,16 @@ pub const Node = extern union { else unreachable; - if (!body.isNoreturn(break_counts)) return false; + if (!body.isNoreturn()) return false; } return true; }, - .@"return", .return_void => return true, - .@"break" => if (break_counts) return true, - else => {}, - } - return false; + .@"return", .return_void => true, + .@"break" => true, + .@"continue" => true, + .@"unreachable" => true, + else => false, + }; } pub fn isBoolRes(res: Node) bool { @@ -2015,6 +2018,10 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex { const lhs = try renderNodeGrouped(c, payload.lhs); return renderFieldAccess(c, lhs, payload.field_name); }, + .field_builtin => { + const payload = node.castTag(.field_builtin).?.data; + return renderBuiltinCall(c, "@field", &.{ payload.lhs, payload.rhs }); + }, .@"struct", .@"union", .@"opaque" => return renderContainer(c, node), .enum_constant => { const payload = node.castTag(.enum_constant).?.data; @@ -2424,7 +2431,7 @@ fn renderNullSentinelArrayType(c: *Context, len: u64, elem_type: Node) !NodeInde fn addSemicolonIfNeeded(c: *Context, node: Node) !void { switch (node.tag()) { .warning => unreachable, - .var_decl, .var_simple, .arg_redecl, .alias, .block, .empty_block, .block_single, .@"switch", .wrapped_local, .mut_str => {}, + .static_assert, .var_decl, .var_simple, .arg_redecl, .alias, .block, .empty_block, .block_single, .@"switch", .wrapped_local, .mut_str => {}, .while_true => { const payload = node.castTag(.while_true).?.data; return addSemicolonIfNotBlock(c, payload); @@ -2532,6 +2539,8 @@ fn renderNodeGrouped(c: *Context, node: Node) !NodeIndex { .trunc, .floor, .root_ref, + .field_builtin, + .@"switch", => { // no grouping needed return renderNode(c, node); @@ -2594,7 +2603,6 @@ fn renderNodeGrouped(c: *Context, node: Node) !NodeIndex { .pub_var_simple, .enum_constant, .@"while", - .@"switch", .@"break", .break_val, .pub_inline_fn, diff --git a/lib/compiler/translate-c/main.zig b/lib/compiler/translate-c/main.zig @@ -1,15 +1,17 @@ const std = @import("std"); -const Io = std.Io; const assert = std.debug.assert; const mem = std.mem; const process = std.process; +const Io = std.Io; + const aro = @import("aro"); const compiler_util = @import("../util.zig"); + const Translator = @import("Translator.zig"); const fast_exit = @import("builtin").mode != .Debug; -pub fn main(init: std.process.Init) u8 { +pub fn main(init: process.Init) u8 { const gpa = init.gpa; const arena = init.arena.allocator(); const io = init.io; @@ -33,16 +35,20 @@ pub fn main(init: std.process.Init) u8 { var stderr = Io.File.stderr().writer(io, &stderr_buf); var diagnostics: aro.Diagnostics = switch (zig_integration) { false => .{ .output = .{ .to_writer = .{ - .mode = Io.Terminal.Mode.detect(io, stderr.file, NO_COLOR, CLICOLOR_FORCE) catch unreachable, + .mode = Io.Terminal.Mode.detect(io, stderr.file, NO_COLOR, CLICOLOR_FORCE) catch .no_color, .writer = &stderr.interface, } } }, - true => .{ .output = .{ .to_list = .{ - .arena = .init(gpa), - } } }, + true => .{ .output = .{ .to_list = .{ .arena = .init(gpa) } } }, }; defer diagnostics.deinit(); - var comp = aro.Compilation.initDefault(gpa, arena, io, &diagnostics, .cwd(), environ_map) catch |err| switch (err) { + var comp = aro.Compilation.init(.{ + .gpa = gpa, + .arena = arena, + .io = io, + .diagnostics = &diagnostics, + .environ_map = environ_map, + }) catch |err| switch (err) { error.OutOfMemory => { std.debug.print("ran out of memory initializing C compilation\n", .{}); if (fast_exit) process.exit(1); @@ -82,7 +88,6 @@ pub fn main(init: std.process.Init) u8 { return 1; }, }; - assert(comp.diagnostics.errors == 0 or !zig_integration); if (fast_exit) process.exit(@intFromBool(comp.diagnostics.errors != 0)); return @intFromBool(comp.diagnostics.errors != 0); @@ -107,10 +112,23 @@ pub const usage = \\Usage {s}: [options] file [CC options] \\ \\Options: - \\ --help Print this message - \\ --version Print translate-c version - \\ -fmodule-libs Import libraries as modules - \\ -fno-module-libs (default) Install libraries next to output file + \\ --help Print this message + \\ --version Print translate-c version + \\ -fmodule-libs Import libraries as modules + \\ -fno-module-libs (default) Install libraries next to output file + \\ -fpub-static (default) Translate static functions as pub + \\ -fno-pub-static Do not translate static functions as pub + \\ -ffunc-bodies (default) Translate function bodies + \\ -fno-func-bodies Do not translate function bodies + \\ -fkeep-macro-literals (default) Preserve macro names for literals + \\ -fno-keep-macro-literals Do not preserve macro names for literals + \\ -fdefault-init Default initialize struct fields + \\ -fno-default-init (default) Do not default initialize struct fields + \\ -fstrict-flex-arrays=<n> Control when to treat a trailing array as a flexible array member (default: 2) + \\ 0: any trailing array + \\ 1: size [0]/[1]/[] + \\ 2: size [0]/[] + \\ 3: [] only \\ \\ ; @@ -119,7 +137,14 @@ fn translate(d: *aro.Driver, tc: *aro.Toolchain, args: []const [:0]const u8, zig const gpa = d.comp.gpa; const io = d.comp.io; - var aro_args: std.ArrayList([:0]const u8) = .empty; + var module_libs = true; + var pub_static = true; + var func_bodies = true; + var keep_macro_literals = true; + var default_init = true; + var strict_flex_arrays: Translator.StrictFlexArraysLevel = .@"2"; + + var aro_args: std.ArrayList([:0]const u8) = try .initCapacity(gpa, args.len); defer aro_args.deinit(gpa); for (args, 0..) |arg, i| { @@ -139,8 +164,34 @@ fn translate(d: *aro.Driver, tc: *aro.Toolchain, args: []const [:0]const u8, zig } else if (mem.eql(u8, arg, "--zig-integration")) { if (i != 1 or !zig_integration) return d.fatal("--zig-integration must be the first argument", .{}); + } else if (mem.eql(u8, arg, "-fmodule-libs")) { + module_libs = true; + } else if (mem.eql(u8, arg, "-fno-module-libs")) { + module_libs = false; + } else if (mem.eql(u8, arg, "-fpub-static")) { + pub_static = true; + } else if (mem.eql(u8, arg, "-fno-pub-static")) { + pub_static = false; + } else if (mem.eql(u8, arg, "-ffunc-bodies")) { + func_bodies = true; + } else if (mem.eql(u8, arg, "-fno-func-bodies")) { + func_bodies = false; + } else if (mem.eql(u8, arg, "-fkeep-macro-literals")) { + keep_macro_literals = true; + } else if (mem.eql(u8, arg, "-fno-keep-macro-literals")) { + keep_macro_literals = false; + } else if (mem.eql(u8, arg, "-fdefault-init")) { + default_init = true; + } else if (mem.eql(u8, arg, "-fno-default-init")) { + default_init = false; + } else if (mem.startsWith(u8, arg, "-fstrict-flex-arrays=")) { + const val_str = arg["-fstrict-flex-arrays=".len..]; + if (val_str.len != 1 or val_str[0] < '0' or val_str[0] > '3') { + return d.fatal("-fstrict-flex-arrays= requires a value of '0', '1', '2', or '3'", .{}); + } + strict_flex_arrays = @enumFromInt(val_str[0] - '0'); } else { - try aro_args.append(gpa, arg); + aro_args.appendAssumeCapacity(arg); } } const user_macros = macros: { @@ -148,7 +199,7 @@ fn translate(d: *aro.Driver, tc: *aro.Toolchain, args: []const [:0]const u8, zig defer macro_buf.deinit(gpa); var discard_buf: [256]u8 = undefined; - var discarding: std.Io.Writer.Discarding = .init(&discard_buf); + var discarding: Io.Writer.Discarding = .init(&discard_buf); assert(!try d.parseArgs(&discarding.writer, &macro_buf, aro_args.items)); if (macro_buf.items.len > std.math.maxInt(u32)) { return d.fatal("user provided macro source exceeded max size", .{}); @@ -185,7 +236,9 @@ fn translate(d: *aro.Driver, tc: *aro.Toolchain, args: []const [:0]const u8, zig else => |e| return e, }; - var pp = try aro.Preprocessor.initDefault(d.comp); + var pp = try aro.Preprocessor.init(d.comp, .{ + .base_file = source.id, + }); defer pp.deinit(); var name_buf: [std.fs.max_name_bytes]u8 = undefined; @@ -235,6 +288,12 @@ fn translate(d: *aro.Driver, tc: *aro.Toolchain, args: []const [:0]const u8, zig .comp = d.comp, .pp = &pp, .tree = &c_tree, + .module_libs = module_libs, + .pub_static = pub_static, + .func_bodies = func_bodies, + .keep_macro_literals = keep_macro_literals, + .default_init = default_init, + .strict_flex_arrays = strict_flex_arrays, }); defer gpa.free(rendered_zig); diff --git a/lib/std/zig/c_translation/helpers.zig b/lib/std/zig/c_translation/helpers.zig @@ -81,15 +81,20 @@ fn ToUnsigned(comptime T: type) type { } /// Constructs a [*c] pointer with the const and volatile annotations -/// from Self for pointing to a C flexible array of Element. -pub fn FlexibleArrayType(comptime Self: type, comptime Element: type) type { - return switch (@typeInfo(Self)) { - .pointer => |ptr| @Pointer(.c, .{ - .@"const" = ptr.is_const, - .@"volatile" = ptr.is_volatile, - }, Element, null), - else => |info| @compileError("Invalid self type \"" ++ @tagName(info) ++ "\" for flexible array getter: " ++ @typeName(Self)), - }; +/// from SelfType for pointing to a C flexible array of ElementType. +pub fn FlexibleArrayType(comptime SelfType: type, comptime ElementType: type) type { + switch (@typeInfo(SelfType)) { + .pointer => |ptr| { + return @Pointer(.c, .{ + .@"const" = ptr.is_const, + .@"volatile" = ptr.is_volatile, + .@"allowzero" = true, + .@"addrspace" = .generic, + .@"align" = null, + }, ElementType, null); + }, + else => |info| @compileError("Invalid self type \"" ++ @tagName(info) ++ "\" for flexible array getter: " ++ @typeName(SelfType)), + } } /// Promote the type of an integer literal until it fits as C would. diff --git a/src/libs/mingw.zig b/src/libs/mingw.zig @@ -279,7 +279,13 @@ pub fn buildImportLib(comp: *Compilation, lib_name: []const u8) !void { .output = .{ .to_list = .{ .arena = .init(gpa) } }, }; defer diagnostics.deinit(); - var aro_comp = aro.Compilation.init(gpa, arena, io, &diagnostics, Io.Dir.cwd()); + var aro_comp = try aro.Compilation.init(.{ + .gpa = gpa, + .arena = arena, + .io = io, + .diagnostics = &diagnostics, + .environ_map = null, + }); defer aro_comp.deinit(); aro_comp.target = .fromZigTarget(target.*); @@ -304,7 +310,7 @@ pub fn buildImportLib(comp: *Compilation, lib_name: []const u8) !void { const builtin_macros = try aro_comp.generateBuiltinMacros(.include_system_defines); const def_file_source = try aro_comp.addSourceFromPath(def_file_path); - var pp = aro.Preprocessor.init(&aro_comp, .{ .provided = 0 }); + var pp = try aro.Preprocessor.init(&aro_comp, .{ .base_file = .unused }); defer pp.deinit(); pp.linemarkers = .none; pp.preserve_whitespace = true;