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:
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, ¯o_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, ¯o_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;