authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-04-11 14:34:23-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-04-11 15:17:46-07:00
log68bf81432cd0bafc355821370268eedc91ed8eb7
treec994fd653f8d282feacc5bd06ebb25ebfc6ec9bb
parentbc08199ef1f9419b5b8ed4165458783314934266

update aro to latest

upstream commit 5f5a050569a95ecc40a426f0c3666ae7ef987ede

32 files changed, 3686 insertions(+), 2540 deletions(-)

lib/compiler/aro/aro/Attribute.zig+202-116
...@@ -7,7 +7,9 @@ const Diagnostics = @import("Diagnostics.zig");...@@ -7,7 +7,9 @@ const Diagnostics = @import("Diagnostics.zig");
7const Parser = @import("Parser.zig");7const Parser = @import("Parser.zig");
8const Tree = @import("Tree.zig");8const Tree = @import("Tree.zig");
9const TokenIndex = Tree.TokenIndex;9const TokenIndex = Tree.TokenIndex;
10const QualType = @import("TypeStore.zig").QualType;10const TypeStore = @import("TypeStore.zig");
11const Type = TypeStore.Type;
12const QualType = TypeStore.QualType;
11const Value = @import("Value.zig");13const Value = @import("Value.zig");
1214
13const Attribute = @This();15const Attribute = @This();
...@@ -341,7 +343,6 @@ fn diagnoseField(...@@ -341,7 +343,6 @@ fn diagnoseField(
341343
342pub fn diagnose(attr: Tag, arguments: *Arguments, arg_idx: u32, res: Parser.Result, arg_start: TokenIndex, node: Tree.Node, p: *Parser) !bool {344pub fn diagnose(attr: Tag, arguments: *Arguments, arg_idx: u32, res: Parser.Result, arg_start: TokenIndex, node: Tree.Node, p: *Parser) !bool {
343 switch (attr) {345 switch (attr) {
344 .nonnull => return false,
345 inline else => |tag| {346 inline else => |tag| {
346 const decl = @typeInfo(attributes).@"struct".decls[@intFromEnum(tag)];347 const decl = @typeInfo(attributes).@"struct".decls[@intFromEnum(tag)];
347 const max_arg_count = comptime maxArgCount(tag);348 const max_arg_count = comptime maxArgCount(tag);
...@@ -529,7 +530,10 @@ const attributes = struct {...@@ -529,7 +530,10 @@ const attributes = struct {
529 pub const @"noinline" = struct {};530 pub const @"noinline" = struct {};
530 pub const noipa = struct {};531 pub const noipa = struct {};
531 // TODO: arbitrary number of arguments532 // TODO: arbitrary number of arguments
532 pub const nonnull = struct {};533 // const nonnull = struct {
534 // // arg_index: []const u32,
535 // };
536 // };
533 pub const nonstring = struct {};537 pub const nonstring = struct {};
534 pub const noplt = struct {};538 pub const noplt = struct {};
535 pub const @"noreturn" = struct {};539 pub const @"noreturn" = struct {};
...@@ -577,6 +581,7 @@ const attributes = struct {...@@ -577,6 +581,7 @@ const attributes = struct {
577 };581 };
578 } = null,582 } = null,
579 };583 };
584 pub const single = struct {};
580 pub const spectre = struct {585 pub const spectre = struct {
581 arg: enum {586 arg: enum {
582 nomitigation,587 nomitigation,
...@@ -618,6 +623,7 @@ const attributes = struct {...@@ -618,6 +623,7 @@ const attributes = struct {
618 __name_tok: TokenIndex,623 __name_tok: TokenIndex,
619 };624 };
620 pub const uninitialized = struct {};625 pub const uninitialized = struct {};
626 pub const unsafe_indexable = struct {};
621 pub const unsequenced = struct {};627 pub const unsequenced = struct {};
622 pub const unused = struct {};628 pub const unused = struct {};
623 pub const used = struct {};629 pub const used = struct {};
...@@ -723,6 +729,7 @@ pub const Arguments = blk: {...@@ -723,6 +729,7 @@ pub const Arguments = blk: {
723 name.* = decl.name;729 name.* = decl.name;
724 T.* = @field(attributes, decl.name);730 T.* = @field(attributes, decl.name);
725 }731 }
732
726 break :blk @Union(.auto, null, &names, &types, &@splat(.{}));733 break :blk @Union(.auto, null, &names, &types, &@splat(.{}));
727};734};
728735
...@@ -784,15 +791,8 @@ fn ignoredAttrErr(p: *Parser, tok: TokenIndex, attr: Attribute.Tag, context: []c...@@ -784,15 +791,8 @@ fn ignoredAttrErr(p: *Parser, tok: TokenIndex, attr: Attribute.Tag, context: []c
784 try p.err(tok, .ignored_attribute, .{ @tagName(attr), context });791 try p.err(tok, .ignored_attribute, .{ @tagName(attr), context });
785}792}
786793
787pub fn applyParameterAttributes(p: *Parser, qt: QualType, attr_buf_start: usize, diagnostic: ?Parser.Diagnostic) !QualType {794pub const applyParameterAttributes = applyVariableAttributes;
788 return applyVariableOrParameterAttributes(p, qt, attr_buf_start, diagnostic, .parameter);
789}
790
791pub fn applyVariableAttributes(p: *Parser, qt: QualType, attr_buf_start: usize, diagnostic: ?Parser.Diagnostic) !QualType {795pub fn applyVariableAttributes(p: *Parser, qt: QualType, attr_buf_start: usize, diagnostic: ?Parser.Diagnostic) !QualType {
792 return applyVariableOrParameterAttributes(p, qt, attr_buf_start, diagnostic, .variable);
793}
794
795fn applyVariableOrParameterAttributes(p: *Parser, qt: QualType, attr_buf_start: usize, diagnostic: ?Parser.Diagnostic, context: enum { parameter, variable }) !QualType {
796 const gpa = p.comp.gpa;796 const gpa = p.comp.gpa;
797 const attrs = p.attr_buf.items(.attr)[attr_buf_start..];797 const attrs = p.attr_buf.items(.attr)[attr_buf_start..];
798 const toks = p.attr_buf.items(.tok)[attr_buf_start..];798 const toks = p.attr_buf.items(.tok)[attr_buf_start..];
...@@ -804,6 +804,7 @@ fn applyVariableOrParameterAttributes(p: *Parser, qt: QualType, attr_buf_start:...@@ -804,6 +804,7 @@ fn applyVariableOrParameterAttributes(p: *Parser, qt: QualType, attr_buf_start:
804 // zig fmt: off804 // zig fmt: off
805 .alias, .may_alias, .deprecated, .unavailable, .unused, .warn_if_not_aligned, .weak, .used,805 .alias, .may_alias, .deprecated, .unavailable, .unused, .warn_if_not_aligned, .weak, .used,
806 .noinit, .retain, .persistent, .section, .mode, .asm_label, .nullability, .unaligned, .selectany, .internal_linkage,806 .noinit, .retain, .persistent, .section, .mode, .asm_label, .nullability, .unaligned, .selectany, .internal_linkage,
807 .visibility,
807 => try p.attr_application_buf.append(gpa, attr),808 => try p.attr_application_buf.append(gpa, attr),
808 // zig fmt: on809 // zig fmt: on
809 .common => if (nocommon) {810 .common => if (nocommon) {
...@@ -820,12 +821,6 @@ fn applyVariableOrParameterAttributes(p: *Parser, qt: QualType, attr_buf_start:...@@ -820,12 +821,6 @@ fn applyVariableOrParameterAttributes(p: *Parser, qt: QualType, attr_buf_start:
820 },821 },
821 .vector_size => try attr.applyVectorSize(p, tok, &base_qt),822 .vector_size => try attr.applyVectorSize(p, tok, &base_qt),
822 .aligned => try attr.applyAligned(p, base_qt, diagnostic),823 .aligned => try attr.applyAligned(p, base_qt, diagnostic),
823 .nonnull => {
824 switch (context) {
825 .parameter => try p.err(tok, .attribute_todo, .{ "nonnull", "parameters" }),
826 .variable => try p.err(tok, .nonnull_not_applicable, .{}),
827 }
828 },
829 .nonstring => {824 .nonstring => {
830 if (base_qt.get(p.comp, .array)) |array_ty| {825 if (base_qt.get(p.comp, .array)) |array_ty| {
831 if (array_ty.elem.get(p.comp, .int)) |int_ty| switch (int_ty) {826 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:...@@ -848,11 +843,28 @@ fn applyVariableOrParameterAttributes(p: *Parser, qt: QualType, attr_buf_start:
848 } else {843 } else {
849 try p.attr_application_buf.append(gpa, attr);844 try p.attr_application_buf.append(gpa, attr);
850 },845 },
851 .calling_convention => try applyCallingConvention(attr, p, tok, base_qt),846 .single,
847 .unsafe_indexable,
848 => try applyBoundsSafetyAttr(.fromTag(attr.tag), p, tok, &base_qt),
849
850 .calling_convention => try applyKeywordCallingConvention(attr, p, tok, base_qt),
851
852 .fastcall,
853 .stdcall,
854 .thiscall,
855 .vectorcall,
856 .cdecl,
857 .pcs,
858 .riscv_vector_cc,
859 .aarch64_sve_pcs,
860 .aarch64_vector_pcs,
861 .sysv_abi,
862 .ms_abi,
863 => try applyGnuAttrCallingConvention(attr, p, tok, base_qt),
864
852 .alloc_size,865 .alloc_size,
853 .copy,866 .copy,
854 .tls_model,867 .tls_model,
855 .visibility,
856 => |t| try p.err(tok, .attribute_todo, .{ @tagName(t), "variables" }),868 => |t| try p.err(tok, .attribute_todo, .{ @tagName(t), "variables" }),
857 // There is already an error in Parser for _Noreturn keyword869 // There is already an error in Parser for _Noreturn keyword
858 .noreturn => if (attr.syntax != .keyword) try ignoredAttrErr(p, tok, attr.tag, "variables"),870 .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...@@ -903,7 +915,25 @@ pub fn applyTypeAttributes(p: *Parser, qt: QualType, attr_buf_start: usize, diag
903 } else {915 } else {
904 try p.err(tok, .designated_init_invalid, .{});916 try p.err(tok, .designated_init_invalid, .{});
905 },917 },
906 .calling_convention => try applyCallingConvention(attr, p, tok, base_qt),918 .calling_convention => try applyKeywordCallingConvention(attr, p, tok, base_qt),
919
920 .fastcall,
921 .stdcall,
922 .thiscall,
923 .vectorcall,
924 .cdecl,
925 .pcs,
926 .riscv_vector_cc,
927 .aarch64_sve_pcs,
928 .aarch64_vector_pcs,
929 .sysv_abi,
930 .ms_abi,
931 => try applyGnuAttrCallingConvention(attr, p, tok, base_qt),
932
933 .single,
934 .unsafe_indexable,
935 => try applyBoundsSafetyAttr(.fromTag(attr.tag), p, tok, &base_qt),
936
907 .alloc_size,937 .alloc_size,
908 .copy,938 .copy,
909 .scalar_storage_order,939 .scalar_storage_order,
...@@ -931,6 +961,7 @@ pub fn applyFunctionAttributes(p: *Parser, qt: QualType, attr_buf_start: usize)...@@ -931,6 +961,7 @@ pub fn applyFunctionAttributes(p: *Parser, qt: QualType, attr_buf_start: usize)
931 .@"const", .warn_unused_result, .section, .returns_nonnull, .returns_twice, .@"error",961 .@"const", .warn_unused_result, .section, .returns_nonnull, .returns_twice, .@"error",
932 .externally_visible, .retain, .flatten, .gnu_inline, .alias, .asm_label, .nodiscard,962 .externally_visible, .retain, .flatten, .gnu_inline, .alias, .asm_label, .nodiscard,
933 .reproducible, .unsequenced, .nothrow, .nullability, .unaligned, .internal_linkage,963 .reproducible, .unsequenced, .nothrow, .nullability, .unaligned, .internal_linkage,
964 .visibility,
934 => try p.attr_application_buf.append(gpa, attr),965 => try p.attr_application_buf.append(gpa, attr),
935 // zig fmt: on966 // zig fmt: on
936 .hot => if (cold) {967 .hot => if (cold) {
...@@ -959,97 +990,21 @@ pub fn applyFunctionAttributes(p: *Parser, qt: QualType, attr_buf_start: usize)...@@ -959,97 +990,21 @@ pub fn applyFunctionAttributes(p: *Parser, qt: QualType, attr_buf_start: usize)
959 },990 },
960 .aligned => try attr.applyAligned(p, base_qt, null),991 .aligned => try attr.applyAligned(p, base_qt, null),
961 .format => try attr.applyFormat(p, base_qt),992 .format => try attr.applyFormat(p, base_qt),
962 .calling_convention => try applyCallingConvention(attr, p, tok, base_qt),993 .calling_convention => try applyKeywordCallingConvention(attr, p, tok, base_qt),
963 .fastcall => if (p.comp.target.cpu.arch == .x86) {994
964 try p.attr_application_buf.append(gpa, .{995 .fastcall,
965 .tag = .calling_convention,996 .stdcall,
966 .args = .{ .calling_convention = .{ .cc = .fastcall } },997 .thiscall,
967 .syntax = attr.syntax,998 .vectorcall,
968 });999 .cdecl,
969 } else {1000 .pcs,
970 try p.err(tok, .callconv_not_supported, .{"fastcall"});1001 .riscv_vector_cc,
971 },1002 .aarch64_sve_pcs,
972 .stdcall => if (p.comp.target.cpu.arch == .x86) {1003 .aarch64_vector_pcs,
973 try p.attr_application_buf.append(gpa, .{1004 .sysv_abi,
974 .tag = .calling_convention,1005 .ms_abi,
975 .args = .{ .calling_convention = .{ .cc = .stdcall } },1006 => try applyGnuAttrCallingConvention(attr, p, tok, base_qt),
976 .syntax = attr.syntax,1007
977 });
978 } else {
979 try p.err(tok, .callconv_not_supported, .{"stdcall"});
980 },
981 .thiscall => if (p.comp.target.cpu.arch == .x86) {
982 try p.attr_application_buf.append(gpa, .{
983 .tag = .calling_convention,
984 .args = .{ .calling_convention = .{ .cc = .thiscall } },
985 .syntax = attr.syntax,
986 });
987 } else {
988 try p.err(tok, .callconv_not_supported, .{"thiscall"});
989 },
990 .vectorcall => if (p.comp.target.cpu.arch == .x86 or p.comp.target.cpu.arch.isAARCH64()) {
991 try p.attr_application_buf.append(gpa, .{
992 .tag = .calling_convention,
993 .args = .{ .calling_convention = .{ .cc = .vectorcall } },
994 .syntax = attr.syntax,
995 });
996 } else {
997 try p.err(tok, .callconv_not_supported, .{"vectorcall"});
998 },
999 .cdecl => {},
1000 .pcs => if (p.comp.target.cpu.arch.isArm()) {
1001 try p.attr_application_buf.append(gpa, .{
1002 .tag = .calling_convention,
1003 .args = .{ .calling_convention = .{ .cc = switch (attr.args.pcs.kind) {
1004 .aapcs => .arm_aapcs,
1005 .@"aapcs-vfp" => .arm_aapcs_vfp,
1006 } } },
1007 .syntax = attr.syntax,
1008 });
1009 } else {
1010 try p.err(tok, .callconv_not_supported, .{"pcs"});
1011 },
1012 .riscv_vector_cc => if (p.comp.target.cpu.arch.isRISCV()) {
1013 try p.attr_application_buf.append(gpa, .{
1014 .tag = .calling_convention,
1015 .args = .{ .calling_convention = .{ .cc = .riscv_vector } },
1016 .syntax = attr.syntax,
1017 });
1018 } else {
1019 try p.err(tok, .callconv_not_supported, .{"pcs"});
1020 },
1021 .aarch64_sve_pcs => if (p.comp.target.cpu.arch.isAARCH64()) {
1022 try p.attr_application_buf.append(gpa, .{
1023 .tag = .calling_convention,
1024 .args = .{ .calling_convention = .{ .cc = .aarch64_sve_pcs } },
1025 .syntax = attr.syntax,
1026 });
1027 } else {
1028 try p.err(tok, .callconv_not_supported, .{"pcs"});
1029 },
1030 .aarch64_vector_pcs => if (p.comp.target.cpu.arch.isAARCH64()) {
1031 try p.attr_application_buf.append(gpa, .{
1032 .tag = .calling_convention,
1033 .args = .{ .calling_convention = .{ .cc = .aarch64_vector_pcs } },
1034 .syntax = attr.syntax,
1035 });
1036 } else {
1037 try p.err(tok, .callconv_not_supported, .{"pcs"});
1038 },
1039 .sysv_abi => if (p.comp.target.cpu.arch == .x86_64 and p.comp.target.os.tag == .windows) {
1040 try p.attr_application_buf.append(gpa, .{
1041 .tag = .calling_convention,
1042 .args = .{ .calling_convention = .{ .cc = .x86_64_sysv } },
1043 .syntax = attr.syntax,
1044 });
1045 },
1046 .ms_abi => if (p.comp.target.cpu.arch == .x86_64 and p.comp.target.os.tag != .windows) {
1047 try p.attr_application_buf.append(gpa, .{
1048 .tag = .calling_convention,
1049 .args = .{ .calling_convention = .{ .cc = .x86_64_win } },
1050 .syntax = attr.syntax,
1051 });
1052 },
1053 .malloc => {1008 .malloc => {
1054 if (base_qt.get(p.comp, .func).?.return_type.isPointer(p.comp)) {1009 if (base_qt.get(p.comp, .func).?.return_type.isPointer(p.comp)) {
1055 try p.attr_application_buf.append(gpa, attr);1010 try p.attr_application_buf.append(gpa, attr);
...@@ -1102,7 +1057,7 @@ pub fn applyFunctionAttributes(p: *Parser, qt: QualType, attr_buf_start: usize)...@@ -1102,7 +1057,7 @@ pub fn applyFunctionAttributes(p: *Parser, qt: QualType, attr_buf_start: usize)
1102 .no_stack_protector,1057 .no_stack_protector,
1103 .noclone,1058 .noclone,
1104 .noipa,1059 .noipa,
1105 .nonnull,1060 // .nonnull,
1106 .noplt,1061 .noplt,
1107 // .optimize,1062 // .optimize,
1108 .patchable_function_entry,1063 .patchable_function_entry,
...@@ -1112,7 +1067,6 @@ pub fn applyFunctionAttributes(p: *Parser, qt: QualType, attr_buf_start: usize)...@@ -1112,7 +1067,6 @@ pub fn applyFunctionAttributes(p: *Parser, qt: QualType, attr_buf_start: usize)
1112 .symver,1067 .symver,
1113 .target,1068 .target,
1114 .target_clones,1069 .target_clones,
1115 .visibility,
1116 .weakref,1070 .weakref,
1117 .zero_call_used_regs,1071 .zero_call_used_regs,
1118 => |t| try p.err(tok, .attribute_todo, .{ @tagName(t), "functions" }),1072 => |t| try p.err(tok, .attribute_todo, .{ @tagName(t), "functions" }),
...@@ -1262,9 +1216,129 @@ fn applyFormat(attr: Attribute, p: *Parser, qt: QualType) !void {...@@ -1262,9 +1216,129 @@ fn applyFormat(attr: Attribute, p: *Parser, qt: QualType) !void {
1262 try p.attr_application_buf.append(p.comp.gpa, attr);1216 try p.attr_application_buf.append(p.comp.gpa, attr);
1263}1217}
12641218
1265fn applyCallingConvention(attr: Attribute, p: *Parser, tok: TokenIndex, qt: QualType) !void {1219/// These come from GNU attributes like __attribute__((sysv_abi))
1266 if (!qt.is(p.comp, .func)) {1220fn applyGnuAttrCallingConvention(attr: Attribute, p: *Parser, tok: TokenIndex, qt: QualType) !void {
1267 return p.err(tok, .callconv_non_func, .{ p.tok_ids[tok].symbol(), qt });1221 if (!qt.isCallable(p.comp)) {
1222 return p.err(tok, .callconv_non_func, .{ p.tokSlice(tok), qt });
1223 }
1224 const gpa = p.comp.gpa;
1225 switch (attr.tag) {
1226 .fastcall => if (p.comp.target.cpu.arch == .x86) {
1227 try p.attr_application_buf.append(gpa, .{
1228 .tag = .calling_convention,
1229 .args = .{ .calling_convention = .{ .cc = .fastcall } },
1230 .syntax = attr.syntax,
1231 });
1232 } else {
1233 try p.err(tok, .callconv_not_supported, .{"fastcall"});
1234 },
1235 .stdcall => if (p.comp.target.cpu.arch == .x86) {
1236 try p.attr_application_buf.append(gpa, .{
1237 .tag = .calling_convention,
1238 .args = .{ .calling_convention = .{ .cc = .stdcall } },
1239 .syntax = attr.syntax,
1240 });
1241 } else {
1242 try p.err(tok, .callconv_not_supported, .{"stdcall"});
1243 },
1244 .thiscall => if (p.comp.target.cpu.arch == .x86) {
1245 try p.attr_application_buf.append(gpa, .{
1246 .tag = .calling_convention,
1247 .args = .{ .calling_convention = .{ .cc = .thiscall } },
1248 .syntax = attr.syntax,
1249 });
1250 } else {
1251 try p.err(tok, .callconv_not_supported, .{"thiscall"});
1252 },
1253 .vectorcall => if (p.comp.target.cpu.arch == .x86 or p.comp.target.cpu.arch.isAARCH64()) {
1254 try p.attr_application_buf.append(gpa, .{
1255 .tag = .calling_convention,
1256 .args = .{ .calling_convention = .{ .cc = .vectorcall } },
1257 .syntax = attr.syntax,
1258 });
1259 } else {
1260 try p.err(tok, .callconv_not_supported, .{"vectorcall"});
1261 },
1262 .cdecl => {},
1263 .pcs => if (p.comp.target.cpu.arch.isArm()) {
1264 try p.attr_application_buf.append(gpa, .{
1265 .tag = .calling_convention,
1266 .args = .{ .calling_convention = .{ .cc = switch (attr.args.pcs.kind) {
1267 .aapcs => .arm_aapcs,
1268 .@"aapcs-vfp" => .arm_aapcs_vfp,
1269 } } },
1270 .syntax = attr.syntax,
1271 });
1272 } else {
1273 try p.err(tok, .callconv_not_supported, .{"pcs"});
1274 },
1275 .riscv_vector_cc => if (p.comp.target.cpu.arch.isRISCV()) {
1276 try p.attr_application_buf.append(gpa, .{
1277 .tag = .calling_convention,
1278 .args = .{ .calling_convention = .{ .cc = .riscv_vector } },
1279 .syntax = attr.syntax,
1280 });
1281 } else {
1282 try p.err(tok, .callconv_not_supported, .{"pcs"});
1283 },
1284 .aarch64_sve_pcs => if (p.comp.target.cpu.arch.isAARCH64()) {
1285 try p.attr_application_buf.append(gpa, .{
1286 .tag = .calling_convention,
1287 .args = .{ .calling_convention = .{ .cc = .aarch64_sve_pcs } },
1288 .syntax = attr.syntax,
1289 });
1290 } else {
1291 try p.err(tok, .callconv_not_supported, .{"pcs"});
1292 },
1293 .aarch64_vector_pcs => if (p.comp.target.cpu.arch.isAARCH64()) {
1294 try p.attr_application_buf.append(gpa, .{
1295 .tag = .calling_convention,
1296 .args = .{ .calling_convention = .{ .cc = .aarch64_vector_pcs } },
1297 .syntax = attr.syntax,
1298 });
1299 } else {
1300 try p.err(tok, .callconv_not_supported, .{"pcs"});
1301 },
1302 .sysv_abi => if (p.comp.target.cpu.arch == .x86_64 and p.comp.target.os.tag == .windows) {
1303 try p.attr_application_buf.append(gpa, .{
1304 .tag = .calling_convention,
1305 .args = .{ .calling_convention = .{ .cc = .x86_64_sysv } },
1306 .syntax = attr.syntax,
1307 });
1308 },
1309 .ms_abi => if (p.comp.target.cpu.arch == .x86_64 and p.comp.target.os.tag != .windows) {
1310 try p.attr_application_buf.append(gpa, .{
1311 .tag = .calling_convention,
1312 .args = .{ .calling_convention = .{ .cc = .x86_64_win } },
1313 .syntax = attr.syntax,
1314 });
1315 },
1316 else => unreachable,
1317 }
1318}
1319
1320fn applyBoundsSafetyAttr(bounds: Type.Pointer.Bounds, p: *Parser, tok: TokenIndex, qt: *QualType) !void {
1321 if (qt.isInvalid()) return;
1322 const pointer = qt.get(p.comp, .pointer) orelse {
1323 return p.err(tok, .attribute_requires_pointer, .{@tagName(bounds)});
1324 };
1325 if (pointer.bounds == bounds) {
1326 return p.err(tok, .redundant_bounds_annotation, .{@tagName(bounds)});
1327 }
1328 if (pointer.bounds != .c) {
1329 return p.err(tok, .multiple_bounds_annotations, .{});
1330 }
1331 qt.* = try p.comp.type_store.put(p.comp.gpa, .{ .pointer = .{
1332 .child = pointer.child,
1333 .decayed = pointer.decayed,
1334 .bounds = bounds,
1335 } });
1336}
1337
1338/// These come from explicit MSVC keywords like __stdcall, __fastcall, etc
1339fn applyKeywordCallingConvention(attr: Attribute, p: *Parser, tok: TokenIndex, qt: QualType) !void {
1340 if (!qt.isCallable(p.comp)) {
1341 return p.err(tok, .callconv_non_func, .{ p.tokSlice(tok), qt });
1268 }1342 }
1269 switch (attr.args.calling_convention.cc) {1343 switch (attr.args.calling_convention.cc) {
1270 .c => {},1344 .c => {},
...@@ -1295,3 +1369,15 @@ fn applySelected(qt: QualType, p: *Parser) !QualType {...@@ -1295,3 +1369,15 @@ fn applySelected(qt: QualType, p: *Parser) !QualType {
1295 .attributes = p.attr_application_buf.items,1369 .attributes = p.attr_application_buf.items,
1296 } })).withQualifiers(qt);1370 } })).withQualifiers(qt);
1297}1371}
1372
1373pub fn visibilityFromString(s: []const u8) ?std.builtin.SymbolVisibility {
1374 if (mem.eql(u8, s, "internal")) {
1375 return .hidden;
1376 }
1377 const visibility = std.meta.stringToEnum(std.builtin.SymbolVisibility, s) orelse return null;
1378 // compiler will notify us if .internal is added as a visibility type
1379 switch (visibility) {
1380 .default, .hidden, .protected => {},
1381 }
1382 return visibility;
1383}
lib/compiler/aro/aro/Attribute/names.zig+604-589
...@@ -99,6 +99,7 @@ pub const Tag = enum(u16) { aarch64_sve_pcs,...@@ -99,6 +99,7 @@ pub const Tag = enum(u16) { aarch64_sve_pcs,
99 selectany,99 selectany,
100 sentinel,100 sentinel,
101 simd,101 simd,
102 single,
102 spectre,103 spectre,
103 stack_protect,104 stack_protect,
104 stdcall,105 stdcall,
...@@ -112,6 +113,7 @@ pub const Tag = enum(u16) { aarch64_sve_pcs,...@@ -112,6 +113,7 @@ pub const Tag = enum(u16) { aarch64_sve_pcs,
112 transparent_union,113 transparent_union,
113 unavailable,114 unavailable,
114 uninitialized,115 uninitialized,
116 unsafe_indexable,
115 unsequenced,117 unsequenced,
116 unused,118 unused,
117 used,119 used,
...@@ -181,7 +183,7 @@ pub const longest_name = 30;...@@ -181,7 +183,7 @@ pub const longest_name = 30;
181/// If found, returns the index of the node within the `dafsa` array.183/// If found, returns the index of the node within the `dafsa` array.
182/// Otherwise, returns `null`.184/// Otherwise, returns `null`.
183pub fn findInList(first_child_index: u16, char: u8) ?u16 {185pub fn findInList(first_child_index: u16, char: u8) ?u16 {
184 @setEvalBranchQuota(234);186 @setEvalBranchQuota(238);
185 var index = first_child_index;187 var index = first_child_index;
186 while (true) {188 while (true) {
187 if (dafsa[index].char == char) return index;189 if (dafsa[index].char == char) return index;
...@@ -290,9 +292,9 @@ const dafsa = [_]Node{...@@ -290,9 +292,9 @@ const dafsa = [_]Node{
290 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 25, .child_index = 47 },292 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 25, .child_index = 47 },
291 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 49 },293 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 49 },
292 .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 54 },294 .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 54 },
293 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 11, .child_index = 56 },295 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 12, .child_index = 56 },
294 .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 63 },296 .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 63 },
295 .{ .char = 'u', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 67 },297 .{ .char = 'u', .end_of_word = false, .end_of_list = false, .number = 7, .child_index = 67 },
296 .{ .char = 'v', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 70 },298 .{ .char = 'v', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 70 },
297 .{ .char = 'w', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 72 },299 .{ .char = 'w', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 72 },
298 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 74 },300 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 74 },
...@@ -334,642 +336,653 @@ const dafsa = [_]Node{...@@ -334,642 +336,653 @@ const dafsa = [_]Node{
334 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 130 },336 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 130 },
335 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 131 },337 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 131 },
336 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 132 },338 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 132 },
337 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 135 },339 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 135 },
338 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 136 },340 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 137 },
339 .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 137 },341 .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 138 },
340 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 139 },342 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 140 },
341 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 141 },343 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 142 },
342 .{ .char = 'h', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 142 },344 .{ .char = 'h', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 143 },
343 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 144 },345 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 145 },
344 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 145 },346 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 146 },
345 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 146 },347 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 147 },
346 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 150 },348 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 151 },
347 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 151 },349 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 152 },
348 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 152 },350 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 153 },
349 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 153 },351 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 154 },
350 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 154 },352 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 155 },
351 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 155 },353 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 156 },
352 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 156 },354 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 157 },
353 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 157 },355 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 158 },
354 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 158 },356 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 159 },
355 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 159 },357 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 160 },
356 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 161 },358 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 162 },
357 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 162 },359 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 163 },
358 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 163 },360 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 164 },
359 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 164 },361 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 165 },
360 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 165 },362 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 166 },
361 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 166 },363 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 167 },
362 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 167 },
363 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 168 },364 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 168 },
364 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 169 },365 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 169 },
365 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 170 },366 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 170 },
366 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 171 },367 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 171 },
367 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 172 },368 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 172 },
368 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 173 },369 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 173 },
369 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 174 },370 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 174 },
370 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 175 },371 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 175 },
371 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 177 },372 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 176 },
372 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 179 },373 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 178 },
373 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 180 },374 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 180 },
374 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 181 },375 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 181 },
375 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 182 },376 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 182 },
376 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 183 },377 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 183 },
377 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 184 },378 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 184 },
378 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 185 },379 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 185 },
379 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
380 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 186 },380 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 186 },
381 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 187 },381 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
382 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 188 },382 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 187 },
383 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 189 },383 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 188 },
384 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 190 },384 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 189 },
385 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 191 },385 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 190 },
386 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 193 },386 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 191 },
387 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 194 },387 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 192 },
388 .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 150 },388 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 194 },
389 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 13, .child_index = 195 },389 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 195 },
390 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 200 },390 .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 151 },
391 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 201 },391 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 13, .child_index = 196 },
392 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 203 },392 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 201 },
393 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 204 },393 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 202 },
394 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 206 },394 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 204 },
395 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 207 },395 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 205 },
396 .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 208 },396 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 207 },
397 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 209 },397 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 208 },
398 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 110 },398 .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 209 },
399 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 210 },399 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 210 },
400 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 110 },
401 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 211 },
400 .{ .char = 's', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },402 .{ .char = 's', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
401 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 211 },403 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 212 },
402 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 76 },404 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 76 },
403 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 193 },405 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 194 },
404 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 212 },406 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 213 },
405 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 213 },407 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 214 },
406 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 214 },408 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 215 },
407 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 216 },409 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 217 },
408 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 217 },410 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 218 },
409 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 218 },411 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 219 },
410 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 219 },412 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 220 },
411 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 220 },413 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 221 },
412 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 221 },414 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 222 },
413 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 170 },415 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 171 },
414 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 222 },416 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 223 },
415 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 223 },417 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 224 },
416 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 224 },418 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 225 },
417 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 225 },419 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 226 },
418 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 226 },420 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 227 },
419 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 227 },421 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 228 },
420 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 228 },422 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 229 },
421 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 229 },423 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 230 },
422 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 230 },424 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 231 },
423 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 231 },425 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 232 },
424 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 232 },426 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 233 },
425 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 233 },427 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 234 },
426 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 234 },428 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 235 },
427 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 235 },429 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 236 },
428 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 170 },430 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 238 },
429 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 170 },431 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 171 },
430 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 236 },432 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 171 },
431 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 237 },433 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 239 },
432 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 238 },434 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 240 },
433 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 239 },435 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 241 },
434 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 240 },436 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 242 },
435 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 241 },437 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 243 },
436 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 242 },438 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 244 },
439 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 245 },
437 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 122 },440 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 122 },
438 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 243 },441 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 246 },
439 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 244 },442 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 247 },
440 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 245 },443 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 248 },
441 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 246 },444 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 249 },
442 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 247 },445 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 250 },
443 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 248 },446 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 251 },
444 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 249 },447 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 252 },
445 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 250 },448 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 253 },
446 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 251 },449 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 254 },
447 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 252 },450 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 255 },
448 .{ .char = 'd', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },451 .{ .char = 'd', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
449 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 253 },452 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 256 },
450 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 254 },453 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 257 },
451 .{ .char = 'y', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },454 .{ .char = 'y', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
452 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 255 },455 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 258 },
453 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 256 },456 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 259 },
454 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 257 },457 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 260 },
455 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 258 },458 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 261 },
456 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 259 },459 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 262 },
457 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 260 },460 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 263 },
458 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 261 },461 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 264 },
459 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 262 },462 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 265 },
460 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 224 },463 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 226 },
461 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 263 },464 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 266 },
462 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 264 },465 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 267 },
463 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 265 },466 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 268 },
464 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 266 },467 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 269 },
465 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 267 },468 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 270 },
466 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 268 },469 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 271 },
467 .{ .char = 'f', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },470 .{ .char = 'f', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
468 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 269 },471 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 272 },
469 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 270 },472 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 273 },
470 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 271 },473 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 274 },
471 .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },474 .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
472 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 272 },475 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 275 },
473 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 273 },476 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 276 },
474 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 274 },477 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 277 },
475 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 276 },478 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 279 },
476 .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 277 },479 .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 280 },
477 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 278 },480 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 281 },
478 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 281 },481 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 284 },
479 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 282 },482 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 285 },
480 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 283 },483 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 286 },
481 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 284 },484 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 287 },
482 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 285 },485 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 288 },
483 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 287 },486 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 290 },
484 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 288 },487 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 291 },
485 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 101 },488 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 101 },
486 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 289 },489 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 292 },
487 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 290 },490 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 293 },
488 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 291 },491 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 294 },
489 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 292 },492 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 295 },
490 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 293 },493 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 296 },
491 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 294 },494 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 297 },
492 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 295 },495 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 298 },
493 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 296 },496 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 299 },
494 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 297 },497 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 300 },
495 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 298 },
496 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 299 },
497 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 300 },
498 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 301 },498 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 301 },
499 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 302 },499 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 302 },
500 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 303 },500 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 303 },
501 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 304 },501 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 304 },
502 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 305 },502 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 305 },
503 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 306 },503 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 306 },
504 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 307 },
505 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 308 },
506 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 309 },
507 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 310 },
504 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 109 },508 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 109 },
505 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 307 },509 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 311 },
506 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 224 },510 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 226 },
507 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 308 },511 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 312 },
508 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 309 },512 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 313 },
509 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 310 },513 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 314 },
510 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 311 },514 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 315 },
511 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 312 },515 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 316 },
512 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 313 },516 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 317 },
513 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 150 },517 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 318 },
514 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 314 },518 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 151 },
515 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 315 },519 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 319 },
516 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 316 },520 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 320 },
517 .{ .char = 'k', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 318 },521 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 321 },
518 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 319 },522 .{ .char = 'k', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 323 },
519 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 320 },523 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 324 },
524 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 325 },
520 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 },525 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 },
521 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 321 },526 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 326 },
522 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 322 },527 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 327 },
523 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 324 },528 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 329 },
524 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 325 },529 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 330 },
525 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 326 },530 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 331 },
526 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 327 },531 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 332 },
527 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 328 },532 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 333 },
528 .{ .char = 'l', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },533 .{ .char = 'l', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
529 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 329 },534 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 334 },
530 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 330 },535 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 335 },
531 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 331 },536 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 336 },
532 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 332 },537 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 337 },
533 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 333 },538 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 338 },
534 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 334 },539 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 339 },
535 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 335 },540 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 340 },
536 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 336 },541 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 341 },
537 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 336 },542 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 341 },
538 .{ .char = 'r', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },543 .{ .char = 'r', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
539 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 337 },544 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 342 },
540 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 338 },545 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 343 },
541 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 339 },546 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 344 },
542 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 340 },547 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 345 },
543 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 341 },548 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 346 },
544 .{ .char = 'c', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },549 .{ .char = 'c', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
545 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 342 },550 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 347 },
546 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 344 },551 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 349 },
547 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 266 },552 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 269 },
548 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 200 },553 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 201 },
549 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 345 },
550 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 346 },
551 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 347 },
552 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 189 },
553 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 348 },
554 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 349 },
555 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 350 },554 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 350 },
556 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 351 },555 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 351 },
557 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 352 },556 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 352 },
558 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 353 },557 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 190 },
559 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 354 },558 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 353 },
560 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 355 },559 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 354 },
561 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 171 },560 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 355 },
562 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 356 },561 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 356 },
562 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 357 },
563 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 358 },
564 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 359 },
565 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 360 },
566 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 172 },
567 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 361 },
563 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 101 },568 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 101 },
564 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 357 },569 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 362 },
565 .{ .char = 'a', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },570 .{ .char = 'a', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
566 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 358 },571 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 363 },
567 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 359 },572 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 364 },
568 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 360 },573 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 365 },
569 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 361 },574 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 366 },
570 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 362 },575 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 367 },
571 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 363 },576 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 368 },
572 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 364 },577 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 369 },
573 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 331 },578 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 336 },
574 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 365 },579 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 370 },
575 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 366 },580 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 371 },
576 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 367 },581 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 372 },
577 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 368 },582 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 373 },
578 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 253 },583 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 256 },
579 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 369 },584 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 374 },
580 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 370 },585 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 375 },
586 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 194 },
581 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 125 },587 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 125 },
582 .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 371 },588 .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 376 },
583 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 372 },589 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 377 },
584 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 260 },590 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 263 },
585 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 373 },591 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 378 },
586 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 170 },592 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 171 },
587 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 374 },593 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 379 },
588 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 375 },594 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 380 },
589 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 376 },595 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 381 },
590 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 377 },596 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 382 },
591 .{ .char = 'q', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 378 },597 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 383 },
592 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 379 },598 .{ .char = 'q', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 384 },
593 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 380 },599 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 385 },
594 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 381 },600 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 386 },
595 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 383 },
596 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 384 },
597 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 385 },
598 .{ .char = '6', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 386 },
599 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 170 },
600 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 387 },601 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 387 },
601 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 389 },602 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 389 },
602 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 185 },603 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 390 },
603 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 390 },604 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 391 },
604 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 391 },605 .{ .char = '6', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 392 },
605 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 392 },606 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 171 },
606 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 315 },607 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 393 },
607 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 393 },608 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 395 },
608 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 394 },609 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 186 },
610 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 396 },
611 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 397 },
612 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 398 },
613 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 320 },
614 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 399 },
615 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 400 },
609 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },616 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
610 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 335 },617 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 340 },
611 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 395 },618 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 401 },
612 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 396 },
613 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 397 },
614 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 398 },
615 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 399 },
616 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 400 },
617 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 331 },
618 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 401 },
619 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 402 },619 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 402 },
620 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 403 },620 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 403 },
621 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 404 },621 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 404 },
622 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 405 },622 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 405 },
623 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 406 },623 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 406 },
624 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 336 },
625 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 407 },
626 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 408 },
627 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 409 },
628 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 410 },
629 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 411 },
630 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 412 },
624 .{ .char = 'i', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },631 .{ .char = 'i', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
625 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 407 },632 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 413 },
626 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 408 },633 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 414 },
627 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 409 },634 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 415 },
628 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 410 },635 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 416 },
629 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 411 },636 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 417 },
630 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 412 },637 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 418 },
631 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 413 },638 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 419 },
632 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 },639 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 },
633 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 193 },640 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 194 },
634 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 414 },641 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 420 },
635 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 355 },642 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 360 },
636 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 415 },643 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 421 },
637 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 416 },644 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 422 },
638 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 417 },645 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 423 },
639 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 418 },646 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 424 },
640 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 419 },647 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 425 },
641 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 420 },648 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 426 },
642 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 421 },649 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 427 },
643 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 422 },650 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 428 },
644 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 423 },651 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 429 },
645 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 424 },652 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 430 },
646 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 425 },653 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 431 },
647 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 426 },654 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 432 },
648 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 427 },655 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 433 },
649 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 428 },656 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 434 },
650 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 250 },657 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 253 },
651 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 429 },658 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 435 },
652 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 430 },659 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 436 },
653 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 431 },660 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 437 },
654 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 432 },661 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 438 },
655 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 433 },662 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 439 },
656 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 434 },
657 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 435 },
658 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 437 },
659 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 438 },
660 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 439 },
661 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 440 },
662 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 189 },
663 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 441 },
664 .{ .char = '4', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 442 },
665 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 443 },
666 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 444 },
667 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 445 },
668 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 295 },
669 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 447 },
670 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 448 },
671 .{ .char = 'p', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
672 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 440 },663 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 440 },
673 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 449 },664 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 441 },
674 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 450 },665 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 442 },
675 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 451 },666 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 444 },
676 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 452 },667 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 445 },
677 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 453 },668 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 446 },
678 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 454 },669 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 447 },
670 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 190 },
671 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 448 },
672 .{ .char = '4', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 449 },
673 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 450 },
674 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 451 },
675 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 452 },
676 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 298 },
677 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 454 },
679 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 455 },678 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 455 },
680 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 357 },679 .{ .char = 'p', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
680 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 447 },
681 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 456 },681 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 456 },
682 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 457 },682 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 457 },
683 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 458 },683 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 458 },
684 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 459 },684 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 459 },
685 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 460 },685 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 460 },
686 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 461 },686 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 461 },
687 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 462 },687 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 462 },
688 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 463 },688 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 362 },
689 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 464 },689 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 463 },
690 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 465 },690 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 464 },
691 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 466 },691 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 465 },
692 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 467 },692 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 466 },
693 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 383 },693 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 467 },
694 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 331 },694 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 468 },
695 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 469 },
696 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 470 },
697 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 471 },
698 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 472 },
699 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 473 },
700 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 474 },
701 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 389 },
702 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 336 },
695 .{ .char = 'w', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },703 .{ .char = 'w', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
696 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 468 },704 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 475 },
697 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 469 },705 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 476 },
698 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 470 },706 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 477 },
699 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 101 },707 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 101 },
700 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 471 },708 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 478 },
701 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 472 },709 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 479 },
702 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 473 },710 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 480 },
703 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 474 },711 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 481 },
704 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 475 },712 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 482 },
705 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 250 },713 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 253 },
706 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 476 },714 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 483 },
707 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 477 },715 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 484 },
708 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 427 },716 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 433 },
709 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 478 },717 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 485 },
710 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 479 },718 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 486 },
711 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 480 },719 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 487 },
712 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 481 },720 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 488 },
713 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 482 },721 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 489 },
714 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 305 },722 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 490 },
715 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 483 },723 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 309 },
716 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 484 },724 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 491 },
717 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 485 },725 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 492 },
726 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 493 },
718 .{ .char = 'g', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },727 .{ .char = 'g', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
719 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 486 },728 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 494 },
720 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 487 },729 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 495 },
721 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 489 },
722 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 490 },
723 .{ .char = 'e', .end_of_word = true, .end_of_list = false, .number = 1, .child_index = 0 },
724 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 260 },
725 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 491 },
726 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 492 },
727 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 150 },
728 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 493 },
729 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 179 },
730 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 101 },
731 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 494 },
732 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 495 },
733 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 496 },
734 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 497 },730 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 497 },
735 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 498 },731 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 498 },
732 .{ .char = 'e', .end_of_word = true, .end_of_list = false, .number = 1, .child_index = 0 },
733 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 263 },
736 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 499 },734 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 499 },
737 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 500 },735 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 500 },
738 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 501 },736 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 151 },
739 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 502 },737 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 501 },
740 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 503 },738 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 180 },
741 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 306 },739 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 101 },
742 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 504 },740 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 502 },
743 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 505 },741 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 503 },
744 .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 506 },742 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 504 },
745 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 170 },743 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 505 },
746 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 507 },744 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 506 },
747 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 508 },745 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 507 },
748 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 509 },746 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 508 },
749 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 510 },747 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 509 },
750 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 512 },748 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 510 },
751 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 513 },749 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 511 },
752 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 514 },750 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 310 },
753 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 173 },751 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 512 },
754 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 515 },752 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 513 },
755 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 516 },753 .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 514 },
756 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 517 },754 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 171 },
757 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 518 },755 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 515 },
758 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 519 },756 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 516 },
759 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 520 },757 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 517 },
760 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 444 },758 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 518 },
761 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 521 },759 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 520 },
762 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 522 },760 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 521 },
763 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 523 },761 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 522 },
764 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 524 },762 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 174 },
765 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 525 },763 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 523 },
766 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 526 },764 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 524 },
767 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 527 },765 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 525 },
768 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 193 },766 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 526 },
769 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 250 },767 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 527 },
770 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 528 },768 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 528 },
771 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 529 },769 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 529 },
772 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 530 },770 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 451 },
773 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 531 },771 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 530 },
774 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 440 },772 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 531 },
775 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 532 },773 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 532 },
776 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 533 },774 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 533 },
777 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 534 },775 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 534 },
778 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 235 },776 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 535 },
779 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 535 },777 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 536 },
780 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 536 },778 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 194 },
779 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 253 },
781 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 537 },780 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 537 },
782 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 538 },781 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 538 },
783 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 539 },782 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 539 },
784 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 540 },783 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 540 },
785 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 542 },784 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 447 },
785 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 541 },
786 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 542 },
787 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 543 },
788 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 238 },
789 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 544 },
790 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 545 },
791 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 546 },
792 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 547 },
793 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 548 },
794 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 549 },
795 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 551 },
786 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 101 },796 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 101 },
787 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 518 },797 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 526 },
788 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 543 },798 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 552 },
789 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 544 },799 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 553 },
790 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 545 },800 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 554 },
791 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 546 },801 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 555 },
792 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 547 },802 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 556 },
793 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 548 },803 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 557 },
794 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 549 },804 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 558 },
795 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 550 },805 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },
796 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 551 },806 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 306 },
797 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 552 },807 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 560 },
798 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 150 },808 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 561 },
799 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 173 },809 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 151 },
800 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 553 },810 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 174 },
801 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 554 },811 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 562 },
802 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 555 },812 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 563 },
803 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 556 },813 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 564 },
804 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 557 },814 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 565 },
805 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 331 },815 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 566 },
806 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 558 },816 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 336 },
807 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },817 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 567 },
808 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 560 },818 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 568 },
809 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 561 },819 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 569 },
810 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 562 },820 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 570 },
811 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 563 },821 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 571 },
812 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 564 },
813 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 565 },
814 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 566 },
815 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 567 },
816 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 568 },
817 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 569 },
818 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 570 },
819 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 571 },
820 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 572 },822 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 572 },
821 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 573 },823 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 573 },
822 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 574 },824 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 574 },
823 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 575 },825 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 575 },
826 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 576 },
827 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 577 },
828 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 578 },
829 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 579 },
830 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 580 },
831 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 581 },
832 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 582 },
833 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 583 },
834 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 584 },
824 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 },835 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 },
825 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 576 },836 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 585 },
826 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 577 },837 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 586 },
827 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 578 },838 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 587 },
828 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 579 },839 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 588 },
829 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 193 },
830 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 580 },
831 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 581 },
832 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 582 },
833 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 583 },
834 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 584 },
835 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 585 },
836 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 586 },
837 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 587 },
838 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 588 },
839 .{ .char = 'h', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
840 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 589 },840 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 589 },
841 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 590 },841 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 590 },
842 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 266 },842 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 591 },
843 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 591 },
844 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 592 },843 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 592 },
845 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 593 },844 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 593 },
846 .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 5, .child_index = 594 },845 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 594 },
847 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 595 },846 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 595 },
848 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 596 },847 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 596 },
849 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 597 },848 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 597 },
850 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 598 },849 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 598 },
851 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 599 },850 .{ .char = 'h', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
852 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 600 },851 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 599 },
853 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 601 },852 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 600 },
854 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 602 },853 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 269 },
855 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 421 },854 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 601 },
856 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 603 },855 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 602 },
857 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 604 },856 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 603 },
858 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 150 },857 .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 5, .child_index = 604 },
859 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 392 },858 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 605 },
860 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 605 },859 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 606 },
861 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 606 },860 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 607 },
862 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 607 },861 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 608 },
863 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 608 },862 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 609 },
864 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 150 },863 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 610 },
865 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 609 },864 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 611 },
866 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 610 },865 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 612 },
867 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 611 },866 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 427 },
868 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 612 },867 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 613 },
869 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 613 },868 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 614 },
870 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 614 },869 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 151 },
871 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 615 },870 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 615 },
872 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 616 },871 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 398 },
873 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 620 },872 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 616 },
874 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 621 },873 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 617 },
875 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 622 },874 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 618 },
876 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 623 },875 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 619 },
877 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 624 },876 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 151 },
878 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 193 },877 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 620 },
879 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 625 },878 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 621 },
880 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 626 },879 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 622 },
880 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 623 },
881 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 624 },
882 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 625 },
883 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 626 },
884 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 627 },
885 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 631 },
886 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 632 },
887 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 633 },
888 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 634 },
889 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 635 },
890 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 194 },
891 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 636 },
892 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 637 },
881 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 },893 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 },
882 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 627 },894 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 638 },
883 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 628 },895 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 486 },
884 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 629 },896 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 639 },
885 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 630 },897 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 640 },
886 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 631 },898 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 641 },
887 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 621 },899 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 642 },
888 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 632 },900 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 632 },
889 .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 633 },901 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 643 },
890 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 634 },902 .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 644 },
891 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 635 },903 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 645 },
892 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 636 },904 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 646 },
893 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 348 },905 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 647 },
894 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 637 },906 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 353 },
895 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 638 },907 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 648 },
896 .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 639 },908 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 649 },
897 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 640 },909 .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 650 },
898 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 641 },910 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 651 },
911 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 652 },
899 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 101 },912 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 101 },
900 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 642 },913 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 653 },
901 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 643 },914 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 654 },
902 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 372 },915 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 377 },
903 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 644 },916 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 655 },
904 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 645 },917 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 656 },
905 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 646 },918 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 657 },
906 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 647 },919 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 658 },
907 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 648 },
908 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 },
909 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 584 },
910 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 509 },
911 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 649 },
912 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 650 },
913 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 651 },
914 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 652 },
915 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 653 },
916 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 654 },
917 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 655 },
918 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 656 },
919 .{ .char = 'k', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
920 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 397 },
921 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 657 },
922 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 266 },
923 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 658 },
924 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 300 },
925 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 659 },920 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 659 },
926 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 660 },921 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 },
927 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 193 },922 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 594 },
928 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 306 },923 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 517 },
929 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 661 },924 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 660 },
925 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 661 },
930 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 662 },926 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 662 },
931 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 663 },927 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 663 },
932 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 664 },928 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 664 },
933 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 229 },929 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 665 },
934 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 665 },930 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 666 },
935 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 666 },931 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 667 },
936 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 350 },932 .{ .char = 'k', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
937 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 667 },933 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 403 },
938 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 668 },934 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 668 },
939 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 669 },935 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 269 },
940 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 670 },936 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 669 },
941 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 158 },937 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 303 },
942 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 671 },938 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 670 },
939 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 671 },
940 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 194 },
941 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 310 },
943 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 672 },942 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 672 },
944 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 673 },943 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 673 },
945 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 207 },944 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 674 },
946 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 674 },945 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 675 },
947 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 675 },946 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 231 },
948 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 676 },947 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 676 },
949 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 633 },948 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 677 },
950 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 677 },949 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 355 },
951 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 678 },950 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 678 },
952 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 679 },951 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 679 },
953 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 680 },952 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 680 },
954 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 219 },953 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 681 },
955 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 586 },954 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 159 },
956 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 681 },955 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 682 },
957 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 },956 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 683 },
958 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 682 },957 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 684 },
959 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 683 },958 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 208 },
960 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 684 },959 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 685 },
961 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 685 },960 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 686 },
962 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 686 },
963 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 687 },961 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 687 },
964 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 688 },962 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 644 },
965 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 689 },963 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 688 },
966 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 690 },964 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 689 },
967 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 173 },965 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 690 },
968 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 691 },966 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 691 },
967 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 220 },
968 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 596 },
969 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 692 },
970 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 },
971 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 693 },
972 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 694 },
973 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 695 },
974 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 696 },
975 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 697 },
976 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 698 },
977 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 699 },
978 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 700 },
979 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 701 },
980 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 174 },
981 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 702 },
969 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 },982 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 },
970};983};
971pub const data = blk: {984pub const data = blk: {
972 @setEvalBranchQuota(1053);985 @setEvalBranchQuota(1071);
973 break :blk [_]Properties{986 break :blk [_]Properties{
974 .{ .tag = .aarch64_sve_pcs, .gnu = true },987 .{ .tag = .aarch64_sve_pcs, .gnu = true },
975 .{ .tag = .aarch64_vector_pcs, .gnu = true },988 .{ .tag = .aarch64_vector_pcs, .gnu = true },
...@@ -1062,6 +1075,7 @@ pub const data = blk: {...@@ -1062,6 +1075,7 @@ pub const data = blk: {
1062 .{ .tag = .selectany, .gnu = true, .declspec = true },1075 .{ .tag = .selectany, .gnu = true, .declspec = true },
1063 .{ .tag = .sentinel, .gnu = true },1076 .{ .tag = .sentinel, .gnu = true },
1064 .{ .tag = .simd, .gnu = true },1077 .{ .tag = .simd, .gnu = true },
1078 .{ .tag = .single, .gnu = true },
1065 .{ .tag = .spectre, .declspec = true },1079 .{ .tag = .spectre, .declspec = true },
1066 .{ .tag = .stack_protect, .gnu = true },1080 .{ .tag = .stack_protect, .gnu = true },
1067 .{ .tag = .stdcall, .gnu = true },1081 .{ .tag = .stdcall, .gnu = true },
...@@ -1075,6 +1089,7 @@ pub const data = blk: {...@@ -1075,6 +1089,7 @@ pub const data = blk: {
1075 .{ .tag = .transparent_union, .gnu = true },1089 .{ .tag = .transparent_union, .gnu = true },
1076 .{ .tag = .unavailable, .gnu = true },1090 .{ .tag = .unavailable, .gnu = true },
1077 .{ .tag = .uninitialized, .gnu = true },1091 .{ .tag = .uninitialized, .gnu = true },
1092 .{ .tag = .unsafe_indexable, .gnu = true },
1078 .{ .tag = .unsequenced, .c23 = true },1093 .{ .tag = .unsequenced, .c23 = true },
1079 .{ .tag = .unused, .gnu = true },1094 .{ .tag = .unused, .gnu = true },
1080 .{ .tag = .used, .gnu = true },1095 .{ .tag = .used, .gnu = true },
lib/compiler/aro/aro/Builtins.zig-1
...@@ -264,7 +264,6 @@ fn createType(desc: TypeDescription, it: *TypeDescription.TypeIterator, comp: *C...@@ -264,7 +264,6 @@ fn createType(desc: TypeDescription, it: *TypeDescription.TypeIterator, comp: *C
264 _ = address_space; // TODO: handle address space264 _ = address_space; // TODO: handle address space
265 const pointer_qt = try comp.type_store.put(comp.gpa, .{ .pointer = .{265 const pointer_qt = try comp.type_store.put(comp.gpa, .{ .pointer = .{
266 .child = builder.finish() catch unreachable,266 .child = builder.finish() catch unreachable,
267 .decayed = null,
268 } });267 } });
269268
270 builder.@"const" = null;269 builder.@"const" = null;
lib/compiler/aro/aro/Builtins/common.zig+874-863
...@@ -751,6 +751,8 @@ pub const Tag = enum(u16) { _Block_object_assign,...@@ -751,6 +751,8 @@ pub const Tag = enum(u16) { _Block_object_assign,
751 __builtin_usubl_overflow,751 __builtin_usubl_overflow,
752 __builtin_usubll_overflow,752 __builtin_usubll_overflow,
753 __builtin_va_arg,753 __builtin_va_arg,
754 __builtin_va_arg_pack,
755 __builtin_va_arg_pack_len,
754 __builtin_va_copy,756 __builtin_va_copy,
755 __builtin_va_end,757 __builtin_va_end,
756 __builtin_va_start,758 __builtin_va_start,
...@@ -1436,7 +1438,7 @@ pub const longest_name = 41;...@@ -1436,7 +1438,7 @@ pub const longest_name = 41;
1436/// If found, returns the index of the node within the `dafsa` array.1438/// If found, returns the index of the node within the `dafsa` array.
1437/// Otherwise, returns `null`.1439/// Otherwise, returns `null`.
1438pub fn findInList(first_child_index: u16, char: u8) ?u16 {1440pub fn findInList(first_child_index: u16, char: u8) ?u16 {
1439 @setEvalBranchQuota(2744);1441 @setEvalBranchQuota(2748);
1440 var index = first_child_index;1442 var index = first_child_index;
1441 while (true) {1443 while (true) {
1442 if (dafsa[index].char == char) return index;1444 if (dafsa[index].char == char) return index;
...@@ -1531,7 +1533,7 @@ const Node = packed struct {...@@ -1531,7 +1533,7 @@ const Node = packed struct {
15311533
1532const dafsa = [_]Node{1534const dafsa = [_]Node{
1533 .{ .char = 0, .end_of_word = false, .end_of_list = true, .number = 0, .child_index = 1 },1535 .{ .char = 0, .end_of_word = false, .end_of_list = true, .number = 0, .child_index = 1 },
1534 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 1016, .child_index = 19 },1536 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 1018, .child_index = 19 },
1535 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 25, .child_index = 31 },1537 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 25, .child_index = 31 },
1536 .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 36 },1538 .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 36 },
1537 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 82, .child_index = 38 },1539 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 82, .child_index = 38 },
...@@ -1553,7 +1555,7 @@ const dafsa = [_]Node{...@@ -1553,7 +1555,7 @@ const dafsa = [_]Node{
1553 .{ .char = 'E', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 102 },1555 .{ .char = 'E', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 102 },
1554 .{ .char = 'I', .end_of_word = false, .end_of_list = false, .number = 29, .child_index = 103 },1556 .{ .char = 'I', .end_of_word = false, .end_of_list = false, .number = 29, .child_index = 103 },
1555 .{ .char = 'R', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 104 },1557 .{ .char = 'R', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 104 },
1556 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 938, .child_index = 105 },1558 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 940, .child_index = 105 },
1557 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 123 },1559 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 123 },
1558 .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 11, .child_index = 125 },1560 .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 11, .child_index = 125 },
1559 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 127 },1561 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 127 },
...@@ -1637,7 +1639,7 @@ const dafsa = [_]Node{...@@ -1637,7 +1639,7 @@ const dafsa = [_]Node{
1637 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 238 },1639 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 238 },
1638 .{ .char = 'G', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 239 },1640 .{ .char = 'G', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 239 },
1639 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 34, .child_index = 240 },1641 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 34, .child_index = 240 },
1640 .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 694, .child_index = 245 },1642 .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 696, .child_index = 245 },
1641 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 19, .child_index = 246 },1643 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 19, .child_index = 246 },
1642 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 248 },1644 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 248 },
1643 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 249 },1645 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 249 },
...@@ -1775,7 +1777,7 @@ const dafsa = [_]Node{...@@ -1775,7 +1777,7 @@ const dafsa = [_]Node{
1775 .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 398 },1777 .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 398 },
1776 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 399 },1778 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 399 },
1777 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 30, .child_index = 400 },1779 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 30, .child_index = 400 },
1778 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 694, .child_index = 401 },1780 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 696, .child_index = 401 },
1779 .{ .char = '1', .end_of_word = false, .end_of_list = false, .number = 17, .child_index = 402 },1781 .{ .char = '1', .end_of_word = false, .end_of_list = false, .number = 17, .child_index = 402 },
1780 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 403 },1782 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 403 },
1781 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 404 },1783 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 404 },
...@@ -1931,7 +1933,7 @@ const dafsa = [_]Node{...@@ -1931,7 +1933,7 @@ const dafsa = [_]Node{
1931 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 523 },1933 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 523 },
1932 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 524 },1934 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 524 },
1933 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 30, .child_index = 525 },1935 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 30, .child_index = 525 },
1934 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 694, .child_index = 526 },1936 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 696, .child_index = 526 },
1935 .{ .char = '1', .end_of_word = false, .end_of_list = true, .number = 17, .child_index = 527 },1937 .{ .char = '1', .end_of_word = false, .end_of_list = true, .number = 17, .child_index = 527 },
1936 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 528 },1938 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 528 },
1937 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 529 },1939 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 529 },
...@@ -2056,7 +2058,7 @@ const dafsa = [_]Node{...@@ -2056,7 +2058,7 @@ const dafsa = [_]Node{
2056 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 610 },2058 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 610 },
2057 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 611 },2059 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 611 },
2058 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 30, .child_index = 612 },2060 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 30, .child_index = 612 },
2059 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 694, .child_index = 613 },2061 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 696, .child_index = 613 },
2060 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 17, .child_index = 614 },2062 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 17, .child_index = 614 },
2061 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 615 },2063 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 615 },
2062 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 616 },2064 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 616 },
...@@ -2143,7 +2145,7 @@ const dafsa = [_]Node{...@@ -2143,7 +2145,7 @@ const dafsa = [_]Node{
2143 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 658 },2145 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 658 },
2144 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },2146 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },
2145 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 30, .child_index = 659 },2147 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 30, .child_index = 659 },
2146 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 694, .child_index = 660 },2148 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 696, .child_index = 660 },
2147 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 17, .child_index = 661 },2149 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 17, .child_index = 661 },
2148 .{ .char = 'i', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 662 },2150 .{ .char = 'i', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 662 },
2149 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 663 },2151 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 663 },
...@@ -2190,7 +2192,7 @@ const dafsa = [_]Node{...@@ -2190,7 +2192,7 @@ const dafsa = [_]Node{
2190 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 700 },2192 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 700 },
2191 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 701 },2193 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 701 },
2192 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 30, .child_index = 702 },2194 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 30, .child_index = 702 },
2193 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 694, .child_index = 703 },2195 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 696, .child_index = 703 },
2194 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 17, .child_index = 704 },2196 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 17, .child_index = 704 },
2195 .{ .char = 'f', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },2197 .{ .char = 'f', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
2196 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 705 },2198 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 705 },
...@@ -2233,7 +2235,7 @@ const dafsa = [_]Node{...@@ -2233,7 +2235,7 @@ const dafsa = [_]Node{
2233 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 740 },2235 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 740 },
2234 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 741 },2236 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 741 },
2235 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 30, .child_index = 742 },2237 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 30, .child_index = 742 },
2236 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 694, .child_index = 754 },2238 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 696, .child_index = 754 },
2237 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 17, .child_index = 755 },2239 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 17, .child_index = 755 },
2238 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 756 },2240 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 756 },
2239 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 640 },2241 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 640 },
...@@ -2284,7 +2286,7 @@ const dafsa = [_]Node{...@@ -2284,7 +2286,7 @@ const dafsa = [_]Node{
2284 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 799 },2286 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 799 },
2285 .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 802 },2287 .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 802 },
2286 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 804 },2288 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 804 },
2287 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 694, .child_index = 805 },2289 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 696, .child_index = 805 },
2288 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 17, .child_index = 825 },2290 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 17, .child_index = 825 },
2289 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 826 },2291 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 826 },
2290 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 12, .child_index = 827 },2292 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 12, .child_index = 827 },
...@@ -2353,7 +2355,7 @@ const dafsa = [_]Node{...@@ -2353,7 +2355,7 @@ const dafsa = [_]Node{
2353 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 76, .child_index = 940 },2355 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 76, .child_index = 940 },
2354 .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 23, .child_index = 952 },2356 .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 23, .child_index = 952 },
2355 .{ .char = 'u', .end_of_word = false, .end_of_list = false, .number = 12, .child_index = 957 },2357 .{ .char = 'u', .end_of_word = false, .end_of_list = false, .number = 12, .child_index = 957 },
2356 .{ .char = 'v', .end_of_word = false, .end_of_list = false, .number = 12, .child_index = 961 },2358 .{ .char = 'v', .end_of_word = false, .end_of_list = false, .number = 14, .child_index = 961 },
2357 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 99 },2359 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 99 },
2358 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 17, .child_index = 966 },2360 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 17, .child_index = 966 },
2359 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 512 },2361 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 512 },
...@@ -2491,7 +2493,7 @@ const dafsa = [_]Node{...@@ -2491,7 +2493,7 @@ const dafsa = [_]Node{
2491 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 1140 },2493 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 1140 },
2492 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 1154 },2494 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 1154 },
2493 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1157 },2495 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1157 },
2494 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 1158 },2496 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 1158 },
2495 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1159 },2497 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1159 },
2496 .{ .char = 'f', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1160 },2498 .{ .char = 'f', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1160 },
2497 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 174 },2499 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 174 },
...@@ -2688,7 +2690,7 @@ const dafsa = [_]Node{...@@ -2688,7 +2690,7 @@ const dafsa = [_]Node{
2688 .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1387 },2690 .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1387 },
2689 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1388 },2691 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1388 },
2690 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1371 },2692 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1371 },
2691 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1389 },2693 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1389 },
2692 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1393 },2694 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1393 },
2693 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 174 },2695 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 174 },
2694 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 176 },2696 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 176 },
...@@ -2919,7 +2921,7 @@ const dafsa = [_]Node{...@@ -2919,7 +2921,7 @@ const dafsa = [_]Node{
2919 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1574 },2921 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1574 },
2920 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1575 },2922 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1575 },
2921 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1576 },2923 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1576 },
2922 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1577 },2924 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 1577 },
2923 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 509 },2925 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 509 },
2924 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 510 },2926 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 510 },
2925 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 511 },2927 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 511 },
...@@ -3107,1047 +3109,1054 @@ const dafsa = [_]Node{...@@ -3107,1047 +3109,1054 @@ const dafsa = [_]Node{
3107 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1728 },3109 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1728 },
3108 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1729 },3110 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1729 },
3109 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1730 },3111 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1730 },
3110 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1604 },3112 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1731 },
3111 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1731 },3113 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1732 },
3112 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1732 },3114 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1733 },
3113 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1733 },3115 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1734 },
3114 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 236 },3116 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 236 },
3115 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 857 },3117 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 857 },
3116 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1734 },3118 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1735 },
3117 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 863 },3119 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 863 },
3118 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1735 },3120 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1736 },
3119 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 867 },3121 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 867 },
3120 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 1736 },3122 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 1737 },
3121 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1735 },3123 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1736 },
3122 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 1737 },3124 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 1738 },
3123 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 13, .child_index = 1739 },3125 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 13, .child_index = 1740 },
3124 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 25, .child_index = 1740 },3126 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 25, .child_index = 1741 },
3125 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1741 },3127 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1742 },
3126 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1742 },3128 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1743 },
3127 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1743 },3129 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1744 },
3128 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1744 },3130 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1745 },
3129 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1745 },3131 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1746 },
3130 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1746 },3132 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1747 },
3131 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1747 },3133 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1748 },
3132 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 567 },3134 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 567 },
3133 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1748 },3135 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1749 },
3134 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1749 },3136 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1750 },
3135 .{ .char = '6', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 633 },3137 .{ .char = '6', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 633 },
3136 .{ .char = '6', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 633 },3138 .{ .char = '6', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 633 },
3137 .{ .char = 'g', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },3139 .{ .char = 'g', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
3138 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 1750 },3140 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 1751 },
3139 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1751 },3141 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1752 },
3140 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1752 },3142 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1753 },
3141 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1753 },3143 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1754 },
3142 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1754 },3144 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1755 },
3143 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 10, .child_index = 1755 },3145 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 10, .child_index = 1756 },
3144 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 569 },3146 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 569 },
3145 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1756 },3147 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1757 },
3146 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1208 },3148 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1208 },
3147 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1757 },3149 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1758 },
3148 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1759 },3150 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1760 },
3149 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1761 },3151 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1762 },
3150 .{ .char = 'o', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 572 },3152 .{ .char = 'o', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 572 },
3151 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1762 },3153 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1763 },
3152 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 649 },3154 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 649 },
3153 .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1763 },3155 .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1764 },
3154 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 641 },3156 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 641 },
3155 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1764 },3157 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1765 },
3156 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1765 },3158 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1766 },
3157 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1766 },3159 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1767 },
3158 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1767 },3160 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1768 },
3159 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1768 },3161 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1769 },
3160 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1770 },3162 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1771 },
3161 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1771 },3163 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1772 },
3162 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1772 },3164 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1773 },
3163 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1773 },3165 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1774 },
3164 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1774 },3166 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1775 },
3165 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1771 },3167 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1772 },
3166 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1775 },3168 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1776 },
3167 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1777 },3169 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1778 },
3168 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1777 },3170 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1778 },
3169 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1778 },3171 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1779 },
3170 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1779 },3172 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1780 },
3171 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1780 },3173 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1781 },
3172 .{ .char = 'a', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1782 },3174 .{ .char = 'a', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1783 },
3173 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1783 },3175 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1784 },
3174 .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1784 },3176 .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1785 },
3175 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1785 },3177 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1786 },
3176 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1786 },3178 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1787 },
3177 .{ .char = '1', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 632 },3179 .{ .char = '1', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 632 },
3178 .{ .char = '3', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1787 },3180 .{ .char = '3', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1788 },
3179 .{ .char = '6', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 633 },3181 .{ .char = '6', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 633 },
3180 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1788 },3182 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1789 },
3181 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1789 },3183 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1790 },
3182 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1790 },3184 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1791 },
3183 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1791 },3185 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1792 },
3184 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1792 },3186 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1793 },
3185 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1793 },3187 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1794 },
3186 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1794 },3188 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1795 },
3187 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1795 },3189 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1796 },
3188 .{ .char = '2', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1796 },3190 .{ .char = '2', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1797 },
3189 .{ .char = '6', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },3191 .{ .char = '6', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
3190 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1797 },3192 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1798 },
3191 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 236 },3193 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 236 },
3192 .{ .char = 's', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },3194 .{ .char = 's', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
3193 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1798 },3195 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1799 },
3194 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1799 },3196 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1800 },
3195 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1800 },3197 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1801 },
3196 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1801 },3198 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1802 },
3197 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1803 },3199 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1804 },
3198 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1804 },3200 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1805 },
3199 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1805 },3201 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1806 },
3200 .{ .char = '2', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1796 },3202 .{ .char = '2', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1797 },
3201 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 1806 },3203 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 1807 },
3202 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1807 },3204 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1808 },
3203 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1808 },3205 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1809 },
3204 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1809 },3206 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1810 },
3205 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1810 },3207 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1811 },
3206 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1811 },3208 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1812 },
3207 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1812 },3209 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1813 },
3208 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1813 },3210 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1814 },
3209 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1814 },3211 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1815 },
3210 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1815 },3212 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1816 },
3211 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1816 },3213 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1817 },
3212 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1817 },3214 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1818 },
3213 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1818 },3215 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1819 },
3214 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1819 },3216 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1820 },
3215 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1751 },3217 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1752 },
3216 .{ .char = 's', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 1820 },3218 .{ .char = 's', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 1821 },
3217 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1822 },3219 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1823 },
3218 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1823 },
3219 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1824 },3220 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1824 },
3220 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1825 },3221 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1825 },
3222 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1826 },
3221 .{ .char = 'a', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1479 },3223 .{ .char = 'a', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1479 },
3222 .{ .char = 'd', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1479 },3224 .{ .char = 'd', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1479 },
3223 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1826 },3225 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1827 },
3224 .{ .char = 'y', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 1827 },3226 .{ .char = 'y', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 1828 },
3225 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 1827 },3227 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 1828 },
3226 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1828 },3228 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1829 },
3227 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1829 },3229 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1830 },
3228 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1830 },3230 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1831 },
3229 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1831 },3231 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1832 },
3230 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1832 },3232 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1833 },
3231 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1833 },3233 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1834 },
3232 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1834 },
3233 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1835 },3234 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1835 },
3234 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1836 },3235 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1836 },
3235 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1837 },3236 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1837 },
3237 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1838 },
3236 .{ .char = 'y', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 1278 },3238 .{ .char = 'y', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 1278 },
3237 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1838 },3239 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1839 },
3238 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1839 },3240 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1840 },
3239 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 1840 },3241 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 1841 },
3240 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1841 },3242 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1842 },
3241 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1842 },3243 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1843 },
3242 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 9, .child_index = 1843 },3244 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 9, .child_index = 1844 },
3243 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1844 },3245 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1845 },
3244 .{ .char = 'o', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1479 },3246 .{ .char = 'o', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1479 },
3245 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1674 },3247 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1674 },
3246 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 1845 },3248 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 1846 },
3247 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 1847 },3249 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 1848 },
3248 .{ .char = 'f', .end_of_word = true, .end_of_list = false, .number = 3, .child_index = 1489 },3250 .{ .char = 'f', .end_of_word = true, .end_of_list = false, .number = 3, .child_index = 1489 },
3249 .{ .char = 'l', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },3251 .{ .char = 'l', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
3250 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1458 },3252 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1458 },
3251 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1327 },3253 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1327 },
3252 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 1848 },3254 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 1849 },
3253 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1479 },3255 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1479 },
3254 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1849 },
3255 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1850 },3256 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1850 },
3257 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1851 },
3256 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 287 },3258 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 287 },
3257 .{ .char = 's', .end_of_word = true, .end_of_list = true, .number = 8, .child_index = 1851 },3259 .{ .char = 's', .end_of_word = true, .end_of_list = true, .number = 8, .child_index = 1852 },
3258 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 419 },3260 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 419 },
3259 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1854 },3261 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1855 },
3260 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1855 },3262 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1856 },
3261 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1856 },3263 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1857 },
3262 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1857 },3264 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1858 },
3263 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1858 },3265 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1859 },
3264 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1859 },3266 .{ .char = 'g', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 1860 },
3265 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1860 },3267 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1861 },
3266 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1861 },3268 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1862 },
3269 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1863 },
3267 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 448 },3270 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 448 },
3268 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1862 },3271 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1864 },
3269 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 1863 },3272 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 1865 },
3270 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 1864 },3273 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 1866 },
3271 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1865 },3274 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1867 },
3272 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 13, .child_index = 1866 },3275 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 13, .child_index = 1868 },
3273 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 25, .child_index = 1872 },3276 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 25, .child_index = 1874 },
3274 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1883 },3277 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1885 },
3275 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1884 },
3276 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1885 },
3277 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1886 },3278 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1886 },
3278 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1887 },3279 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1887 },
3279 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1888 },3280 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1888 },
3280 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1889 },3281 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1889 },
3282 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1890 },
3283 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1891 },
3281 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 657 },3284 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 657 },
3282 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1890 },3285 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1892 },
3283 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 1891 },3286 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 1893 },
3284 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 571 },3287 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 571 },
3285 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1892 },3288 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1894 },
3286 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1893 },3289 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1895 },
3287 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1894 },3290 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1896 },
3288 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 10, .child_index = 1895 },3291 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 10, .child_index = 1897 },
3289 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1896 },3292 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1898 },
3290 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 448 },3293 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 448 },
3291 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 448 },3294 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 448 },
3292 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 453 },3295 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 453 },
3293 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 447 },3296 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 447 },
3294 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 510 },3297 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 510 },
3295 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1897 },3298 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1899 },
3296 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1898 },3299 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1900 },
3297 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1899 },3300 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1901 },
3298 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1900 },3301 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1902 },
3299 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1901 },3302 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1903 },
3300 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1902 },3303 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1904 },
3301 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1774 },3304 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1775 },
3302 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1903 },3305 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1905 },
3303 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1904 },3306 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1906 },
3304 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1774 },3307 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1775 },
3305 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1905 },
3306 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1906 },
3307 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1903 },
3308 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1905 },
3309 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1903 },
3310 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1775 },
3311 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1907 },3308 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1907 },
3312 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1835 },3309 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1908 },
3313 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1908 },3310 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1905 },
3311 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1907 },
3312 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1905 },
3313 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1776 },
3314 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1909 },
3315 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1836 },
3316 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1910 },
3314 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 281 },3317 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 281 },
3315 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1909 },3318 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1911 },
3316 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1911 },3319 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1913 },
3317 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1912 },3320 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1914 },
3318 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 301 },3321 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 301 },
3319 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1915 },3322 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1917 },
3320 .{ .char = '2', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },3323 .{ .char = '2', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
3321 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1916 },3324 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1918 },
3322 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1917 },3325 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1919 },
3323 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1918 },3326 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1920 },
3324 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1919 },3327 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1921 },
3325 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1920 },3328 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1922 },
3326 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1921 },3329 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1923 },
3327 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1922 },3330 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1924 },
3328 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1923 },3331 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1925 },
3329 .{ .char = '8', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },3332 .{ .char = '8', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
3330 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1924 },3333 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1926 },
3331 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1925 },3334 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1927 },
3332 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1926 },3335 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1928 },
3333 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1927 },3336 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1929 },
3334 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1928 },3337 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1930 },
3335 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1929 },3338 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1931 },
3336 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1930 },3339 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1932 },
3337 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1931 },3340 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1933 },
3338 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1932 },3341 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1934 },
3339 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1933 },3342 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1935 },
3340 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1934 },3343 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1936 },
3341 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1513 },3344 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1513 },
3342 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1935 },3345 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1937 },
3343 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1936 },3346 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1938 },
3344 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1937 },3347 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1939 },
3345 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 698 },3348 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 698 },
3346 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1938 },3349 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1940 },
3347 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1939 },3350 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1941 },
3348 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1241 },3351 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1241 },
3349 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1940 },3352 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1942 },
3350 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1941 },3353 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1943 },
3351 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 998 },3354 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 998 },
3352 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1942 },3355 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1944 },
3353 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1943 },3356 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1945 },
3354 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1944 },3357 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1946 },
3355 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 640 },3358 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 640 },
3356 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1945 },3359 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1947 },
3357 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1525 },3360 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1525 },
3358 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1946 },3361 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1948 },
3359 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1947 },3362 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1949 },
3360 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1949 },3363 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1951 },
3361 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1318 },3364 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1318 },
3362 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1950 },3365 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1952 },
3363 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1951 },3366 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1953 },
3364 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1952 },
3365 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1953 },
3366 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1954 },3367 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1954 },
3367 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1955 },3368 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1955 },
3369 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1956 },
3370 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1957 },
3368 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 486 },3371 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 486 },
3369 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1956 },3372 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1958 },
3370 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1957 },3373 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1959 },
3371 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1958 },3374 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1960 },
3372 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1959 },3375 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1961 },
3373 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 1960 },3376 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 1962 },
3374 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1961 },3377 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1963 },
3375 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1962 },3378 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1964 },
3376 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 9, .child_index = 1963 },3379 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 9, .child_index = 1965 },
3377 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1950 },3380 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1952 },
3378 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 1967 },3381 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 1969 },
3379 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1968 },3382 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1970 },
3380 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1969 },3383 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1971 },
3381 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1479 },3384 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1479 },
3382 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1280 },3385 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1280 },
3383 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1922 },3386 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1924 },
3384 .{ .char = 'f', .end_of_word = true, .end_of_list = false, .number = 3, .child_index = 1489 },3387 .{ .char = 'f', .end_of_word = true, .end_of_list = false, .number = 3, .child_index = 1489 },
3385 .{ .char = 'l', .end_of_word = true, .end_of_list = false, .number = 1, .child_index = 0 },3388 .{ .char = 'l', .end_of_word = true, .end_of_list = false, .number = 1, .child_index = 0 },
3386 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1970 },3389 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1972 },
3387 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1971 },3390 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1973 },
3388 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1972 },3391 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1974 },
3389 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1973 },3392 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1975 },
3390 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1974 },3393 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1976 },
3391 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1975 },3394 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1977 },
3392 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1976 },3395 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1978 },
3393 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1977 },3396 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1979 },
3394 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1978 },3397 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1980 },
3398 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1981 },
3395 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },3399 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },
3396 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 1979 },3400 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 1982 },
3397 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1980 },3401 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1983 },
3398 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1981 },3402 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1984 },
3399 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1579 },3403 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1579 },
3400 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1580 },3404 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1580 },
3401 .{ .char = 'f', .end_of_word = false, .end_of_list = false, .number = 7, .child_index = 1587 },3405 .{ .char = 'f', .end_of_word = false, .end_of_list = false, .number = 7, .child_index = 1587 },
3402 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1982 },3406 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1985 },
3403 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1583 },3407 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1583 },
3404 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1588 },3408 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1588 },
3405 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1983 },3409 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1986 },
3406 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1985 },3410 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1988 },
3407 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 791 },3411 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 791 },
3408 .{ .char = 'f', .end_of_word = false, .end_of_list = false, .number = 8, .child_index = 792 },3412 .{ .char = 'f', .end_of_word = false, .end_of_list = false, .number = 8, .child_index = 792 },
3409 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 794 },3413 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 794 },
3410 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 795 },3414 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 795 },
3411 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 797 },3415 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 797 },
3412 .{ .char = 'o', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 798 },3416 .{ .char = 'o', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 798 },
3413 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 1986 },3417 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 1989 },
3414 .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1586 },3418 .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1586 },
3415 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 804 },3419 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 804 },
3416 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1988 },3420 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1991 },
3417 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1995 },3421 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1998 },
3418 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1996 },3422 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1999 },
3419 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1997 },3423 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2000 },
3420 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },3424 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },
3421 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1998 },3425 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2001 },
3422 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1999 },3426 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2002 },
3423 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2000 },3427 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2003 },
3424 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2001 },3428 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2004 },
3425 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2002 },3429 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2005 },
3426 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2003 },3430 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2006 },
3427 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2004 },3431 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2007 },
3428 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 10, .child_index = 2005 },3432 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 10, .child_index = 2008 },
3429 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 791 },3433 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 791 },
3430 .{ .char = 'b', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },3434 .{ .char = 'b', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
3431 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2006 },3435 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2009 },
3432 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2007 },3436 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2010 },
3433 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2008 },3437 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2011 },
3434 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2009 },3438 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2012 },
3435 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2010 },3439 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2013 },
3436 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2011 },3440 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2014 },
3437 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2012 },3441 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2015 },
3438 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2011 },3442 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2014 },
3439 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2011 },3443 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2014 },
3440 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2013 },3444 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2016 },
3441 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2014 },3445 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2017 },
3442 .{ .char = 'u', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2015 },3446 .{ .char = 'u', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2018 },
3443 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2016 },3447 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2019 },
3444 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2017 },3448 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2020 },
3445 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1519 },3449 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1519 },
3446 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2018 },3450 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2021 },
3447 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2019 },3451 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2022 },
3448 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2020 },3452 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2023 },
3449 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2021 },3453 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2024 },
3450 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2022 },3454 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2025 },
3451 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 503 },3455 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 503 },
3452 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2023 },3456 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2026 },
3453 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2024 },3457 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2027 },
3454 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2025 },3458 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2028 },
3455 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2026 },3459 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2029 },
3456 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 5, .child_index = 1295 },3460 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 5, .child_index = 1295 },
3457 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2027 },3461 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2030 },
3458 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2028 },3462 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2031 },
3459 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 281 },3463 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 281 },
3460 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2029 },3464 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2032 },
3461 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 554 },3465 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 554 },
3462 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2030 },3466 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2033 },
3463 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2031 },3467 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2034 },
3464 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2032 },3468 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2035 },
3465 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2033 },3469 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2036 },
3466 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2034 },3470 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2037 },
3467 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2035 },3471 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2038 },
3468 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2036 },3472 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2039 },
3469 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2037 },3473 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2040 },
3470 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2038 },3474 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2041 },
3471 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2039 },3475 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2042 },
3472 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 419 },3476 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 419 },
3473 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2040 },3477 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2043 },
3474 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2041 },3478 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2044 },
3475 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2042 },3479 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2045 },
3476 .{ .char = 'q', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2043 },3480 .{ .char = 'q', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2046 },
3477 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2044 },3481 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2047 },
3478 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2045 },3482 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2048 },
3479 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2046 },3483 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2049 },
3480 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2047 },3484 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2050 },
3481 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2048 },3485 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2051 },
3482 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2049 },3486 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2052 },
3483 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2050 },3487 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2053 },
3484 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2051 },3488 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2054 },
3485 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2052 },3489 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2055 },
3486 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2053 },3490 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2056 },
3487 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2054 },3491 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2057 },
3488 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1745 },3492 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1746 },
3489 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2055 },3493 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2058 },
3490 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2056 },3494 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2059 },
3491 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 2057 },3495 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 2060 },
3492 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2059 },3496 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2062 },
3493 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2060 },3497 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2063 },
3494 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2063 },3498 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2066 },
3495 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2064 },3499 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2067 },
3496 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1757 },3500 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1758 },
3497 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 2065 },3501 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 2068 },
3498 .{ .char = 'o', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 572 },3502 .{ .char = 'o', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 572 },
3499 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 649 },3503 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 649 },
3500 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2068 },3504 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2071 },
3501 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2069 },3505 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2072 },
3502 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1923 },3506 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1925 },
3503 .{ .char = 'i', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 352 },3507 .{ .char = 'i', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 352 },
3504 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2070 },3508 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2073 },
3505 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2071 },3509 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2074 },
3506 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2072 },3510 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2075 },
3507 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2073 },3511 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2076 },
3508 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1982 },3512 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1985 },
3513 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2077 },
3509 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1661 },3514 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1661 },
3510 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2074 },3515 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2078 },
3511 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2075 },3516 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2079 },
3512 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 2076 },3517 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 2080 },
3513 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2077 },3518 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2081 },
3514 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2078 },3519 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2082 },
3515 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 236 },3520 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 236 },
3516 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 851 },3521 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 851 },
3517 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 851 },3522 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 851 },
3518 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 854 },3523 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 854 },
3519 .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 864 },3524 .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 864 },
3520 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 865 },3525 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 865 },
3521 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 12, .child_index = 2079 },3526 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 12, .child_index = 2083 },
3522 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1759 },3527 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1760 },
3523 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2081 },3528 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2085 },
3524 .{ .char = 'o', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2082 },3529 .{ .char = 'o', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2086 },
3525 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2083 },3530 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2087 },
3526 .{ .char = 'u', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2084 },3531 .{ .char = 'u', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2088 },
3527 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2085 },3532 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2089 },
3528 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2086 },3533 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2090 },
3529 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2087 },3534 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2091 },
3530 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2088 },3535 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2092 },
3531 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2089 },3536 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2093 },
3532 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2090 },3537 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2094 },
3533 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2091 },3538 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2095 },
3534 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2092 },3539 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2096 },
3535 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2093 },3540 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2097 },
3536 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2094 },3541 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2098 },
3537 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2095 },3542 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2099 },
3538 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 10, .child_index = 2096 },3543 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 10, .child_index = 2100 },
3539 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2097 },3544 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2101 },
3540 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 476 },3545 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 476 },
3541 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2098 },3546 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2102 },
3542 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2099 },3547 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2103 },
3543 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2100 },3548 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2104 },
3544 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2101 },3549 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2105 },
3545 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2011 },3550 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2014 },
3546 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2102 },3551 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2106 },
3547 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 447 },3552 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 447 },
3548 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2103 },3553 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2107 },
3549 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2104 },3554 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2108 },
3550 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2105 },3555 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2109 },
3551 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2106 },3556 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2110 },
3552 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2107 },3557 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2111 },
3553 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2108 },3558 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2112 },
3554 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2109 },3559 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2113 },
3555 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2110 },3560 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2114 },
3556 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2111 },3561 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2115 },
3557 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2112 },3562 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2116 },
3558 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 281 },3563 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 281 },
3559 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2113 },3564 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2117 },
3560 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2114 },3565 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2118 },
3561 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2115 },3566 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2119 },
3562 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 568 },3567 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 568 },
3563 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2116 },3568 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2120 },
3564 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2117 },
3565 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2118 },
3566 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2119 },
3567 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2120 },
3568 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2121 },3569 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2121 },
3570 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2122 },
3571 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2123 },
3572 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2124 },
3573 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2125 },
3569 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 335 },3574 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 335 },
3570 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2122 },3575 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2126 },
3571 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 437 },3576 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 437 },
3572 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2123 },3577 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2127 },
3573 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2124 },3578 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2128 },
3574 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 448 },3579 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 448 },
3575 .{ .char = 'r', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2125 },3580 .{ .char = 'r', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2129 },
3576 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1822 },3581 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1823 },
3577 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2126 },3582 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2130 },
3578 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1423 },3583 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1423 },
3579 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2041 },3584 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2044 },
3580 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2127 },3585 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2131 },
3581 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2128 },3586 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2132 },
3582 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2129 },3587 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2133 },
3583 .{ .char = 'r', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1479 },3588 .{ .char = 'r', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1479 },
3584 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1689 },3589 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1689 },
3585 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2130 },3590 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2134 },
3586 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2131 },3591 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2135 },
3587 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2132 },3592 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2136 },
3588 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2133 },3593 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2137 },
3589 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2135 },3594 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2139 },
3590 .{ .char = 'g', .end_of_word = true, .end_of_list = false, .number = 1, .child_index = 0 },3595 .{ .char = 'g', .end_of_word = true, .end_of_list = false, .number = 1, .child_index = 0 },
3591 .{ .char = 'l', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 695 },3596 .{ .char = 'l', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 695 },
3592 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2136 },3597 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2140 },
3593 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2137 },3598 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2141 },
3594 .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2138 },3599 .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2142 },
3595 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2139 },3600 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2143 },
3596 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2141 },3601 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2145 },
3597 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2142 },3602 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2146 },
3598 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2143 },3603 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2147 },
3599 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2144 },3604 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2148 },
3600 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 640 },3605 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 640 },
3601 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2145 },3606 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2149 },
3602 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2146 },3607 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2150 },
3603 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2147 },3608 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2151 },
3604 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2148 },3609 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2152 },
3605 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1974 },3610 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1976 },
3606 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2149 },3611 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2153 },
3607 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2150 },3612 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2154 },
3608 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2151 },3613 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2155 },
3609 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 2152 },3614 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2156 },
3610 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2157 },3615 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 2157 },
3611 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2108 },3616 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2162 },
3612 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2161 },3617 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2112 },
3613 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2161 },3618 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2166 },
3614 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2162 },3619 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2166 },
3620 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2167 },
3615 .{ .char = 'r', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 974 },3621 .{ .char = 'r', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 974 },
3616 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2163 },3622 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2168 },
3617 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1759 },3623 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1760 },
3618 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2082 },3624 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2086 },
3619 .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 974 },3625 .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 974 },
3620 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2164 },3626 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2169 },
3621 .{ .char = 'h', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 974 },3627 .{ .char = 'h', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 974 },
3622 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2165 },3628 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2170 },
3623 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2166 },3629 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2171 },
3624 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2167 },3630 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2172 },
3625 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2168 },3631 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2173 },
3626 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },3632 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },
3627 .{ .char = 'E', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2169 },3633 .{ .char = 'E', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2174 },
3628 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2170 },3634 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2175 },
3629 .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 10, .child_index = 2171 },3635 .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 10, .child_index = 2176 },
3630 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },3636 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },
3631 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2176 },3637 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2181 },
3632 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2177 },3638 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2182 },
3633 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2178 },3639 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2183 },
3634 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2179 },3640 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2184 },
3635 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2180 },3641 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2185 },
3636 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2181 },3642 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2186 },
3637 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2182 },3643 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2187 },
3638 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2183 },
3639 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2184 },
3640 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2185 },
3641 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2157 },
3642 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2186 },
3643 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2187 },
3644 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 572 },
3645 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2188 },3644 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2188 },
3646 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2189 },3645 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2189 },
3647 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2190 },3646 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2190 },
3648 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2191 },3647 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2162 },
3649 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2192 },3648 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2191 },
3650 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2193 },3649 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2192 },
3651 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2194 },3650 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 572 },
3652 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2195 },3651 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2193 },
3653 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2196 },3652 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2194 },
3654 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2197 },3653 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2195 },
3655 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2198 },3654 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2196 },
3656 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2199 },3655 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2197 },
3657 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2200 },3656 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2198 },
3658 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1943 },3657 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2199 },
3659 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2201 },3658 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2200 },
3660 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2202 },3659 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2201 },
3661 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2203 },3660 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2202 },
3662 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2204 },3661 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2203 },
3663 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2205 },3662 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2204 },
3664 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2206 },3663 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2205 },
3665 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2207 },3664 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1945 },
3666 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2208 },3665 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2206 },
3667 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2209 },3666 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2207 },
3668 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2210 },3667 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2208 },
3669 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2211 },3668 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2209 },
3670 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2212 },3669 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2210 },
3671 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2213 },3670 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2211 },
3672 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2214 },3671 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2212 },
3673 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2215 },3672 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2213 },
3674 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2216 },3673 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2214 },
3675 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2141 },3674 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2215 },
3676 .{ .char = 'x', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2217 },3675 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2216 },
3677 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2217 },3676 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2217 },
3678 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2157 },3677 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2218 },
3679 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2145 },3678 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2219 },
3680 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2218 },3679 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2220 },
3681 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2219 },3680 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2221 },
3681 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2145 },
3682 .{ .char = 'x', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2222 },
3683 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2222 },
3684 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2162 },
3685 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2149 },
3686 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2223 },
3687 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2224 },
3682 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },3688 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },
3683 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2220 },3689 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2225 },
3690 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2226 },
3684 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },3691 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },
3685 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1757 },3692 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1758 },
3686 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1759 },3693 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1760 },
3687 .{ .char = 'o', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 572 },3694 .{ .char = 'o', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 572 },
3688 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1762 },3695 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1763 },
3689 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 649 },3696 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 649 },
3690 .{ .char = '1', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 632 },3697 .{ .char = '1', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 632 },
3691 .{ .char = '3', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1787 },3698 .{ .char = '3', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1788 },
3692 .{ .char = '6', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 633 },3699 .{ .char = '6', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 633 },
3693 .{ .char = '8', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },3700 .{ .char = '8', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
3694 .{ .char = 'd', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 974 },3701 .{ .char = 'd', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 974 },
3695 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2161 },3702 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2166 },
3696 .{ .char = 'b', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 974 },3703 .{ .char = 'b', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 974 },
3697 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2221 },3704 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2227 },
3698 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2222 },3705 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2228 },
3699 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 314 },3706 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 314 },
3700 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1421 },3707 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1421 },
3701 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2223 },3708 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2229 },
3702 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2224 },3709 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2230 },
3703 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2225 },3710 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2231 },
3704 .{ .char = '1', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 632 },3711 .{ .char = '1', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 632 },
3705 .{ .char = '8', .end_of_word = true, .end_of_list = false, .number = 1, .child_index = 0 },3712 .{ .char = '8', .end_of_word = true, .end_of_list = false, .number = 1, .child_index = 0 },
3706 .{ .char = 'A', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2226 },3713 .{ .char = 'A', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2232 },
3707 .{ .char = 'P', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2035 },3714 .{ .char = 'P', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2038 },
3708 .{ .char = 'S', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2227 },3715 .{ .char = 'S', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2233 },
3709 .{ .char = 'M', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2228 },3716 .{ .char = 'M', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2234 },
3710 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2229 },3717 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2235 },
3711 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2230 },3718 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2236 },
3712 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 512 },3719 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 512 },
3713 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2231 },3720 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2237 },
3714 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2232 },3721 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2238 },
3715 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2233 },3722 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2239 },
3716 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2234 },3723 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2240 },
3717 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2235 },3724 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2241 },
3718 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2236 },3725 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2242 },
3719 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2237 },3726 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2243 },
3720 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2238 },3727 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2244 },
3721 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2239 },3728 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2245 },
3722 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 649 },3729 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 649 },
3723 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2240 },3730 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2246 },
3724 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 335 },3731 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 335 },
3725 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2241 },3732 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2247 },
3726 .{ .char = 'j', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2242 },3733 .{ .char = 'j', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2248 },
3727 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2243 },3734 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2249 },
3728 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2244 },3735 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2250 },
3729 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2245 },3736 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2251 },
3730 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2201 },3737 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2206 },
3731 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2246 },3738 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2252 },
3732 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2247 },3739 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2253 },
3733 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2248 },3740 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2254 },
3734 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 566 },3741 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 566 },
3735 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2249 },3742 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2255 },
3736 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1752 },3743 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1753 },
3737 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2250 },3744 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2256 },
3738 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2251 },3745 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2257 },
3739 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2252 },3746 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2258 },
3740 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2253 },3747 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2259 },
3741 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2254 },3748 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2260 },
3742 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2231 },3749 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2237 },
3743 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2255 },3750 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2261 },
3744 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2256 },3751 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2262 },
3745 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2257 },3752 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2263 },
3746 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2258 },3753 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2264 },
3747 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2259 },3754 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2265 },
3748 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2260 },3755 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2266 },
3749 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2261 },3756 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2267 },
3750 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2262 },3757 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2268 },
3751 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2263 },3758 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2269 },
3752 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2264 },3759 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2270 },
3753 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2265 },3760 .{ .char = 'k', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2271 },
3754 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2266 },3761 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2272 },
3755 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2267 },3762 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2273 },
3756 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2268 },3763 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2274 },
3757 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2269 },3764 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2275 },
3765 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2276 },
3758 .{ .char = '1', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 632 },3766 .{ .char = '1', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 632 },
3759 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1430 },3767 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1430 },
3760 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2270 },3768 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2277 },
3761 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2271 },3769 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2278 },
3762 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },3770 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },
3763 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2272 },3771 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2279 },
3764 .{ .char = 'w', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },3772 .{ .char = 'w', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
3765 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2273 },3773 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2280 },
3766 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2274 },3774 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2281 },
3767 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2275 },3775 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2282 },
3768 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2276 },3776 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2283 },
3769 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2277 },3777 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2284 },
3770 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2278 },3778 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2285 },
3771 .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 2279 },3779 .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 2286 },
3772 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },3780 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },
3773 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2281 },3781 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2288 },
3774 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2282 },3782 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2289 },
3775 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1546 },3783 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1546 },
3776 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2283 },3784 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2290 },
3777 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2284 },3785 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2291 },
3778 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2296 },3786 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2303 },
3779 .{ .char = 'm', .end_of_word = true, .end_of_list = true, .number = 5, .child_index = 1295 },3787 .{ .char = 'm', .end_of_word = true, .end_of_list = true, .number = 5, .child_index = 1295 },
3780 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2297 },3788 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2304 },
3781 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2298 },3789 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2305 },
3782 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2299 },3790 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2306 },
3783 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },3791 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },
3784 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2300 },3792 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2307 },
3785 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2301 },3793 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2308 },
3786 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2303 },3794 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2310 },
3787 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2304 },3795 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2311 },
3788 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2305 },3796 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2312 },
3789 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2306 },3797 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2313 },
3790 .{ .char = 'h', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2307 },3798 .{ .char = 'h', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2314 },
3791 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2308 },3799 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2315 },
3792 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2309 },3800 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2316 },
3793 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2310 },3801 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2317 },
3794 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2197 },3802 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2202 },
3795 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 561 },3803 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 561 },
3796 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2312 },3804 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2319 },
3797 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2313 },3805 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2320 },
3798 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2314 },3806 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2171 },
3799 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2315 },3807 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2321 },
3800 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2316 },3808 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2322 },
3801 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2317 },3809 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2323 },
3802 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2319 },3810 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2324 },
3811 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2326 },
3803 .{ .char = 'b', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 1434 },3812 .{ .char = 'b', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 1434 },
3804 .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2320 },3813 .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2327 },
3805 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2321 },3814 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2328 },
3806 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2322 },3815 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2329 },
3807 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2323 },3816 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2330 },
3808 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2324 },3817 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2331 },
3809 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2325 },3818 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2332 },
3810 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2326 },3819 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2333 },
3811 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2327 },3820 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2334 },
3812 .{ .char = 'f', .end_of_word = true, .end_of_list = false, .number = 2, .child_index = 2225 },3821 .{ .char = 'f', .end_of_word = true, .end_of_list = false, .number = 2, .child_index = 2231 },
3813 .{ .char = 'l', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },3822 .{ .char = 'l', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
3814 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 486 },3823 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 486 },
3815 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2328 },3824 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2335 },
3816 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2329 },3825 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2336 },
3817 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2330 },3826 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2337 },
3818 .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2335 },3827 .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2342 },
3819 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 2336 },3828 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 2343 },
3820 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2339 },3829 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2346 },
3821 .{ .char = 'f', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2340 },3830 .{ .char = 'f', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2347 },
3822 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2342 },3831 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2349 },
3823 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2343 },3832 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2350 },
3824 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2345 },3833 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2352 },
3825 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2346 },3834 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2353 },
3826 .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2347 },3835 .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2354 },
3827 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 2349 },3836 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 2356 },
3828 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2352 },3837 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2359 },
3829 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2354 },3838 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2361 },
3830 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2355 },3839 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2362 },
3831 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2356 },3840 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2363 },
3832 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2357 },3841 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2364 },
3833 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2358 },3842 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2365 },
3834 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1583 },3843 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1583 },
3835 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1588 },3844 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1588 },
3836 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2359 },3845 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2366 },
3837 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 450 },3846 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 450 },
3838 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2360 },3847 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2367 },
3839 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2361 },3848 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2368 },
3840 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2362 },3849 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2369 },
3841 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2363 },3850 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2370 },
3842 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2364 },3851 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2371 },
3843 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2367 },3852 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2374 },
3844 .{ .char = 'p', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },3853 .{ .char = 'p', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
3845 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2368 },3854 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2375 },
3846 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2369 },3855 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2376 },
3847 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2370 },3856 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2377 },
3848 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2371 },3857 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2378 },
3849 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2372 },3858 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2379 },
3850 .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 8, .child_index = 2373 },3859 .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 8, .child_index = 2380 },
3851 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2374 },3860 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2381 },
3852 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2375 },3861 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2382 },
3853 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2376 },3862 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2383 },
3854 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2377 },3863 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2384 },
3855 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2378 },3864 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2385 },
3856 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2379 },3865 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2386 },
3857 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2380 },3866 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2387 },
3858 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2381 },3867 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2388 },
3859 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2382 },3868 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2389 },
3860 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2383 },3869 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2390 },
3861 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 447 },3870 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 447 },
3862 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2384 },3871 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2391 },
3863 .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 335 },3872 .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 335 },
3864 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2385 },3873 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2392 },
3865 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2386 },3874 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2393 },
3866 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2387 },3875 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2394 },
3867 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2388 },3876 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2395 },
3868 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2389 },3877 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2396 },
3869 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2390 },3878 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2397 },
3870 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 706 },3879 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 706 },
3871 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2391 },3880 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2398 },
3872 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2393 },3881 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2400 },
3873 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2394 },3882 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2401 },
3874 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2395 },3883 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2402 },
3875 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2397 },3884 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2404 },
3876 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2398 },3885 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2405 },
3877 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2399 },3886 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2406 },
3878 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2400 },3887 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2407 },
3879 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2401 },3888 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2408 },
3880 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 567 },3889 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 567 },
3881 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2403 },3890 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2410 },
3882 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2404 },3891 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2411 },
3883 .{ .char = 'q', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 276 },3892 .{ .char = 'q', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 276 },
3884 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2405 },3893 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2412 },
3885 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2404 },3894 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2411 },
3886 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2406 },3895 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2413 },
3887 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2407 },3896 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2414 },
3888 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2408 },3897 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2415 },
3889 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2409 },3898 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2416 },
3890 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2410 },3899 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2417 },
3891 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2411 },3900 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2418 },
3892 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2412 },3901 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2419 },
3893 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2413 },3902 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2420 },
3894 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2414 },3903 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2421 },
3895 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2415 },3904 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2422 },
3896 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2416 },3905 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2423 },
3897 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2417 },3906 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2424 },
3898 .{ .char = 'g', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2418 },3907 .{ .char = 'g', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2425 },
3899 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2419 },3908 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2426 },
3900 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2363 },3909 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2370 },
3901 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2420 },3910 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2427 },
3902 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2421 },3911 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2428 },
3903 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2422 },3912 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2429 },
3904 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 974 },3913 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 974 },
3905 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2423 },3914 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2430 },
3906 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2424 },3915 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2431 },
3907 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2425 },3916 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2432 },
3908 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2426 },3917 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2433 },
3909 .{ .char = 'C', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2427 },3918 .{ .char = 'C', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2434 },
3910 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2428 },3919 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2435 },
3911 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2429 },3920 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2436 },
3912 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2430 },3921 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2437 },
3913 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2431 },3922 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2438 },
3914 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2432 },3923 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2439 },
3915 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2433 },3924 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2440 },
3916 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2434 },3925 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2441 },
3917 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2435 },3926 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2442 },
3918 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 335 },3927 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 335 },
3919 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2436 },3928 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2443 },
3920 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 447 },3929 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 447 },
3921 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2437 },3930 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2444 },
3922 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2438 },3931 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2445 },
3923 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2439 },3932 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2446 },
3924 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2440 },3933 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2447 },
3925 .{ .char = 's', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2441 },3934 .{ .char = 's', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2448 },
3926 .{ .char = 'p', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 2442 },3935 .{ .char = 'p', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 2449 },
3927 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 649 },3936 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 649 },
3928 .{ .char = 'a', .end_of_word = true, .end_of_list = false, .number = 1, .child_index = 0 },3937 .{ .char = 'a', .end_of_word = true, .end_of_list = false, .number = 1, .child_index = 0 },
3929 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 448 },3938 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 448 },
3930 .{ .char = 'g', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 2442 },3939 .{ .char = 'g', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 2449 },
3931 .{ .char = 'x', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 2444 },3940 .{ .char = 'x', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 2451 },
3932 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 2444 },3941 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 2451 },
3933 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2446 },3942 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2453 },
3934 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2447 },3943 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2454 },
3935 .{ .char = 'w', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },3944 .{ .char = 'w', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
3936 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2448 },3945 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2455 },
3937 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2441 },3946 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2448 },
3938 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2436 },3947 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2443 },
3939 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2449 },3948 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2456 },
3940 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2450 },3949 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2457 },
3941 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 572 },3950 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 572 },
3942 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2451 },3951 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2458 },
3943 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2452 },3952 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2459 },
3944 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2453 },3953 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2460 },
3945 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2454 },3954 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2461 },
3946 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2455 },3955 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2462 },
3947 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2456 },3956 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2463 },
3948 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2457 },3957 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2464 },
3949 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2458 },3958 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2465 },
3950 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2459 },3959 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2466 },
3951 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2460 },3960 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2467 },
3952 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2461 },3961 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2468 },
3953 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2462 },3962 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2469 },
3954 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2463 },
3955 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2464 },
3956 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 768 },
3957 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2374 },
3958 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 8, .child_index = 2465 },
3959 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2467 },
3960 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2468 },
3961 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2469 },
3962 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2470 },3963 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2470 },
3963 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2471 },3964 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2471 },
3964 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2472 },3965 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 768 },
3965 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2473 },3966 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2381 },
3966 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2474 },3967 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 8, .child_index = 2472 },
3967 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2475 },3968 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2474 },
3968 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2476 },3969 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2475 },
3969 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2477 },3970 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2476 },
3970 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2478 },3971 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2477 },
3971 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2479 },3972 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2478 },
3972 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2480 },3973 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2479 },
3973 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1751 },3974 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2480 },
3975 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2481 },
3976 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2482 },
3977 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2483 },
3978 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2484 },
3979 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2485 },
3980 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2486 },
3981 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2487 },
3982 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1752 },
3974 .{ .char = 'h', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },3983 .{ .char = 'h', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
3975 .{ .char = '1', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2481 },3984 .{ .char = '1', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2488 },
3976 .{ .char = '2', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },3985 .{ .char = '2', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
3977 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2262 },3986 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2268 },
3978 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 561 },3987 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 561 },
3979 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2482 },3988 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2489 },
3980 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2483 },3989 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2490 },
3981 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2484 },3990 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2491 },
3982 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 555 },3991 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 555 },
3983 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2485 },3992 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2492 },
3984 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2486 },3993 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2493 },
3985 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2487 },3994 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2494 },
3986 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2488 },3995 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2495 },
3987 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2489 },3996 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2496 },
3988 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2490 },3997 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2497 },
3989 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2491 },3998 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2498 },
3990 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2492 },3999 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2499 },
3991 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2493 },4000 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2500 },
3992 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2494 },4001 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2501 },
3993 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2495 },4002 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2502 },
3994 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2496 },4003 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2503 },
3995 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 450 },4004 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 450 },
3996 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2025 },4005 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2028 },
3997 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2497 },4006 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2504 },
3998 .{ .char = '6', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 2498 },4007 .{ .char = '6', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 2505 },
3999 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2499 },4008 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2506 },
4000 .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 2502 },4009 .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 2509 },
4001 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2506 },4010 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2513 },
4002 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2507 },4011 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2514 },
4003 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2508 },4012 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2515 },
4004 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2509 },4013 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2516 },
4005 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2510 },4014 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2517 },
4006 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2511 },4015 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2518 },
4007 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2512 },4016 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2519 },
4008 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2513 },4017 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2520 },
4009 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2514 },4018 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2521 },
4010 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2515 },4019 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2522 },
4011 .{ .char = '2', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },4020 .{ .char = '2', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
4012 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2516 },4021 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2523 },
4013 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2517 },4022 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2524 },
4014 .{ .char = '0', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },4023 .{ .char = '0', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
4015 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2518 },4024 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2525 },
4016 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2519 },4025 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2526 },
4017 .{ .char = 'd', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2520 },4026 .{ .char = 'd', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2527 },
4018 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2521 },4027 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2528 },
4019 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2522 },4028 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2529 },
4020 .{ .char = 'j', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2523 },4029 .{ .char = 'j', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2530 },
4021 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2524 },4030 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2531 },
4022 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2525 },4031 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2532 },
4023 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2526 },4032 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2533 },
4024 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2527 },4033 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2534 },
4025 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2528 },4034 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2535 },
4026 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2529 },4035 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2536 },
4027 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2530 },4036 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2537 },
4028 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2531 },4037 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2538 },
4029 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2532 },4038 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2539 },
4030 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2533 },4039 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2540 },
4031 .{ .char = '4', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 2534 },4040 .{ .char = '4', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 2541 },
4032 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2535 },4041 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2542 },
4033 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 486 },4042 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 486 },
4034 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2536 },4043 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2543 },
4035 .{ .char = '1', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 632 },4044 .{ .char = '1', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 632 },
4036 .{ .char = '6', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 633 },4045 .{ .char = '6', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 633 },
4037 .{ .char = '8', .end_of_word = true, .end_of_list = false, .number = 1, .child_index = 0 },4046 .{ .char = '8', .end_of_word = true, .end_of_list = false, .number = 1, .child_index = 0 },
4038 .{ .char = 'P', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2537 },4047 .{ .char = 'P', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2544 },
4039 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2538 },4048 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2545 },
4040 .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2539 },4049 .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2546 },
4041 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2041 },4050 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2044 },
4042 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2540 },4051 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2547 },
4043 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 512 },4052 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 512 },
4044 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1974 },4053 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1976 },
4045 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2541 },4054 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2548 },
4046 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2542 },4055 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2549 },
4047 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2543 },4056 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2550 },
4048 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 301 },4057 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 301 },
4049 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2544 },4058 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2551 },
4050 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2545 },4059 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2552 },
4051 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 461 },4060 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 461 },
4052 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 567 },4061 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 567 },
4053 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2546 },4062 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2553 },
4054 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2547 },4063 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2554 },
4055 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2548 },4064 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2555 },
4056 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2549 },4065 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2556 },
4057 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2550 },4066 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2557 },
4058 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1973 },4067 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1975 },
4059 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2551 },4068 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2558 },
4060 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 181 },4069 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 181 },
4061 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2552 },4070 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2559 },
4062 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2553 },4071 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2560 },
4063 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2554 },4072 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2561 },
4064 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2555 },4073 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2562 },
4065 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2556 },4074 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2563 },
4066 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2557 },4075 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2564 },
4067 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2499 },4076 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2506 },
4068 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2558 },4077 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2565 },
4069 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 640 },4078 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 640 },
4070 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2559 },4079 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2566 },
4071 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2560 },4080 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2567 },
4072 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2561 },4081 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2568 },
4073 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2015 },4082 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2018 },
4074 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2565 },4083 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2572 },
4075 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2566 },4084 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2573 },
4076 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 438 },4085 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 438 },
4077 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2567 },4086 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2574 },
4078 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2568 },4087 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2575 },
4079 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 314 },4088 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 314 },
4080 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2569 },4089 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2576 },
4081 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2570 },4090 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2577 },
4082 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2252 },4091 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2258 },
4083 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2571 },4092 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2578 },
4084 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2572 },4093 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2579 },
4085 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1751 },4094 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1752 },
4086 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2573 },4095 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2580 },
4087 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 567 },4096 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 567 },
4088 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2574 },4097 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2581 },
4089 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2575 },4098 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2582 },
4090 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2576 },4099 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2583 },
4091 .{ .char = 'q', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },4100 .{ .char = 'q', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
4092 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2577 },4101 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2584 },
4093 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2578 },4102 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2585 },
4094 .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2579 },4103 .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2586 },
4095 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2580 },4104 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2587 },
4096 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 511 },4105 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 511 },
4097 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 411 },4106 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 411 },
4098 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2581 },4107 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2588 },
4099 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2387 },4108 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2394 },
4100 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2093 },4109 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2097 },
4101 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2582 },4110 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2589 },
4102 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2583 },4111 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2590 },
4103 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2072 },4112 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2075 },
4104 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2584 },4113 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2591 },
4105 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1834 },4114 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1835 },
4106 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2585 },4115 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2592 },
4107 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2586 },4116 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2593 },
4108 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2587 },4117 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2594 },
4109 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2588 },4118 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2595 },
4110 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2590 },4119 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2597 },
4111 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2591 },4120 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2598 },
4112 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2592 },4121 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2599 },
4113 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 572 },4122 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 572 },
4114 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2151 },4123 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2156 },
4115 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1745 },4124 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1746 },
4116 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2593 },4125 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2600 },
4117 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },4126 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },
4118 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2594 },4127 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2601 },
4119 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2595 },4128 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2602 },
4120 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2596 },4129 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2603 },
4121 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2597 },4130 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2604 },
4122 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 756 },4131 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 756 },
4123 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2598 },4132 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2605 },
4124 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2599 },4133 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2606 },
4125 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2600 },
4126 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 437 },
4127 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2601 },
4128 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2602 },
4129 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2603 },
4130 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2604 },
4131 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2605 },
4132 .{ .char = 'S', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2606 },
4133 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2607 },4134 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2607 },
4134 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2608 },4135 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 437 },
4135 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2609 },4136 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2608 },
4136 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2610 },4137 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2609 },
4138 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2610 },
4139 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2611 },
4140 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2612 },
4141 .{ .char = 'S', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2613 },
4142 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2614 },
4143 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2615 },
4144 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2616 },
4145 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2617 },
4137 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1185 },4146 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1185 },
4138 .{ .char = 'r', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2611 },4147 .{ .char = 'r', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2618 },
4139 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2612 },4148 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2619 },
4140 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 639 },4149 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 639 },
4141 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2189 },4150 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2194 },
4142 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 554 },4151 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 554 },
4143 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2613 },4152 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2620 },
4144 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 449 },4153 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 449 },
4145 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2045 },4154 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2048 },
4146 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2614 },4155 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2621 },
4147 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2041 },4156 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2044 },
4148};4157};
4149pub const data = blk: {4158pub const data = blk: {
4150 @setEvalBranchQuota(12348);4159 @setEvalBranchQuota(12366);
4151 break :blk [_]Properties{4160 break :blk [_]Properties{
4152 .{ .param_str = "vv*vC*iC", .header = .blocks, .language = .all_languages, .attributes = .{ .lib_function_without_prefix = true } },4161 .{ .param_str = "vv*vC*iC", .header = .blocks, .language = .all_languages, .attributes = .{ .lib_function_without_prefix = true } },
4153 .{ .param_str = "vvC*iC", .header = .blocks, .language = .all_languages, .attributes = .{ .lib_function_without_prefix = true } },4162 .{ .param_str = "vvC*iC", .header = .blocks, .language = .all_languages, .attributes = .{ .lib_function_without_prefix = true } },
...@@ -4892,6 +4901,8 @@ pub const data = blk: {...@@ -4892,6 +4901,8 @@ pub const data = blk: {
4892 .{ .param_str = "bULiCULiCULi*", .attributes = .{ .const_evaluable = true } },4901 .{ .param_str = "bULiCULiCULi*", .attributes = .{ .const_evaluable = true } },
4893 .{ .param_str = "bULLiCULLiCULLi*", .attributes = .{ .const_evaluable = true } },4902 .{ .param_str = "bULLiCULLiCULLi*", .attributes = .{ .const_evaluable = true } },
4894 .{ .param_str = "v.", .attributes = .{ .custom_typecheck = true } },4903 .{ .param_str = "v.", .attributes = .{ .custom_typecheck = true } },
4904 .{ .param_str = "v", .attributes = .{ .custom_typecheck = true } },
4905 .{ .param_str = "i", .attributes = .{ .custom_typecheck = true } },
4895 .{ .param_str = "vAA", .attributes = .{ .lib_function_with_builtin_prefix = true } },4906 .{ .param_str = "vAA", .attributes = .{ .lib_function_with_builtin_prefix = true } },
4896 .{ .param_str = "vA", .attributes = .{ .lib_function_with_builtin_prefix = true } },4907 .{ .param_str = "vA", .attributes = .{ .lib_function_with_builtin_prefix = true } },
4897 .{ .param_str = "vA.", .attributes = .{ .custom_typecheck = true } },4908 .{ .param_str = "vA.", .attributes = .{ .custom_typecheck = true } },
lib/compiler/aro/aro/Builtins/eval.zig+15-7
...@@ -1,16 +1,19 @@...@@ -1,16 +1,19 @@
1const std = @import("std");1const std = @import("std");
2const assert = std.debug.assert;
3
2const backend = @import("../../backend.zig");4const backend = @import("../../backend.zig");
3const Interner = backend.Interner;5const Interner = backend.Interner;
6
4const Builtins = @import("../Builtins.zig");7const Builtins = @import("../Builtins.zig");
5const Parser = @import("../Parser.zig");8const Parser = @import("../Parser.zig");
6const Tree = @import("../Tree.zig");9const Tree = @import("../Tree.zig");
7const TypeStore = @import("../TypeStore.zig");10const TypeStore = @import("../TypeStore.zig");
8const Type = TypeStore.Type;
9const QualType = TypeStore.QualType;11const QualType = TypeStore.QualType;
12const Type = TypeStore.Type;
10const Value = @import("../Value.zig");13const Value = @import("../Value.zig");
1114
12fn makeNan(comptime T: type, str: []const u8) T {15fn makeNan(comptime T: type, str: []const u8) T {
13 const UnsignedSameSize = std.meta.Int(.unsigned, @bitSizeOf(T));16 const UnsignedSameSize = @Int(.unsigned, @bitSizeOf(T));
14 const parsed = std.fmt.parseUnsigned(UnsignedSameSize, str[0 .. str.len - 1], 0) catch 0;17 const parsed = std.fmt.parseUnsigned(UnsignedSameSize, str[0 .. str.len - 1], 0) catch 0;
15 const bits: switch (T) {18 const bits: switch (T) {
16 f32 => u23,19 f32 => u23,
...@@ -24,7 +27,6 @@ fn makeNan(comptime T: type, str: []const u8) T {...@@ -24,7 +27,6 @@ fn makeNan(comptime T: type, str: []const u8) T {
2427
25pub fn eval(expanded: Builtins.Expanded, p: *Parser, args: []const Tree.Node.Index) !Value {28pub fn eval(expanded: Builtins.Expanded, p: *Parser, args: []const Tree.Node.Index) !Value {
26 if (!expanded.attributes.const_evaluable) return .{};29 if (!expanded.attributes.const_evaluable) return .{};
27
28 switch (expanded.tag) {30 switch (expanded.tag) {
29 .common => |tag| switch (tag) {31 .common => |tag| switch (tag) {
30 .__builtin_inff,32 .__builtin_inff,
...@@ -47,12 +49,12 @@ pub fn eval(expanded: Builtins.Expanded, p: *Parser, args: []const Tree.Node.Ind...@@ -47,12 +49,12 @@ pub fn eval(expanded: Builtins.Expanded, p: *Parser, args: []const Tree.Node.Ind
47 return Value.intern(p.comp, .{ .float = f });49 return Value.intern(p.comp, .{ .float = f });
48 },50 },
49 .__builtin_isinf => blk: {51 .__builtin_isinf => blk: {
50 if (args.len == 0) break :blk;52 assert(args.len == 1);
51 const val = p.tree.value_map.get(args[0]) orelse break :blk;53 const val = p.tree.value_map.get(args[0]) orelse break :blk;
52 return Value.fromBool(val.isInf(p.comp));54 return Value.fromBool(val.isInf(p.comp));
53 },55 },
54 .__builtin_isinf_sign => blk: {56 .__builtin_isinf_sign => blk: {
55 if (args.len == 0) break :blk;57 assert(args.len == 1);
56 const val = p.tree.value_map.get(args[0]) orelse break :blk;58 const val = p.tree.value_map.get(args[0]) orelse break :blk;
57 switch (val.isInfSign(p.comp)) {59 switch (val.isInfSign(p.comp)) {
58 .unknown => {},60 .unknown => {},
...@@ -62,12 +64,12 @@ pub fn eval(expanded: Builtins.Expanded, p: *Parser, args: []const Tree.Node.Ind...@@ -62,12 +64,12 @@ pub fn eval(expanded: Builtins.Expanded, p: *Parser, args: []const Tree.Node.Ind
62 }64 }
63 },65 },
64 .__builtin_isnan => blk: {66 .__builtin_isnan => blk: {
65 if (args.len == 0) break :blk;67 assert(args.len == 1);
66 const val = p.tree.value_map.get(args[0]) orelse break :blk;68 const val = p.tree.value_map.get(args[0]) orelse break :blk;
67 return Value.fromBool(val.isNan(p.comp));69 return Value.fromBool(val.isNan(p.comp));
68 },70 },
69 .__builtin_nan => blk: {71 .__builtin_nan => blk: {
70 if (args.len == 0) break :blk;72 assert(args.len == 1);
71 const val = p.getDecayedStringLiteral(args[0]) orelse break :blk;73 const val = p.getDecayedStringLiteral(args[0]) orelse break :blk;
72 const bytes = p.comp.interner.get(val.ref()).bytes;74 const bytes = p.comp.interner.get(val.ref()).bytes;
7375
...@@ -80,6 +82,12 @@ pub fn eval(expanded: Builtins.Expanded, p: *Parser, args: []const Tree.Node.Ind...@@ -80,6 +82,12 @@ pub fn eval(expanded: Builtins.Expanded, p: *Parser, args: []const Tree.Node.Ind
80 };82 };
81 return Value.intern(p.comp, .{ .float = f });83 return Value.intern(p.comp, .{ .float = f });
82 },84 },
85 .__builtin_constant_p => {
86 assert(args.len == 1);
87 const arg = args[0];
88 const val = p.tree.value_map.get(arg) orelse return Value.fromBool(p.isAddressOfStringLiteral(arg));
89 return Value.fromBool(!val.isPointer(p.comp));
90 },
83 else => {},91 else => {},
84 },92 },
85 else => {},93 else => {},
lib/compiler/aro/aro/CodeGen.zig+3-1
...@@ -2,7 +2,7 @@ const std = @import("std");...@@ -2,7 +2,7 @@ const std = @import("std");
2const Allocator = std.mem.Allocator;2const Allocator = std.mem.Allocator;
3const assert = std.debug.assert;3const assert = std.debug.assert;
44
5const backend = @import("backend");5const backend = @import("../backend.zig");
6const Interner = backend.Interner;6const Interner = backend.Interner;
7const Ir = backend.Ir;7const Ir = backend.Ir;
8const Builder = Ir.Builder;8const Builder = Ir.Builder;
...@@ -867,6 +867,8 @@ fn genExpr(c: *CodeGen, node_index: Node.Index) Error!Ir.Ref {...@@ -867,6 +867,8 @@ fn genExpr(c: *CodeGen, node_index: Node.Index) Error!Ir.Ref {
867 .imag_expr,867 .imag_expr,
868 .real_expr,868 .real_expr,
869 .sizeof_expr,869 .sizeof_expr,
870 .builtin_va_arg_pack,
871 .builtin_va_arg_pack_len,
870 => return c.fail("TODO CodeGen.genExpr {s}\n", .{@tagName(node)}),872 => return c.fail("TODO CodeGen.genExpr {s}\n", .{@tagName(node)}),
871 else => unreachable, // Not an expression.873 else => unreachable, // Not an expression.
872 }874 }
lib/compiler/aro/aro/Compilation.zig+120-97
...@@ -71,34 +71,23 @@ pub const Environment = struct {...@@ -71,34 +71,23 @@ pub const Environment = struct {
71 /// used for __DATE__, __TIME__, and __TIMESTAMP__71 /// used for __DATE__, __TIME__, and __TIMESTAMP__
72 provided: u64,72 provided: u64,
7373
74 pub const default: @This() = .{ .provided = 0 };74 pub const default: SourceEpoch = .{ .provided = 0 };
75 };75 };
7676
77 pub fn loadAll(allocator: std.mem.Allocator, environ_map: *const std.process.Environ.Map) !Environment {77 /// Load all of the environment variables from an environ map. Does not copy values.
78 pub fn loadAll(environ_map: *const std.process.Environ.Map) Environment {
78 var env: Environment = .{};79 var env: Environment = .{};
79 errdefer env.deinit(allocator);
8080
81 inline for (@typeInfo(@TypeOf(env)).@"struct".fields) |field| {81 inline for (@typeInfo(@TypeOf(env)).@"struct".fields) |field| {
82 std.debug.assert(@field(env, field.name) == null);82 std.debug.assert(@field(env, field.name) == null);
8383
84 var env_var_buf: [field.name.len]u8 = undefined;84 var env_var_buf: [field.name.len]u8 = undefined;
85 const env_var_name = std.ascii.upperString(&env_var_buf, field.name);85 const env_var_name = std.ascii.upperString(&env_var_buf, field.name);
86 const val: ?[]const u8 = if (environ_map.get(env_var_name)) |v| try allocator.dupe(u8, v) else null;86 @field(env, field.name) = environ_map.get(env_var_name);
87 @field(env, field.name) = val;
88 }87 }
89 return env;88 return env;
90 }89 }
9190
92 /// Use this only if environment slices were allocated with `allocator` (such as via `loadAll`)
93 pub fn deinit(self: *Environment, allocator: std.mem.Allocator) void {
94 inline for (@typeInfo(@TypeOf(self.*)).@"struct".fields) |field| {
95 if (@field(self, field.name)) |slice| {
96 allocator.free(slice);
97 }
98 }
99 self.* = undefined;
100 }
101
102 pub fn sourceEpoch(self: *const Environment, io: Io) !SourceEpoch {91 pub fn sourceEpoch(self: *const Environment, io: Io) !SourceEpoch {
103 const max_timestamp = 253402300799; // Dec 31 9999 23:59:5992 const max_timestamp = 253402300799; // Dec 31 9999 23:59:59
10493
...@@ -148,7 +137,7 @@ gpa: Allocator,...@@ -148,7 +137,7 @@ gpa: Allocator,
148/// Allocations in this arena live all the way until `Compilation.deinit`.137/// Allocations in this arena live all the way until `Compilation.deinit`.
149arena: Allocator,138arena: Allocator,
150io: Io,139io: Io,
151cwd: Io.Dir,140cwd: std.Io.Dir,
152diagnostics: *Diagnostics,141diagnostics: *Diagnostics,
153142
154sources: std.StringArrayHashMapUnmanaged(Source) = .empty,143sources: std.StringArrayHashMapUnmanaged(Source) = .empty,
...@@ -175,37 +164,48 @@ pragma_handlers: std.StringArrayHashMapUnmanaged(*Pragma) = .empty,...@@ -175,37 +164,48 @@ pragma_handlers: std.StringArrayHashMapUnmanaged(*Pragma) = .empty,
175/// Used by MS extensions which allow searching for includes relative to the directory of the main source file.164/// Used by MS extensions which allow searching for includes relative to the directory of the main source file.
176ms_cwd_source_id: ?Source.Id = null,165ms_cwd_source_id: ?Source.Id = null,
177166
178pub fn init(gpa: Allocator, arena: Allocator, io: Io, diagnostics: *Diagnostics, cwd: Io.Dir) Compilation {167pub const InitOptions = struct {
179 return .{
180 .gpa = gpa,
181 .arena = arena,
182 .io = io,
183 .diagnostics = diagnostics,
184 .cwd = cwd,
185 };
186}
187
188/// Initialize Compilation with default environment,
189/// pragma handlers and emulation mode set to target.
190pub fn initDefault(
191 gpa: Allocator,168 gpa: Allocator,
192 arena: Allocator,169 arena: Allocator,
193 io: Io,170 io: Io,
194 diagnostics: *Diagnostics,171 diagnostics: *Diagnostics,
195 cwd: Io.Dir,172
196 environ_map: *const std.process.Environ.Map,173 /// Used to initiate `Compilation.Environment`, values are not copied.
197) !Compilation {174 environ_map: ?*const std.process.Environ.Map,
175 /// Defaults to `std.Io.Dir.cwd()`
176 cwd: ?std.Io.Dir = null,
177
178 add_default_pragma_handlers: bool = true,
179
180 pub const testing: InitOptions = .{
181 .gpa = std.testing.allocator,
182 .arena = undefined,
183 .io = std.testing.io,
184 .diagnostics = undefined,
185 .environ_map = null,
186 .add_default_pragma_handlers = false,
187 };
188};
189
190/// Initialize Compilation with default environment,
191/// pragma handlers and emulation mode set to target.
192pub fn init(options: InitOptions) !Compilation {
198 var comp: Compilation = .{193 var comp: Compilation = .{
199 .gpa = gpa,194 .gpa = options.gpa,
200 .arena = arena,195 .arena = options.arena,
201 .io = io,196 .io = options.io,
202 .diagnostics = diagnostics,197 .diagnostics = options.diagnostics,
203 .environment = try Environment.loadAll(gpa, environ_map),198 .cwd = options.cwd orelse .cwd(),
204 .cwd = cwd,
205 };199 };
206 errdefer comp.deinit();200 errdefer comp.deinit();
207 try comp.addDefaultPragmaHandlers();201
208 comp.langopts.setEmulatedCompiler(comp.target.systemCompiler());202 if (options.environ_map) |map| {
203 comp.environment = .loadAll(map);
204 }
205
206 if (options.add_default_pragma_handlers) {
207 try comp.addDefaultPragmaHandlers();
208 }
209 return comp;209 return comp;
210}210}
211211
...@@ -228,7 +228,6 @@ pub fn deinit(comp: *Compilation) void {...@@ -228,7 +228,6 @@ pub fn deinit(comp: *Compilation) void {
228 comp.builtins.deinit(gpa);228 comp.builtins.deinit(gpa);
229 comp.string_interner.deinit(gpa);229 comp.string_interner.deinit(gpa);
230 comp.interner.deinit(gpa);230 comp.interner.deinit(gpa);
231 comp.environment.deinit(gpa);
232 comp.type_store.deinit(gpa);231 comp.type_store.deinit(gpa);
233 comp.* = undefined;232 comp.* = undefined;
234}233}
...@@ -275,17 +274,18 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {...@@ -275,17 +274,18 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {
275 }274 }
276275
277 try w.writeAll(276 try w.writeAll(
277 \\#define __ARO_EMULATE_NO__ 0
278 \\#define __ARO_EMULATE_CLANG__ 1278 \\#define __ARO_EMULATE_CLANG__ 1
279 \\#define __ARO_EMULATE_GCC__ 2279 \\#define __ARO_EMULATE_GCC__ 2
280 \\#define __ARO_EMULATE_MSVC__ 3280 \\#define __ARO_EMULATE_MSVC__ 3
281 \\281 \\
282 );282 );
283 const emulated = switch (comp.langopts.emulate) {283 try w.print("#define __ARO_EMULATE__ {s}\n", .{switch (comp.langopts.emulate) {
284 .no => "__ARO_EMULATE_NO__",
284 .clang => "__ARO_EMULATE_CLANG__",285 .clang => "__ARO_EMULATE_CLANG__",
285 .gcc => "__ARO_EMULATE_GCC__",286 .gcc => "__ARO_EMULATE_GCC__",
286 .msvc => "__ARO_EMULATE_MSVC__",287 .msvc => "__ARO_EMULATE_MSVC__",
287 };288 }});
288 try w.print("#define __ARO_EMULATE__ {s}\n", .{emulated});
289289
290 if (comp.langopts.emulate == .msvc) {290 if (comp.langopts.emulate == .msvc) {
291 try w.writeAll("#define _MSC_VER 1933\n");291 try w.writeAll("#define _MSC_VER 1933\n");
...@@ -375,6 +375,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {...@@ -375,6 +375,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {
375 .watchos,375 .watchos,
376 => {376 => {
377 try define(w, "__APPLE__");377 try define(w, "__APPLE__");
378 try w.writeAll("#define __APPLE_CC__ 6000\n");
378379
379 const version = target.os.version_range.semver.min;380 const version = target.os.version_range.semver.min;
380 var version_buf: [8]u8 = undefined;381 var version_buf: [8]u8 = undefined;
...@@ -647,6 +648,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {...@@ -647,6 +648,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {
647 try define(w, "__ppc__");648 try define(w, "__ppc__");
648 try define(w, "__PPC__");649 try define(w, "__PPC__");
649 try define(w, "_ARCH_PPC");650 try define(w, "_ARCH_PPC");
651 try w.print("#define _CALL_ELF {d}\n", .{target.ppcElfVersion()});
650 },652 },
651 .powerpc64,653 .powerpc64,
652 .powerpc64le,654 .powerpc64le,
...@@ -661,7 +663,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {...@@ -661,7 +663,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {
661 try define(w, "__PPC64__");663 try define(w, "__PPC64__");
662 try define(w, "_ARCH_PPC");664 try define(w, "_ARCH_PPC");
663 try define(w, "_ARCH_PPC64");665 try define(w, "_ARCH_PPC64");
664 try w.writeAll("#define _CALL_ELF 2\n");666 try w.print("#define _CALL_ELF {d}\n", .{target.ppcElfVersion()});
665 },667 },
666 .sparc64 => {668 .sparc64 => {
667 try defineStd(w, "sparc", is_gnu);669 try defineStd(w, "sparc", is_gnu);
...@@ -686,8 +688,19 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {...@@ -686,8 +688,19 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {
686 try define(w, "__thumb__");688 try define(w, "__thumb__");
687 }689 }
688 },690 },
689 .aarch64, .aarch64_be => {691 .aarch64, .aarch64_be => |arch| {
690 try define(w, "__aarch64__");692 try define(w, "__aarch64__");
693 switch (arch) {
694 .aarch64 => {
695 try define(w, "__AARCH64EL__");
696 },
697 .aarch64_be => {
698 try define(w, "__AARCH64EB__");
699 try define(w, "__AARCH_BIG_ENDIAN");
700 try define(w, "__ARM_BIG_ENDIAN");
701 },
702 else => unreachable,
703 }
691 if (target.os.tag.isDarwin()) {704 if (target.os.tag.isDarwin()) {
692 try define(w, "__AARCH64_SIMD__");705 try define(w, "__AARCH64_SIMD__");
693 if (ptr_width == 32) {706 if (ptr_width == 32) {
...@@ -839,6 +852,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {...@@ -839,6 +852,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {
839 }852 }
840 },853 },
841 .riscv32, .riscv32be, .riscv64, .riscv64be => {854 .riscv32, .riscv32be, .riscv64, .riscv64be => {
855 try define(w, "__riscv");
842 try w.print("#define __riscv_xlen {d}\n", .{ptr_width});856 try w.print("#define __riscv_xlen {d}\n", .{ptr_width});
843 },857 },
844 else => {},858 else => {},
...@@ -910,6 +924,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {...@@ -910,6 +924,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {
910 \\#define __ATOMIC_CHAR16_T_LOCK_FREE 1924 \\#define __ATOMIC_CHAR16_T_LOCK_FREE 1
911 \\#define __ATOMIC_CHAR32_T_LOCK_FREE 1925 \\#define __ATOMIC_CHAR32_T_LOCK_FREE 1
912 \\#define __ATOMIC_WCHAR_T_LOCK_FREE 1926 \\#define __ATOMIC_WCHAR_T_LOCK_FREE 1
927 \\#define __ATOMIC_WINT_T_LOCK_FREE 1
913 \\#define __ATOMIC_SHORT_LOCK_FREE 1928 \\#define __ATOMIC_SHORT_LOCK_FREE 1
914 \\#define __ATOMIC_INT_LOCK_FREE 1929 \\#define __ATOMIC_INT_LOCK_FREE 1
915 \\#define __ATOMIC_LONG_LOCK_FREE 1930 \\#define __ATOMIC_LONG_LOCK_FREE 1
...@@ -922,7 +937,15 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {...@@ -922,7 +937,15 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {
922 }937 }
923938
924 // types939 // types
925 if (comp.getCharSignedness() == .unsigned) try w.writeAll("#define __CHAR_UNSIGNED__ 1\n");940 if (comp.getCharSignedness() == .unsigned) {
941 try w.writeAll("#define __CHAR_UNSIGNED__ 1\n");
942 }
943 if (comp.type_store.wchar.signedness(comp) == .unsigned) {
944 try w.writeAll("#define __WCHAR_UNSIGNED__ 1\n");
945 }
946 if (comp.type_store.wint.signedness(comp) == .unsigned) {
947 try w.writeAll("#define __WINT_UNSIGNED__ 1\n");
948 }
926 try w.writeAll("#define __CHAR_BIT__ 8\n");949 try w.writeAll("#define __CHAR_BIT__ 8\n");
927950
928 // int maxs951 // int maxs
...@@ -933,7 +956,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {...@@ -933,7 +956,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {
933 try comp.generateIntMaxAndWidth(w, "LONG", .long);956 try comp.generateIntMaxAndWidth(w, "LONG", .long);
934 try comp.generateIntMaxAndWidth(w, "LONG_LONG", .long_long);957 try comp.generateIntMaxAndWidth(w, "LONG_LONG", .long_long);
935 try comp.generateIntMaxAndWidth(w, "WCHAR", comp.type_store.wchar);958 try comp.generateIntMaxAndWidth(w, "WCHAR", comp.type_store.wchar);
936 // try comp.generateIntMax(w, "WINT", comp.type_store.wchar);959 try comp.generateIntMaxAndWidth(w, "WINT", comp.type_store.wint);
937 try comp.generateIntMaxAndWidth(w, "INTMAX", comp.type_store.intmax);960 try comp.generateIntMaxAndWidth(w, "INTMAX", comp.type_store.intmax);
938 try comp.generateIntMaxAndWidth(w, "SIZE", comp.type_store.size);961 try comp.generateIntMaxAndWidth(w, "SIZE", comp.type_store.size);
939 try comp.generateIntMaxAndWidth(w, "UINTMAX", try comp.type_store.intmax.makeIntUnsigned(comp));962 try comp.generateIntMaxAndWidth(w, "UINTMAX", try comp.type_store.intmax.makeIntUnsigned(comp));
...@@ -957,7 +980,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {...@@ -957,7 +980,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {
957 try comp.generateSizeofType(w, "__SIZEOF_PTRDIFF_T__", comp.type_store.ptrdiff);980 try comp.generateSizeofType(w, "__SIZEOF_PTRDIFF_T__", comp.type_store.ptrdiff);
958 try comp.generateSizeofType(w, "__SIZEOF_SIZE_T__", comp.type_store.size);981 try comp.generateSizeofType(w, "__SIZEOF_SIZE_T__", comp.type_store.size);
959 try comp.generateSizeofType(w, "__SIZEOF_WCHAR_T__", comp.type_store.wchar);982 try comp.generateSizeofType(w, "__SIZEOF_WCHAR_T__", comp.type_store.wchar);
960 // try comp.generateSizeofType(w, "__SIZEOF_WINT_T__", .void_pointer);983 try comp.generateSizeofType(w, "__SIZEOF_WINT_T__", comp.type_store.wint);
961984
962 if (target.hasInt128()) {985 if (target.hasInt128()) {
963 try comp.generateSizeofType(w, "__SIZEOF_INT128__", .int128);986 try comp.generateSizeofType(w, "__SIZEOF_INT128__", .int128);
...@@ -968,14 +991,15 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {...@@ -968,14 +991,15 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {
968 try comp.generateTypeMacro(w, "__UINTPTR_TYPE__", try comp.type_store.intptr.makeIntUnsigned(comp));991 try comp.generateTypeMacro(w, "__UINTPTR_TYPE__", try comp.type_store.intptr.makeIntUnsigned(comp));
969992
970 try comp.generateTypeMacro(w, "__INTMAX_TYPE__", comp.type_store.intmax);993 try comp.generateTypeMacro(w, "__INTMAX_TYPE__", comp.type_store.intmax);
971 try comp.generateSuffixMacro("__INTMAX", w, comp.type_store.intptr);994 try comp.generateIntLiteralMacros("__INTMAX", w, comp.type_store.intptr);
972995
973 try comp.generateTypeMacro(w, "__UINTMAX_TYPE__", try comp.type_store.intmax.makeIntUnsigned(comp));996 try comp.generateTypeMacro(w, "__UINTMAX_TYPE__", try comp.type_store.intmax.makeIntUnsigned(comp));
974 try comp.generateSuffixMacro("__UINTMAX", w, try comp.type_store.intptr.makeIntUnsigned(comp));997 try comp.generateIntLiteralMacros("__UINTMAX", w, try comp.type_store.intptr.makeIntUnsigned(comp));
975998
976 try comp.generateTypeMacro(w, "__PTRDIFF_TYPE__", comp.type_store.ptrdiff);999 try comp.generateTypeMacro(w, "__PTRDIFF_TYPE__", comp.type_store.ptrdiff);
977 try comp.generateTypeMacro(w, "__SIZE_TYPE__", comp.type_store.size);1000 try comp.generateTypeMacro(w, "__SIZE_TYPE__", comp.type_store.size);
978 try comp.generateTypeMacro(w, "__WCHAR_TYPE__", comp.type_store.wchar);1001 try comp.generateTypeMacro(w, "__WCHAR_TYPE__", comp.type_store.wchar);
1002 try comp.generateTypeMacro(w, "__WINT_TYPE__", comp.type_store.wint);
979 try comp.generateTypeMacro(w, "__CHAR16_TYPE__", comp.type_store.uint_least16_t);1003 try comp.generateTypeMacro(w, "__CHAR16_TYPE__", comp.type_store.uint_least16_t);
980 try comp.generateTypeMacro(w, "__CHAR32_TYPE__", comp.type_store.uint_least32_t);1004 try comp.generateTypeMacro(w, "__CHAR32_TYPE__", comp.type_store.uint_least32_t);
9811005
...@@ -1167,8 +1191,10 @@ fn generateTypeMacro(comp: *const Compilation, w: *Io.Writer, name: []const u8,...@@ -1167,8 +1191,10 @@ fn generateTypeMacro(comp: *const Compilation, w: *Io.Writer, name: []const u8,
1167}1191}
11681192
1169pub fn float80Type(comp: *const Compilation) ?QualType {1193pub fn float80Type(comp: *const Compilation) ?QualType {
1170 if (comp.langopts.emulate != .gcc) return null;1194 return switch (comp.langopts.emulate) {
1171 return comp.target.float80Type();1195 .no, .gcc => comp.target.float80Type(),
1196 .msvc, .clang => null,
1197 };
1172}1198}
11731199
1174/// Smallest integer type with at least N bits1200/// Smallest integer type with at least N bits
...@@ -1292,8 +1318,14 @@ fn generateFmt(comp: *const Compilation, prefix: []const u8, w: *Io.Writer, qt:...@@ -1292,8 +1318,14 @@ fn generateFmt(comp: *const Compilation, prefix: []const u8, w: *Io.Writer, qt:
1292 }1318 }
1293}1319}
12941320
1295fn generateSuffixMacro(comp: *const Compilation, prefix: []const u8, w: *Io.Writer, qt: QualType) !void {1321fn generateIntLiteralMacros(comp: *const Compilation, prefix: []const u8, w: *Io.Writer, qt: QualType) !void {
1296 return w.print("#define {s}_C_SUFFIX__ {s}\n", .{ prefix, qt.intValueSuffix(comp) });1322 const suffix = qt.intValueSuffix(comp);
1323 try w.print("#define {s}_C_SUFFIX__ {s}\n", .{ prefix, suffix });
1324 if (suffix.len == 0) {
1325 try w.print("#define {s}_C(c) c\n", .{prefix});
1326 } else {
1327 try w.print("#define {s}_C(c) c##{s}\n", .{ prefix, suffix });
1328 }
1297}1329}
12981330
1299/// Generate the following for a type:1331/// Generate the following for a type:
...@@ -1322,7 +1354,7 @@ fn generateExactWidthType(comp: *Compilation, w: *Io.Writer, original_qt: QualTy...@@ -1322,7 +1354,7 @@ fn generateExactWidthType(comp: *Compilation, w: *Io.Writer, original_qt: QualTy
1322 const prefix = full[0 .. full.len - suffix.len]; // remove "_TYPE__"1354 const prefix = full[0 .. full.len - suffix.len]; // remove "_TYPE__"
13231355
1324 try comp.generateFmt(prefix, w, qt);1356 try comp.generateFmt(prefix, w, qt);
1325 try comp.generateSuffixMacro(prefix, w, qt);1357 try comp.generateIntLiteralMacros(prefix, w, qt);
1326}1358}
13271359
1328pub fn hasFloat128(comp: *const Compilation) bool {1360pub fn hasFloat128(comp: *const Compilation) bool {
...@@ -1414,7 +1446,7 @@ pub fn maxArrayBytes(comp: *const Compilation) u64 {...@@ -1414,7 +1446,7 @@ pub fn maxArrayBytes(comp: *const Compilation) u64 {
1414pub fn fixedEnumTagType(comp: *const Compilation) ?QualType {1446pub fn fixedEnumTagType(comp: *const Compilation) ?QualType {
1415 switch (comp.langopts.emulate) {1447 switch (comp.langopts.emulate) {
1416 .msvc => return .int,1448 .msvc => return .int,
1417 .clang => if (comp.target.os.tag == .windows and comp.target.abi == .msvc) return .int,1449 .no, .clang => if (comp.target.os.tag == .windows and comp.target.abi == .msvc) return .int,
1418 .gcc => {},1450 .gcc => {},
1419 }1451 }
1420 return null;1452 return null;
...@@ -1424,6 +1456,10 @@ pub fn getCharSignedness(comp: *const Compilation) std.builtin.Signedness {...@@ -1424,6 +1456,10 @@ pub fn getCharSignedness(comp: *const Compilation) std.builtin.Signedness {
1424 return comp.langopts.char_signedness_override orelse comp.target.cCharSignedness();1456 return comp.langopts.char_signedness_override orelse comp.target.cCharSignedness();
1425}1457}
14261458
1459pub fn hasClangStyleBoundsSafety(comp: *const Compilation) bool {
1460 return comp.langopts.bounds_safety == .clang;
1461}
1462
1427pub fn getSource(comp: *const Compilation, id: Source.Id) Source {1463pub fn getSource(comp: *const Compilation, id: Source.Id) Source {
1428 if (id.alias) {1464 if (id.alias) {
1429 return comp.source_aliases.items[@intFromEnum(id.index)];1465 return comp.source_aliases.items[@intFromEnum(id.index)];
...@@ -1643,14 +1679,12 @@ fn addSourceFromPathExtra(comp: *Compilation, path: []const u8, kind: Source.Kin...@@ -1643,14 +1679,12 @@ fn addSourceFromPathExtra(comp: *Compilation, path: []const u8, kind: Source.Kin
1643 return error.FileNotFound;1679 return error.FileNotFound;
1644 }1680 }
16451681
1646 const io = comp.io;1682 const file = try comp.cwd.openFile(comp.io, path, .{});
16471683 defer file.close(comp.io);
1648 const file = try comp.cwd.openFile(io, path, .{});
1649 defer file.close(io);
1650 return comp.addSourceFromFile(file, path, kind);1684 return comp.addSourceFromFile(file, path, kind);
1651}1685}
16521686
1653pub fn addSourceFromFile(comp: *Compilation, file: Io.File, path: []const u8, kind: Source.Kind) !Source {1687pub fn addSourceFromFile(comp: *Compilation, file: std.Io.File, path: []const u8, kind: Source.Kind) !Source {
1654 const contents = try comp.getFileContents(file, .unlimited);1688 const contents = try comp.getFileContents(file, .unlimited);
1655 errdefer comp.gpa.free(contents);1689 errdefer comp.gpa.free(contents);
1656 return comp.addSourceFromOwnedBuffer(path, contents, kind);1690 return comp.addSourceFromOwnedBuffer(path, contents, kind);
...@@ -1718,8 +1752,7 @@ pub fn initSearchPath(comp: *Compilation, includes: []const Include, verbose: bo...@@ -1718,8 +1752,7 @@ pub fn initSearchPath(comp: *Compilation, includes: []const Include, verbose: bo
1718 }1752 }
1719}1753}
1720fn addToSearchPath(comp: *Compilation, include: Include, verbose: bool) !void {1754fn addToSearchPath(comp: *Compilation, include: Include, verbose: bool) !void {
1721 const io = comp.io;1755 comp.cwd.access(comp.io, include.path, .{}) catch {
1722 comp.cwd.access(io, include.path, .{}) catch {
1723 if (verbose) {1756 if (verbose) {
1724 std.debug.print("ignoring nonexistent directory \"{s}\"\n", .{include.path});1757 std.debug.print("ignoring nonexistent directory \"{s}\"\n", .{include.path});
1725 return;1758 return;
...@@ -1979,14 +2012,12 @@ fn getPathContents(comp: *Compilation, path: []const u8, limit: Io.Limit) ![]u8...@@ -1979,14 +2012,12 @@ fn getPathContents(comp: *Compilation, path: []const u8, limit: Io.Limit) ![]u8
1979 return error.FileNotFound;2012 return error.FileNotFound;
1980 }2013 }
19812014
1982 const io = comp.io;2015 const file = try comp.cwd.openFile(comp.io, path, .{});
19832016 defer file.close(comp.io);
1984 const file = try comp.cwd.openFile(io, path, .{});
1985 defer file.close(io);
1986 return comp.getFileContents(file, limit);2017 return comp.getFileContents(file, limit);
1987}2018}
19882019
1989fn getFileContents(comp: *Compilation, file: Io.File, limit: Io.Limit) ![]u8 {2020fn getFileContents(comp: *Compilation, file: std.Io.File, limit: Io.Limit) ![]u8 {
1990 var file_buf: [4096]u8 = undefined;2021 var file_buf: [4096]u8 = undefined;
1991 var file_reader = file.reader(comp.io, &file_buf);2022 var file_reader = file.reader(comp.io, &file_buf);
19922023
...@@ -2168,9 +2199,8 @@ pub fn locSlice(comp: *const Compilation, loc: Source.Location) []const u8 {...@@ -2168,9 +2199,8 @@ pub fn locSlice(comp: *const Compilation, loc: Source.Location) []const u8 {
2168}2199}
21692200
2170pub fn getSourceMTimeUncached(comp: *const Compilation, source_id: Source.Id) ?u64 {2201pub fn getSourceMTimeUncached(comp: *const Compilation, source_id: Source.Id) ?u64 {
2171 const io = comp.io;
2172 const source = comp.getSource(source_id);2202 const source = comp.getSource(source_id);
2173 if (comp.cwd.statFile(io, source.path, .{})) |stat| {2203 if (comp.cwd.statFile(comp.io, source.path, .{})) |stat| {
2174 return std.math.cast(u64, stat.mtime.toSeconds());2204 return std.math.cast(u64, stat.mtime.toSeconds());
2175 } else |_| {2205 } else |_| {
2176 return null;2206 return null;
...@@ -2257,10 +2287,9 @@ pub const Diagnostic = struct {...@@ -2257,10 +2287,9 @@ pub const Diagnostic = struct {
2257test "addSourceFromBuffer" {2287test "addSourceFromBuffer" {
2258 const Test = struct {2288 const Test = struct {
2259 fn addSourceFromBuffer(str: []const u8, expected: []const u8, warning_count: u32, splices: []const u32) !void {2289 fn addSourceFromBuffer(str: []const u8, expected: []const u8, warning_count: u32, splices: []const u32) !void {
2260 var arena: std.heap.ArenaAllocator = .init(std.testing.allocator);
2261 defer arena.deinit();
2262 var diagnostics: Diagnostics = .{ .output = .ignore };2290 var diagnostics: Diagnostics = .{ .output = .ignore };
2263 var comp = Compilation.init(std.testing.allocator, arena.allocator(), std.testing.io, &diagnostics, Io.Dir.cwd());2291 var comp = try Compilation.init(.testing);
2292 comp.diagnostics = &diagnostics;
2264 defer comp.deinit();2293 defer comp.deinit();
22652294
2266 const source = try comp.addSourceFromBuffer("path", str);2295 const source = try comp.addSourceFromBuffer("path", str);
...@@ -2271,10 +2300,8 @@ test "addSourceFromBuffer" {...@@ -2271,10 +2300,8 @@ test "addSourceFromBuffer" {
2271 }2300 }
22722301
2273 fn withAllocationFailures(allocator: std.mem.Allocator) !void {2302 fn withAllocationFailures(allocator: std.mem.Allocator) !void {
2274 var arena: std.heap.ArenaAllocator = .init(allocator);2303 var comp = try Compilation.init(.testing);
2275 defer arena.deinit();2304 comp.gpa = allocator;
2276 var diagnostics: Diagnostics = .{ .output = .ignore };
2277 var comp = Compilation.init(allocator, arena.allocator(), std.testing.io, &diagnostics, Io.Dir.cwd());
2278 defer comp.deinit();2305 defer comp.deinit();
22792306
2280 _ = try comp.addSourceFromBuffer("path", "spliced\\\nbuffer\n");2307 _ = try comp.addSourceFromBuffer("path", "spliced\\\nbuffer\n");
...@@ -2320,7 +2347,8 @@ test "addSourceFromBuffer - exhaustive check for carriage return elimination" {...@@ -2320,7 +2347,8 @@ test "addSourceFromBuffer - exhaustive check for carriage return elimination" {
2320 var buf: [alphabet.len]u8 = @splat(alphabet[0]);2347 var buf: [alphabet.len]u8 = @splat(alphabet[0]);
23212348
2322 var diagnostics: Diagnostics = .{ .output = .ignore };2349 var diagnostics: Diagnostics = .{ .output = .ignore };
2323 var comp = Compilation.init(std.testing.allocator, arena.allocator(), std.testing.io, &diagnostics, Io.Dir.cwd());2350 var comp = try Compilation.init(.testing);
2351 comp.diagnostics = &diagnostics;
2324 defer comp.deinit();2352 defer comp.deinit();
23252353
2326 var source_count: u32 = 0;2354 var source_count: u32 = 0;
...@@ -2346,9 +2374,8 @@ test "addSourceFromBuffer - exhaustive check for carriage return elimination" {...@@ -2346,9 +2374,8 @@ test "addSourceFromBuffer - exhaustive check for carriage return elimination" {
2346test "ignore BOM at beginning of file" {2374test "ignore BOM at beginning of file" {
2347 const BOM = "\xEF\xBB\xBF";2375 const BOM = "\xEF\xBB\xBF";
2348 const Test = struct {2376 const Test = struct {
2349 fn run(arena: Allocator, buf: []const u8) !void {2377 fn run(buf: []const u8) !void {
2350 var diagnostics: Diagnostics = .{ .output = .ignore };2378 var comp = try Compilation.init(.testing);
2351 var comp = Compilation.init(std.testing.allocator, arena, std.testing.io, &diagnostics, Io.Dir.cwd());
2352 defer comp.deinit();2379 defer comp.deinit();
23532380
2354 const source = try comp.addSourceFromBuffer("file.c", buf);2381 const source = try comp.addSourceFromBuffer("file.c", buf);
...@@ -2357,19 +2384,15 @@ test "ignore BOM at beginning of file" {...@@ -2357,19 +2384,15 @@ test "ignore BOM at beginning of file" {
2357 }2384 }
2358 };2385 };
23592386
2360 var arena_state: std.heap.ArenaAllocator = .init(std.testing.allocator);2387 try Test.run(BOM);
2361 defer arena_state.deinit();2388 try Test.run(BOM ++ "x");
2362 const arena = arena_state.allocator();2389 try Test.run("x" ++ BOM);
23632390 try Test.run(BOM ++ " ");
2364 try Test.run(arena, BOM);2391 try Test.run(BOM ++ "\n");
2365 try Test.run(arena, BOM ++ "x");2392 try Test.run(BOM ++ "\\");
2366 try Test.run(arena, "x" ++ BOM);2393
2367 try Test.run(arena, BOM ++ " ");2394 try Test.run(BOM[0..1] ++ "x");
2368 try Test.run(arena, BOM ++ "\n");2395 try Test.run(BOM[0..2] ++ "x");
2369 try Test.run(arena, BOM ++ "\\");2396 try Test.run(BOM[1..] ++ "x");
23702397 try Test.run(BOM[2..] ++ "x");
2371 try Test.run(arena, BOM[0..1] ++ "x");
2372 try Test.run(arena, BOM[0..2] ++ "x");
2373 try Test.run(arena, BOM[1..] ++ "x");
2374 try Test.run(arena, BOM[2..] ++ "x");
2375}2398}
lib/compiler/aro/aro/Diagnostics.zig+21-17
...@@ -24,21 +24,21 @@ pub const Message = struct {...@@ -24,21 +24,21 @@ pub const Message = struct {
24 @"fatal error",24 @"fatal error",
25 };25 };
2626
27 pub fn write(msg: Message, t: std.Io.Terminal, details: bool) std.Io.Terminal.SetColorError!void {27 pub fn write(msg: Message, term: std.Io.Terminal, details: bool) std.Io.Terminal.SetColorError!void {
28 const w = t.writer;28 const w = term.writer;
29 try t.setColor(.bold);29 try term.setColor(.bold);
30 if (msg.location) |loc| {30 if (msg.location) |loc| {
31 try w.print("{s}:{d}:{d}: ", .{ loc.path, loc.line_no, loc.col });31 try w.print("{s}:{d}:{d}: ", .{ loc.path, loc.line_no, loc.col });
32 }32 }
33 switch (msg.effective_kind) {33 switch (msg.effective_kind) {
34 .@"fatal error", .@"error" => try t.setColor(.bright_red),34 .@"fatal error", .@"error" => try term.setColor(.bright_red),
35 .note => try t.setColor(.bright_cyan),35 .note => try term.setColor(.bright_cyan),
36 .warning => try t.setColor(.bright_magenta),36 .warning => try term.setColor(.bright_magenta),
37 .off => unreachable,37 .off => unreachable,
38 }38 }
39 try w.print("{s}: ", .{@tagName(msg.effective_kind)});39 try w.print("{s}: ", .{@tagName(msg.effective_kind)});
4040
41 try t.setColor(.white);41 try term.setColor(.white);
42 try w.writeAll(msg.text);42 try w.writeAll(msg.text);
43 if (msg.opt) |some| {43 if (msg.opt) |some| {
44 if (msg.effective_kind == .@"error" and msg.kind != .@"error") {44 if (msg.effective_kind == .@"error" and msg.kind != .@"error") {
...@@ -56,17 +56,17 @@ pub const Message = struct {...@@ -56,17 +56,17 @@ pub const Message = struct {
5656
57 if (!details or msg.location == null) {57 if (!details or msg.location == null) {
58 try w.writeAll("\n");58 try w.writeAll("\n");
59 try t.setColor(.reset);59 try term.setColor(.reset);
60 } else {60 } else {
61 const loc = msg.location.?;61 const loc = msg.location.?;
62 const trailer = if (loc.end_with_splice) "\\ " else "";62 const trailer = if (loc.end_with_splice) "\\ " else "";
63 try t.setColor(.reset);63 try term.setColor(.reset);
64 try w.print("\n{s}{s}\n", .{ loc.line, trailer });64 try w.print("\n{s}{s}\n", .{ loc.line, trailer });
65 try w.splatByteAll(' ', loc.width);65 try w.splatByteAll(' ', loc.width);
66 try t.setColor(.bold);66 try term.setColor(.bold);
67 try t.setColor(.bright_green);67 try term.setColor(.bright_green);
68 try w.writeAll("^\n");68 try w.writeAll("^\n");
69 try t.setColor(.reset);69 try term.setColor(.reset);
70 }70 }
71 try w.flush();71 try w.flush();
72 }72 }
...@@ -199,6 +199,10 @@ pub const Option = enum {...@@ -199,6 +199,10 @@ pub const Option = enum {
199 @"pragma-once-outside-header",199 @"pragma-once-outside-header",
200 @"underlying-atomic-qualifier-ignored",200 @"underlying-atomic-qualifier-ignored",
201 @"underlying-cv-qualifier-ignored",201 @"underlying-cv-qualifier-ignored",
202 @"bounds-attributes-redundant",
203 @"file-name-extension",
204 @"base-file-extension",
205 @"include-level-extension",
202206
203 /// GNU extensions207 /// GNU extensions
204 pub const gnu = [_]Option{208 pub const gnu = [_]Option{
...@@ -541,11 +545,11 @@ fn addMessage(d: *Diagnostics, msg: Message) Compilation.Error!void {...@@ -541,11 +545,11 @@ fn addMessage(d: *Diagnostics, msg: Message) Compilation.Error!void {
541545
542 switch (d.output) {546 switch (d.output) {
543 .ignore => {},547 .ignore => {},
544 .to_writer => |t| {548 .to_writer => |terminal| {
545 var new_mode = t.mode;549 var mode = terminal.mode;
546 if (d.color == false) new_mode = .no_color;550 if (d.color == false) mode = .no_color;
547 if (d.color == true and new_mode == .no_color) new_mode = .escape_codes;551 if (d.color == true and mode == .no_color) mode = .escape_codes;
548 msg.write(.{ .writer = t.writer, .mode = new_mode }, d.details) catch {552 msg.write(.{ .mode = mode, .writer = terminal.writer }, d.details) catch {
549 return error.FatalError;553 return error.FatalError;
550 };554 };
551 },555 },
lib/compiler/aro/aro/Driver.zig+124-50
...@@ -1,5 +1,4 @@...@@ -1,5 +1,4 @@
1const std = @import("std");1const std = @import("std");
2const Io = std.Io;
3const mem = std.mem;2const mem = std.mem;
4const Allocator = mem.Allocator;3const Allocator = mem.Allocator;
5const process = std.process;4const process = std.process;
...@@ -9,6 +8,7 @@ const Assembly = backend.Assembly;...@@ -9,6 +8,7 @@ const Assembly = backend.Assembly;
9const Ir = backend.Ir;8const Ir = backend.Ir;
10const Object = backend.Object;9const Object = backend.Object;
1110
11const Attribute = @import("Attribute.zig");
12const Compilation = @import("Compilation.zig");12const Compilation = @import("Compilation.zig");
13const Diagnostics = @import("Diagnostics.zig");13const Diagnostics = @import("Diagnostics.zig");
14const DepFile = @import("DepFile.zig");14const DepFile = @import("DepFile.zig");
...@@ -52,6 +52,7 @@ implicit_includes: std.ArrayList(Source) = .empty,...@@ -52,6 +52,7 @@ implicit_includes: std.ArrayList(Source) = .empty,
52/// List of includes that will be used to construct the compilation's search path52/// List of includes that will be used to construct the compilation's search path
53includes: std.ArrayList(Compilation.Include) = .empty,53includes: std.ArrayList(Compilation.Include) = .empty,
54link_objects: std.ArrayList([]const u8) = .empty,54link_objects: std.ArrayList([]const u8) = .empty,
55macro_prefix_map: std.ArrayList(struct { []const u8, []const u8 }) = .empty,
55output_name: ?[]const u8 = null,56output_name: ?[]const u8 = null,
56sysroot: ?[]const u8 = null,57sysroot: ?[]const u8 = null,
57resource_dir: ?[]const u8 = null,58resource_dir: ?[]const u8 = null,
...@@ -134,9 +135,8 @@ strip: bool = false,...@@ -134,9 +135,8 @@ strip: bool = false,
134unwindlib: ?[]const u8 = null,135unwindlib: ?[]const u8 = null,
135136
136pub fn deinit(d: *Driver) void {137pub fn deinit(d: *Driver) void {
137 const io = d.comp.io;
138 for (d.link_objects.items[d.link_objects.items.len - d.temp_file_count ..]) |obj| {138 for (d.link_objects.items[d.link_objects.items.len - d.temp_file_count ..]) |obj| {
139 Io.Dir.deleteFileAbsolute(io, obj) catch {};139 std.Io.Dir.deleteFileAbsolute(d.comp.io, obj) catch {};
140 d.comp.gpa.free(obj);140 d.comp.gpa.free(obj);
141 }141 }
142 d.inputs.deinit(d.comp.gpa);142 d.inputs.deinit(d.comp.gpa);
...@@ -144,6 +144,7 @@ pub fn deinit(d: *Driver) void {...@@ -144,6 +144,7 @@ pub fn deinit(d: *Driver) void {
144 d.implicit_includes.deinit(d.comp.gpa);144 d.implicit_includes.deinit(d.comp.gpa);
145 d.includes.deinit(d.comp.gpa);145 d.includes.deinit(d.comp.gpa);
146 d.link_objects.deinit(d.comp.gpa);146 d.link_objects.deinit(d.comp.gpa);
147 d.macro_prefix_map.deinit(d.comp.gpa);
147 d.* = undefined;148 d.* = undefined;
148}149}
149150
...@@ -177,6 +178,10 @@ pub const usage =...@@ -177,6 +178,10 @@ pub const usage =
177 \\ -darwin-target-variant-triple178 \\ -darwin-target-variant-triple
178 \\ Specify the darwin target variant triple179 \\ Specify the darwin target variant triple
179 \\ -fapple-kext Use Apple's kernel extensions ABI180 \\ -fapple-kext Use Apple's kernel extensions ABI
181 \\ -fexperimental-bounds-safety
182 \\ Enable experimental clang-style bounds safety attributes (INCOMPLETE)
183 \\ -fno-experimental-bounds-safety
184 \\ Disable experimental clang-style bounds safety attributes
180 \\ -fchar8_t Enable char8_t (enabled by default in C23 and later)185 \\ -fchar8_t Enable char8_t (enabled by default in C23 and later)
181 \\ -fno-char8_t Disable char8_t (disabled by default for pre-C23)186 \\ -fno-char8_t Disable char8_t (disabled by default for pre-C23)
182 \\ -fcolor-diagnostics Enable colors in diagnostics187 \\ -fcolor-diagnostics Enable colors in diagnostics
...@@ -218,6 +223,8 @@ pub const usage =...@@ -218,6 +223,8 @@ pub const usage =
218 \\ -fuse-line-directives Use `#line <num>` linemarkers in preprocessed output223 \\ -fuse-line-directives Use `#line <num>` linemarkers in preprocessed output
219 \\ -fno-use-line-directives224 \\ -fno-use-line-directives
220 \\ Use `# <num>` linemarkers in preprocessed output225 \\ Use `# <num>` linemarkers in preprocessed output
226 \\ -fvisibility=[default|hidden|internal|protected]
227 \\ Set the default ELF image symbol visibility to the specified option—all symbols are marked with this unless overridden within the code
221 \\ -iquote <dir> Add directory to QUOTE include search path228 \\ -iquote <dir> Add directory to QUOTE include search path
222 \\ -I <dir> Add directory to include search path229 \\ -I <dir> Add directory to include search path
223 \\ -idirafter <dir> Add directory to AFTER include search path230 \\ -idirafter <dir> Add directory to AFTER include search path
...@@ -375,6 +382,17 @@ pub fn parseArgs(...@@ -375,6 +382,17 @@ pub fn parseArgs(
375 d.use_line_directives = false;382 d.use_line_directives = false;
376 } else if (mem.eql(u8, arg, "-fapple-kext")) {383 } else if (mem.eql(u8, arg, "-fapple-kext")) {
377 d.apple_kext = true;384 d.apple_kext = true;
385 } else if (option(arg, "-fvisibility=")) |visibility| {
386 d.comp.langopts.default_symbol_visibility = Attribute.visibilityFromString(visibility) orelse
387 return d.fatal("unsupported value '{s}'' in '{s}'", .{ visibility, arg });
388 } else if (option(arg, "-frandom-seed=")) |_| {
389 // Ignore
390 } else if (option(arg, "-fmacro-prefix-map=")) |kv| {
391 const pair = mem.cutScalar(u8, kv, '=') orelse {
392 try d.err("invalid argument '{s}' to '-fmacro-prefix-map=", .{kv});
393 continue;
394 };
395 try d.macro_prefix_map.append(gpa, pair);
378 } else if (option(arg, "-mcmodel=")) |cmodel| {396 } else if (option(arg, "-mcmodel=")) |cmodel| {
379 d.comp.cmodel = std.meta.stringToEnum(std.builtin.CodeModel, cmodel) orelse397 d.comp.cmodel = std.meta.stringToEnum(std.builtin.CodeModel, cmodel) orelse
380 return d.fatal("unsupported machine code model: '{s}'", .{arg});398 return d.fatal("unsupported machine code model: '{s}'", .{arg});
...@@ -415,6 +433,10 @@ pub fn parseArgs(...@@ -415,6 +433,10 @@ pub fn parseArgs(
415 d.dependencies.file = path;433 d.dependencies.file = path;
416 } else if (mem.eql(u8, arg, "-MV")) {434 } else if (mem.eql(u8, arg, "-MV")) {
417 d.dependencies.format = .nmake;435 d.dependencies.format = .nmake;
436 } else if (mem.eql(u8, arg, "-fexperimental-bounds-safety")) {
437 d.comp.langopts.bounds_safety = .clang;
438 } else if (mem.eql(u8, arg, "-fno-experimental-bounds-safety")) {
439 d.comp.langopts.bounds_safety = .none;
418 } else if (mem.eql(u8, arg, "-fchar8_t")) {440 } else if (mem.eql(u8, arg, "-fchar8_t")) {
419 d.comp.langopts.has_char8_t_override = true;441 d.comp.langopts.has_char8_t_override = true;
420 } else if (mem.eql(u8, arg, "-fno-char8_t")) {442 } else if (mem.eql(u8, arg, "-fno-char8_t")) {
...@@ -635,6 +657,42 @@ pub fn parseArgs(...@@ -635,6 +657,42 @@ pub fn parseArgs(
635 d.output_name = file;657 d.output_name = file;
636 } else if (option(arg, "--sysroot=")) |sysroot| {658 } else if (option(arg, "--sysroot=")) |sysroot| {
637 d.sysroot = sysroot;659 d.sysroot = sysroot;
660 } else if (mem.eql(u8, arg, "--sysroot")) {
661 i += 1;
662 if (i >= args.len) {
663 try d.err("expected argument after --sysroot", .{});
664 continue;
665 }
666 d.sysroot = args[i];
667 } else if (mem.startsWith(u8, arg, "-isysroot")) {
668 var path = arg["-isysroot".len..];
669 if (path.len == 0) {
670 i += 1;
671 if (i >= args.len) {
672 try d.err("expected argument after -isysroot", .{});
673 continue;
674 }
675 path = args[i];
676 }
677 d.sysroot = path;
678 } else if (mem.eql(u8, arg, "-rpath")) {
679 i += 1;
680 if (i >= args.len) {
681 try d.err("expected argument after -rpath", .{});
682 continue;
683 }
684 // ignore for now
685 } else if (mem.startsWith(u8, arg, "-L")) {
686 var path = arg["-L".len..];
687 if (path.len == 0) {
688 i += 1;
689 if (i >= args.len) {
690 try d.err("expected argument after -L", .{});
691 continue;
692 }
693 path = args[i];
694 }
695 // ignore for now
638 } else if (mem.eql(u8, arg, "-Wp,-v")) {696 } else if (mem.eql(u8, arg, "-Wp,-v")) {
639 // TODO this is not how this argument should work697 // TODO this is not how this argument should work
640 d.verbose_search_path = true;698 d.verbose_search_path = true;
...@@ -706,6 +764,10 @@ pub fn parseArgs(...@@ -706,6 +764,10 @@ pub fn parseArgs(
706 d.comp.langopts.preserve_comments = true;764 d.comp.langopts.preserve_comments = true;
707 d.comp.langopts.preserve_comments_in_macros = true;765 d.comp.langopts.preserve_comments_in_macros = true;
708 comment_arg = arg;766 comment_arg = arg;
767 } else if (option(arg, "-fuse-ld=")) |linker_name| {
768 d.use_linker = linker_name;
769 } else if (mem.eql(u8, arg, "-fuse-ld=")) {
770 d.use_linker = null;
709 } else if (option(arg, "--ld-path=")) |linker_path| {771 } else if (option(arg, "--ld-path=")) |linker_path| {
710 d.linker_path = linker_path;772 d.linker_path = linker_path;
711 } else if (mem.eql(u8, arg, "-r")) {773 } else if (mem.eql(u8, arg, "-r")) {
...@@ -810,6 +872,7 @@ pub fn parseArgs(...@@ -810,6 +872,7 @@ pub fn parseArgs(
810 .clang => try d.diagnostics.set("clang", .off),872 .clang => try d.diagnostics.set("clang", .off),
811 .gcc => try d.diagnostics.set("gnu", .off),873 .gcc => try d.diagnostics.set("gnu", .off),
812 .msvc => try d.diagnostics.set("microsoft", .off),874 .msvc => try d.diagnostics.set("microsoft", .off),
875 .no => {},
813 }876 }
814 }877 }
815 if (d.comp.langopts.preserve_comments and !d.only_preprocess) {878 if (d.comp.langopts.preserve_comments and !d.only_preprocess) {
...@@ -1063,20 +1126,22 @@ pub fn printDiagnosticsStats(d: *Driver) void {...@@ -1063,20 +1126,22 @@ pub fn printDiagnosticsStats(d: *Driver) void {
1063 }1126 }
1064}1127}
10651128
1066pub fn detectConfig(d: *Driver, file: Io.File) std.Io.tty.Config {1129pub fn detectMode(d: *Driver, file: std.Io.File) std.Io.Cancelable!std.Io.Terminal.Mode {
1067 if (d.diagnostics.color == false) return .no_color;1130 if (d.diagnostics.color == false) return .no_color;
1068 const force_color = d.diagnostics.color == true;1131 const force_color = d.diagnostics.color == true;
10691132
1070 if (file.supportsAnsiEscapeCodes()) return .escape_codes;1133 const io = d.comp.io;
1071 if (@import("builtin").os.tag == .windows and file.isTty()) {1134 if (try file.supportsAnsiEscapeCodes(io)) return .escape_codes;
1072 var info: std.os.windows.CONSOLE_SCREEN_BUFFER_INFO = undefined;1135 if (@import("builtin").os.tag == .windows and try file.isTty(io)) {
1073 if (std.os.windows.kernel32.GetConsoleScreenBufferInfo(file.handle, &info) == std.os.windows.FALSE) {1136 var get_console_info = std.os.windows.CONSOLE.USER_IO.GET_SCREEN_BUFFER_INFO;
1074 return if (force_color) .escape_codes else .no_color;1137 switch (try get_console_info.operate(io, file)) {
1138 .SUCCESS => return .{ .windows_api = .{
1139 .io = io,
1140 .file = file,
1141 .reset_attributes = get_console_info.Data.wAttributes,
1142 } },
1143 else => {},
1075 }1144 }
1076 return .{ .windows_api = .{
1077 .handle = file.handle,
1078 .reset_attributes = info.wAttributes,
1079 } };
1080 }1145 }
10811146
1082 return if (force_color) .escape_codes else .no_color;1147 return if (force_color) .escape_codes else .no_color;
...@@ -1105,13 +1170,13 @@ pub fn errorDescription(e: anyerror) []const u8 {...@@ -1105,13 +1170,13 @@ pub fn errorDescription(e: anyerror) []const u8 {
11051170
1106/// The entry point of the Aro compiler.1171/// The entry point of the Aro compiler.
1107/// **MAY call `exit` if `fast_exit` is set.**1172/// **MAY call `exit` if `fast_exit` is set.**
1108pub fn main(d: *Driver, tc: *Toolchain, args: []const []const u8, comptime fast_exit: bool, asm_gen_fn: ?AsmCodeGenFn) Compilation.Error!void {1173pub fn main(d: *Driver, tc: *Toolchain, args: []const []const u8, comptime fast_exit: bool, asm_gen_fn: ?AsmCodeGenFn) (Compilation.Error || std.Io.Cancelable)!void {
1109 const user_macros = macros: {1174 const user_macros = macros: {
1110 var macro_buf: std.ArrayList(u8) = .empty;1175 var macro_buf: std.ArrayList(u8) = .empty;
1111 defer macro_buf.deinit(d.comp.gpa);1176 defer macro_buf.deinit(d.comp.gpa);
11121177
1113 var stdout_buf: [256]u8 = undefined;1178 var stdout_buf: [256]u8 = undefined;
1114 var stdout = Io.File.stdout().writer(&stdout_buf);1179 var stdout = std.Io.File.stdout().writer(d.comp.io, &stdout_buf);
1115 if (parseArgs(d, &stdout.interface, &macro_buf, args) catch |er| switch (er) {1180 if (parseArgs(d, &stdout.interface, &macro_buf, args) catch |er| switch (er) {
1116 error.WriteFailed => return d.fatal("failed to write to stdout: {s}", .{errorDescription(er)}),1181 error.WriteFailed => return d.fatal("failed to write to stdout: {s}", .{errorDescription(er)}),
1117 error.OutOfMemory => return error.OutOfMemory,1182 error.OutOfMemory => return error.OutOfMemory,
...@@ -1217,14 +1282,13 @@ pub fn getDepFileName(d: *Driver, source: Source, buf: *[std.fs.max_name_bytes]u...@@ -1217,14 +1282,13 @@ pub fn getDepFileName(d: *Driver, source: Source, buf: *[std.fs.max_name_bytes]u
1217}1282}
12181283
1219fn getRandomFilename(d: *Driver, buf: *[std.fs.max_name_bytes]u8, extension: []const u8) ![]const u8 {1284fn getRandomFilename(d: *Driver, buf: *[std.fs.max_name_bytes]u8, extension: []const u8) ![]const u8 {
1220 const io = d.comp.io;
1221 const random_bytes_count = 12;1285 const random_bytes_count = 12;
1222 const sub_path_len = comptime std.base64.url_safe.Encoder.calcSize(random_bytes_count);1286 const sub_path_len = comptime std.fs.base64_encoder.calcSize(random_bytes_count);
12231287
1224 var random_bytes: [random_bytes_count]u8 = undefined;1288 var random_bytes: [random_bytes_count]u8 = undefined;
1225 io.random(&random_bytes);1289 d.comp.io.random(&random_bytes);
1226 var random_name: [sub_path_len]u8 = undefined;1290 var random_name: [sub_path_len]u8 = undefined;
1227 _ = std.base64.url_safe.Encoder.encode(&random_name, &random_bytes);1291 _ = std.fs.base64_encoder.encode(&random_name, &random_bytes);
12281292
1229 const fmt_template = "/tmp/{s}{s}";1293 const fmt_template = "/tmp/{s}{s}";
1230 const fmt_args = .{1294 const fmt_args = .{
...@@ -1251,12 +1315,11 @@ fn getOutFileName(d: *Driver, source: Source, buf: *[std.fs.max_name_bytes]u8) !...@@ -1251,12 +1315,11 @@ fn getOutFileName(d: *Driver, source: Source, buf: *[std.fs.max_name_bytes]u8) !
1251}1315}
12521316
1253fn invokeAssembler(d: *Driver, tc: *Toolchain, input_path: []const u8, output_path: []const u8) !void {1317fn invokeAssembler(d: *Driver, tc: *Toolchain, input_path: []const u8, output_path: []const u8) !void {
1254 const io = d.comp.io;
1255 var assembler_path_buf: [std.fs.max_path_bytes]u8 = undefined;1318 var assembler_path_buf: [std.fs.max_path_bytes]u8 = undefined;
1256 const assembler_path = try tc.getAssemblerPath(&assembler_path_buf);1319 const assembler_path = try tc.getAssemblerPath(&assembler_path_buf);
1257 const argv = [_][]const u8{ assembler_path, input_path, "-o", output_path };1320 const argv = [_][]const u8{ assembler_path, input_path, "-o", output_path };
12581321
1259 var child = std.process.spawn(io, .{1322 var child = std.process.spawn(d.comp.io, .{
1260 .argv = &argv,1323 .argv = &argv,
1261 // TODO handle better1324 // TODO handle better
1262 .stdin = .inherit,1325 .stdin = .inherit,
...@@ -1265,8 +1328,8 @@ fn invokeAssembler(d: *Driver, tc: *Toolchain, input_path: []const u8, output_pa...@@ -1265,8 +1328,8 @@ fn invokeAssembler(d: *Driver, tc: *Toolchain, input_path: []const u8, output_pa
1265 }) catch |er| {1328 }) catch |er| {
1266 return d.fatal("unable to spawn linker: {s}", .{errorDescription(er)});1329 return d.fatal("unable to spawn linker: {s}", .{errorDescription(er)});
1267 };1330 };
1268 const term = child.wait(io) catch |er| {1331 const term = child.wait(d.comp.io) catch |er| {
1269 return d.fatal("unable to wait linker: {s}", .{errorDescription(er)});1332 return d.fatal("error waiting for linker: {s}", .{errorDescription(er)});
1270 };1333 };
1271 switch (term) {1334 switch (term) {
1272 .exited => |code| if (code != 0) {1335 .exited => |code| if (code != 0) {
...@@ -1289,13 +1352,16 @@ fn processSource(...@@ -1289,13 +1352,16 @@ fn processSource(
1289 comptime fast_exit: bool,1352 comptime fast_exit: bool,
1290 asm_gen_fn: ?AsmCodeGenFn,1353 asm_gen_fn: ?AsmCodeGenFn,
1291) !void {1354) !void {
1292 const gpa = d.comp.gpa;1355 const comp = d.comp;
1293 d.comp.generated_buf.items.len = 0;1356 const io = comp.io;
1357 const gpa = comp.gpa;
1358 comp.generated_buf.items.len = 0;
1294 const prev_total = d.diagnostics.errors;1359 const prev_total = d.diagnostics.errors;
12951360
1296 const io = d.comp.io;1361 var pp = try Preprocessor.init(comp, .{
12971362 .base_file = source.id,
1298 var pp = try Preprocessor.initDefault(d.comp);1363 .path_replacements = d.macro_prefix_map.items,
1364 });
1299 defer pp.deinit();1365 defer pp.deinit();
13001366
1301 var name_buf: [std.fs.max_name_bytes]u8 = undefined;1367 var name_buf: [std.fs.max_name_bytes]u8 = undefined;
...@@ -1304,8 +1370,8 @@ fn processSource(...@@ -1304,8 +1370,8 @@ fn processSource(
13041370
1305 if (opt_dep_file) |*dep_file| pp.dep_file = dep_file;1371 if (opt_dep_file) |*dep_file| pp.dep_file = dep_file;
13061372
1307 if (d.comp.langopts.ms_extensions) {1373 if (comp.langopts.ms_extensions) {
1308 d.comp.ms_cwd_source_id = source.id;1374 comp.ms_cwd_source_id = source.id;
1309 }1375 }
1310 const dump_mode = d.debug_dump_letters.getPreprocessorDumpMode();1376 const dump_mode = d.debug_dump_letters.getPreprocessorDumpMode();
1311 if (d.verbose_pp) pp.verbose = true;1377 if (d.verbose_pp) pp.verbose = true;
...@@ -1333,10 +1399,10 @@ fn processSource(...@@ -1333,10 +1399,10 @@ fn processSource(
1333 const dep_file_name = try d.getDepFileName(source, writer_buf[0..std.fs.max_name_bytes]);1399 const dep_file_name = try d.getDepFileName(source, writer_buf[0..std.fs.max_name_bytes]);
13341400
1335 const file = if (dep_file_name) |path|1401 const file = if (dep_file_name) |path|
1336 d.comp.cwd.createFile(io, path, .{}) catch |er|1402 comp.cwd.createFile(io, path, .{}) catch |er|
1337 return d.fatal("unable to create dependency file '{s}': {s}", .{ path, errorDescription(er) })1403 return d.fatal("unable to create dependency file '{s}': {s}", .{ path, errorDescription(er) })
1338 else1404 else
1339 Io.File.stdout();1405 std.Io.File.stdout();
1340 defer if (dep_file_name != null) file.close(io);1406 defer if (dep_file_name != null) file.close(io);
13411407
1342 var file_writer = file.writer(io, &writer_buf);1408 var file_writer = file.writer(io, &writer_buf);
...@@ -1358,10 +1424,10 @@ fn processSource(...@@ -1358,10 +1424,10 @@ fn processSource(
1358 }1424 }
13591425
1360 const file = if (d.output_name) |some|1426 const file = if (d.output_name) |some|
1361 d.comp.cwd.createFile(io, some, .{}) catch |er|1427 comp.cwd.createFile(io, some, .{}) catch |er|
1362 return d.fatal("unable to create output file '{s}': {s}", .{ some, errorDescription(er) })1428 return d.fatal("unable to create output file '{s}': {s}", .{ some, errorDescription(er) })
1363 else1429 else
1364 Io.File.stdout();1430 std.Io.File.stdout();
1365 defer if (d.output_name != null) file.close(io);1431 defer if (d.output_name != null) file.close(io);
13661432
1367 var file_writer = file.writer(io, &writer_buf);1433 var file_writer = file.writer(io, &writer_buf);
...@@ -1376,8 +1442,11 @@ fn processSource(...@@ -1376,8 +1442,11 @@ fn processSource(
1376 defer tree.deinit();1442 defer tree.deinit();
13771443
1378 if (d.verbose_ast) {1444 if (d.verbose_ast) {
1379 var stdout = Io.File.stdout().writer(&writer_buf);1445 var stdout = std.Io.File.stdout().writer(io, &writer_buf);
1380 tree.dump(d.detectConfig(stdout.file), &stdout.interface) catch {};1446 tree.dump(.{
1447 .mode = try d.detectMode(stdout.file),
1448 .writer = &stdout.interface,
1449 }) catch {};
1381 }1450 }
13821451
1383 d.printDiagnosticsStats();1452 d.printDiagnosticsStats();
...@@ -1392,10 +1461,10 @@ fn processSource(...@@ -1392,10 +1461,10 @@ fn processSource(
1392 return;1461 return;
1393 }1462 }
13941463
1395 if (d.comp.target.ofmt != .elf or d.comp.target.cpu.arch != .x86_64) {1464 if (comp.target.ofmt != .elf or comp.target.cpu.arch != .x86_64) {
1396 return d.fatal(1465 return d.fatal(
1397 "unsupported target {s}-{s}-{s}, currently only x86-64 elf is supported",1466 "unsupported target {s}-{s}-{s}, currently only x86-64 elf is supported",
1398 .{ @tagName(d.comp.target.cpu.arch), @tagName(d.comp.target.os.tag), @tagName(d.comp.target.abi) },1467 .{ @tagName(comp.target.cpu.arch), @tagName(comp.target.os.tag), @tagName(comp.target.abi) },
1399 );1468 );
1400 }1469 }
14011470
...@@ -1407,15 +1476,15 @@ fn processSource(...@@ -1407,15 +1476,15 @@ fn processSource(
1407 .{},1476 .{},
1408 );1477 );
14091478
1410 const assembly = try asm_fn(d.comp.target.toZigTarget(), &tree);1479 const assembly = try asm_fn(comp.target.toZigTarget(), &tree);
1411 defer assembly.deinit(gpa);1480 defer assembly.deinit(gpa);
14121481
1413 if (d.only_preprocess_and_compile) {1482 if (d.only_preprocess_and_compile) {
1414 const out_file = d.comp.cwd.createFile(io, out_file_name, .{}) catch |er|1483 const out_file = comp.cwd.createFile(io, out_file_name, .{}) catch |er|
1415 return d.fatal("unable to create output file '{s}': {s}", .{ out_file_name, errorDescription(er) });1484 return d.fatal("unable to create output file '{s}': {s}", .{ out_file_name, errorDescription(er) });
1416 defer out_file.close(io);1485 defer out_file.close(io);
14171486
1418 assembly.writeToFile(out_file) catch |er|1487 assembly.writeToFile(io, out_file) catch |er|
1419 return d.fatal("unable to write to output file '{s}': {s}", .{ out_file_name, errorDescription(er) });1488 return d.fatal("unable to write to output file '{s}': {s}", .{ out_file_name, errorDescription(er) });
1420 if (fast_exit) std.process.exit(0); // Not linking, no need for cleanup.1489 if (fast_exit) std.process.exit(0); // Not linking, no need for cleanup.
1421 return;1490 return;
...@@ -1425,10 +1494,10 @@ fn processSource(...@@ -1425,10 +1494,10 @@ fn processSource(
1425 // then assemble to out_file_name1494 // then assemble to out_file_name
1426 var assembly_name_buf: [std.fs.max_name_bytes]u8 = undefined;1495 var assembly_name_buf: [std.fs.max_name_bytes]u8 = undefined;
1427 const assembly_out_file_name = try d.getRandomFilename(&assembly_name_buf, ".s");1496 const assembly_out_file_name = try d.getRandomFilename(&assembly_name_buf, ".s");
1428 const out_file = d.comp.cwd.createFile(io, assembly_out_file_name, .{}) catch |er|1497 const out_file = comp.cwd.createFile(io, assembly_out_file_name, .{}) catch |er|
1429 return d.fatal("unable to create output file '{s}': {s}", .{ assembly_out_file_name, errorDescription(er) });1498 return d.fatal("unable to create output file '{s}': {s}", .{ assembly_out_file_name, errorDescription(er) });
1430 defer out_file.close(io);1499 defer out_file.close(io);
1431 assembly.writeToFile(out_file) catch |er|1500 assembly.writeToFile(io, out_file) catch |er|
1432 return d.fatal("unable to write to output file '{s}': {s}", .{ assembly_out_file_name, errorDescription(er) });1501 return d.fatal("unable to write to output file '{s}': {s}", .{ assembly_out_file_name, errorDescription(er) });
1433 try d.invokeAssembler(tc, assembly_out_file_name, out_file_name);1502 try d.invokeAssembler(tc, assembly_out_file_name, out_file_name);
1434 if (d.only_compile) {1503 if (d.only_compile) {
...@@ -1440,8 +1509,11 @@ fn processSource(...@@ -1440,8 +1509,11 @@ fn processSource(
1440 defer ir.deinit(gpa);1509 defer ir.deinit(gpa);
14411510
1442 if (d.verbose_ir) {1511 if (d.verbose_ir) {
1443 var stdout = Io.File.stdout().writer(&writer_buf);1512 var stdout = std.Io.File.stdout().writer(io, &writer_buf);
1444 ir.dump(gpa, d.detectConfig(stdout.file), &stdout.interface) catch {};1513 ir.dump(gpa, .{
1514 .mode = try d.detectMode(stdout.file),
1515 .writer = &stdout.interface,
1516 }) catch {};
1445 }1517 }
14461518
1447 var render_errors: Ir.Renderer.ErrorList = .{};1519 var render_errors: Ir.Renderer.ErrorList = .{};
...@@ -1494,8 +1566,9 @@ fn dumpLinkerArgs(w: *std.Io.Writer, items: []const []const u8) !void {...@@ -1494,8 +1566,9 @@ fn dumpLinkerArgs(w: *std.Io.Writer, items: []const []const u8) !void {
1494/// The entry point of the Aro compiler.1566/// The entry point of the Aro compiler.
1495/// **MAY call `exit` if `fast_exit` is set.**1567/// **MAY call `exit` if `fast_exit` is set.**
1496pub fn invokeLinker(d: *Driver, tc: *Toolchain, comptime fast_exit: bool) Compilation.Error!void {1568pub fn invokeLinker(d: *Driver, tc: *Toolchain, comptime fast_exit: bool) Compilation.Error!void {
1497 const gpa = d.comp.gpa;1569 const comp = d.comp;
1498 const io = d.comp.io;1570 const io = comp.io;
1571 const gpa = comp.gpa;
1499 var argv: std.ArrayList([]const u8) = .empty;1572 var argv: std.ArrayList([]const u8) = .empty;
1500 defer argv.deinit(gpa);1573 defer argv.deinit(gpa);
15011574
...@@ -1507,7 +1580,7 @@ pub fn invokeLinker(d: *Driver, tc: *Toolchain, comptime fast_exit: bool) Compil...@@ -1507,7 +1580,7 @@ pub fn invokeLinker(d: *Driver, tc: *Toolchain, comptime fast_exit: bool) Compil
15071580
1508 if (d.verbose_linker_args) {1581 if (d.verbose_linker_args) {
1509 var stdout_buf: [4096]u8 = undefined;1582 var stdout_buf: [4096]u8 = undefined;
1510 var stdout = Io.File.stdout().writer(&stdout_buf);1583 var stdout = std.Io.File.stdout().writer(io, &stdout_buf);
1511 dumpLinkerArgs(&stdout.interface, argv.items) catch {1584 dumpLinkerArgs(&stdout.interface, argv.items) catch {
1512 return d.fatal("unable to dump linker args: {s}", .{errorDescription(stdout.err.?)});1585 return d.fatal("unable to dump linker args: {s}", .{errorDescription(stdout.err.?)});
1513 };1586 };
...@@ -1521,8 +1594,9 @@ pub fn invokeLinker(d: *Driver, tc: *Toolchain, comptime fast_exit: bool) Compil...@@ -1521,8 +1594,9 @@ pub fn invokeLinker(d: *Driver, tc: *Toolchain, comptime fast_exit: bool) Compil
1521 }) catch |er| {1594 }) catch |er| {
1522 return d.fatal("unable to spawn linker: {s}", .{errorDescription(er)});1595 return d.fatal("unable to spawn linker: {s}", .{errorDescription(er)});
1523 };1596 };
1597
1524 const term = child.wait(io) catch |er| {1598 const term = child.wait(io) catch |er| {
1525 return d.fatal("unable to wait linker: {s}", .{errorDescription(er)});1599 return d.fatal("error waiting for linker: {s}", .{errorDescription(er)});
1526 };1600 };
1527 switch (term) {1601 switch (term) {
1528 .exited => |code| if (code != 0) {1602 .exited => |code| if (code != 0) {
...@@ -1541,7 +1615,7 @@ pub fn invokeLinker(d: *Driver, tc: *Toolchain, comptime fast_exit: bool) Compil...@@ -1541,7 +1615,7 @@ pub fn invokeLinker(d: *Driver, tc: *Toolchain, comptime fast_exit: bool) Compil
15411615
1542fn exitWithCleanup(d: *Driver, code: u8) noreturn {1616fn exitWithCleanup(d: *Driver, code: u8) noreturn {
1543 for (d.link_objects.items[d.link_objects.items.len - d.temp_file_count ..]) |obj| {1617 for (d.link_objects.items[d.link_objects.items.len - d.temp_file_count ..]) |obj| {
1544 std.fs.deleteFileAbsolute(obj) catch {};1618 std.Io.Dir.deleteFileAbsolute(d.comp.io, obj) catch {};
1545 }1619 }
1546 std.process.exit(code);1620 std.process.exit(code);
1547}1621}
lib/compiler/aro/aro/Driver/Filesystem.zig deleted-241
...@@ -1,241 +0,0 @@
1const builtin = @import("builtin");
2const is_windows = builtin.os.tag == .windows;
3
4const std = @import("std");
5const Io = std.Io;
6const mem = std.std.mem;
7
8fn readFileFake(entries: []const Filesystem.Entry, path: []const u8, buf: []u8) ?[]const u8 {
9 @branchHint(.cold);
10 for (entries) |entry| {
11 if (mem.eql(u8, entry.path, path)) {
12 const len = @min(entry.contents.len, buf.len);
13 @memcpy(buf[0..len], entry.contents[0..len]);
14 return buf[0..len];
15 }
16 }
17 return null;
18}
19
20fn findProgramByNameFake(entries: []const Filesystem.Entry, name: []const u8, path: ?[]const u8, buf: []u8) ?[]const u8 {
21 @branchHint(.cold);
22 if (mem.indexOfScalar(u8, name, '/') != null) {
23 @memcpy(buf[0..name.len], name);
24 return buf[0..name.len];
25 }
26 const path_env = path orelse return null;
27 var fib = std.heap.FixedBufferAllocator.init(buf);
28
29 var it = mem.tokenizeScalar(u8, path_env, std.fs.path.delimiter);
30 while (it.next()) |path_dir| {
31 defer fib.reset();
32 const full_path = std.fs.path.join(fib.allocator(), &.{ path_dir, name }) catch continue;
33 if (canExecuteFake(entries, full_path)) return full_path;
34 }
35
36 return null;
37}
38
39fn canExecuteFake(entries: []const Filesystem.Entry, path: []const u8) bool {
40 @branchHint(.cold);
41 for (entries) |entry| {
42 if (mem.eql(u8, entry.path, path)) {
43 return entry.executable;
44 }
45 }
46 return false;
47}
48
49fn existsFake(entries: []const Filesystem.Entry, path: []const u8) bool {
50 @branchHint(.cold);
51 var buf: [std.fs.max_path_bytes]u8 = undefined;
52 var fib = std.heap.FixedBufferAllocator.init(&buf);
53 const resolved = std.fs.path.resolvePosix(fib.allocator(), &.{path}) catch return false;
54 for (entries) |entry| {
55 if (mem.eql(u8, entry.path, resolved)) return true;
56 }
57 return false;
58}
59
60fn canExecutePosix(io: Io, path: []const u8) bool {
61 Io.Dir.accessAbsolute(io, path, .{ .execute = true }) catch return false;
62 // Todo: ensure path is not a directory
63 return true;
64}
65
66/// TODO
67fn canExecuteWindows(path: []const u8) bool {
68 _ = path;
69 return true;
70}
71
72/// TODO
73fn findProgramByNameWindows(allocator: std.mem.Allocator, name: []const u8, path: ?[]const u8, buf: []u8) ?[]const u8 {
74 _ = path;
75 _ = buf;
76 _ = name;
77 _ = allocator;
78 return null;
79}
80
81/// TODO: does WASI need special handling?
82fn findProgramByNamePosix(name: []const u8, path: ?[]const u8, buf: []u8) ?[]const u8 {
83 if (mem.indexOfScalar(u8, name, '/') != null) {
84 @memcpy(buf[0..name.len], name);
85 return buf[0..name.len];
86 }
87 const path_env = path orelse return null;
88 var fib = std.heap.FixedBufferAllocator.init(buf);
89
90 var it = mem.tokenizeScalar(u8, path_env, std.fs.path.delimiter);
91 while (it.next()) |path_dir| {
92 defer fib.reset();
93 const full_path = std.fs.path.join(fib.allocator(), &.{ path_dir, name }) catch continue;
94 if (canExecutePosix(full_path)) return full_path;
95 }
96
97 return null;
98}
99
100pub const Filesystem = union(enum) {
101 real: std.Io.Dir,
102 fake: []const Entry,
103
104 const Entry = struct {
105 path: []const u8,
106 contents: []const u8 = "",
107 executable: bool = false,
108 };
109
110 const FakeDir = struct {
111 entries: []const Entry,
112 path: []const u8,
113
114 fn iterate(self: FakeDir) FakeDir.Iterator {
115 return .{
116 .entries = self.entries,
117 .base = self.path,
118 };
119 }
120
121 const Iterator = struct {
122 entries: []const Entry,
123 base: []const u8,
124 i: usize = 0,
125
126 fn next(self: *@This()) !?std.Io.Dir.Entry {
127 while (self.i < self.entries.len) {
128 const entry = self.entries[self.i];
129 self.i += 1;
130 if (entry.path.len == self.base.len) continue;
131 if (std.mem.startsWith(u8, entry.path, self.base)) {
132 const remaining = entry.path[self.base.len + 1 ..];
133 if (std.mem.indexOfScalar(u8, remaining, std.fs.path.sep) != null) continue;
134 const extension = std.fs.path.extension(remaining);
135 const kind: std.Io.Dir.Entry.Kind = if (extension.len == 0) .directory else .file;
136 return .{ .name = remaining, .kind = kind };
137 }
138 }
139 return null;
140 }
141 };
142 };
143
144 const Dir = union(enum) {
145 dir: std.Io.Dir,
146 fake: FakeDir,
147
148 pub fn iterate(self: Dir) Iterator {
149 return switch (self) {
150 .dir => |dir| .{ .iterator = dir.iterate() },
151 .fake => |fake| .{ .fake = fake.iterate() },
152 };
153 }
154
155 pub fn close(self: *Dir, io: Io) void {
156 switch (self.*) {
157 .dir => |*d| d.close(io),
158 .fake => {},
159 }
160 }
161 };
162
163 const Iterator = union(enum) {
164 iterator: std.Io.Dir.Iterator,
165 fake: FakeDir.Iterator,
166
167 pub fn next(self: *Iterator) std.Io.Dir.Iterator.Error!?std.Io.Dir.Entry {
168 return switch (self.*) {
169 .iterator => |*it| it.next(),
170 .fake => |*it| it.next(),
171 };
172 }
173 };
174
175 pub fn exists(fs: Filesystem, io: Io, path: []const u8) bool {
176 switch (fs) {
177 .real => |cwd| {
178 cwd.access(io, path, .{}) catch return false;
179 return true;
180 },
181 .fake => |paths| return existsFake(paths, path),
182 }
183 }
184
185 pub fn joinedExists(fs: Filesystem, parts: []const []const u8) bool {
186 var buf: [std.fs.max_path_bytes]u8 = undefined;
187 var fib = std.heap.FixedBufferAllocator.init(&buf);
188 const joined = std.fs.path.join(fib.allocator(), parts) catch return false;
189 return fs.exists(joined);
190 }
191
192 pub fn canExecute(fs: Filesystem, path: []const u8) bool {
193 return switch (fs) {
194 .real => if (is_windows) canExecuteWindows(path) else canExecutePosix(path),
195 .fake => |entries| canExecuteFake(entries, path),
196 };
197 }
198
199 /// Search for an executable named `name` using platform-specific logic
200 /// If it's found, write the full path to `buf` and return a slice of it
201 /// Otherwise retun null
202 pub fn findProgramByName(fs: Filesystem, allocator: std.mem.Allocator, name: []const u8, path: ?[]const u8, buf: []u8) ?[]const u8 {
203 std.debug.assert(name.len > 0);
204 return switch (fs) {
205 .real => if (is_windows) findProgramByNameWindows(allocator, name, path, buf) else findProgramByNamePosix(name, path, buf),
206 .fake => |entries| findProgramByNameFake(entries, name, path, buf),
207 };
208 }
209
210 /// Read the file at `path` into `buf`.
211 /// Returns null if any errors are encountered
212 /// Otherwise returns a slice of `buf`. If the file is larger than `buf` partial contents are returned
213 pub fn readFile(fs: Filesystem, io: Io, path: []const u8, buf: []u8) ?[]const u8 {
214 return switch (fs) {
215 .real => |cwd| {
216 const file = cwd.openFile(io, path, .{}) catch return null;
217 defer file.close(io);
218
219 const bytes_read = file.readAll(buf) catch return null;
220 return buf[0..bytes_read];
221 },
222 .fake => |entries| readFileFake(entries, path, buf),
223 };
224 }
225
226 pub fn openDir(fs: Filesystem, io: Io, dir_name: []const u8) std.Io.Dir.OpenError!Dir {
227 return switch (fs) {
228 .real => |cwd| .{ .dir = try cwd.openDir(io, dir_name, .{ .access_sub_paths = false, .iterate = true }) },
229 .fake => |entries| .{ .fake = .{ .entries = entries, .path = dir_name } },
230 };
231 }
232};
233
234test "Fake filesystem" {
235 const fs: Filesystem = .{ .fake = &.{
236 .{ .path = "/usr/bin" },
237 } };
238 try std.testing.expect(fs.exists("/usr/bin"));
239 try std.testing.expect(fs.exists("/usr/bin/foo/.."));
240 try std.testing.expect(!fs.exists("/usr/bin/bar"));
241}
lib/compiler/aro/aro/Driver/GCCDetector.zig created+635
...@@ -0,0 +1,635 @@
1const std = @import("std");
2
3const system_defaults = @import("system_defaults");
4
5const GCCVersion = @import("GCCVersion.zig");
6const Multilib = @import("Multilib.zig");
7const Target = @import("../Target.zig");
8const Toolchain = @import("../Toolchain.zig");
9
10const GCCDetector = @This();
11
12is_valid: bool = false,
13install_path: []const u8 = "",
14parent_lib_path: []const u8 = "",
15version: GCCVersion = .{},
16gcc_triple: []const u8 = "",
17selected: Multilib = .{},
18biarch_sibling: ?Multilib = null,
19
20pub fn deinit(self: *GCCDetector) void {
21 if (!self.is_valid) return;
22}
23
24pub fn appendToolPath(self: *const GCCDetector, tc: *Toolchain) !void {
25 if (!self.is_valid) return;
26 return tc.addPathFromComponents(&.{
27 self.parent_lib_path,
28 "..",
29 self.gcc_triple,
30 "bin",
31 }, .program);
32}
33
34fn addDefaultGCCPrefixes(prefixes: *std.ArrayList([]const u8), tc: *const Toolchain) !void {
35 const sysroot = tc.getSysroot();
36 const target = tc.getTarget();
37 if (sysroot.len == 0 and target.os.tag == .linux and tc.exists("/opt/rh")) {
38 prefixes.appendAssumeCapacity("/opt/rh/gcc-toolset-12/root/usr");
39 prefixes.appendAssumeCapacity("/opt/rh/gcc-toolset-11/root/usr");
40 prefixes.appendAssumeCapacity("/opt/rh/gcc-toolset-10/root/usr");
41 prefixes.appendAssumeCapacity("/opt/rh/devtoolset-12/root/usr");
42 prefixes.appendAssumeCapacity("/opt/rh/devtoolset-11/root/usr");
43 prefixes.appendAssumeCapacity("/opt/rh/devtoolset-10/root/usr");
44 prefixes.appendAssumeCapacity("/opt/rh/devtoolset-9/root/usr");
45 prefixes.appendAssumeCapacity("/opt/rh/devtoolset-8/root/usr");
46 prefixes.appendAssumeCapacity("/opt/rh/devtoolset-7/root/usr");
47 prefixes.appendAssumeCapacity("/opt/rh/devtoolset-6/root/usr");
48 prefixes.appendAssumeCapacity("/opt/rh/devtoolset-4/root/usr");
49 prefixes.appendAssumeCapacity("/opt/rh/devtoolset-3/root/usr");
50 prefixes.appendAssumeCapacity("/opt/rh/devtoolset-2/root/usr");
51 }
52 if (sysroot.len == 0) {
53 prefixes.appendAssumeCapacity("/usr");
54 } else {
55 var usr_path = try tc.driver.comp.arena.alloc(u8, 4 + sysroot.len);
56 @memcpy(usr_path[0..4], "/usr");
57 @memcpy(usr_path[4..], sysroot);
58 prefixes.appendAssumeCapacity(usr_path);
59 }
60}
61
62fn collectLibDirsAndTriples(
63 tc: *Toolchain,
64 lib_dirs: *std.ArrayList([]const u8),
65 triple_aliases: *std.ArrayList([]const u8),
66 biarch_libdirs: *std.ArrayList([]const u8),
67 biarch_triple_aliases: *std.ArrayList([]const u8),
68) !void {
69 const AArch64LibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
70 const AArch64Triples: [4][]const u8 = .{ "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-redhat-linux", "aarch64-suse-linux" };
71 const AArch64beLibDirs: [1][]const u8 = .{"/lib"};
72 const AArch64beTriples: [2][]const u8 = .{ "aarch64_be-none-linux-gnu", "aarch64_be-linux-gnu" };
73
74 const ARMLibDirs: [1][]const u8 = .{"/lib"};
75 const ARMTriples: [1][]const u8 = .{"arm-linux-gnueabi"};
76 const ARMHFTriples: [4][]const u8 = .{ "arm-linux-gnueabihf", "armv7hl-redhat-linux-gnueabi", "armv6hl-suse-linux-gnueabi", "armv7hl-suse-linux-gnueabi" };
77
78 const ARMebLibDirs: [1][]const u8 = .{"/lib"};
79 const ARMebTriples: [1][]const u8 = .{"armeb-linux-gnueabi"};
80 const ARMebHFTriples: [2][]const u8 = .{ "armeb-linux-gnueabihf", "armebv7hl-redhat-linux-gnueabi" };
81
82 const AVRLibDirs: [1][]const u8 = .{"/lib"};
83 const AVRTriples: [1][]const u8 = .{"avr"};
84
85 const CSKYLibDirs: [1][]const u8 = .{"/lib"};
86 const CSKYTriples: [3][]const u8 = .{ "csky-linux-gnuabiv2", "csky-linux-uclibcabiv2", "csky-elf-noneabiv2" };
87
88 const X86_64LibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
89 const X86_64Triples: [11][]const u8 = .{
90 "x86_64-linux-gnu", "x86_64-unknown-linux-gnu",
91 "x86_64-pc-linux-gnu", "x86_64-redhat-linux6E",
92 "x86_64-redhat-linux", "x86_64-suse-linux",
93 "x86_64-manbo-linux-gnu", "x86_64-linux-gnu",
94 "x86_64-slackware-linux", "x86_64-unknown-linux",
95 "x86_64-amazon-linux",
96 };
97 const X32Triples: [2][]const u8 = .{ "x86_64-linux-gnux32", "x86_64-pc-linux-gnux32" };
98 const X32LibDirs: [2][]const u8 = .{ "/libx32", "/lib" };
99 const X86LibDirs: [2][]const u8 = .{ "/lib32", "/lib" };
100 const X86Triples: [9][]const u8 = .{
101 "i586-linux-gnu", "i686-linux-gnu", "i686-pc-linux-gnu",
102 "i386-redhat-linux6E", "i686-redhat-linux", "i386-redhat-linux",
103 "i586-suse-linux", "i686-montavista-linux", "i686-gnu",
104 };
105
106 const LoongArch64LibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
107 const LoongArch64Triples: [2][]const u8 = .{ "loongarch64-linux-gnu", "loongarch64-unknown-linux-gnu" };
108
109 const M68kLibDirs: [1][]const u8 = .{"/lib"};
110 const M68kTriples: [3][]const u8 = .{ "m68k-linux-gnu", "m68k-unknown-linux-gnu", "m68k-suse-linux" };
111
112 const MIPSLibDirs: [2][]const u8 = .{ "/libo32", "/lib" };
113 const MIPSTriples: [5][]const u8 = .{
114 "mips-linux-gnu", "mips-mti-linux",
115 "mips-mti-linux-gnu", "mips-img-linux-gnu",
116 "mipsisa32r6-linux-gnu",
117 };
118 const MIPSELLibDirs: [2][]const u8 = .{ "/libo32", "/lib" };
119 const MIPSELTriples: [3][]const u8 = .{ "mipsel-linux-gnu", "mips-img-linux-gnu", "mipsisa32r6el-linux-gnu" };
120
121 const MIPS64LibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
122 const MIPS64Triples: [6][]const u8 = .{
123 "mips64-linux-gnu", "mips-mti-linux-gnu",
124 "mips-img-linux-gnu", "mips64-linux-gnuabi64",
125 "mipsisa64r6-linux-gnu", "mipsisa64r6-linux-gnuabi64",
126 };
127 const MIPS64ELLibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
128 const MIPS64ELTriples: [6][]const u8 = .{
129 "mips64el-linux-gnu", "mips-mti-linux-gnu",
130 "mips-img-linux-gnu", "mips64el-linux-gnuabi64",
131 "mipsisa64r6el-linux-gnu", "mipsisa64r6el-linux-gnuabi64",
132 };
133
134 const MIPSN32LibDirs: [1][]const u8 = .{"/lib32"};
135 const MIPSN32Triples: [2][]const u8 = .{ "mips64-linux-gnuabin32", "mipsisa64r6-linux-gnuabin32" };
136 const MIPSN32ELLibDirs: [1][]const u8 = .{"/lib32"};
137 const MIPSN32ELTriples: [2][]const u8 = .{ "mips64el-linux-gnuabin32", "mipsisa64r6el-linux-gnuabin32" };
138
139 const MSP430LibDirs: [1][]const u8 = .{"/lib"};
140 const MSP430Triples: [1][]const u8 = .{"msp430-elf"};
141
142 const PPCLibDirs: [2][]const u8 = .{ "/lib32", "/lib" };
143 const PPCTriples: [5][]const u8 = .{
144 "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
145 // On 32-bit PowerPC systems running SUSE Linux, gcc is configured as a
146 // 64-bit compiler which defaults to "-m32", hence "powerpc64-suse-linux".
147 "powerpc64-suse-linux", "powerpc-montavista-linuxspe",
148 };
149 const PPCLELibDirs: [2][]const u8 = .{ "/lib32", "/lib" };
150 const PPCLETriples: [3][]const u8 = .{ "powerpcle-linux-gnu", "powerpcle-unknown-linux-gnu", "powerpcle-linux-musl" };
151
152 const PPC64LibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
153 const PPC64Triples: [4][]const u8 = .{
154 "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu",
155 "powerpc64-suse-linux", "ppc64-redhat-linux",
156 };
157 const PPC64LELibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
158 const PPC64LETriples: [5][]const u8 = .{
159 "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu",
160 "powerpc64le-none-linux-gnu", "powerpc64le-suse-linux",
161 "ppc64le-redhat-linux",
162 };
163
164 const RISCV32LibDirs: [2][]const u8 = .{ "/lib32", "/lib" };
165 const RISCV32Triples: [3][]const u8 = .{ "riscv32-unknown-linux-gnu", "riscv32-linux-gnu", "riscv32-unknown-elf" };
166 const RISCV64LibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
167 const RISCV64Triples: [3][]const u8 = .{
168 "riscv64-unknown-linux-gnu",
169 "riscv64-linux-gnu",
170 "riscv64-unknown-elf",
171 };
172
173 const SPARCv8LibDirs: [2][]const u8 = .{ "/lib32", "/lib" };
174 const SPARCv8Triples: [2][]const u8 = .{ "sparc-linux-gnu", "sparcv8-linux-gnu" };
175 const SPARCv9LibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
176 const SPARCv9Triples: [2][]const u8 = .{ "sparc64-linux-gnu", "sparcv9-linux-gnu" };
177
178 const SystemZLibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
179 const SystemZTriples: [5][]const u8 = .{
180 "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
181 "s390x-suse-linux", "s390x-redhat-linux",
182 };
183 const target = tc.getTarget();
184 if (target.os.tag == .illumos) {
185 // TODO
186 return;
187 }
188 if (target.abi.isAndroid()) {
189 const AArch64AndroidTriples: [1][]const u8 = .{"aarch64-linux-android"};
190 const ARMAndroidTriples: [1][]const u8 = .{"arm-linux-androideabi"};
191 const MIPSELAndroidTriples: [1][]const u8 = .{"mipsel-linux-android"};
192 const MIPS64ELAndroidTriples: [1][]const u8 = .{"mips64el-linux-android"};
193 const X86AndroidTriples: [1][]const u8 = .{"i686-linux-android"};
194 const X86_64AndroidTriples: [1][]const u8 = .{"x86_64-linux-android"};
195
196 switch (target.cpu.arch) {
197 .aarch64 => {
198 lib_dirs.appendSliceAssumeCapacity(&AArch64LibDirs);
199 triple_aliases.appendSliceAssumeCapacity(&AArch64AndroidTriples);
200 },
201 .arm,
202 .thumb,
203 => {
204 lib_dirs.appendSliceAssumeCapacity(&ARMLibDirs);
205 triple_aliases.appendSliceAssumeCapacity(&ARMAndroidTriples);
206 },
207 .mipsel => {
208 lib_dirs.appendSliceAssumeCapacity(&MIPSELLibDirs);
209 triple_aliases.appendSliceAssumeCapacity(&MIPSELAndroidTriples);
210 biarch_libdirs.appendSliceAssumeCapacity(&MIPS64ELLibDirs);
211 biarch_triple_aliases.appendSliceAssumeCapacity(&MIPS64ELAndroidTriples);
212 },
213 .mips64el => {
214 lib_dirs.appendSliceAssumeCapacity(&MIPS64ELLibDirs);
215 triple_aliases.appendSliceAssumeCapacity(&MIPS64ELAndroidTriples);
216 biarch_libdirs.appendSliceAssumeCapacity(&MIPSELLibDirs);
217 biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSELAndroidTriples);
218 },
219 .x86_64 => {
220 lib_dirs.appendSliceAssumeCapacity(&X86_64LibDirs);
221 triple_aliases.appendSliceAssumeCapacity(&X86_64AndroidTriples);
222 biarch_libdirs.appendSliceAssumeCapacity(&X86LibDirs);
223 biarch_triple_aliases.appendSliceAssumeCapacity(&X86AndroidTriples);
224 },
225 .x86 => {
226 lib_dirs.appendSliceAssumeCapacity(&X86LibDirs);
227 triple_aliases.appendSliceAssumeCapacity(&X86AndroidTriples);
228 biarch_libdirs.appendSliceAssumeCapacity(&X86_64LibDirs);
229 biarch_triple_aliases.appendSliceAssumeCapacity(&X86_64AndroidTriples);
230 },
231 else => {},
232 }
233 return;
234 }
235 switch (target.cpu.arch) {
236 .aarch64 => {
237 lib_dirs.appendSliceAssumeCapacity(&AArch64LibDirs);
238 triple_aliases.appendSliceAssumeCapacity(&AArch64Triples);
239 biarch_libdirs.appendSliceAssumeCapacity(&AArch64LibDirs);
240 biarch_triple_aliases.appendSliceAssumeCapacity(&AArch64Triples);
241 },
242 .aarch64_be => {
243 lib_dirs.appendSliceAssumeCapacity(&AArch64beLibDirs);
244 triple_aliases.appendSliceAssumeCapacity(&AArch64beTriples);
245 biarch_libdirs.appendSliceAssumeCapacity(&AArch64beLibDirs);
246 biarch_triple_aliases.appendSliceAssumeCapacity(&AArch64beTriples);
247 },
248 .arm, .thumb => {
249 lib_dirs.appendSliceAssumeCapacity(&ARMLibDirs);
250 if (target.abi == .gnueabihf) {
251 triple_aliases.appendSliceAssumeCapacity(&ARMHFTriples);
252 } else {
253 triple_aliases.appendSliceAssumeCapacity(&ARMTriples);
254 }
255 },
256 .armeb, .thumbeb => {
257 lib_dirs.appendSliceAssumeCapacity(&ARMebLibDirs);
258 if (target.abi == .gnueabihf) {
259 triple_aliases.appendSliceAssumeCapacity(&ARMebHFTriples);
260 } else {
261 triple_aliases.appendSliceAssumeCapacity(&ARMebTriples);
262 }
263 },
264 .avr => {
265 lib_dirs.appendSliceAssumeCapacity(&AVRLibDirs);
266 triple_aliases.appendSliceAssumeCapacity(&AVRTriples);
267 },
268 .csky => {
269 lib_dirs.appendSliceAssumeCapacity(&CSKYLibDirs);
270 triple_aliases.appendSliceAssumeCapacity(&CSKYTriples);
271 },
272 .x86_64 => {
273 if (target.abi == .gnux32 or target.abi == .muslx32) {
274 lib_dirs.appendSliceAssumeCapacity(&X32LibDirs);
275 triple_aliases.appendSliceAssumeCapacity(&X32Triples);
276 biarch_libdirs.appendSliceAssumeCapacity(&X86_64LibDirs);
277 biarch_triple_aliases.appendSliceAssumeCapacity(&X86_64Triples);
278 } else {
279 lib_dirs.appendSliceAssumeCapacity(&X86_64LibDirs);
280 triple_aliases.appendSliceAssumeCapacity(&X86_64Triples);
281 biarch_libdirs.appendSliceAssumeCapacity(&X32LibDirs);
282 biarch_triple_aliases.appendSliceAssumeCapacity(&X32Triples);
283 }
284 biarch_libdirs.appendSliceAssumeCapacity(&X86LibDirs);
285 biarch_triple_aliases.appendSliceAssumeCapacity(&X86Triples);
286 },
287 .x86 => {
288 lib_dirs.appendSliceAssumeCapacity(&X86LibDirs);
289 },
290 .loongarch64 => {
291 lib_dirs.appendSliceAssumeCapacity(&LoongArch64LibDirs);
292 triple_aliases.appendSliceAssumeCapacity(&LoongArch64Triples);
293 },
294 .m68k => {
295 lib_dirs.appendSliceAssumeCapacity(&M68kLibDirs);
296 triple_aliases.appendSliceAssumeCapacity(&M68kTriples);
297 },
298 .mips => {
299 lib_dirs.appendSliceAssumeCapacity(&MIPSLibDirs);
300 triple_aliases.appendSliceAssumeCapacity(&MIPSTriples);
301 biarch_libdirs.appendSliceAssumeCapacity(&MIPS64LibDirs);
302 biarch_triple_aliases.appendSliceAssumeCapacity(&MIPS64Triples);
303 biarch_libdirs.appendSliceAssumeCapacity(&MIPSN32LibDirs);
304 biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSN32Triples);
305 },
306 .mipsel => {
307 lib_dirs.appendSliceAssumeCapacity(&MIPSELLibDirs);
308 triple_aliases.appendSliceAssumeCapacity(&MIPSELTriples);
309 triple_aliases.appendSliceAssumeCapacity(&MIPSTriples);
310 biarch_libdirs.appendSliceAssumeCapacity(&MIPS64ELLibDirs);
311 biarch_triple_aliases.appendSliceAssumeCapacity(&MIPS64ELTriples);
312 biarch_libdirs.appendSliceAssumeCapacity(&MIPSN32ELLibDirs);
313 biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSN32ELTriples);
314 },
315 .mips64 => {
316 lib_dirs.appendSliceAssumeCapacity(&MIPS64LibDirs);
317 triple_aliases.appendSliceAssumeCapacity(&MIPS64Triples);
318 biarch_libdirs.appendSliceAssumeCapacity(&MIPSLibDirs);
319 biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSTriples);
320 biarch_libdirs.appendSliceAssumeCapacity(&MIPSN32LibDirs);
321 biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSN32Triples);
322 },
323 .mips64el => {
324 lib_dirs.appendSliceAssumeCapacity(&MIPS64ELLibDirs);
325 triple_aliases.appendSliceAssumeCapacity(&MIPS64ELTriples);
326 biarch_libdirs.appendSliceAssumeCapacity(&MIPSELLibDirs);
327 biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSELTriples);
328 biarch_libdirs.appendSliceAssumeCapacity(&MIPSN32ELLibDirs);
329 biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSN32ELTriples);
330 biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSTriples);
331 },
332 .msp430 => {
333 lib_dirs.appendSliceAssumeCapacity(&MSP430LibDirs);
334 triple_aliases.appendSliceAssumeCapacity(&MSP430Triples);
335 },
336 .powerpc => {
337 lib_dirs.appendSliceAssumeCapacity(&PPCLibDirs);
338 triple_aliases.appendSliceAssumeCapacity(&PPCTriples);
339 biarch_libdirs.appendSliceAssumeCapacity(&PPC64LibDirs);
340 biarch_triple_aliases.appendSliceAssumeCapacity(&PPC64Triples);
341 },
342 .powerpcle => {
343 lib_dirs.appendSliceAssumeCapacity(&PPCLELibDirs);
344 triple_aliases.appendSliceAssumeCapacity(&PPCLETriples);
345 biarch_libdirs.appendSliceAssumeCapacity(&PPC64LELibDirs);
346 biarch_triple_aliases.appendSliceAssumeCapacity(&PPC64LETriples);
347 },
348 .powerpc64 => {
349 lib_dirs.appendSliceAssumeCapacity(&PPC64LibDirs);
350 triple_aliases.appendSliceAssumeCapacity(&PPC64Triples);
351 biarch_libdirs.appendSliceAssumeCapacity(&PPCLibDirs);
352 biarch_triple_aliases.appendSliceAssumeCapacity(&PPCTriples);
353 },
354 .powerpc64le => {
355 lib_dirs.appendSliceAssumeCapacity(&PPC64LELibDirs);
356 triple_aliases.appendSliceAssumeCapacity(&PPC64LETriples);
357 biarch_libdirs.appendSliceAssumeCapacity(&PPCLELibDirs);
358 biarch_triple_aliases.appendSliceAssumeCapacity(&PPCLETriples);
359 },
360 .riscv32 => {
361 lib_dirs.appendSliceAssumeCapacity(&RISCV32LibDirs);
362 triple_aliases.appendSliceAssumeCapacity(&RISCV32Triples);
363 biarch_libdirs.appendSliceAssumeCapacity(&RISCV64LibDirs);
364 biarch_triple_aliases.appendSliceAssumeCapacity(&RISCV64Triples);
365 },
366 .riscv64 => {
367 lib_dirs.appendSliceAssumeCapacity(&RISCV64LibDirs);
368 triple_aliases.appendSliceAssumeCapacity(&RISCV64Triples);
369 biarch_libdirs.appendSliceAssumeCapacity(&RISCV32LibDirs);
370 biarch_triple_aliases.appendSliceAssumeCapacity(&RISCV32Triples);
371 },
372 .sparc => {
373 lib_dirs.appendSliceAssumeCapacity(&SPARCv8LibDirs);
374 triple_aliases.appendSliceAssumeCapacity(&SPARCv8Triples);
375 biarch_libdirs.appendSliceAssumeCapacity(&SPARCv9LibDirs);
376 biarch_triple_aliases.appendSliceAssumeCapacity(&SPARCv9Triples);
377 },
378 .sparc64 => {
379 lib_dirs.appendSliceAssumeCapacity(&SPARCv9LibDirs);
380 triple_aliases.appendSliceAssumeCapacity(&SPARCv9Triples);
381 biarch_libdirs.appendSliceAssumeCapacity(&SPARCv8LibDirs);
382 biarch_triple_aliases.appendSliceAssumeCapacity(&SPARCv8Triples);
383 },
384 .s390x => {
385 lib_dirs.appendSliceAssumeCapacity(&SystemZLibDirs);
386 triple_aliases.appendSliceAssumeCapacity(&SystemZTriples);
387 },
388 else => {},
389 }
390}
391
392pub fn discover(self: *GCCDetector, tc: *Toolchain) !void {
393 var path_buf: [std.fs.max_path_bytes]u8 = undefined;
394 var fib = std.heap.FixedBufferAllocator.init(&path_buf);
395
396 const target = tc.getTarget();
397 const biarch_variant_target = if (target.ptrBitWidth() == 32)
398 target.get64BitArchVariant()
399 else
400 target.get32BitArchVariant();
401
402 var candidate_lib_dirs_buffer: [16][]const u8 = undefined;
403 var candidate_lib_dirs = std.ArrayList([]const u8).initBuffer(&candidate_lib_dirs_buffer);
404
405 var candidate_triple_aliases_buffer: [16][]const u8 = undefined;
406 var candidate_triple_aliases = std.ArrayList([]const u8).initBuffer(&candidate_triple_aliases_buffer);
407
408 var candidate_biarch_lib_dirs_buffer: [16][]const u8 = undefined;
409 var candidate_biarch_lib_dirs = std.ArrayList([]const u8).initBuffer(&candidate_biarch_lib_dirs_buffer);
410
411 var candidate_biarch_triple_aliases_buffer: [20][]const u8 = undefined;
412 var candidate_biarch_triple_aliases = std.ArrayList([]const u8).initBuffer(&candidate_biarch_triple_aliases_buffer);
413
414 try collectLibDirsAndTriples(
415 tc,
416 &candidate_lib_dirs,
417 &candidate_triple_aliases,
418 &candidate_biarch_lib_dirs,
419 &candidate_biarch_triple_aliases,
420 );
421
422 var target_buf: [64]u8 = undefined;
423 const triple_str = target.toLLVMTriple(&target_buf);
424 candidate_triple_aliases.appendAssumeCapacity(triple_str);
425
426 // Also include the multiarch variant if it's different.
427 var biarch_buf: [64]u8 = undefined;
428 if (biarch_variant_target) |*biarch_target| {
429 const biarch_triple_str = biarch_target.toLLVMTriple(&biarch_buf);
430 if (!std.mem.eql(u8, biarch_triple_str, triple_str)) {
431 candidate_triple_aliases.appendAssumeCapacity(biarch_triple_str);
432 }
433 }
434
435 var prefixes_buf: [16][]const u8 = undefined;
436 var prefixes = std.ArrayList([]const u8).initBuffer(&prefixes_buf);
437 const gcc_toolchain_dir = gccToolchainDir(tc);
438 if (gcc_toolchain_dir.len != 0) {
439 const adjusted = if (gcc_toolchain_dir[gcc_toolchain_dir.len - 1] == '/')
440 gcc_toolchain_dir[0 .. gcc_toolchain_dir.len - 1]
441 else
442 gcc_toolchain_dir;
443 prefixes.appendAssumeCapacity(adjusted);
444 } else {
445 const sysroot = tc.getSysroot();
446 if (sysroot.len > 0) {
447 prefixes.appendAssumeCapacity(sysroot);
448 try addDefaultGCCPrefixes(&prefixes, tc);
449 }
450
451 if (sysroot.len == 0) {
452 try addDefaultGCCPrefixes(&prefixes, tc);
453 }
454 // TODO: Special-case handling for Gentoo
455 }
456
457 const v0 = GCCVersion.parse("0.0.0");
458 for (prefixes.items) |prefix| {
459 if (!tc.exists(prefix)) continue;
460
461 for (candidate_lib_dirs.items) |suffix| {
462 defer fib.reset();
463 const lib_dir = std.fs.path.join(fib.allocator(), &.{ prefix, suffix }) catch continue;
464 if (!tc.exists(lib_dir)) continue;
465
466 const gcc_dir_exists = tc.joinedExists(&.{ lib_dir, "/gcc" });
467 const gcc_cross_dir_exists = tc.joinedExists(&.{ lib_dir, "/gcc-cross" });
468
469 try self.scanLibDirForGCCTriple(tc, target, lib_dir, triple_str, false, gcc_dir_exists, gcc_cross_dir_exists);
470 for (candidate_triple_aliases.items) |candidate| {
471 try self.scanLibDirForGCCTriple(tc, target, lib_dir, candidate, false, gcc_dir_exists, gcc_cross_dir_exists);
472 }
473 }
474 for (candidate_biarch_lib_dirs.items) |suffix| {
475 const lib_dir = std.fs.path.join(fib.allocator(), &.{ prefix, suffix }) catch continue;
476 if (!tc.exists(lib_dir)) continue;
477
478 const gcc_dir_exists = tc.joinedExists(&.{ lib_dir, "/gcc" });
479 const gcc_cross_dir_exists = tc.joinedExists(&.{ lib_dir, "/gcc-cross" });
480 for (candidate_biarch_triple_aliases.items) |candidate| {
481 try self.scanLibDirForGCCTriple(tc, target, lib_dir, candidate, true, gcc_dir_exists, gcc_cross_dir_exists);
482 }
483 }
484 if (self.version.order(v0) == .gt) break;
485 }
486}
487
488fn findBiarchMultilibs(
489 tc: *const Toolchain,
490 result: *Multilib.Detected,
491 target: *const Target,
492 path: [2][]const u8,
493 needs_biarch_suffix: bool,
494) !bool {
495 const suff64 = if (target.os.tag == .illumos) switch (target.cpu.arch) {
496 .x86, .x86_64 => "/amd64",
497 .sparc => "/sparcv9",
498 else => "/64",
499 } else "/64";
500
501 const alt_64 = Multilib.init(suff64, suff64, &.{ "-m32", "+m64", "-mx32" });
502 const alt_32 = Multilib.init("/32", "/32", &.{ "+m32", "-m64", "-mx32" });
503 const alt_x32 = Multilib.init("/x32", "/x32", &.{ "-m32", "-m64", "+mx32" });
504
505 const multilib_filter = Multilib.Filter{
506 .base = path,
507 .file = "crtbegin.o",
508 };
509
510 const Want = enum {
511 want32,
512 want64,
513 wantx32,
514 };
515 const is_x32 = target.abi == .gnux32 or target.abi == .muslx32;
516 const target_ptr_width = target.ptrBitWidth();
517 const want: Want = if (target_ptr_width == 32 and multilib_filter.exists(alt_32, tc))
518 .want64
519 else if (target_ptr_width == 64 and is_x32 and multilib_filter.exists(alt_x32, tc))
520 .want64
521 else if (target_ptr_width == 64 and !is_x32 and multilib_filter.exists(alt_64, tc))
522 .want32
523 else if (target_ptr_width == 32)
524 if (needs_biarch_suffix) .want64 else .want32
525 else if (is_x32)
526 if (needs_biarch_suffix) .want64 else .wantx32
527 else if (needs_biarch_suffix) .want32 else .want64;
528
529 const default = switch (want) {
530 .want32 => Multilib.init("", "", &.{ "+m32", "-m64", "-mx32" }),
531 .want64 => Multilib.init("", "", &.{ "-m32", "+m64", "-mx32" }),
532 .wantx32 => Multilib.init("", "", &.{ "-m32", "-m64", "+mx32" }),
533 };
534 result.multilib_buf[result.multilib_count..][0..4].* = .{
535 default,
536 alt_64,
537 alt_32,
538 alt_x32,
539 };
540 result.multilib_count += 4;
541
542 result.filter(multilib_filter, tc);
543 return result.select(&.{
544 if (target_ptr_width == 64 and !is_x32) "+m64" else "-m64",
545 if (target_ptr_width == 32) "+m32" else "-m32",
546 if (target_ptr_width == 64 and is_x32) "+mx32" else "-mx32",
547 });
548}
549
550fn scanGCCForMultilibs(
551 self: *GCCDetector,
552 tc: *const Toolchain,
553 target: *const Target,
554 path: [2][]const u8,
555 needs_biarch_suffix: bool,
556) !bool {
557 var detected: Multilib.Detected = .{};
558 if (target.cpu.arch == .csky) {
559 // TODO
560 } else if (target.cpu.arch.isMIPS()) {
561 // TODO
562 } else if (target.cpu.arch.isRISCV()) {
563 // TODO
564 } else if (target.cpu.arch == .msp430) {
565 // TODO
566 } else if (target.cpu.arch == .avr) {
567 // No multilibs
568 } else if (!try findBiarchMultilibs(tc, &detected, target, path, needs_biarch_suffix)) {
569 return false;
570 }
571 self.selected = detected.selected;
572 self.biarch_sibling = detected.biarch_sibling;
573 return true;
574}
575
576fn scanLibDirForGCCTriple(
577 self: *GCCDetector,
578 tc: *const Toolchain,
579 target: *const Target,
580 lib_dir: []const u8,
581 candidate_triple: []const u8,
582 needs_biarch_suffix: bool,
583 gcc_dir_exists: bool,
584 gcc_cross_dir_exists: bool,
585) !void {
586 var path_buf: [std.fs.max_path_bytes]u8 = undefined;
587 var fib = std.heap.FixedBufferAllocator.init(&path_buf);
588 const comp = tc.driver.comp;
589 const arena = comp.arena;
590 const io = comp.io;
591 for (0..2) |i| {
592 if (i == 0 and !gcc_dir_exists) continue;
593 if (i == 1 and !gcc_cross_dir_exists) continue;
594 defer fib.reset();
595
596 const base: []const u8 = if (i == 0) "gcc" else "gcc-cross";
597 var lib_suffix_buf: [64]u8 = undefined;
598 var suffix_buf_fib = std.heap.FixedBufferAllocator.init(&lib_suffix_buf);
599 const lib_suffix = std.fs.path.join(suffix_buf_fib.allocator(), &.{ base, candidate_triple }) catch continue;
600
601 const dir_name = std.fs.path.join(fib.allocator(), &.{ lib_dir, lib_suffix }) catch continue;
602 var parent_dir = comp.cwd.openDir(io, dir_name, .{ .access_sub_paths = false, .iterate = true }) catch continue;
603 defer parent_dir.close(io);
604
605 var it = parent_dir.iterate();
606 while (it.next(io) catch continue) |entry| {
607 if (entry.kind != .directory) continue;
608
609 const version_text = entry.name;
610 const candidate_version = GCCVersion.parse(version_text);
611 if (candidate_version.major != -1) {
612 // TODO: cache path so we're not repeatedly scanning
613 }
614 if (candidate_version.isLessThan(4, 1, 1, "")) continue;
615 switch (candidate_version.order(self.version)) {
616 .lt, .eq => continue,
617 .gt => {},
618 }
619
620 if (!try self.scanGCCForMultilibs(tc, target, .{ dir_name, version_text }, needs_biarch_suffix)) continue;
621
622 self.version = candidate_version;
623 self.gcc_triple = try arena.dupe(u8, candidate_triple);
624 self.install_path = try std.fs.path.join(arena, &.{ lib_dir, lib_suffix, version_text });
625 self.parent_lib_path = try std.fs.path.join(arena, &.{ self.install_path, "..", "..", ".." });
626 self.is_valid = true;
627 }
628 }
629}
630
631fn gccToolchainDir(tc: *const Toolchain) []const u8 {
632 const sysroot = tc.getSysroot();
633 if (sysroot.len != 0) return "";
634 return system_defaults.gcc_install_prefix;
635}
lib/compiler/aro/aro/LangOpts.zig+12-2
...@@ -7,16 +7,22 @@ pub const Compiler = enum {...@@ -7,16 +7,22 @@ pub const Compiler = enum {
7 clang,7 clang,
8 gcc,8 gcc,
9 msvc,9 msvc,
10 no,
1011
11 pub fn defaultGccVersion(self: Compiler) u32 {12 pub fn defaultGccVersion(self: Compiler) u32 {
12 return switch (self) {13 return switch (self) {
13 .clang => 4 * 10_000 + 2 * 100 + 1,14 .clang => 4 * 10_000 + 2 * 100 + 1,
14 .gcc => 7 * 10_000 + 1 * 100 + 0,15 .no, .gcc => 7 * 10_000 + 1 * 100 + 0,
15 .msvc => 0,16 .msvc => 0,
16 };17 };
17 }18 }
18};19};
1920
21pub const BoundsSafety = enum {
22 none,
23 clang,
24};
25
20/// The floating-point evaluation method for intermediate results within a single expression26/// The floating-point evaluation method for intermediate results within a single expression
21pub const FPEvalMethod = enum(i8) {27pub const FPEvalMethod = enum(i8) {
22 /// The evaluation method cannot be determined or is inconsistent for this target.28 /// The evaluation method cannot be determined or is inconsistent for this target.
...@@ -116,7 +122,7 @@ pub const Standard = enum {...@@ -116,7 +122,7 @@ pub const Standard = enum {
116122
117const LangOpts = @This();123const LangOpts = @This();
118124
119emulate: Compiler = .clang,125emulate: Compiler = .no,
120standard: Standard = .default,126standard: Standard = .default,
121/// -fshort-enums option, makes enums only take up as much space as they need to hold all the values.127/// -fshort-enums option, makes enums only take up as much space as they need to hold all the values.
122short_enums: bool = false,128short_enums: bool = false,
...@@ -149,6 +155,10 @@ preserve_comments_in_macros: bool = false,...@@ -149,6 +155,10 @@ preserve_comments_in_macros: bool = false,
149/// e.g. 4.2.1 == 40201155/// e.g. 4.2.1 == 40201
150gnuc_version: ?u32 = null,156gnuc_version: ?u32 = null,
151157
158bounds_safety: BoundsSafety = .none,
159
160default_symbol_visibility: std.builtin.SymbolVisibility = .default,
161
152pub fn setStandard(self: *LangOpts, name: []const u8) error{InvalidStandard}!void {162pub fn setStandard(self: *LangOpts, name: []const u8) error{InvalidStandard}!void {
153 self.standard = Standard.NameMap.get(name) orelse return error.InvalidStandard;163 self.standard = Standard.NameMap.get(name) orelse return error.InvalidStandard;
154}164}
lib/compiler/aro/aro/Parser.zig+336-142
...@@ -1,5 +1,4 @@...@@ -1,5 +1,4 @@
1const std = @import("std");1const std = @import("std");
2const Io = std.Io;
3const mem = std.mem;2const mem = std.mem;
4const Allocator = mem.Allocator;3const Allocator = mem.Allocator;
5const assert = std.debug.assert;4const assert = std.debug.assert;
...@@ -204,6 +203,11 @@ string_ids: struct {...@@ -204,6 +203,11 @@ string_ids: struct {
204 sigjmp_buf: StringId,203 sigjmp_buf: StringId,
205 ucontext_t: StringId,204 ucontext_t: StringId,
206},205},
206va_arg_pack_ctx: packed struct {
207 valid: bool = false,
208 variadic: bool = false,
209 typed: bool = false,
210} = .{},
207211
208/// Checks codepoint for various pedantic warnings212/// Checks codepoint for various pedantic warnings
209/// Returns true if diagnostic issued213/// Returns true if diagnostic issued
...@@ -212,7 +216,7 @@ fn checkIdentifierCodepointWarnings(p: *Parser, codepoint: u21, loc: Source.Loca...@@ -212,7 +216,7 @@ fn checkIdentifierCodepointWarnings(p: *Parser, codepoint: u21, loc: Source.Loca
212216
213 const prev_total = p.diagnostics.total;217 const prev_total = p.diagnostics.total;
214 var sf = std.heap.stackFallback(1024, p.comp.gpa);218 var sf = std.heap.stackFallback(1024, p.comp.gpa);
215 var allocating: Io.Writer.Allocating = .init(sf.get());219 var allocating: std.Io.Writer.Allocating = .init(sf.get());
216 defer allocating.deinit();220 defer allocating.deinit();
217221
218 if (!char_info.isC99IdChar(codepoint)) {222 if (!char_info.isC99IdChar(codepoint)) {
...@@ -426,7 +430,7 @@ pub fn err(p: *Parser, tok_i: TokenIndex, diagnostic: Diagnostic, args: anytype)...@@ -426,7 +430,7 @@ pub fn err(p: *Parser, tok_i: TokenIndex, diagnostic: Diagnostic, args: anytype)
426 if (p.diagnostics.effectiveKind(diagnostic) == .off) return;430 if (p.diagnostics.effectiveKind(diagnostic) == .off) return;
427431
428 var sf = std.heap.stackFallback(1024, p.comp.gpa);432 var sf = std.heap.stackFallback(1024, p.comp.gpa);
429 var allocating: Io.Writer.Allocating = .init(sf.get());433 var allocating: std.Io.Writer.Allocating = .init(sf.get());
430 defer allocating.deinit();434 defer allocating.deinit();
431435
432 p.formatArgs(&allocating.writer, diagnostic.fmt, args) catch return error.OutOfMemory;436 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)...@@ -448,7 +452,7 @@ pub fn err(p: *Parser, tok_i: TokenIndex, diagnostic: Diagnostic, args: anytype)
448 }, p.pp.expansionSlice(tok_i), true);452 }, p.pp.expansionSlice(tok_i), true);
449}453}
450454
451fn formatArgs(p: *Parser, w: *Io.Writer, fmt: []const u8, args: anytype) !void {455fn formatArgs(p: *Parser, w: *std.Io.Writer, fmt: []const u8, args: anytype) !void {
452 var i: usize = 0;456 var i: usize = 0;
453 inline for (std.meta.fields(@TypeOf(args))) |arg_info| {457 inline for (std.meta.fields(@TypeOf(args))) |arg_info| {
454 const arg = @field(args, arg_info.name);458 const arg = @field(args, arg_info.name);
...@@ -477,13 +481,13 @@ fn formatArgs(p: *Parser, w: *Io.Writer, fmt: []const u8, args: anytype) !void {...@@ -477,13 +481,13 @@ fn formatArgs(p: *Parser, w: *Io.Writer, fmt: []const u8, args: anytype) !void {
477 try w.writeAll(fmt[i..]);481 try w.writeAll(fmt[i..]);
478}482}
479483
480fn formatTokenId(w: *Io.Writer, fmt: []const u8, tok_id: Tree.Token.Id) !usize {484fn formatTokenId(w: *std.Io.Writer, fmt: []const u8, tok_id: Tree.Token.Id) !usize {
481 const i = Diagnostics.templateIndex(w, fmt, "{tok_id}");485 const i = Diagnostics.templateIndex(w, fmt, "{tok_id}");
482 try w.writeAll(tok_id.symbol());486 try w.writeAll(tok_id.symbol());
483 return i;487 return i;
484}488}
485489
486fn formatQualType(p: *Parser, w: *Io.Writer, fmt: []const u8, qt: QualType) !usize {490fn formatQualType(p: *Parser, w: *std.Io.Writer, fmt: []const u8, qt: QualType) !usize {
487 const i = Diagnostics.templateIndex(w, fmt, "{qt}");491 const i = Diagnostics.templateIndex(w, fmt, "{qt}");
488 try w.writeByte('\'');492 try w.writeByte('\'');
489 try qt.print(p.comp, w);493 try qt.print(p.comp, w);
...@@ -502,7 +506,7 @@ fn formatQualType(p: *Parser, w: *Io.Writer, fmt: []const u8, qt: QualType) !usi...@@ -502,7 +506,7 @@ fn formatQualType(p: *Parser, w: *Io.Writer, fmt: []const u8, qt: QualType) !usi
502 return i;506 return i;
503}507}
504508
505fn formatResult(p: *Parser, w: *Io.Writer, fmt: []const u8, res: Result) !usize {509fn formatResult(p: *Parser, w: *std.Io.Writer, fmt: []const u8, res: Result) !usize {
506 const i = Diagnostics.templateIndex(w, fmt, "{value}");510 const i = Diagnostics.templateIndex(w, fmt, "{value}");
507 switch (res.val.opt_ref) {511 switch (res.val.opt_ref) {
508 .none => try w.writeAll("(none)"),512 .none => try w.writeAll("(none)"),
...@@ -525,7 +529,7 @@ const Normalized = struct {...@@ -525,7 +529,7 @@ const Normalized = struct {
525 return .{ .str = str };529 return .{ .str = str };
526 }530 }
527531
528 pub fn format(ctx: Normalized, w: *Io.Writer, fmt: []const u8) !usize {532 pub fn format(ctx: Normalized, w: *std.Io.Writer, fmt: []const u8) !usize {
529 const i = Diagnostics.templateIndex(w, fmt, "{normalized}");533 const i = Diagnostics.templateIndex(w, fmt, "{normalized}");
530 var it: std.unicode.Utf8Iterator = .{534 var it: std.unicode.Utf8Iterator = .{
531 .bytes = ctx.str,535 .bytes = ctx.str,
...@@ -559,7 +563,7 @@ const Codepoint = struct {...@@ -559,7 +563,7 @@ const Codepoint = struct {
559 return .{ .codepoint = codepoint };563 return .{ .codepoint = codepoint };
560 }564 }
561565
562 pub fn format(ctx: Codepoint, w: *Io.Writer, fmt: []const u8) !usize {566 pub fn format(ctx: Codepoint, w: *std.Io.Writer, fmt: []const u8) !usize {
563 const i = Diagnostics.templateIndex(w, fmt, "{codepoint}");567 const i = Diagnostics.templateIndex(w, fmt, "{codepoint}");
564 try w.print("{X:0>4}", .{ctx.codepoint});568 try w.print("{X:0>4}", .{ctx.codepoint});
565 return i;569 return i;
...@@ -573,7 +577,7 @@ const Escaped = struct {...@@ -573,7 +577,7 @@ const Escaped = struct {
573 return .{ .str = str };577 return .{ .str = str };
574 }578 }
575579
576 pub fn format(ctx: Escaped, w: *Io.Writer, fmt: []const u8) !usize {580 pub fn format(ctx: Escaped, w: *std.Io.Writer, fmt: []const u8) !usize {
577 const i = Diagnostics.templateIndex(w, fmt, "{s}");581 const i = Diagnostics.templateIndex(w, fmt, "{s}");
578 try std.zig.stringEscape(ctx.str, w);582 try std.zig.stringEscape(ctx.str, w);
579 return i;583 return i;
...@@ -740,6 +744,11 @@ fn getNode(p: *Parser, node: Node.Index, comptime tag: std.meta.Tag(Tree.Node))...@@ -740,6 +744,11 @@ fn getNode(p: *Parser, node: Node.Index, comptime tag: std.meta.Tag(Tree.Node))
740 }744 }
741}745}
742746
747pub fn isAddressOfStringLiteral(p: *Parser, node: Node.Index) bool {
748 const addr_of = p.getNode(node, .addr_of_expr) orelse return false;
749 return p.nodeIs(addr_of.operand, .string_literal_expr);
750}
751
743fn pragma(p: *Parser) Compilation.Error!bool {752fn pragma(p: *Parser) Compilation.Error!bool {
744 var found_pragma = false;753 var found_pragma = false;
745 while (p.eatToken(.keyword_pragma)) |_| {754 while (p.eatToken(.keyword_pragma)) |_| {
...@@ -1070,14 +1079,15 @@ fn decl(p: *Parser) Error!bool {...@@ -1070,14 +1079,15 @@ fn decl(p: *Parser) Error!bool {
10701079
1071 try p.attributeSpecifier();1080 try p.attributeSpecifier();
10721081
1082 const decl_spec_start = p.tok_i;
1073 var decl_spec = (try p.declSpec()) orelse blk: {1083 var decl_spec = (try p.declSpec()) orelse blk: {
1074 if (p.func.qt != null) {1084 if (p.func.qt != null) {
1075 p.tok_i = first_tok;1085 p.tok_i = first_tok;
1076 return false;1086 return false;
1077 }1087 }
1078 switch (p.tok_ids[first_tok]) {1088 switch (p.tok_ids[decl_spec_start]) {
1079 .asterisk, .l_paren => {},1089 .asterisk, .l_paren => {},
1080 .identifier, .extended_identifier => switch (p.tok_ids[first_tok + 1]) {1090 .identifier, .extended_identifier => switch (p.tok_ids[decl_spec_start + 1]) {
1081 .identifier, .extended_identifier => {1091 .identifier, .extended_identifier => {
1082 // The most likely reason for `identifier identifier` is1092 // The most likely reason for `identifier identifier` is
1083 // an unknown type name.1093 // an unknown type name.
...@@ -1087,7 +1097,7 @@ fn decl(p: *Parser) Error!bool {...@@ -1087,7 +1097,7 @@ fn decl(p: *Parser) Error!bool {
1087 },1097 },
1088 else => {},1098 else => {},
1089 },1099 },
1090 else => if (p.tok_i != first_tok) {1100 else => if (p.tok_i != decl_spec_start) {
1091 try p.err(p.tok_i, .expected_ident_or_l_paren, .{});1101 try p.err(p.tok_i, .expected_ident_or_l_paren, .{});
1092 return error.ParsingFailed;1102 return error.ParsingFailed;
1093 } else return false,1103 } else return false,
...@@ -1167,6 +1177,7 @@ fn decl(p: *Parser) Error!bool {...@@ -1167,6 +1177,7 @@ fn decl(p: *Parser) Error!bool {
11671177
1168 // Collect old style parameter declarations.1178 // Collect old style parameter declarations.
1169 if (init_d.d.old_style_func != null) {1179 if (init_d.d.old_style_func != null) {
1180 try p.err(init_d.d.name, .def_no_proto_deprecated, .{});
1170 const param_buf_top = p.param_buf.items.len;1181 const param_buf_top = p.param_buf.items.len;
1171 defer p.param_buf.items.len = param_buf_top;1182 defer p.param_buf.items.len = param_buf_top;
11721183
...@@ -1340,7 +1351,7 @@ fn decl(p: *Parser) Error!bool {...@@ -1340,7 +1351,7 @@ fn decl(p: *Parser) Error!bool {
1340 if (init_d.d.old_style_func) |tok_i| try p.err(tok_i, .invalid_old_style_params, .{});1351 if (init_d.d.old_style_func) |tok_i| try p.err(tok_i, .invalid_old_style_params, .{});
13411352
1342 if (decl_spec.storage_class == .typedef) {1353 if (decl_spec.storage_class == .typedef) {
1343 try decl_spec.validateDecl(p);1354 try decl_spec.validateDecl(p, init_d.asm_label);
1344 try p.tree.setNode(.{ .typedef = .{1355 try p.tree.setNode(.{ .typedef = .{
1345 .name_tok = init_d.d.name,1356 .name_tok = init_d.d.name,
1346 .qt = init_d.d.qt,1357 .qt = init_d.d.qt,
...@@ -1357,7 +1368,7 @@ fn decl(p: *Parser) Error!bool {...@@ -1357,7 +1368,7 @@ fn decl(p: *Parser) Error!bool {
1357 .definition = null,1368 .definition = null,
1358 } }, @intFromEnum(decl_node));1369 } }, @intFromEnum(decl_node));
1359 } else {1370 } else {
1360 try decl_spec.validateDecl(p);1371 try decl_spec.validateDecl(p, init_d.asm_label);
1361 var node_qt = init_d.d.qt;1372 var node_qt = init_d.d.qt;
1362 if (p.func.qt == null and decl_spec.storage_class != .@"extern") {1373 if (p.func.qt == null and decl_spec.storage_class != .@"extern") {
1363 if (node_qt.get(p.comp, .array)) |array_ty| {1374 if (node_qt.get(p.comp, .array)) |array_ty| {
...@@ -1454,7 +1465,7 @@ fn decl(p: *Parser) Error!bool {...@@ -1454,7 +1465,7 @@ fn decl(p: *Parser) Error!bool {
1454 return true;1465 return true;
1455}1466}
14561467
1457fn staticAssertMessage(p: *Parser, cond_node: Node.Index, maybe_message: ?Result, allocating: *Io.Writer.Allocating) !?[]const u8 {1468fn staticAssertMessage(p: *Parser, cond_node: Node.Index, maybe_message: ?Result, allocating: *std.Io.Writer.Allocating) !?[]const u8 {
1458 const w = &allocating.writer;1469 const w = &allocating.writer;
14591470
1460 const cond = cond_node.get(&p.tree);1471 const cond = cond_node.get(&p.tree);
...@@ -1527,7 +1538,7 @@ fn staticAssert(p: *Parser) Error!bool {...@@ -1527,7 +1538,7 @@ fn staticAssert(p: *Parser) Error!bool {
1527 } else {1538 } else {
1528 if (!res.val.toBool(p.comp)) {1539 if (!res.val.toBool(p.comp)) {
1529 var sf = std.heap.stackFallback(1024, gpa);1540 var sf = std.heap.stackFallback(1024, gpa);
1530 var allocating: Io.Writer.Allocating = .init(sf.get());1541 var allocating: std.Io.Writer.Allocating = .init(sf.get());
1531 defer allocating.deinit();1542 defer allocating.deinit();
15321543
1533 if (p.staticAssertMessage(res_node, str, &allocating) catch return error.OutOfMemory) |message| {1544 if (p.staticAssertMessage(res_node, str, &allocating) catch return error.OutOfMemory) |message| {
...@@ -1597,13 +1608,16 @@ pub const DeclSpec = struct {...@@ -1597,13 +1608,16 @@ pub const DeclSpec = struct {
1597 if (d.constexpr) |tok_i| try p.err(tok_i, .illegal_storage_on_func, .{});1608 if (d.constexpr) |tok_i| try p.err(tok_i, .illegal_storage_on_func, .{});
1598 }1609 }
15991610
1600 fn validateDecl(d: DeclSpec, p: *Parser) Error!void {1611 fn validateDecl(d: DeclSpec, p: *Parser, asm_label: ?Node.Index) Error!void {
1601 if (d.@"inline") |tok_i| try p.err(tok_i, .func_spec_non_func, .{"inline"});1612 if (d.@"inline") |tok_i| try p.err(tok_i, .func_spec_non_func, .{"inline"});
1602 // TODO move to attribute validation1613 // TODO move to attribute validation
1603 if (d.noreturn) |tok_i| try p.err(tok_i, .func_spec_non_func, .{"_Noreturn"});1614 if (d.noreturn) |tok_i| try p.err(tok_i, .func_spec_non_func, .{"_Noreturn"});
1604 switch (d.storage_class) {1615 switch (d.storage_class) {
1605 .auto => std.debug.assert(!p.comp.langopts.standard.atLeast(.c23)),1616 .auto => {
1606 .register => if (p.func.qt == null) try p.err(p.tok_i, .illegal_storage_on_global, .{}),1617 std.debug.assert(!p.comp.langopts.standard.atLeast(.c23));
1618 try p.err(p.tok_i, .auto_on_global, .{});
1619 },
1620 .register => if (p.func.qt == null and asm_label == null) try p.err(p.tok_i, .register_on_global, .{}),
1607 else => {},1621 else => {},
1608 }1622 }
1609 }1623 }
...@@ -1787,7 +1801,11 @@ fn storageClassSpec(p: *Parser, d: *DeclSpec) Error!bool {...@@ -1787,7 +1801,11 @@ fn storageClassSpec(p: *Parser, d: *DeclSpec) Error!bool {
1787 return p.tok_i != start;1801 return p.tok_i != start;
1788}1802}
17891803
1790const InitDeclarator = struct { d: Declarator, initializer: ?Result = null };1804const InitDeclarator = struct {
1805 d: Declarator,
1806 initializer: ?Result = null,
1807 asm_label: ?Node.Index = null,
1808};
17911809
1792/// attribute1810/// attribute
1793/// : attrIdentifier1811/// : attrIdentifier
...@@ -1829,18 +1847,18 @@ fn attribute(p: *Parser, kind: Attribute.Kind, namespace: ?[]const u8) Error!?Te...@@ -1829,18 +1847,18 @@ fn attribute(p: *Parser, kind: Attribute.Kind, namespace: ?[]const u8) Error!?Te
1829 if (try p.eatIdentifier()) |ident| {1847 if (try p.eatIdentifier()) |ident| {
1830 if (try Attribute.diagnoseIdent(attr, &arguments, ident, p)) {1848 if (try Attribute.diagnoseIdent(attr, &arguments, ident, p)) {
1831 p.skipTo(.r_paren);1849 p.skipTo(.r_paren);
1832 return error.ParsingFailed;1850 return null;
1833 }1851 }
1834 } else {1852 } else {
1835 try p.err(name_tok, .attribute_requires_identifier, .{name});1853 try p.err(name_tok, .attribute_requires_identifier, .{name});
1836 return error.ParsingFailed;1854 return null;
1837 }1855 }
1838 } else {1856 } else {
1839 const arg_start = p.tok_i;1857 const arg_start = p.tok_i;
1840 const first_expr = try p.expect(assignExpr);1858 const first_expr = try p.expect(assignExpr);
1841 if (try p.diagnose(attr, &arguments, arg_idx, first_expr, arg_start)) {1859 if (try p.diagnose(attr, &arguments, arg_idx, first_expr, arg_start)) {
1842 p.skipTo(.r_paren);1860 p.skipTo(.r_paren);
1843 return error.ParsingFailed;1861 return null;
1844 }1862 }
1845 }1863 }
1846 arg_idx += 1;1864 arg_idx += 1;
...@@ -1851,7 +1869,7 @@ fn attribute(p: *Parser, kind: Attribute.Kind, namespace: ?[]const u8) Error!?Te...@@ -1851,7 +1869,7 @@ fn attribute(p: *Parser, kind: Attribute.Kind, namespace: ?[]const u8) Error!?Te
1851 const arg_expr = try p.expect(assignExpr);1869 const arg_expr = try p.expect(assignExpr);
1852 if (try p.diagnose(attr, &arguments, arg_idx, arg_expr, arg_start)) {1870 if (try p.diagnose(attr, &arguments, arg_idx, arg_expr, arg_start)) {
1853 p.skipTo(.r_paren);1871 p.skipTo(.r_paren);
1854 return error.ParsingFailed;1872 return null;
1855 }1873 }
1856 }1874 }
1857 },1875 },
...@@ -1861,9 +1879,9 @@ fn attribute(p: *Parser, kind: Attribute.Kind, namespace: ?[]const u8) Error!?Te...@@ -1861,9 +1879,9 @@ fn attribute(p: *Parser, kind: Attribute.Kind, namespace: ?[]const u8) Error!?Te
1861 try p.err(name_tok, .attribute_not_enough_args, .{1879 try p.err(name_tok, .attribute_not_enough_args, .{
1862 @tagName(attr), required_count,1880 @tagName(attr), required_count,
1863 });1881 });
1864 return error.ParsingFailed;1882 return null;
1865 }1883 }
1866 return TentativeAttribute{ .attr = .{ .tag = attr, .args = arguments, .syntax = kind.toSyntax() }, .tok = name_tok };1884 return .{ .attr = .{ .tag = attr, .args = arguments, .syntax = kind.toSyntax() }, .tok = name_tok };
1867}1885}
18681886
1869fn diagnose(p: *Parser, attr: Attribute.Tag, arguments: *Attribute.Arguments, arg_idx: u32, res: Result, arg_start: TokenIndex) !bool {1887fn 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...@@ -1995,12 +2013,12 @@ fn initDeclarator(p: *Parser, decl_spec: *DeclSpec, attr_buf_top: usize, decl_no
1995 defer p.attr_buf.len = this_attr_buf_top;2013 defer p.attr_buf.len = this_attr_buf_top;
1996 const gpa = p.comp.gpa;2014 const gpa = p.comp.gpa;
19972015
1998 var init_d = InitDeclarator{2016 var init_d: InitDeclarator = .{
1999 .d = (try p.declarator(decl_spec.qt, .normal)) orelse return null,2017 .d = (try p.declarator(decl_spec.qt, .normal)) orelse return null,
2000 };2018 };
20012019
2002 try p.attributeSpecifierExtra(init_d.d.name);2020 try p.attributeSpecifierExtra(init_d.d.name);
2003 _ = try p.assembly(.decl_label);2021 init_d.asm_label = try p.assembly(.decl_label);
2004 try p.attributeSpecifierExtra(init_d.d.name);2022 try p.attributeSpecifierExtra(init_d.d.name);
20052023
2006 switch (init_d.d.declarator_type) {2024 switch (init_d.d.declarator_type) {
...@@ -2276,14 +2294,13 @@ fn typeSpec(p: *Parser, builder: *TypeStore.Builder) Error!bool {...@@ -2276,14 +2294,13 @@ fn typeSpec(p: *Parser, builder: *TypeStore.Builder) Error!bool {
2276 }, .syntax = .keyword },2294 }, .syntax = .keyword },
2277 .tok = align_tok,2295 .tok = align_tok,
2278 });2296 });
2279 } else {2297 } else check: {
2280 const arg_start = p.tok_i;2298 const arg_start = p.tok_i;
2281 const res = try p.integerConstExpr(.no_const_decl_folding);2299 const res = try p.integerConstExpr(.no_const_decl_folding);
2282 if (!res.val.isZero(p.comp)) {2300 if (!res.val.isZero(p.comp)) {
2283 var args = Attribute.initArguments(.aligned, align_tok);2301 var args = Attribute.initArguments(.aligned, align_tok);
2284 if (try p.diagnose(.aligned, &args, 0, res, arg_start)) {2302 if (try p.diagnose(.aligned, &args, 0, res, arg_start)) {
2285 p.skipTo(.r_paren);2303 break :check;
2286 return error.ParsingFailed;
2287 }2304 }
2288 args.aligned.alignment.?.node = .pack(res.node);2305 args.aligned.alignment.?.node = .pack(res.node);
2289 try p.attr_buf.append(gpa, .{2306 try p.attr_buf.append(gpa, .{
...@@ -2562,7 +2579,7 @@ fn recordSpec(p: *Parser) Error!QualType {...@@ -2562,7 +2579,7 @@ fn recordSpec(p: *Parser) Error!QualType {
25622579
2563 if (!any_incomplete) {2580 if (!any_incomplete) {
2564 const pragma_pack_value = switch (p.comp.langopts.emulate) {2581 const pragma_pack_value = switch (p.comp.langopts.emulate) {
2565 .clang => starting_pragma_pack,2582 .clang, .no => starting_pragma_pack,
2566 .gcc => p.pragma_pack,2583 .gcc => p.pragma_pack,
2567 // TODO: msvc considers `#pragma pack` on a per-field basis2584 // TODO: msvc considers `#pragma pack` on a per-field basis
2568 .msvc => p.pragma_pack,2585 .msvc => p.pragma_pack,
...@@ -3542,7 +3559,6 @@ fn declarator(...@@ -3542,7 +3559,6 @@ fn declarator(
35423559
3543 const pointer_qt = try p.comp.type_store.put(p.comp.gpa, .{ .pointer = .{3560 const pointer_qt = try p.comp.type_store.put(p.comp.gpa, .{ .pointer = .{
3544 .child = d.qt,3561 .child = d.qt,
3545 .decayed = null,
3546 } });3562 } });
3547 d.qt = try builder.finishQuals(pointer_qt);3563 d.qt = try builder.finishQuals(pointer_qt);
3548 }3564 }
...@@ -4141,7 +4157,10 @@ fn designation(p: *Parser, il: *InitList, init_qt: QualType, index_list: *IndexL...@@ -4141,7 +4157,10 @@ fn designation(p: *Parser, il: *InitList, init_qt: QualType, index_list: *IndexL
4141 const field = record_ty.fields[field_index];4157 const field = record_ty.fields[field_index];
4142 if (field.name_tok == 0) if (field.qt.getRecord(p.comp)) |field_record_ty| {4158 if (field.name_tok == 0) if (field.qt.getRecord(p.comp)) |field_record_ty| {
4143 // Recurse into anonymous field if it has a field by the name.4159 // Recurse into anonymous field if it has a field by the name.
4144 if (!field_record_ty.hasField(p.comp, target_name)) continue;4160 if (!field_record_ty.hasField(p.comp, target_name)) {
4161 field_index += 1;
4162 continue;
4163 }
4145 try index_list.append(gpa, field_index);4164 try index_list.append(gpa, field_index);
4146 cur_il = try il.find(gpa, field_index);4165 cur_il = try il.find(gpa, field_index);
4147 record_ty = field_record_ty;4166 record_ty = field_record_ty;
...@@ -4983,31 +5002,31 @@ fn assembly(p: *Parser, kind: enum { global, decl_label, stmt }) Error!?Node.Ind...@@ -4983,31 +5002,31 @@ fn assembly(p: *Parser, kind: enum { global, decl_label, stmt }) Error!?Node.Ind
4983 };5002 };
49845003
4985 const l_paren = try p.expectToken(.l_paren);5004 const l_paren = try p.expectToken(.l_paren);
4986 var result_node: ?Node.Index = null;5005 const res = switch (kind) {
4987 switch (kind) {5006 .decl_label => blk: {
4988 .decl_label => {
4989 const asm_str = try p.asmStr();5007 const asm_str = try p.asmStr();
4990 const str = try p.removeNull(asm_str.val);5008 const str = try p.removeNull(asm_str.val);
49915009
4992 const attr = Attribute{ .tag = .asm_label, .args = .{ .asm_label = .{ .name = str } }, .syntax = .keyword };5010 const attr = Attribute{ .tag = .asm_label, .args = .{ .asm_label = .{ .name = str } }, .syntax = .keyword };
4993 try p.attr_buf.append(p.comp.gpa, .{ .attr = attr, .tok = asm_tok });5011 try p.attr_buf.append(p.comp.gpa, .{ .attr = attr, .tok = asm_tok });
5012 break :blk asm_str.node;
4994 },5013 },
4995 .global => {5014 .global => blk: {
4996 const asm_str = try p.asmStr();5015 const asm_str = try p.asmStr();
4997 try p.checkAsmStr(asm_str.val, l_paren);5016 try p.checkAsmStr(asm_str.val, l_paren);
4998 result_node = try p.addNode(.{5017 break :blk try p.addNode(.{
4999 .global_asm = .{5018 .global_asm = .{
5000 .asm_tok = asm_tok,5019 .asm_tok = asm_tok,
5001 .asm_str = asm_str.node,5020 .asm_str = asm_str.node,
5002 },5021 },
5003 });5022 });
5004 },5023 },
5005 .stmt => result_node = try p.gnuAsmStmt(quals, asm_tok, l_paren),5024 .stmt => try p.gnuAsmStmt(quals, asm_tok, l_paren),
5006 }5025 };
5007 try p.expectClosing(l_paren, .r_paren);5026 try p.expectClosing(l_paren, .r_paren);
50085027
5009 if (kind != .decl_label) _ = try p.expectToken(.semicolon);5028 if (kind != .decl_label) _ = try p.expectToken(.semicolon);
5010 return result_node;5029 return res;
5011}5030}
50125031
5013/// Same as stringLiteral but errors on unicode and wide string literals5032/// Same as stringLiteral but errors on unicode and wide string literals
...@@ -5253,7 +5272,6 @@ fn stmt(p: *Parser) Error!Node.Index {...@@ -5253,7 +5272,6 @@ fn stmt(p: *Parser) Error!Node.Index {
5253 if (!goto_expr.qt.isInvalid() and !goto_expr.qt.isPointer(p.comp)) {5272 if (!goto_expr.qt.isInvalid() and !goto_expr.qt.isPointer(p.comp)) {
5254 const result_qt = try p.comp.type_store.put(gpa, .{ .pointer = .{5273 const result_qt = try p.comp.type_store.put(gpa, .{ .pointer = .{
5255 .child = .{ .@"const" = true, ._index = .void },5274 .child = .{ .@"const" = true, ._index = .void },
5256 .decayed = null,
5257 } });5275 } });
5258 if (!goto_expr.qt.isRealInt(p.comp)) {5276 if (!goto_expr.qt.isRealInt(p.comp)) {
5259 try p.err(expr_tok, .incompatible_arg, .{ goto_expr.qt, result_qt });5277 try p.err(expr_tok, .incompatible_arg, .{ goto_expr.qt, result_qt });
...@@ -5905,6 +5923,7 @@ const CallExpr = union(enum) {...@@ -5905,6 +5923,7 @@ const CallExpr = union(enum) {
5905 .__builtin_reduce_xor,5923 .__builtin_reduce_xor,
5906 .__builtin_reduce_max,5924 .__builtin_reduce_max,
5907 .__builtin_reduce_min,5925 .__builtin_reduce_min,
5926 .__builtin_constant_p,
5908 => 1,5927 => 1,
59095928
5910 .__builtin_complex,5929 .__builtin_complex,
...@@ -5922,13 +5941,15 @@ const CallExpr = union(enum) {...@@ -5922,13 +5941,15 @@ const CallExpr = union(enum) {
59225941
5923 .__c11_atomic_store,5942 .__c11_atomic_store,
5924 .__atomic_store,5943 .__atomic_store,
5944 .__atomic_store_n,
5945 .__atomic_load,
5925 .__c11_atomic_exchange,5946 .__c11_atomic_exchange,
5926 .__atomic_exchange,
5927 .__c11_atomic_fetch_add,5947 .__c11_atomic_fetch_add,
5928 .__c11_atomic_fetch_sub,5948 .__c11_atomic_fetch_sub,
5929 .__c11_atomic_fetch_or,5949 .__c11_atomic_fetch_or,
5930 .__c11_atomic_fetch_xor,5950 .__c11_atomic_fetch_xor,
5931 .__c11_atomic_fetch_and,5951 .__c11_atomic_fetch_and,
5952 .__c11_atomic_fetch_nand,
5932 .__atomic_fetch_add,5953 .__atomic_fetch_add,
5933 .__atomic_fetch_sub,5954 .__atomic_fetch_sub,
5934 .__atomic_fetch_and,5955 .__atomic_fetch_and,
...@@ -5948,6 +5969,9 @@ const CallExpr = union(enum) {...@@ -5948,6 +5969,9 @@ const CallExpr = union(enum) {
5948 .__atomic_exchange_n,5969 .__atomic_exchange_n,
5949 => 3,5970 => 3,
59505971
5972 .__atomic_exchange,
5973 => 4,
5974
5951 .__c11_atomic_compare_exchange_strong,5975 .__c11_atomic_compare_exchange_strong,
5952 .__c11_atomic_compare_exchange_weak,5976 .__c11_atomic_compare_exchange_weak,
5953 => 5,5977 => 5,
...@@ -5964,25 +5988,13 @@ const CallExpr = union(enum) {...@@ -5964,25 +5988,13 @@ const CallExpr = union(enum) {
59645988
5965 fn returnType(self: CallExpr, p: *Parser, args: []const Node.Index, func_qt: QualType) !QualType {5989 fn returnType(self: CallExpr, p: *Parser, args: []const Node.Index, func_qt: QualType) !QualType {
5966 if (self == .standard) {5990 if (self == .standard) {
5991 if (func_qt.isInvalid()) return .invalid;
5967 return if (func_qt.get(p.comp, .func)) |func_ty| func_ty.return_type else .invalid;5992 return if (func_qt.get(p.comp, .func)) |func_ty| func_ty.return_type else .invalid;
5968 }5993 }
5969 const builtin = self.builtin;5994 const builtin = self.builtin;
5970 const func_ty = func_qt.get(p.comp, .func).?;5995 const func_ty = func_qt.get(p.comp, .func).?;
5971 return switch (builtin.expanded.tag) {5996 return switch (builtin.expanded.tag) {
5972 .common => |tag| switch (tag) {5997 .common => |tag| switch (tag) {
5973 .__c11_atomic_exchange => {
5974 if (args.len != 4) return .invalid; // wrong number of arguments; already an error
5975 const second_param = args[2];
5976 return second_param.qt(&p.tree);
5977 },
5978 .__c11_atomic_load => {
5979 if (args.len != 3) return .invalid; // wrong number of arguments; already an error
5980 const first_param = args[1];
5981 const qt = first_param.qt(&p.tree);
5982 if (!qt.isPointer(p.comp)) return .invalid;
5983 return qt.childType(p.comp);
5984 },
5985
5986 .__atomic_fetch_add,5998 .__atomic_fetch_add,
5987 .__atomic_add_fetch,5999 .__atomic_add_fetch,
5988 .__c11_atomic_fetch_add,6000 .__c11_atomic_fetch_add,
...@@ -6008,15 +6020,38 @@ const CallExpr = union(enum) {...@@ -6008,15 +6020,38 @@ const CallExpr = union(enum) {
6008 .__c11_atomic_fetch_nand,6020 .__c11_atomic_fetch_nand,
60096021
6010 .__atomic_exchange_n,6022 .__atomic_exchange_n,
6023 .__c11_atomic_exchange,
6024 => {
6025 const second_param = args[1].qt(&p.tree);
6026 return second_param;
6027 },
6028
6029 .__sync_fetch_and_add,
6030 .__sync_fetch_and_and,
6031 .__sync_fetch_and_nand,
6032 .__sync_fetch_and_or,
6033 .__sync_fetch_and_sub,
6034 .__sync_fetch_and_xor,
6035
6036 .__sync_add_and_fetch,
6037 .__sync_and_and_fetch,
6038 .__sync_nand_and_fetch,
6039 .__sync_or_and_fetch,
6040 .__sync_sub_and_fetch,
6041 .__sync_xor_and_fetch,
6042
6043 .__sync_swap,
6044 .__sync_lock_test_and_set,
6045 .__sync_val_compare_and_swap,
6011 => {6046 => {
6012 if (args.len != 3) return .invalid; // wrong number of arguments; already an error6047 if (args.len < 2) return .invalid;
6013 const second_param = args[2];6048 const second_param = args[1].qt(&p.tree);
6014 return second_param.qt(&p.tree);6049 return second_param;
6015 },6050 },
6016 .__builtin_complex => {6051 .__builtin_complex => {
6017 if (args.len < 1) return .invalid; // not enough arguments; already an error6052 const last_param = args[args.len - 1].qt(&p.tree);
6018 const last_param = args[args.len - 1];6053 if (last_param.isInvalid()) return .invalid;
6019 return try last_param.qt(&p.tree).toComplex(p.comp);6054 return try last_param.toComplex(p.comp);
6020 },6055 },
6021 .__atomic_compare_exchange,6056 .__atomic_compare_exchange,
6022 .__atomic_compare_exchange_n,6057 .__atomic_compare_exchange_n,
...@@ -6027,9 +6062,8 @@ const CallExpr = union(enum) {...@@ -6027,9 +6062,8 @@ const CallExpr = union(enum) {
6027 .__c11_atomic_compare_exchange_strong,6062 .__c11_atomic_compare_exchange_strong,
6028 .__c11_atomic_compare_exchange_weak,6063 .__c11_atomic_compare_exchange_weak,
6029 => {6064 => {
6030 if (args.len != 6) return .invalid; // wrong number of arguments6065 const third_param = args[2].qt(&p.tree);
6031 const third_param = args[3];6066 return third_param;
6032 return third_param.qt(&p.tree);
6033 },6067 },
60346068
6035 .__builtin_elementwise_abs,6069 .__builtin_elementwise_abs,
...@@ -6058,13 +6092,12 @@ const CallExpr = union(enum) {...@@ -6058,13 +6092,12 @@ const CallExpr = union(enum) {
6058 .__builtin_elementwise_sub_sat,6092 .__builtin_elementwise_sub_sat,
6059 .__builtin_elementwise_fma,6093 .__builtin_elementwise_fma,
6060 .__builtin_elementwise_popcount,6094 .__builtin_elementwise_popcount,
6095
6061 .__builtin_nondeterministic_value,6096 .__builtin_nondeterministic_value,
6062 => {6097 => {
6063 if (args.len < 1) return .invalid; // not enough arguments; already an error6098 const first_param = args[0].qt(&p.tree);
6064 const last_param = args[args.len - 1];6099 return first_param;
6065 return last_param.qt(&p.tree);
6066 },6100 },
6067 .__builtin_nontemporal_load,
6068 .__builtin_reduce_add,6101 .__builtin_reduce_add,
6069 .__builtin_reduce_mul,6102 .__builtin_reduce_mul,
6070 .__builtin_reduce_and,6103 .__builtin_reduce_and,
...@@ -6073,30 +6106,19 @@ const CallExpr = union(enum) {...@@ -6073,30 +6106,19 @@ const CallExpr = union(enum) {
6073 .__builtin_reduce_max,6106 .__builtin_reduce_max,
6074 .__builtin_reduce_min,6107 .__builtin_reduce_min,
6075 => {6108 => {
6076 if (args.len < 1) return .invalid; // not enough arguments; already an error6109 const first_param = args[0].qt(&p.tree);
6077 const last_param = args[args.len - 1];6110 if (first_param.isInvalid()) return .invalid;
6078 return last_param.qt(&p.tree).childType(p.comp);6111 const vector_ty = first_param.get(p.comp, .vector) orelse return .invalid;
6112 return vector_ty.elem;
6079 },6113 },
6080 .__sync_add_and_fetch,
6081 .__sync_and_and_fetch,
6082 .__sync_fetch_and_add,
6083 .__sync_fetch_and_and,
6084 .__sync_fetch_and_nand,
6085 .__sync_fetch_and_or,
6086 .__sync_fetch_and_sub,
6087 .__sync_fetch_and_xor,
6088 .__sync_lock_test_and_set,
6089 .__sync_nand_and_fetch,
6090 .__sync_or_and_fetch,
6091 .__sync_sub_and_fetch,
6092 .__sync_swap,
6093 .__sync_xor_and_fetch,
6094 .__sync_val_compare_and_swap,
6095 .__atomic_load_n,6114 .__atomic_load_n,
6115 .__c11_atomic_load,
6116 .__builtin_nontemporal_load,
6096 => {6117 => {
6097 if (args.len < 1) return .invalid; // not enough arguments; already an error6118 const first_param = args[0].qt(&p.tree);
6098 const first_param = args[0];6119 if (first_param.isInvalid()) return .invalid;
6099 return first_param.qt(&p.tree).childType(p.comp);6120 if (!first_param.isPointer(p.comp)) return .invalid;
6121 return first_param.childType(p.comp);
6100 },6122 },
6101 else => func_ty.return_type,6123 else => func_ty.return_type,
6102 },6124 },
...@@ -6104,9 +6126,16 @@ const CallExpr = union(enum) {...@@ -6104,9 +6126,16 @@ const CallExpr = union(enum) {
6104 };6126 };
6105 }6127 }
61066128
6107 fn finish(self: CallExpr, p: *Parser, func_qt: QualType, list_buf_top: usize, l_paren: TokenIndex) Error!Result {6129 fn finish(
6130 self: CallExpr,
6131 p: *Parser,
6132 func_qt: QualType,
6133 list_buf_top: usize,
6134 l_paren: TokenIndex,
6135 args_ok: bool,
6136 ) Error!Result {
6108 const args = p.list_buf.items[list_buf_top..];6137 const args = p.list_buf.items[list_buf_top..];
6109 const return_qt = try self.returnType(p, args, func_qt);6138 const return_qt: QualType = if (args_ok) try self.returnType(p, args, func_qt) else .invalid;
6110 switch (self) {6139 switch (self) {
6111 .standard => |func_node| return .{6140 .standard => |func_node| return .{
6112 .qt = return_qt,6141 .qt = return_qt,
...@@ -6118,7 +6147,7 @@ const CallExpr = union(enum) {...@@ -6118,7 +6147,7 @@ const CallExpr = union(enum) {
6118 } }),6147 } }),
6119 },6148 },
6120 .builtin => |builtin| return .{6149 .builtin => |builtin| return .{
6121 .val = try evalBuiltin(builtin.expanded, p, args),6150 .val = if (args_ok) try evalBuiltin(builtin.expanded, p, args) else .{},
6122 .qt = return_qt,6151 .qt = return_qt,
6123 .node = try p.addNode(.{ .builtin_call_expr = .{6152 .node = try p.addNode(.{ .builtin_call_expr = .{
6124 .builtin_tok = builtin.builtin_tok,6153 .builtin_tok = builtin.builtin_tok,
...@@ -6283,14 +6312,12 @@ pub const Result = struct {...@@ -6283,14 +6312,12 @@ pub const Result = struct {
6283 if (!adjusted_elem_qt.eqlQualified(a_elem, p.comp)) {6312 if (!adjusted_elem_qt.eqlQualified(a_elem, p.comp)) {
6284 a.qt = try p.comp.type_store.put(gpa, .{ .pointer = .{6313 a.qt = try p.comp.type_store.put(gpa, .{ .pointer = .{
6285 .child = adjusted_elem_qt,6314 .child = adjusted_elem_qt,
6286 .decayed = null,
6287 } });6315 } });
6288 try a.implicitCast(p, .bitcast, tok);6316 try a.implicitCast(p, .bitcast, tok);
6289 }6317 }
6290 if (!adjusted_elem_qt.eqlQualified(b_elem, p.comp)) {6318 if (!adjusted_elem_qt.eqlQualified(b_elem, p.comp)) {
6291 b.qt = try p.comp.type_store.put(gpa, .{ .pointer = .{6319 b.qt = try p.comp.type_store.put(gpa, .{ .pointer = .{
6292 .child = adjusted_elem_qt,6320 .child = adjusted_elem_qt,
6293 .decayed = null,
6294 } });6321 } });
6295 try b.implicitCast(p, .bitcast, tok);6322 try b.implicitCast(p, .bitcast, tok);
6296 }6323 }
...@@ -6478,6 +6505,7 @@ pub const Result = struct {...@@ -6478,6 +6505,7 @@ pub const Result = struct {
6478 .add => {6505 .add => {
6479 // if both aren't arithmetic one should be pointer and the other an integer6506 // if both aren't arithmetic one should be pointer and the other an integer
6480 if (a_sk.isPointer() == b_sk.isPointer() or a_sk.isInt() == b_sk.isInt()) return a.invalidBinTy(tok, b, p);6507 if (a_sk.isPointer() == b_sk.isPointer() or a_sk.isInt() == b_sk.isInt()) return a.invalidBinTy(tok, b, p);
6508 try p.boundsSafetyCheckPointerArithmetic(a.qt, b.qt, tok, a.node);
64816509
6482 if (a_sk == .void_pointer or b_sk == .void_pointer)6510 if (a_sk == .void_pointer or b_sk == .void_pointer)
6483 try p.err(tok, .gnu_pointer_arith, .{});6511 try p.err(tok, .gnu_pointer_arith, .{});
...@@ -6496,6 +6524,7 @@ pub const Result = struct {...@@ -6496,6 +6524,7 @@ pub const Result = struct {
6496 .sub => {6524 .sub => {
6497 // if both aren't arithmetic then either both should be pointers or just the left one.6525 // if both aren't arithmetic then either both should be pointers or just the left one.
6498 if (!a_sk.isPointer() or !(b_sk.isPointer() or b_sk.isInt())) return a.invalidBinTy(tok, b, p);6526 if (!a_sk.isPointer() or !(b_sk.isPointer() or b_sk.isInt())) return a.invalidBinTy(tok, b, p);
6527 try p.boundsSafetyCheckPointerArithmetic(a.qt, b.qt, tok, a.node);
64996528
6500 if (a_sk == .void_pointer)6529 if (a_sk == .void_pointer)
6501 try p.err(tok, .gnu_pointer_arith, .{});6530 try p.err(tok, .gnu_pointer_arith, .{});
...@@ -7087,14 +7116,14 @@ pub const Result = struct {...@@ -7087,14 +7116,14 @@ pub const Result = struct {
7087 } else if (dest_sk.isPointer()) {7116 } else if (dest_sk.isPointer()) {
7088 if (src_sk.isPointer()) {7117 if (src_sk.isPointer()) {
7089 cast_kind = .bitcast;7118 cast_kind = .bitcast;
7119 } else if (src_sk == .bool) {
7120 cast_kind = .bool_to_pointer;
7090 } else if (src_sk.isInt()) {7121 } else if (src_sk.isInt()) {
7091 if (!src_sk.isReal()) {7122 if (!src_sk.isReal()) {
7092 res.qt = res.qt.toReal(p.comp);7123 res.qt = res.qt.toReal(p.comp);
7093 try res.implicitCast(p, .complex_int_to_real, l_paren);7124 try res.implicitCast(p, .complex_int_to_real, l_paren);
7094 }7125 }
7095 cast_kind = .int_to_pointer;7126 cast_kind = .int_to_pointer;
7096 } else if (src_sk == .bool) {
7097 cast_kind = .bool_to_pointer;
7098 } else if (res.qt.is(p.comp, .array)) {7127 } else if (res.qt.is(p.comp, .array)) {
7099 cast_kind = .array_to_pointer;7128 cast_kind = .array_to_pointer;
7100 } else if (res.qt.is(p.comp, .func)) {7129 } else if (res.qt.is(p.comp, .func)) {
...@@ -7497,7 +7526,16 @@ fn issueDeclaredConstHereNote(p: *Parser, decl_ref: Tree.Node.DeclRef, var_name:...@@ -7497,7 +7526,16 @@ fn issueDeclaredConstHereNote(p: *Parser, decl_ref: Tree.Node.DeclRef, var_name:
7497 try p.err(location, .declared_const_here, .{var_name});7526 try p.err(location, .declared_const_here, .{var_name});
7498}7527}
74997528
7500fn issueConstAssignmetDiagnostics(p: *Parser, node_idx: Node.Index, tok: TokenIndex) Compilation.Error!void {7529fn issueBoundsDeclaredHereNote(p: *Parser, decl_ref: Tree.Node.DeclRef, var_name: []const u8, bounds: Type.Pointer.Bounds) Compilation.Error!void {
7530 const location = switch (decl_ref.decl.get(&p.tree)) {
7531 .variable => |variable| variable.name_tok,
7532 .param => |param| param.name_tok,
7533 else => return,
7534 };
7535 try p.err(location, .pointer_bounds_declared_here, .{ var_name, @tagName(bounds) });
7536}
7537
7538fn issueConstAssignmentDiagnostics(p: *Parser, node_idx: Node.Index, tok: TokenIndex) Compilation.Error!void {
7501 if (p.unwrapNestedOperation(node_idx)) |unwrapped| {7539 if (p.unwrapNestedOperation(node_idx)) |unwrapped| {
7502 const name = p.tokSlice(unwrapped.name_tok);7540 const name = p.tokSlice(unwrapped.name_tok);
7503 try p.err(tok, .const_var_assignment, .{ name, unwrapped.qt });7541 try p.err(tok, .const_var_assignment, .{ name, unwrapped.qt });
...@@ -7530,7 +7568,7 @@ fn assignExpr(p: *Parser) Error!?Result {...@@ -7530,7 +7568,7 @@ fn assignExpr(p: *Parser) Error!?Result {
75307568
7531 var is_const: bool = undefined;7569 var is_const: bool = undefined;
7532 if (!p.tree.isLvalExtra(lhs.node, &is_const) or is_const) {7570 if (!p.tree.isLvalExtra(lhs.node, &is_const) or is_const) {
7533 try p.issueConstAssignmetDiagnostics(lhs.node, tok);7571 try p.issueConstAssignmentDiagnostics(lhs.node, tok);
7534 lhs.qt = .invalid;7572 lhs.qt = .invalid;
7535 }7573 }
75367574
...@@ -8226,7 +8264,7 @@ fn builtinChooseExpr(p: *Parser) Error!Result {...@@ -8226,7 +8264,7 @@ fn builtinChooseExpr(p: *Parser) Error!Result {
8226 return cond;8264 return cond;
8227}8265}
82288266
8229/// vaStart : __builtin_va_arg '(' assignExpr ',' typeName ')'8267/// vaArg : __builtin_va_arg '(' assignExpr ',' typeName ')'
8230fn builtinVaArg(p: *Parser, builtin_tok: TokenIndex) Error!Result {8268fn builtinVaArg(p: *Parser, builtin_tok: TokenIndex) Error!Result {
8231 const l_paren = try p.expectToken(.l_paren);8269 const l_paren = try p.expectToken(.l_paren);
8232 const va_list_tok = p.tok_i;8270 const va_list_tok = p.tok_i;
...@@ -8258,6 +8296,62 @@ fn builtinVaArg(p: *Parser, builtin_tok: TokenIndex) Error!Result {...@@ -8258,6 +8296,62 @@ fn builtinVaArg(p: *Parser, builtin_tok: TokenIndex) Error!Result {
8258 };8296 };
8259}8297}
82608298
8299/// vaArgPack : __builtin_va_arg_pack '(' ')'
8300fn builtinVaArgPack(p: *Parser, builtin_tok: TokenIndex) Error!Result {
8301 const l_paren = try p.expectToken(.l_paren);
8302 try p.expectClosing(l_paren, .r_paren);
8303
8304 var res_qt: QualType = .invalid;
8305 if (!try p.checkVaPackFunc(builtin_tok, "__builtin_va_arg_pack")) {
8306 // Only add one error.
8307 } else if (!p.va_arg_pack_ctx.valid) {
8308 try p.err(builtin_tok, .va_pack_non_call, .{});
8309 } else if (!p.va_arg_pack_ctx.variadic) {
8310 try p.err(builtin_tok, .va_pack_non_variadic_call, .{});
8311 } else if (p.va_arg_pack_ctx.typed) {
8312 try p.err(builtin_tok, .va_pack_non_variadic_arg, .{});
8313 } else {
8314 res_qt = .void;
8315 }
8316 return .{
8317 .qt = res_qt,
8318 .node = try p.addNode(.{
8319 .builtin_va_arg_pack = .{ .builtin_tok = builtin_tok },
8320 }),
8321 };
8322}
8323
8324/// vaArgPackLen : __builtin_va_arg_pack_len '(' ')'
8325fn builtinVaArgPackLen(p: *Parser, builtin_tok: TokenIndex) Error!Result {
8326 const l_paren = try p.expectToken(.l_paren);
8327 try p.expectClosing(l_paren, .r_paren);
8328
8329 _ = try p.checkVaPackFunc(builtin_tok, "__builtin_va_arg_pack_len");
8330
8331 return .{
8332 .qt = .int,
8333 .node = try p.addNode(.{
8334 .builtin_va_arg_pack_len = .{
8335 .builtin_tok = builtin_tok,
8336 },
8337 }),
8338 };
8339}
8340
8341fn checkVaPackFunc(p: *Parser, builtin_tok: TokenIndex, va_func_name: []const u8) !bool {
8342 const func_qt, _ = (try p.checkVaFunc(builtin_tok, va_func_name)) orelse return false;
8343
8344 var it = Attribute.Iterator.initType(func_qt, p.comp);
8345 while (it.next()) |item| switch (item[0].tag) {
8346 .always_inline, .gnu_inline => break,
8347 else => {},
8348 } else {
8349 try p.err(builtin_tok, .va_func_not_always_inline, .{va_func_name});
8350 return false;
8351 }
8352 return true;
8353}
8354
8261const OffsetKind = enum { bits, bytes };8355const OffsetKind = enum { bits, bytes };
82628356
8263/// offsetof8357/// offsetof
...@@ -8504,7 +8598,6 @@ fn unExpr(p: *Parser) Error!?Result {...@@ -8504,7 +8598,6 @@ fn unExpr(p: *Parser) Error!?Result {
85048598
8505 operand.qt = try p.comp.type_store.put(gpa, .{ .pointer = .{8599 operand.qt = try p.comp.type_store.put(gpa, .{ .pointer = .{
8506 .child = operand.qt,8600 .child = operand.qt,
8507 .decayed = null,
8508 } });8601 } });
8509 }8602 }
8510 if (p.getNode(operand.node, .decl_ref_expr)) |decl_ref| {8603 if (p.getNode(operand.node, .decl_ref_expr)) |decl_ref| {
...@@ -8596,6 +8689,9 @@ fn unExpr(p: *Parser) Error!?Result {...@@ -8596,6 +8689,9 @@ fn unExpr(p: *Parser) Error!?Result {
8596 try p.err(tok, .not_assignable, .{});8689 try p.err(tok, .not_assignable, .{});
8597 return error.ParsingFailed;8690 return error.ParsingFailed;
8598 }8691 }
8692 if (operand.qt.get(p.comp, .pointer)) |pointer| {
8693 try p.checkPtrArithmeticAllowed(pointer, p.tok_i, operand.node);
8694 }
8599 try operand.usualUnaryConversion(p, tok);8695 try operand.usualUnaryConversion(p, tok);
86008696
8601 if (operand.val.is(.int, p.comp) or operand.val.is(.int, p.comp)) {8697 if (operand.val.is(.int, p.comp) or operand.val.is(.int, p.comp)) {
...@@ -8624,6 +8720,9 @@ fn unExpr(p: *Parser) Error!?Result {...@@ -8624,6 +8720,9 @@ fn unExpr(p: *Parser) Error!?Result {
8624 try p.err(tok, .not_assignable, .{});8720 try p.err(tok, .not_assignable, .{});
8625 return error.ParsingFailed;8721 return error.ParsingFailed;
8626 }8722 }
8723 if (operand.qt.get(p.comp, .pointer)) |pointer| {
8724 try p.checkPtrArithmeticAllowed(pointer, p.tok_i, operand.node);
8725 }
8627 try operand.usualUnaryConversion(p, tok);8726 try operand.usualUnaryConversion(p, tok);
86288727
8629 if (operand.val.is(.int, p.comp) or operand.val.is(.int, p.comp)) {8728 if (operand.val.is(.int, p.comp) or operand.val.is(.int, p.comp)) {
...@@ -8826,7 +8925,7 @@ fn unExpr(p: *Parser) Error!?Result {...@@ -8826,7 +8925,7 @@ fn unExpr(p: *Parser) Error!?Result {
8826 } else switch (p.comp.langopts.emulate) {8925 } else switch (p.comp.langopts.emulate) {
8827 .msvc => {}, // Doesn't support `_Complex` or `__imag` in the first place8926 .msvc => {}, // Doesn't support `_Complex` or `__imag` in the first place
8828 .gcc => operand.val = .zero,8927 .gcc => operand.val = .zero,
8829 .clang => {8928 .clang, .no => {
8830 if (operand.val.is(.int, p.comp) or operand.val.is(.float, p.comp)) {8929 if (operand.val.is(.int, p.comp) or operand.val.is(.float, p.comp)) {
8831 operand.val = .zero;8930 operand.val = .zero;
8832 } else {8931 } else {
...@@ -8886,7 +8985,7 @@ fn compoundLiteral(p: *Parser, qt_opt: ?QualType, opt_l_paren: ?TokenIndex) Erro...@@ -8886,7 +8985,7 @@ fn compoundLiteral(p: *Parser, qt_opt: ?QualType, opt_l_paren: ?TokenIndex) Erro
8886 try p.err(tok, .invalid_compound_literal_storage_class, .{@tagName(d.storage_class)});8985 try p.err(tok, .invalid_compound_literal_storage_class, .{@tagName(d.storage_class)});
8887 d.storage_class = .none;8986 d.storage_class = .none;
8888 },8987 },
8889 .register => if (p.func.qt == null) try p.err(p.tok_i, .illegal_storage_on_global, .{}),8988 .register => if (p.func.qt == null) try p.err(p.tok_i, .register_on_global_compound_literal, .{}),
8890 else => {},8989 else => {},
8891 }8990 }
88928991
...@@ -8968,6 +9067,9 @@ fn suffixExpr(p: *Parser, lhs: Result) Error!?Result {...@@ -8968,6 +9067,9 @@ fn suffixExpr(p: *Parser, lhs: Result) Error!?Result {
8968 try p.err(p.tok_i, .not_assignable, .{});9067 try p.err(p.tok_i, .not_assignable, .{});
8969 return error.ParsingFailed;9068 return error.ParsingFailed;
8970 }9069 }
9070 if (operand.qt.get(p.comp, .pointer)) |pointer| {
9071 try p.checkPtrArithmeticAllowed(pointer, p.tok_i, operand.node);
9072 }
8971 try operand.usualUnaryConversion(p, p.tok_i);9073 try operand.usualUnaryConversion(p, p.tok_i);
89729074
8973 try operand.un(p, .post_inc_expr, p.tok_i);9075 try operand.un(p, .post_inc_expr, p.tok_i);
...@@ -8989,6 +9091,9 @@ fn suffixExpr(p: *Parser, lhs: Result) Error!?Result {...@@ -8989,6 +9091,9 @@ fn suffixExpr(p: *Parser, lhs: Result) Error!?Result {
8989 try p.err(p.tok_i, .not_assignable, .{});9091 try p.err(p.tok_i, .not_assignable, .{});
8990 return error.ParsingFailed;9092 return error.ParsingFailed;
8991 }9093 }
9094 if (operand.qt.get(p.comp, .pointer)) |pointer| {
9095 try p.checkPtrArithmeticAllowed(pointer, p.tok_i, operand.node);
9096 }
8992 try operand.usualUnaryConversion(p, p.tok_i);9097 try operand.usualUnaryConversion(p, p.tok_i);
89939098
8994 try operand.un(p, .post_dec_expr, p.tok_i);9099 try operand.un(p, .post_dec_expr, p.tok_i);
...@@ -9003,6 +9108,7 @@ fn suffixExpr(p: *Parser, lhs: Result) Error!?Result {...@@ -9003,6 +9108,7 @@ fn suffixExpr(p: *Parser, lhs: Result) Error!?Result {
9003 const array_before_conversion = lhs;9108 const array_before_conversion = lhs;
9004 const index_before_conversion = index;9109 const index_before_conversion = index;
9005 var ptr = lhs;9110 var ptr = lhs;
9111
9006 try ptr.lvalConversion(p, l_bracket);9112 try ptr.lvalConversion(p, l_bracket);
9007 try index.lvalConversion(p, l_bracket);9113 try index.lvalConversion(p, l_bracket);
9008 if (ptr.qt.get(p.comp, .pointer)) |pointer_ty| {9114 if (ptr.qt.get(p.comp, .pointer)) |pointer_ty| {
...@@ -9176,14 +9282,7 @@ fn checkVaStartArg(p: *Parser, builtin_tok: TokenIndex, first_after: TokenIndex,...@@ -9176,14 +9282,7 @@ fn checkVaStartArg(p: *Parser, builtin_tok: TokenIndex, first_after: TokenIndex,
9176 return error.ParsingFailed;9282 return error.ParsingFailed;
9177 }9283 }
91789284
9179 const func_qt = p.func.qt orelse {9285 _, const func_ty = (try p.checkVaFunc(builtin_tok, "va_start")) orelse return;
9180 try p.err(builtin_tok, .va_start_not_in_func, .{});
9181 return;
9182 };
9183 const func_ty = func_qt.get(p.comp, .func) orelse return;
9184 if (func_ty.kind != .variadic or func_ty.params.len == 0) {
9185 return p.err(builtin_tok, .va_start_fixed_args, .{});
9186 }
9187 const last_param_name = func_ty.params[func_ty.params.len - 1].name;9286 const last_param_name = func_ty.params[func_ty.params.len - 1].name;
9188 const decl_ref = p.getNode(arg.node, .decl_ref_expr);9287 const decl_ref = p.getNode(arg.node, .decl_ref_expr);
9189 if (decl_ref == null or last_param_name != try p.comp.internString(p.tokSlice(decl_ref.?.name_tok))) {9288 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,...@@ -9191,6 +9290,19 @@ fn checkVaStartArg(p: *Parser, builtin_tok: TokenIndex, first_after: TokenIndex,
9191 }9290 }
9192}9291}
91939292
9293fn checkVaFunc(p: *Parser, builtin_tok: TokenIndex, va_func_name: []const u8) !?struct { QualType, Type.Func } {
9294 const func_qt = p.func.qt orelse {
9295 try p.err(builtin_tok, .va_func_not_in_func, .{va_func_name});
9296 return null;
9297 };
9298 const func_ty = func_qt.get(p.comp, .func) orelse return null;
9299 if (func_ty.kind != .variadic or func_ty.params.len == 0) {
9300 try p.err(builtin_tok, .va_func_fixed_args, .{va_func_name});
9301 return null;
9302 }
9303 return .{ func_qt, func_ty };
9304}
9305
9194fn checkArithOverflowArg(p: *Parser, builtin_tok: TokenIndex, first_after: TokenIndex, param_tok: TokenIndex, arg: *Result, idx: u32) !void {9306fn checkArithOverflowArg(p: *Parser, builtin_tok: TokenIndex, first_after: TokenIndex, param_tok: TokenIndex, arg: *Result, idx: u32) !void {
9195 _ = builtin_tok;9307 _ = builtin_tok;
9196 _ = first_after;9308 _ = first_after;
...@@ -9320,7 +9432,7 @@ fn callExpr(p: *Parser, lhs: Result) Error!Result {...@@ -9320,7 +9432,7 @@ fn callExpr(p: *Parser, lhs: Result) Error!Result {
93209432
9321 // We cannot refer to the function type here because the pointer to9433 // We cannot refer to the function type here because the pointer to
9322 // type_store.extra might get invalidated while parsing args.9434 // type_store.extra might get invalidated while parsing args.
9323 const func_qt, const params_len, const func_kind = blk: {9435 const func_qt, const typed_params_len, const func_kind_base = blk: {
9324 var base_qt = lhs.qt;9436 var base_qt = lhs.qt;
9325 if (base_qt.get(p.comp, .pointer)) |pointer_ty| base_qt = pointer_ty.child;9437 if (base_qt.get(p.comp, .pointer)) |pointer_ty| base_qt = pointer_ty.child;
9326 if (base_qt.isInvalid()) break :blk .{ base_qt, std.math.maxInt(usize), undefined };9438 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 {...@@ -9343,9 +9455,44 @@ fn callExpr(p: *Parser, lhs: Result) Error!Result {
93439455
9344 const call_expr = CallExpr.init(p, lhs.node, func.node);9456 const call_expr = CallExpr.init(p, lhs.node, func.node);
93459457
9458 const param_len_override = call_expr.paramCountOverride();
9459 const params_len = param_len_override orelse typed_params_len;
9460 const func_kind = if (param_len_override != null) .normal else func_kind_base;
9461
9346 while (p.eatToken(.r_paren) == null) {9462 while (p.eatToken(.r_paren) == null) {
9347 const param_tok = p.tok_i;9463 const param_tok = p.tok_i;
9348 if (arg_count == params_len) first_after = p.tok_i;9464 if (arg_count == params_len) first_after = p.tok_i;
9465
9466 // Check for __builtin_va_arg_pack
9467 {
9468 var i = p.tok_i;
9469 loop: switch (p.tok_ids[i]) {
9470 .l_paren => {
9471 i += 1;
9472 continue :loop p.tok_ids[i];
9473 },
9474 .identifier => if (mem.eql(u8, p.tokSlice(i), "__builtin_va_arg_pack")) {
9475 @branchHint(.cold);
9476 p.va_arg_pack_ctx = .{
9477 .valid = true,
9478 .variadic = func_kind != .normal,
9479 .typed = arg_count < typed_params_len,
9480 };
9481 defer p.va_arg_pack_ctx = .{};
9482
9483 const arg = try p.expect(assignExpr);
9484 try p.list_buf.append(gpa, arg.node);
9485 arg_count += 1;
9486 if (p.eatToken(.comma)) |_| {
9487 try p.err(i, .va_pack_non_final_arg, .{});
9488 continue;
9489 }
9490 try p.expectClosing(l_paren, .r_paren);
9491 break;
9492 },
9493 else => {},
9494 }
9495 }
9349 var arg = try p.expect(assignExpr);9496 var arg = try p.expect(assignExpr);
93509497
9351 if (call_expr.shouldPerformLvalConversion(arg_count)) {9498 if (call_expr.shouldPerformLvalConversion(arg_count)) {
...@@ -9353,7 +9500,7 @@ fn callExpr(p: *Parser, lhs: Result) Error!Result {...@@ -9353,7 +9500,7 @@ fn callExpr(p: *Parser, lhs: Result) Error!Result {
9353 }9500 }
9354 if ((arg.qt.hasIncompleteSize(p.comp) and !arg.qt.is(p.comp, .void)) or arg.qt.isInvalid()) return error.ParsingFailed;9501 if ((arg.qt.hasIncompleteSize(p.comp) and !arg.qt.is(p.comp, .void)) or arg.qt.isInvalid()) return error.ParsingFailed;
93559502
9356 if (arg_count >= params_len) {9503 if (arg_count >= typed_params_len) {
9357 if (call_expr.shouldPromoteVarArg(arg_count)) switch (arg.qt.base(p.comp).type) {9504 if (call_expr.shouldPromoteVarArg(arg_count)) switch (arg.qt.base(p.comp).type) {
9358 .int => |int_ty| if (int_ty == .int) try arg.castToInt(p, arg.qt.promoteInt(p.comp), param_tok),9505 .int => |int_ty| if (int_ty == .int) try arg.castToInt(p, arg.qt.promoteInt(p.comp), param_tok),
9359 .float => |float_ty| if (float_ty == .double) try arg.castToFloat(p, .double, param_tok),9506 .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 {...@@ -9407,19 +9554,23 @@ fn callExpr(p: *Parser, lhs: Result) Error!Result {
9407 }9554 }
9408 if (func_qt.isInvalid()) {9555 if (func_qt.isInvalid()) {
9409 // Skip argument count checks.9556 // Skip argument count checks.
9410 return try call_expr.finish(p, func_qt, list_buf_top, l_paren);9557 return try call_expr.finish(p, func_qt, list_buf_top, l_paren, false);
9411 }9558 }
94129559
9413 if (call_expr.paramCountOverride()) |expected| {9560 const r_paren = p.tok_i - 1;
9414 if (expected != arg_count) {9561 var args_ok = true;
9415 try p.err(first_after, .expected_arguments, .{ expected, arg_count });9562 switch (func_kind) {
9416 }
9417 } else switch (func_kind) {
9418 .normal => if (params_len != arg_count) {9563 .normal => if (params_len != arg_count) {
9419 try p.err(first_after, .expected_arguments, .{ params_len, arg_count });9564 try p.err(
9565 if (arg_count < params_len) r_paren else first_after,
9566 .expected_arguments,
9567 .{ params_len, arg_count },
9568 );
9569 args_ok = false;
9420 },9570 },
9421 .variadic => if (arg_count < params_len) {9571 .variadic => if (arg_count < params_len) {
9422 try p.err(first_after, .expected_at_least_arguments, .{ params_len, arg_count });9572 try p.err(r_paren, .expected_at_least_arguments, .{ params_len, arg_count });
9573 args_ok = false;
9423 },9574 },
9424 .old_style => if (params_len != arg_count) {9575 .old_style => if (params_len != arg_count) {
9425 if (params_len == 0)9576 if (params_len == 0)
...@@ -9429,10 +9580,60 @@ fn callExpr(p: *Parser, lhs: Result) Error!Result {...@@ -9429,10 +9580,60 @@ fn callExpr(p: *Parser, lhs: Result) Error!Result {
9429 },9580 },
9430 }9581 }
94319582
9432 return try call_expr.finish(p, func_qt, list_buf_top, l_paren);9583 return try call_expr.finish(p, func_qt, list_buf_top, l_paren, args_ok);
9584}
9585
9586fn boundsSafetyCheckArrayAccess(p: *Parser, lhs: Result, rhs: Result, l_bracket: TokenIndex) !void {
9587 if (!p.comp.hasClangStyleBoundsSafety()) return;
9588
9589 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 };
9590
9591 switch (pointer.bounds) {
9592 .c, .unsafe_indexable => {},
9593 .single => {
9594 if (!index.val.isZero(p.comp)) {
9595 try p.err(l_bracket, .single_requires_zero_index, .{});
9596 if (p.unwrapNestedOperation(ptr_res.node)) |unwrapped| {
9597 const name = p.tokSlice(unwrapped.name_tok);
9598 try p.issueBoundsDeclaredHereNote(unwrapped, name, pointer.bounds);
9599 }
9600 }
9601 },
9602 }
9603}
9604
9605fn boundsSafetyCheckPointerArithmetic(p: *Parser, lhs: QualType, rhs: QualType, tok: TokenIndex, node: Tree.Node.Index) !void {
9606 if (!p.comp.hasClangStyleBoundsSafety()) return;
9607
9608 const pointer = if (rhs.isInt(p.comp))
9609 lhs.get(p.comp, .pointer) orelse return
9610 else if (lhs.isInt(p.comp))
9611 rhs.get(p.comp, .pointer) orelse return
9612 else
9613 return;
9614
9615 try p.checkPtrArithmeticAllowed(pointer, tok, node);
9616}
9617
9618fn checkPtrArithmeticAllowed(p: *Parser, pointer: Type.Pointer, tok: TokenIndex, node: Tree.Node.Index) !void {
9619 if (!p.comp.hasClangStyleBoundsSafety()) return;
9620
9621 switch (pointer.bounds) {
9622 .c, .unsafe_indexable => {},
9623 .single => {
9624 // clang issues this diagnostic even with a constant `0` operand
9625 try p.err(tok, .pointer_arith_single, .{});
9626 if (p.unwrapNestedOperation(node)) |unwrapped| {
9627 const name = p.tokSlice(unwrapped.name_tok);
9628 try p.issueBoundsDeclaredHereNote(unwrapped, name, pointer.bounds);
9629 }
9630 },
9631 }
9433}9632}
94349633
9435fn checkArrayBounds(p: *Parser, index: Result, array: Result, tok: TokenIndex) !void {9634fn checkArrayBounds(p: *Parser, index: Result, array: Result, tok: TokenIndex) !void {
9635 try p.boundsSafetyCheckArrayAccess(array, index, tok);
9636
9436 if (index.val.opt_ref == .none) return;9637 if (index.val.opt_ref == .none) return;
94379638
9438 const array_len = array.qt.arrayLen(p.comp) orelse return;9639 const array_len = array.qt.arrayLen(p.comp) orelse return;
...@@ -9579,6 +9780,8 @@ fn primaryExpr(p: *Parser) Error!?Result {...@@ -9579,6 +9780,8 @@ fn primaryExpr(p: *Parser) Error!?Result {
9579 .common => |tag| switch (tag) {9780 .common => |tag| switch (tag) {
9580 .__builtin_choose_expr => return try p.builtinChooseExpr(),9781 .__builtin_choose_expr => return try p.builtinChooseExpr(),
9581 .__builtin_va_arg => return try p.builtinVaArg(name_tok),9782 .__builtin_va_arg => return try p.builtinVaArg(name_tok),
9783 .__builtin_va_arg_pack => return try p.builtinVaArgPack(name_tok),
9784 .__builtin_va_arg_pack_len => return try p.builtinVaArgPackLen(name_tok),
9582 .__builtin_offsetof => return try p.builtinOffsetof(name_tok, .bytes),9785 .__builtin_offsetof => return try p.builtinOffsetof(name_tok, .bytes),
9583 .__builtin_bitoffsetof => return try p.builtinOffsetof(name_tok, .bits),9786 .__builtin_bitoffsetof => return try p.builtinOffsetof(name_tok, .bits),
9584 .__builtin_types_compatible_p => return try p.typesCompatible(name_tok),9787 .__builtin_types_compatible_p => return try p.typesCompatible(name_tok),
...@@ -9720,7 +9923,7 @@ fn primaryExpr(p: *Parser) Error!?Result {...@@ -9720,7 +9923,7 @@ fn primaryExpr(p: *Parser) Error!?Result {
9720 qt = some.qt;9923 qt = some.qt;
9721 } else if (p.func.qt) |func_qt| {9924 } else if (p.func.qt) |func_qt| {
9722 var sf = std.heap.stackFallback(1024, gpa);9925 var sf = std.heap.stackFallback(1024, gpa);
9723 var allocating: Io.Writer.Allocating = .init(sf.get());9926 var allocating: std.Io.Writer.Allocating = .init(sf.get());
9724 defer allocating.deinit();9927 defer allocating.deinit();
97259928
9726 func_qt.printNamed(p.tokSlice(p.func.name), p.comp, &allocating.writer) catch return error.OutOfMemory;9929 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...@@ -10277,16 +10480,13 @@ fn fixedSizeInt(p: *Parser, base: u8, buf: []const u8, suffix: NumberSuffix, tok
10277 if (res.qt.intRankOrder(suffix_qt, p.comp).compare(.lt)) continue;10480 if (res.qt.intRankOrder(suffix_qt, p.comp).compare(.lt)) continue;
10278 const max_int = try Value.maxInt(res.qt, p.comp);10481 const max_int = try Value.maxInt(res.qt, p.comp);
10279 if (interned_val.compare(.lte, max_int, p.comp)) break;10482 if (interned_val.compare(.lte, max_int, p.comp)) break;
10280 } else {10483 } else switch (p.comp.langopts.emulate) {
10281 if (p.comp.langopts.emulate == .gcc) {10484 .no, .gcc => if (p.comp.target.hasInt128()) {
10282 if (p.comp.target.hasInt128()) {10485 res.qt = .int128;
10283 res.qt = .int128;
10284 } else {
10285 res.qt = .long_long;
10286 }
10287 } else {10486 } else {
10288 res.qt = .ulong_long;10487 res.qt = .long_long;
10289 }10488 },
10489 .msvc, .clang => res.qt = .ulong_long,
10290 }10490 }
1029110491
10292 res.node = try p.addNode(.{ .int_literal = .{ .qt = res.qt, .literal_tok = tok_i } });10492 res.node = try p.addNode(.{ .int_literal = .{ .qt = res.qt, .literal_tok = tok_i } });
...@@ -10604,12 +10804,7 @@ fn genericSelection(p: *Parser) Error!?Result {...@@ -10604,12 +10804,7 @@ fn genericSelection(p: *Parser) Error!?Result {
10604}10804}
1060510805
10606test "Node locations" {10806test "Node locations" {
10607 var arena_state: std.heap.ArenaAllocator = .init(std.testing.allocator);10807 var comp = try Compilation.init(.testing);
10608 defer arena_state.deinit();
10609 const arena = arena_state.allocator();
10610
10611 var diagnostics: Diagnostics = .{ .output = .ignore };
10612 var comp = Compilation.init(std.testing.allocator, arena, std.testing.io, &diagnostics, Io.Dir.cwd());
10613 defer comp.deinit();10808 defer comp.deinit();
1061410809
10615 const file = try comp.addSourceFromBuffer("file.c",10810 const file = try comp.addSourceFromBuffer("file.c",
...@@ -10621,7 +10816,7 @@ test "Node locations" {...@@ -10621,7 +10816,7 @@ test "Node locations" {
1062110816
10622 const builtin_macros = try comp.generateBuiltinMacros(.no_system_defines);10817 const builtin_macros = try comp.generateBuiltinMacros(.no_system_defines);
1062310818
10624 var pp = Preprocessor.init(&comp, .default);10819 var pp = try Preprocessor.init(&comp, .testing);
10625 defer pp.deinit();10820 defer pp.deinit();
10626 try pp.addBuiltinMacros();10821 try pp.addBuiltinMacros();
1062710822
...@@ -10633,7 +10828,6 @@ test "Node locations" {...@@ -10633,7 +10828,6 @@ test "Node locations" {
10633 var tree = try Parser.parse(&pp);10828 var tree = try Parser.parse(&pp);
10634 defer tree.deinit();10829 defer tree.deinit();
1063510830
10636 try std.testing.expectEqual(0, comp.diagnostics.total);
10637 for (tree.root_decls.items[tree.root_decls.items.len - 3 ..], 0..) |node, i| {10831 for (tree.root_decls.items[tree.root_decls.items.len - 3 ..], 0..) |node, i| {
10638 const slice = tree.tokSlice(node.tok(&tree));10832 const slice = tree.tokSlice(node.tok(&tree));
10639 const expected_slice = switch (i) {10833 const expected_slice = switch (i) {
lib/compiler/aro/aro/Parser/Diagnostic.zig+79-19
...@@ -79,9 +79,9 @@ pub const expected_integer_constant_expr: Diagnostic = .{...@@ -79,9 +79,9 @@ pub const expected_integer_constant_expr: Diagnostic = .{
79};79};
8080
81pub const missing_type_specifier: Diagnostic = .{81pub const missing_type_specifier: Diagnostic = .{
82 .fmt = "type specifier missing, defaults to 'int'",82 .fmt = "type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int",
83 .opt = .@"implicit-int",83 .opt = .@"implicit-int",
84 .kind = .warning,84 .kind = .@"error",
85};85};
8686
87pub const missing_type_specifier_c23: Diagnostic = .{87pub const missing_type_specifier_c23: Diagnostic = .{
...@@ -90,9 +90,9 @@ pub const missing_type_specifier_c23: Diagnostic = .{...@@ -90,9 +90,9 @@ pub const missing_type_specifier_c23: Diagnostic = .{
90};90};
9191
92pub const param_not_declared: Diagnostic = .{92pub const param_not_declared: Diagnostic = .{
93 .fmt = "parameter '{s}' was not declared, defaults to 'int'",93 .fmt = "parameter '{s}' was not declared, defaults to 'int'; ISO C99 and later do not support implicit int",
94 .opt = .@"implicit-int",94 .opt = .@"implicit-int",
95 .kind = .warning,95 .kind = .@"error",
96 .extension = true,96 .extension = true,
97};97};
9898
...@@ -216,8 +216,13 @@ pub const illegal_storage_on_func: Diagnostic = .{...@@ -216,8 +216,13 @@ pub const illegal_storage_on_func: Diagnostic = .{
216 .kind = .@"error",216 .kind = .@"error",
217};217};
218218
219pub const illegal_storage_on_global: Diagnostic = .{219pub const auto_on_global: Diagnostic = .{
220 .fmt = "illegal storage class on global variable",220 .fmt = "'auto' specified on global variable",
221 .kind = .@"error",
222};
223
224pub const register_on_global: Diagnostic = .{
225 .fmt = "register name not specified for global variable",
221 .kind = .@"error",226 .kind = .@"error",
222};227};
223228
...@@ -1507,13 +1512,38 @@ pub const builtin_must_be_called: Diagnostic = .{...@@ -1507,13 +1512,38 @@ pub const builtin_must_be_called: Diagnostic = .{
1507 .kind = .@"error",1512 .kind = .@"error",
1508};1513};
15091514
1510pub const va_start_not_in_func: Diagnostic = .{1515pub const va_func_not_in_func: Diagnostic = .{
1511 .fmt = "'va_start' cannot be used outside a function",1516 .fmt = "'{s}' cannot be used outside a function",
1517 .kind = .@"error",
1518};
1519
1520pub const va_func_fixed_args: Diagnostic = .{
1521 .fmt = "'{s}' used in a function with fixed args",
1522 .kind = .@"error",
1523};
1524
1525pub const va_func_not_always_inline: Diagnostic = .{
1526 .fmt = "'{s}' used in a function that is not always inlined",
1527 .kind = .@"error",
1528};
1529
1530pub const va_pack_non_call: Diagnostic = .{
1531 .fmt = "'__va_arg_pack' used outside a call",
1532 .kind = .@"error",
1533};
1534
1535pub const va_pack_non_variadic_call: Diagnostic = .{
1536 .fmt = "'__va_arg_pack' passed to non-variadic function",
1537 .kind = .@"error",
1538};
1539
1540pub const va_pack_non_variadic_arg: Diagnostic = .{
1541 .fmt = "'__va_arg_pack' passed as non-variadic argument",
1512 .kind = .@"error",1542 .kind = .@"error",
1513};1543};
15141544
1515pub const va_start_fixed_args: Diagnostic = .{1545pub const va_pack_non_final_arg: Diagnostic = .{
1516 .fmt = "'va_start' used in a function with fixed args",1546 .fmt = "'__va_arg_pack' is not the final argument",
1517 .kind = .@"error",1547 .kind = .@"error",
1518};1548};
15191549
...@@ -2258,11 +2288,11 @@ pub const unterminated_char_literal_error: Diagnostic = .{...@@ -2258,11 +2288,11 @@ pub const unterminated_char_literal_error: Diagnostic = .{
2258 .kind = .@"error",2288 .kind = .@"error",
2259};2289};
22602290
2261// pub const def_no_proto_deprecated: Diagnostic = .{2291pub const def_no_proto_deprecated: Diagnostic = .{
2262// .fmt = "a function definition without a prototype is deprecated in all versions of C and is not supported in C23",2292 .fmt = "a function definition without a prototype is deprecated in all versions of C and is not supported in C23",
2263// .kind = .warning,2293 .kind = .warning,
2264// .opt = .@"deprecated-non-prototype",2294 .opt = .@"deprecated-non-prototype",
2265// };2295};
22662296
2267pub const passing_args_to_kr: Diagnostic = .{2297pub const passing_args_to_kr: Diagnostic = .{
2268 .fmt = "passing arguments to a function without a prototype is deprecated in all versions of C and is not supported in C23",2298 .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 = .{...@@ -2296,6 +2326,11 @@ pub const invalid_compound_literal_storage_class: Diagnostic = .{
2296 .kind = .@"error",2326 .kind = .@"error",
2297};2327};
22982328
2329pub const register_on_global_compound_literal: Diagnostic = .{
2330 .fmt = "file scope compound literal specifies 'register'",
2331 .kind = .@"error",
2332};
2333
2299pub const identifier_not_normalized: Diagnostic = .{2334pub const identifier_not_normalized: Diagnostic = .{
2300 .fmt = "'{normalized}' is not in NFC",2335 .fmt = "'{normalized}' is not in NFC",
2301 .kind = .warning,2336 .kind = .warning,
...@@ -2465,10 +2500,9 @@ pub const declared_const_here: Diagnostic = .{...@@ -2465,10 +2500,9 @@ pub const declared_const_here: Diagnostic = .{
2465 .kind = .note,2500 .kind = .note,
2466};2501};
24672502
2468pub const nonnull_not_applicable: Diagnostic = .{2503pub const pointer_bounds_declared_here: Diagnostic = .{
2469 .fmt = "'nonnull' attribute only applies to functions, methods, and parameters",2504 .fmt = "pointer '{s}' declared {s} here",
2470 .kind = .warning,2505 .kind = .note,
2471 .opt = .@"ignored-attributes",
2472};2506};
24732507
2474pub const mixing_decimal_floats: Diagnostic = .{2508pub const mixing_decimal_floats: Diagnostic = .{
...@@ -2480,3 +2514,29 @@ pub const invalid_attribute_location: Diagnostic = .{...@@ -2480,3 +2514,29 @@ pub const invalid_attribute_location: Diagnostic = .{
2480 .fmt = "{s} cannot appear here",2514 .fmt = "{s} cannot appear here",
2481 .kind = .@"error",2515 .kind = .@"error",
2482};2516};
2517
2518pub const attribute_requires_pointer: Diagnostic = .{
2519 .fmt = "'{s}' attribute only applies to pointer arguments",
2520 .kind = .@"error",
2521};
2522
2523pub const single_requires_zero_index: Diagnostic = .{
2524 .fmt = "array subscript on single pointer must use a constant index of 0 to be in bounds",
2525 .kind = .@"error",
2526};
2527
2528pub const pointer_arith_single: Diagnostic = .{
2529 .fmt = "pointer arithmetic on single pointer is out of bounds; consider adding '__counted_by'",
2530 .kind = .@"error",
2531};
2532
2533pub const redundant_bounds_annotation: Diagnostic = .{
2534 .fmt = "pointer annotated with {s} multiple times. Annotate only once to remove this warning",
2535 .kind = .warning,
2536 .opt = .@"bounds-attributes-redundant",
2537};
2538
2539pub const multiple_bounds_annotations: Diagnostic = .{
2540 .fmt = "pointer cannot have more than one bound attribute",
2541 .kind = .@"error",
2542};
lib/compiler/aro/aro/Preprocessor.zig+127-56
...@@ -1,6 +1,6 @@...@@ -1,6 +1,6 @@
1const std = @import("std");1const std = @import("std");
2const Io = std.Io;
3const mem = std.mem;2const mem = std.mem;
3const path = std.Io.Dir.path;
4const Allocator = mem.Allocator;4const Allocator = mem.Allocator;
5const assert = std.debug.assert;5const assert = std.debug.assert;
66
...@@ -79,12 +79,15 @@ pub const Macro = struct {...@@ -79,12 +79,15 @@ pub const Macro = struct {
79 });79 });
8080
81 const Object = enum {81 const Object = enum {
82 base_file,
82 file,83 file,
84 file_basename,
83 line,85 line,
84 counter,86 counter,
85 date,87 date,
86 time,88 time,
87 timestamp,89 timestamp,
90 include_level,
88 };91 };
8992
90 const Func = enum {93 const Func = enum {
...@@ -216,8 +219,6 @@ pub const Macro = struct {...@@ -216,8 +219,6 @@ pub const Macro = struct {
216 }219 }
217};220};
218221
219const Preprocessor = @This();
220
221const ExpansionEntry = struct {222const ExpansionEntry = struct {
222 idx: Tree.TokenIndex,223 idx: Tree.TokenIndex,
223 locs: [*]Source.Location,224 locs: [*]Source.Location,
...@@ -228,6 +229,8 @@ const TokenState = struct {...@@ -228,6 +229,8 @@ const TokenState = struct {
228 expansion_entries_len: usize,229 expansion_entries_len: usize,
229};230};
230231
232const Preprocessor = @This();
233
231comp: *Compilation,234comp: *Compilation,
232diagnostics: *Diagnostics,235diagnostics: *Diagnostics,
233236
...@@ -275,6 +278,12 @@ m_times: std.AutoHashMapUnmanaged(Source.Id, u64) = .empty,...@@ -275,6 +278,12 @@ m_times: std.AutoHashMapUnmanaged(Source.Id, u64) = .empty,
275/// The dependency file tracking all includes and embeds.278/// The dependency file tracking all includes and embeds.
276dep_file: ?*DepFile = null,279dep_file: ?*DepFile = null,
277280
281/// Path prefixes to replace when expanding __FILE__
282path_replacements: []const struct { []const u8, []const u8 } = &.{},
283
284/// File used for __BASE_FILE__ macro.
285base_file: Source.Id,
286
278pub const parse = Parser.parse;287pub const parse = Parser.parse;
279288
280pub const Linemarkers = enum {289pub const Linemarkers = enum {
...@@ -286,21 +295,22 @@ pub const Linemarkers = enum {...@@ -286,21 +295,22 @@ pub const Linemarkers = enum {
286 numeric_directives,295 numeric_directives,
287};296};
288297
289pub fn init(comp: *Compilation, source_epoch: SourceEpoch) Preprocessor {298pub const InitOptions = struct {
290 const pp: Preprocessor = .{299 base_file: Source.Id,
291 .comp = comp,300
292 .diagnostics = comp.diagnostics,301 source_epoch: ?SourceEpoch = null,
293 .arena = .init(comp.gpa),302 add_builtin_macros: bool = true,
294 .hideset = .{ .comp = comp },303 path_replacements: []const struct { []const u8, []const u8 } = &.{},
295 .source_epoch = source_epoch,304
305 pub const testing: InitOptions = .{
306 .base_file = undefined,
307 .source_epoch = .default,
308 .add_builtin_macros = false,
296 };309 };
297 comp.pragmaEvent(.before_preprocess);310};
298 return pp;
299}
300311
301/// Initialize Preprocessor with builtin macros.312pub fn init(comp: *Compilation, options: InitOptions) !Preprocessor {
302pub fn initDefault(comp: *Compilation) !Preprocessor {313 const source_epoch: SourceEpoch = options.source_epoch orelse comp.environment.sourceEpoch(comp.io) catch |er| switch (er) {
303 const source_epoch: SourceEpoch = comp.environment.sourceEpoch(comp.io) catch |er| switch (er) {
304 error.InvalidEpoch => blk: {314 error.InvalidEpoch => blk: {
305 const diagnostic: Diagnostic = .invalid_source_epoch;315 const diagnostic: Diagnostic = .invalid_source_epoch;
306 try comp.diagnostics.add(.{ .text = diagnostic.fmt, .kind = diagnostic.kind, .opt = diagnostic.opt, .location = null });316 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 {...@@ -308,9 +318,18 @@ pub fn initDefault(comp: *Compilation) !Preprocessor {
308 },318 },
309 };319 };
310320
311 var pp = init(comp, source_epoch);321 var pp: Preprocessor = .{
322 .comp = comp,
323 .diagnostics = comp.diagnostics,
324 .arena = .init(comp.gpa),
325 .hideset = .{ .comp = comp },
326 .source_epoch = source_epoch,
327 .base_file = options.base_file,
328 .path_replacements = options.path_replacements,
329 };
312 errdefer pp.deinit();330 errdefer pp.deinit();
313 try pp.addBuiltinMacros();331 comp.pragmaEvent(.before_preprocess);
332 if (options.add_builtin_macros) try pp.addBuiltinMacros();
314 return pp;333 return pp;
315}334}
316335
...@@ -339,7 +358,7 @@ pub fn addBuiltinMacros(pp: *Preprocessor) !void {...@@ -339,7 +358,7 @@ pub fn addBuiltinMacros(pp: *Preprocessor) !void {
339 try pp.addBuiltinMacro("__is_identifier", .{ .func = .is_identifier });358 try pp.addBuiltinMacro("__is_identifier", .{ .func = .is_identifier });
340 try pp.addBuiltinMacro("_Pragma", .{ .func = .pragma_operator });359 try pp.addBuiltinMacro("_Pragma", .{ .func = .pragma_operator });
341360
342 if (pp.comp.langopts.emulate == .clang) {361 if (pp.comp.langopts.emulate == .no or pp.comp.langopts.emulate == .clang) {
343 try pp.addBuiltinMacro("__is_target_arch", .{ .func = .is_target_arch });362 try pp.addBuiltinMacro("__is_target_arch", .{ .func = .is_target_arch });
344 try pp.addBuiltinMacro("__is_target_vendor", .{ .func = .is_target_vendor });363 try pp.addBuiltinMacro("__is_target_vendor", .{ .func = .is_target_vendor });
345 try pp.addBuiltinMacro("__is_target_os", .{ .func = .is_target_os });364 try pp.addBuiltinMacro("__is_target_os", .{ .func = .is_target_os });
...@@ -359,6 +378,12 @@ pub fn addBuiltinMacros(pp: *Preprocessor) !void {...@@ -359,6 +378,12 @@ pub fn addBuiltinMacros(pp: *Preprocessor) !void {
359 try pp.addBuiltinMacro("__DATE__", .{ .obj = .date });378 try pp.addBuiltinMacro("__DATE__", .{ .obj = .date });
360 try pp.addBuiltinMacro("__TIME__", .{ .obj = .time });379 try pp.addBuiltinMacro("__TIME__", .{ .obj = .time });
361 try pp.addBuiltinMacro("__TIMESTAMP__", .{ .obj = .timestamp });380 try pp.addBuiltinMacro("__TIMESTAMP__", .{ .obj = .timestamp });
381
382 if (pp.comp.langopts.emulate == .no or pp.comp.langopts.emulate == .clang) {
383 try pp.addBuiltinMacro("__BASE_FILE__", .{ .obj = .base_file });
384 try pp.addBuiltinMacro("__FILE_NAME__", .{ .obj = .file_basename });
385 try pp.addBuiltinMacro("__INCLUDE_LEVEL__", .{ .obj = .include_level });
386 }
362}387}
363388
364pub fn deinit(pp: *Preprocessor) void {389pub fn deinit(pp: *Preprocessor) void {
...@@ -395,7 +420,7 @@ fn mTime(pp: *Preprocessor, source_id: Source.Id) !u64 {...@@ -395,7 +420,7 @@ fn mTime(pp: *Preprocessor, source_id: Source.Id) !u64 {
395 return gop.value_ptr.*;420 return gop.value_ptr.*;
396}421}
397422
398pub fn expansionSlice(pp: *Preprocessor, tok: Tree.TokenIndex) []Source.Location {423pub fn expansionSlice(pp: *const Preprocessor, tok: Tree.TokenIndex) []Source.Location {
399 const S = struct {424 const S = struct {
400 fn orderTokenIndex(context: Tree.TokenIndex, item: Tree.TokenIndex) std.math.Order {425 fn orderTokenIndex(context: Tree.TokenIndex, item: Tree.TokenIndex) std.math.Order {
401 return std.math.order(context, item);426 return std.math.order(context, item);
...@@ -1065,13 +1090,11 @@ fn fatalNotFound(pp: *Preprocessor, tok: TokenWithExpansionLocs, filename: []con...@@ -1065,13 +1090,11 @@ fn fatalNotFound(pp: *Preprocessor, tok: TokenWithExpansionLocs, filename: []con
10651090
1066fn verboseLog(pp: *Preprocessor, raw: RawToken, comptime fmt: []const u8, args: anytype) void {1091fn verboseLog(pp: *Preprocessor, raw: RawToken, comptime fmt: []const u8, args: anytype) void {
1067 @branchHint(.cold);1092 @branchHint(.cold);
1068 const comp = pp.comp;1093 const source = pp.comp.getSource(raw.source);
1069 const io = comp.io;
1070 const source = comp.getSource(raw.source);
1071 const line_col = source.lineCol(.{ .id = raw.source, .line = raw.line, .byte_offset = raw.start });1094 const line_col = source.lineCol(.{ .id = raw.source, .line = raw.line, .byte_offset = raw.start });
10721095
1073 var stderr_buf: [4096]u8 = undefined;1096 var stderr_buf: [4096]u8 = undefined;
1074 var stderr = Io.File.stderr().writer(io, &stderr_buf);1097 var stderr = std.Io.File.stderr().writer(pp.comp.io, &stderr_buf);
1075 const w = &stderr.interface;1098 const w = &stderr.interface;
10761099
1077 w.print("{s}:{d}:{d}: ", .{ source.path, line_col.line_no, line_col.col }) catch return;1100 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...@@ -1435,7 +1458,37 @@ fn expandObjMacro(pp: *Preprocessor, simple_macro: *const Macro) Error!ExpandBuf
1435 .file => {1458 .file => {
1436 const start = pp.comp.generated_buf.items.len;1459 const start = pp.comp.generated_buf.items.len;
1437 const source = pp.comp.getSource(pp.expansion_source_loc.id);1460 const source = pp.comp.getSource(pp.expansion_source_loc.id);
1438 try pp.comp.generated_buf.print(gpa, "\"{f}\"\n", .{fmtEscapes(source.path)});1461 for (pp.path_replacements) |replacement| {
1462 if (mem.cutPrefix(u8, source.path, replacement[0])) |rest| {
1463 try pp.comp.generated_buf.print(gpa, "\"{f}{f}\"", .{ fmtEscapes(replacement[1]), fmtEscapes(rest) });
1464 break;
1465 }
1466 } else {
1467 try pp.comp.generated_buf.print(gpa, "\"{f}\"\n", .{fmtEscapes(source.path)});
1468 }
1469
1470 buf.appendAssumeCapacity(try pp.makeGeneratedToken(start, .string_literal, tok));
1471 },
1472 .base_file => {
1473 try pp.err(pp.expansion_source_loc, .base_file_is_clang_extension, .{});
1474 const start = pp.comp.generated_buf.items.len;
1475 const base_file = pp.comp.getSource(pp.base_file);
1476 for (pp.path_replacements) |replacement| {
1477 if (mem.cutPrefix(u8, base_file.path, replacement[0])) |rest| {
1478 try pp.comp.generated_buf.print(gpa, "\"{f}{f}\"", .{ fmtEscapes(replacement[1]), fmtEscapes(rest) });
1479 }
1480 } else {
1481 try pp.comp.generated_buf.print(gpa, "\"{f}\"", .{fmtEscapes(base_file.path)});
1482 }
1483
1484 buf.appendAssumeCapacity(try pp.makeGeneratedToken(start, .string_literal, tok));
1485 },
1486 .file_basename => {
1487 try pp.err(pp.expansion_source_loc, .file_name_is_clang_extension, .{});
1488 const start = pp.comp.generated_buf.items.len;
1489 const source = pp.comp.getSource(pp.expansion_source_loc.id);
1490 const basename = path.basename(source.path);
1491 try pp.comp.generated_buf.print(gpa, "\"{f}\"", .{fmtEscapes(basename)});
14391492
1440 buf.appendAssumeCapacity(try pp.makeGeneratedToken(start, .string_literal, tok));1493 buf.appendAssumeCapacity(try pp.makeGeneratedToken(start, .string_literal, tok));
1441 },1494 },
...@@ -1472,6 +1525,13 @@ fn expandObjMacro(pp: *Preprocessor, simple_macro: *const Macro) Error!ExpandBuf...@@ -1472,6 +1525,13 @@ fn expandObjMacro(pp: *Preprocessor, simple_macro: *const Macro) Error!ExpandBuf
1472 try pp.writeDateTimeStamp(.fromBuiltin(builtin_kind), timestamp);1525 try pp.writeDateTimeStamp(.fromBuiltin(builtin_kind), timestamp);
1473 buf.appendAssumeCapacity(try pp.makeGeneratedToken(start, .string_literal, tok));1526 buf.appendAssumeCapacity(try pp.makeGeneratedToken(start, .string_literal, tok));
1474 },1527 },
1528 .include_level => {
1529 try pp.err(pp.expansion_source_loc, .include_level_is_clang_extension, .{});
1530 const start = pp.comp.generated_buf.items.len;
1531 try pp.comp.generated_buf.print(gpa, "{d}\n", .{pp.include_depth});
1532
1533 buf.appendAssumeCapacity(try pp.makeGeneratedToken(start, .pp_num, tok));
1534 },
1475 },1535 },
1476 else => buf.appendAssumeCapacity(tok),1536 else => buf.appendAssumeCapacity(tok),
1477 }1537 }
...@@ -1828,7 +1888,11 @@ fn handleBuiltinMacro(pp: *Preprocessor, builtin: Macro.Builtin.Func, param_toks...@@ -1828,7 +1888,11 @@ fn handleBuiltinMacro(pp: *Preprocessor, builtin: Macro.Builtin.Func, param_toks
1828 features.hasFeature(pp.comp, ident_str)1888 features.hasFeature(pp.comp, ident_str)
1829 else1889 else
1830 features.hasExtension(pp.comp, ident_str),1890 features.hasExtension(pp.comp, ident_str),
1831 .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)),1891
1892 .has_builtin => Builtins.fromName(pp.comp, ident_str) != null or
1893 ((pp.comp.langopts.emulate == .no or pp.comp.langopts.emulate == .clang) and
1894 Macro.Builtin.has_builtin_special_cases.has(ident_str)),
1895
1832 .is_target_arch => pp.comp.isTargetArch(ident_str),1896 .is_target_arch => pp.comp.isTargetArch(ident_str),
1833 .is_target_os => pp.comp.isTargetOs(ident_str),1897 .is_target_os => pp.comp.isTargetOs(ident_str),
1834 .is_target_vendor => pp.comp.isTargetVendor(ident_str),1898 .is_target_vendor => pp.comp.isTargetVendor(ident_str),
...@@ -1972,7 +2036,7 @@ fn expandFuncMacro(...@@ -1972,7 +2036,7 @@ fn expandFuncMacro(
1972 },2036 },
1973 .macro_param_no_expand => {2037 .macro_param_no_expand => {
1974 if (tok_i + 1 < func_macro.tokens.len and func_macro.tokens[tok_i + 1].id == .hash_hash) {2038 if (tok_i + 1 < func_macro.tokens.len and func_macro.tokens[tok_i + 1].id == .hash_hash) {
1975 hideset = pp.hideset.get(tokFromRaw(func_macro.tokens[tok_i + 1]).loc);2039 hideset = .none;
1976 }2040 }
1977 const slice = getPasteArgs(args.items[raw.end]);2041 const slice = getPasteArgs(args.items[raw.end]);
1978 const raw_loc = Source.Location{ .id = raw.source, .byte_offset = raw.start, .line = raw.line };2042 const raw_loc = Source.Location{ .id = raw.source, .byte_offset = raw.start, .line = raw.line };
...@@ -1980,7 +2044,7 @@ fn expandFuncMacro(...@@ -1980,7 +2044,7 @@ fn expandFuncMacro(
1980 },2044 },
1981 .macro_param => {2045 .macro_param => {
1982 if (tok_i + 1 < func_macro.tokens.len and func_macro.tokens[tok_i + 1].id == .hash_hash) {2046 if (tok_i + 1 < func_macro.tokens.len and func_macro.tokens[tok_i + 1].id == .hash_hash) {
1983 hideset = pp.hideset.get(tokFromRaw(func_macro.tokens[tok_i + 1]).loc);2047 hideset = .none;
1984 }2048 }
1985 const arg = expanded_args.items[raw.end];2049 const arg = expanded_args.items[raw.end];
1986 const raw_loc = Source.Location{ .id = raw.source, .byte_offset = raw.start, .line = raw.line };2050 const raw_loc = Source.Location{ .id = raw.source, .byte_offset = raw.start, .line = raw.line };
...@@ -2330,9 +2394,10 @@ fn expandFuncMacro(...@@ -2330,9 +2394,10 @@ fn expandFuncMacro(
2330 for (buf.items) |*tok| {2394 for (buf.items) |*tok| {
2331 try tok.addExpansionLocation(gpa, &.{macro_tok.loc});2395 try tok.addExpansionLocation(gpa, &.{macro_tok.loc});
2332 try tok.addExpansionLocation(gpa, macro_expansion_locs);2396 try tok.addExpansionLocation(gpa, macro_expansion_locs);
2333 const tok_hidelist = pp.hideset.get(tok.loc);2397 if (tok.id.shouldTrackHideset(.func)) {
2334 const new_hidelist = try pp.hideset.@"union"(tok_hidelist, hideset);2398 const new_hideset = try pp.hideset.@"union"(pp.hideset.get(tok.loc), hideset);
2335 try pp.hideset.put(tok.loc, new_hidelist);2399 try pp.hideset.put(tok.loc, new_hideset);
2400 }
2336 }2401 }
23372402
2338 return buf;2403 return buf;
...@@ -2698,9 +2763,10 @@ fn expandMacroExhaustive(...@@ -2698,9 +2763,10 @@ fn expandMacroExhaustive(
2698 try tok.addExpansionLocation(gpa, &.{macro_tok.loc});2763 try tok.addExpansionLocation(gpa, &.{macro_tok.loc});
2699 try tok.addExpansionLocation(gpa, macro_expansion_locs);2764 try tok.addExpansionLocation(gpa, macro_expansion_locs);
27002765
2701 const tok_hidelist = pp.hideset.get(tok.loc);2766 if (tok.id.shouldTrackHideset(.obj)) {
2702 const new_hidelist = try pp.hideset.@"union"(tok_hidelist, hs);2767 const new_hideset = try pp.hideset.@"union"(pp.hideset.get(tok.loc), hs);
2703 try pp.hideset.put(tok.loc, new_hidelist);2768 try pp.hideset.put(tok.loc, new_hideset);
2769 }
27042770
2705 if (tok.id == .keyword_defined and eval_ctx == .expr) {2771 if (tok.id == .keyword_defined and eval_ctx == .expr) {
2706 if (macro.is_func) {2772 if (macro.is_func) {
...@@ -2914,7 +2980,10 @@ fn pasteTokens(pp: *Preprocessor, lhs_toks: *ExpandBuf, rhs_toks: []const TokenW...@@ -2914,7 +2980,10 @@ fn pasteTokens(pp: *Preprocessor, lhs_toks: *ExpandBuf, rhs_toks: []const TokenW
2914 .placemarker2980 .placemarker
2915 else2981 else
2916 pasted_token.id;2982 pasted_token.id;
2917 try lhs_toks.append(gpa, try pp.makeGeneratedToken(start, pasted_id, lhs));2983
2984 const hideset = try pp.hideset.intersection(pp.hideset.get(lhs.loc), pp.hideset.get(rhs.loc));
2985 const generated_token = try pp.makeGeneratedTokenExtra(start, pasted_id, lhs, hideset);
2986 try lhs_toks.append(gpa, generated_token);
29182987
2919 if (next.id != .nl and next.id != .eof) {2988 if (next.id != .nl and next.id != .eof) {
2920 try pp.err(lhs, .pasting_formed_invalid, .{pp.comp.generated_buf.items[start..end]});2989 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...@@ -2924,7 +2993,7 @@ fn pasteTokens(pp: *Preprocessor, lhs_toks: *ExpandBuf, rhs_toks: []const TokenW
2924 try bufCopyTokens(gpa, lhs_toks, rhs_toks[rhs_rest..], &.{});2993 try bufCopyTokens(gpa, lhs_toks, rhs_toks[rhs_rest..], &.{});
2925}2994}
29262995
2927fn makeGeneratedToken(pp: *Preprocessor, start: usize, id: Token.Id, source: TokenWithExpansionLocs) !TokenWithExpansionLocs {2996fn makeGeneratedTokenExtra(pp: *Preprocessor, start: usize, id: Token.Id, source: TokenWithExpansionLocs, hideset: Hideset.Index) !TokenWithExpansionLocs {
2928 const gpa = pp.comp.gpa;2997 const gpa = pp.comp.gpa;
2929 var pasted_token = TokenWithExpansionLocs{ .id = id, .loc = .{2998 var pasted_token = TokenWithExpansionLocs{ .id = id, .loc = .{
2930 .id = .generated,2999 .id = .generated,
...@@ -2934,9 +3003,15 @@ fn makeGeneratedToken(pp: *Preprocessor, start: usize, id: Token.Id, source: Tok...@@ -2934,9 +3003,15 @@ fn makeGeneratedToken(pp: *Preprocessor, start: usize, id: Token.Id, source: Tok
2934 pp.generated_line += 1;3003 pp.generated_line += 1;
2935 try pasted_token.addExpansionLocation(gpa, &.{source.loc});3004 try pasted_token.addExpansionLocation(gpa, &.{source.loc});
2936 try pasted_token.addExpansionLocation(gpa, source.expansionSlice());3005 try pasted_token.addExpansionLocation(gpa, source.expansionSlice());
3006 try pp.hideset.put(pasted_token.loc, hideset);
3007
2937 return pasted_token;3008 return pasted_token;
2938}3009}
29393010
3011fn makeGeneratedToken(pp: *Preprocessor, start: usize, id: Token.Id, source: TokenWithExpansionLocs) !TokenWithExpansionLocs {
3012 return pp.makeGeneratedTokenExtra(start, id, source, pp.hideset.get(source.loc));
3013}
3014
2940/// Defines a new macro and warns if it is a duplicate3015/// Defines a new macro and warns if it is a duplicate
2941fn defineMacro(pp: *Preprocessor, define_tok: RawToken, name_tok: TokenWithExpansionLocs, macro: Macro) Error!void {3016fn defineMacro(pp: *Preprocessor, define_tok: RawToken, name_tok: TokenWithExpansionLocs, macro: Macro) Error!void {
2942 const name_str = pp.expandedSlice(name_tok);3017 const name_str = pp.expandedSlice(name_tok);
...@@ -3898,16 +3973,14 @@ test "Preserve pragma tokens sometimes" {...@@ -3898,16 +3973,14 @@ test "Preserve pragma tokens sometimes" {
3898 const gpa = std.testing.allocator;3973 const gpa = std.testing.allocator;
3899 const Test = struct {3974 const Test = struct {
3900 fn runPreprocessor(source_text: []const u8) ![]const u8 {3975 fn runPreprocessor(source_text: []const u8) ![]const u8 {
3901 var arena: std.heap.ArenaAllocator = .init(gpa);
3902 defer arena.deinit();
3903
3904 var diagnostics: Diagnostics = .{ .output = .ignore };3976 var diagnostics: Diagnostics = .{ .output = .ignore };
3905 var comp = Compilation.init(gpa, arena.allocator(), std.testing.io, &diagnostics, Io.Dir.cwd());3977 var comp = try Compilation.init(.testing);
3978 comp.diagnostics = &diagnostics;
3906 defer comp.deinit();3979 defer comp.deinit();
39073980
3908 try comp.addDefaultPragmaHandlers();3981 try comp.addDefaultPragmaHandlers();
39093982
3910 var pp = Preprocessor.init(&comp, .default);3983 var pp = try Preprocessor.init(&comp, .testing);
3911 defer pp.deinit();3984 defer pp.deinit();
39123985
3913 pp.preserve_whitespace = true;3986 pp.preserve_whitespace = true;
...@@ -3966,12 +4039,10 @@ test "destringify" {...@@ -3966,12 +4039,10 @@ test "destringify" {
3966 try std.testing.expectEqualStrings(destringified, pp.char_buf.items);4039 try std.testing.expectEqualStrings(destringified, pp.char_buf.items);
3967 }4040 }
3968 };4041 };
3969 var arena: std.heap.ArenaAllocator = .init(gpa);4042 var comp = try Compilation.init(.testing);
3970 defer arena.deinit();
3971 var diagnostics: Diagnostics = .{ .output = .ignore };
3972 var comp = Compilation.init(gpa, arena.allocator(), std.testing.io, &diagnostics, Io.Dir.cwd());
3973 defer comp.deinit();4043 defer comp.deinit();
3974 var pp = Preprocessor.init(&comp, .default);4044
4045 var pp = try Preprocessor.init(&comp, .testing);
3975 defer pp.deinit();4046 defer pp.deinit();
39764047
3977 try Test.testDestringify(&pp, "hello\tworld\n", "hello\tworld\n");4048 try Test.testDestringify(&pp, "hello\tworld\n", "hello\tworld\n");
...@@ -4026,20 +4097,20 @@ test "Include guards" {...@@ -4026,20 +4097,20 @@ test "Include guards" {
4026 };4097 };
4027 }4098 }
40284099
4029 fn testIncludeGuard(gpa: std.mem.Allocator, comptime template: []const u8, tok_id: RawToken.Id, expected_guards: u32) !void {4100 fn testIncludeGuard(comptime template: []const u8, tok_id: RawToken.Id, expected_guards: u32) !void {
4030 var arena_state: std.heap.ArenaAllocator = .init(gpa);4101 const gpa = std.testing.allocator;
4031 defer arena_state.deinit();
4032 const arena = arena_state.allocator();
40334102
4034 var diagnostics: Diagnostics = .{ .output = .ignore };4103 var diagnostics: Diagnostics = .{ .output = .ignore };
4035 var comp = Compilation.init(gpa, arena, std.testing.io, &diagnostics, Io.Dir.cwd());4104 var comp = try Compilation.init(.testing);
4105 comp.diagnostics = &diagnostics;
4036 defer comp.deinit();4106 defer comp.deinit();
4037 var pp = Preprocessor.init(&comp, .default);4107 var pp = try Preprocessor.init(&comp, .testing);
4038 defer pp.deinit();4108 defer pp.deinit();
40394109
4040 const path = try std.fs.path.join(arena, &.{ ".", "bar.h" });4110 const file_path = try path.join(gpa, &.{ ".", "bar.h" });
4111 defer gpa.free(file_path);
40414112
4042 _ = try comp.addSourceFromBuffer(path, "int bar = 5;\n");4113 _ = try comp.addSourceFromBuffer(file_path, "int bar = 5;\n");
40434114
4044 var buf: std.ArrayList(u8) = .empty;4115 var buf: std.ArrayList(u8) = .empty;
4045 defer buf.deinit(gpa);4116 defer buf.deinit(gpa);
...@@ -4074,14 +4145,14 @@ test "Include guards" {...@@ -4074,14 +4145,14 @@ test "Include guards" {
4074 \\#endif4145 \\#endif
4075 ;4146 ;
4076 const expected_guards: u32 = if (Test.pairsWithIfndef(tag)) 0 else 1;4147 const expected_guards: u32 = if (Test.pairsWithIfndef(tag)) 0 else 1;
4077 try Test.testIncludeGuard(std.testing.allocator, inside_ifndef_template, tag, expected_guards);4148 try Test.testIncludeGuard(inside_ifndef_template, tag, expected_guards);
40784149
4079 const outside_ifndef_template =4150 const outside_ifndef_template =
4080 \\#ifndef FOO4151 \\#ifndef FOO
4081 \\#endif4152 \\#endif
4082 \\#{s}{s}4153 \\#{s}{s}
4083 ;4154 ;
4084 try Test.testIncludeGuard(std.testing.allocator, outside_ifndef_template, tag, 0);4155 try Test.testIncludeGuard(outside_ifndef_template, tag, 0);
4085 }4156 }
4086 }4157 }
4087}4158}
lib/compiler/aro/aro/Preprocessor/Diagnostic.zig+21
...@@ -472,3 +472,24 @@ pub const pragma_once_in_main_file: Diagnostic = .{...@@ -472,3 +472,24 @@ pub const pragma_once_in_main_file: Diagnostic = .{
472 .kind = .warning,472 .kind = .warning,
473 .opt = .@"pragma-once-outside-header",473 .opt = .@"pragma-once-outside-header",
474};474};
475
476pub const file_name_is_clang_extension: Diagnostic = .{
477 .fmt = "__FILE_NAME__ is a clang extension",
478 .opt = .@"file-name-extension",
479 .kind = .off,
480 .extension = true,
481};
482
483pub const base_file_is_clang_extension: Diagnostic = .{
484 .fmt = "__BASE_FILE__ is a clang extension",
485 .opt = .@"base-file-extension",
486 .kind = .off,
487 .extension = true,
488};
489
490pub const include_level_is_clang_extension: Diagnostic = .{
491 .fmt = "__INCLUDE_LEVEL__ is a clang extension",
492 .opt = .@"include-level-extension",
493 .kind = .off,
494 .extension = true,
495};
lib/compiler/aro/aro/Target.zig+17-12
...@@ -229,7 +229,7 @@ pub fn intMaxType(target: *const Target) QualType {...@@ -229,7 +229,7 @@ pub fn intMaxType(target: *const Target) QualType {
229 => return .long,229 => return .long,
230230
231 .x86_64 => switch (target.os.tag) {231 .x86_64 => switch (target.os.tag) {
232 .windows, .openbsd => {},232 .windows, .openbsd, .uefi => {},
233 else => switch (target.abi) {233 else => switch (target.abi) {
234 .gnux32, .muslx32 => {},234 .gnux32, .muslx32 => {},
235 else => return .long,235 else => return .long,
...@@ -546,18 +546,10 @@ pub fn systemCompiler(target: *const Target) LangOpts.Compiler {...@@ -546,18 +546,10 @@ pub fn systemCompiler(target: *const Target) LangOpts.Compiler {
546}546}
547547
548pub fn hasFloat128(target: *const Target) bool {548pub fn hasFloat128(target: *const Target) bool {
549 if (target.cpu.arch.isWasm()) return true;
550 if (target.os.tag.isDarwin()) return false;549 if (target.os.tag.isDarwin()) return false;
551 if (target.cpu.arch.isPowerPC()) return std.Target.powerpc.featureSetHas(target.cpu.features, .float128);550 if (target.os.tag == .windows) return false;
552 return switch (target.os.tag) {551 if (target.cpu.arch.isX86()) return true;
553 .dragonfly,552 return target.cTypeBitSize(.longdouble) == 128;
554 .haiku,
555 .linux,
556 .openbsd,
557 .illumos,
558 => target.cpu.arch.isX86(),
559 else => false,
560 };
561}553}
562554
563pub fn hasInt128(target: *const Target) bool {555pub fn hasInt128(target: *const Target) bool {
...@@ -1238,6 +1230,7 @@ pub fn toLLVMTriple(target: *const Target, buf: []u8) []const u8 {...@@ -1238,6 +1230,7 @@ pub fn toLLVMTriple(target: *const Target, buf: []u8) []const u8 {
1238 .other,1230 .other,
1239 .plan9,1231 .plan9,
1240 .vita,1232 .vita,
1233 .psp,
1241 => "unknown",1234 => "unknown",
1242 };1235 };
1243 writer.writeAll(llvm_os) catch unreachable;1236 writer.writeAll(llvm_os) catch unreachable;
...@@ -1356,6 +1349,18 @@ pub fn isPIEDefault(target: *const Target) DefaultPIStatus {...@@ -1356,6 +1349,18 @@ pub fn isPIEDefault(target: *const Target) DefaultPIStatus {
1356 };1349 };
1357}1350}
13581351
1352pub fn ppcElfVersion(target: *const Target) u32 {
1353 std.debug.assert(target.cpu.arch.isPowerPC());
1354 return switch (target.cpu.arch) {
1355 .powerpc64le => 2,
1356 .powerpc64 => if ((target.os.isAtLeast(.freebsd, .{ .major = 13, .minor = 0, .patch = 0 }) orelse false) or target.os.tag == .openbsd or target.abi.isMusl())
1357 2
1358 else
1359 1,
1360 else => 1,
1361 };
1362}
1363
1359pub fn isPICdefault(target: *const Target) DefaultPIStatus {1364pub fn isPICdefault(target: *const Target) DefaultPIStatus {
1360 return switch (target.os.tag) {1365 return switch (target.os.tag) {
1361 .haiku,1366 .haiku,
lib/compiler/aro/aro/Tokenizer.zig+31-14
...@@ -1,5 +1,4 @@...@@ -1,5 +1,4 @@
1const std = @import("std");1const std = @import("std");
2const Io = std.Io;
3const assert = std.debug.assert;2const assert = std.debug.assert;
43
5const Compilation = @import("Compilation.zig");4const Compilation = @import("Compilation.zig");
...@@ -891,6 +890,14 @@ pub const Token = struct {...@@ -891,6 +890,14 @@ pub const Token = struct {
891 else => false,890 else => false,
892 };891 };
893 }892 }
893
894 pub fn shouldTrackHideset(id: Id, context: enum { func, obj }) bool {
895 return switch (id) {
896 .identifier, .extended_identifier => true,
897 .r_paren => context == .func,
898 else => false,
899 };
900 }
894 };901 };
895902
896 /// double underscore and underscore + capital letter identifiers903 /// double underscore and underscore + capital letter identifiers
...@@ -938,6 +945,18 @@ pub const Token = struct {...@@ -938,6 +945,18 @@ pub const Token = struct {
938 .keyword_unaligned,945 .keyword_unaligned,
939 .keyword_unaligned2,946 .keyword_unaligned2,
940 => if (langopts.ms_extensions) kw else .identifier,947 => if (langopts.ms_extensions) kw else .identifier,
948
949 .keyword_float32,
950 .keyword_float64,
951 .keyword_float128,
952 .keyword_float32x,
953 .keyword_float64x,
954 .keyword_float128x,
955 .keyword_dfloat32,
956 .keyword_dfloat64,
957 .keyword_dfloat128,
958 .keyword_dfloat64x,
959 => if (langopts.emulate == .clang) .identifier else kw,
941 else => kw,960 else => kw,
942 };961 };
943 }962 }
...@@ -2008,11 +2027,11 @@ test "operators" {...@@ -2008,11 +2027,11 @@ test "operators" {
2008test "keywords" {2027test "keywords" {
2009 try expectTokens(2028 try expectTokens(
2010 \\auto __auto_type break case char const continue default do2029 \\auto __auto_type break case char const continue default do
2011 \\double else enum extern float for goto if int 2030 \\double else enum extern float for goto if int
2012 \\long register return short signed sizeof static 2031 \\long register return short signed sizeof static
2013 \\struct switch typedef union unsigned void volatile 2032 \\struct switch typedef union unsigned void volatile
2014 \\while _Bool _Complex _Imaginary inline restrict _Alignas 2033 \\while _Bool _Complex _Imaginary inline restrict _Alignas
2015 \\_Alignof _Atomic _Generic _Noreturn _Static_assert _Thread_local 2034 \\_Alignof _Atomic _Generic _Noreturn _Static_assert _Thread_local
2016 \\__attribute __attribute__2035 \\__attribute __attribute__
2017 \\2036 \\
2018 , &.{2037 , &.{
...@@ -2324,13 +2343,13 @@ test "Universal character names" {...@@ -2324,13 +2343,13 @@ test "Universal character names" {
23242343
2325test "Tokenizer fuzz test" {2344test "Tokenizer fuzz test" {
2326 const Context = struct {2345 const Context = struct {
2327 fn testOne(_: @This(), input_bytes: []const u8) anyerror!void {2346 fn testOne(_: @This(), smith: *std.testing.Smith) anyerror!void {
2328 var arena: std.heap.ArenaAllocator = .init(std.testing.allocator);2347 var comp = try Compilation.init(.testing);
2329 defer arena.deinit();
2330 var comp = Compilation.init(std.testing.allocator, arena.allocator(), std.testing.io, undefined, Io.Dir.cwd());
2331 defer comp.deinit();2348 defer comp.deinit();
23322349
2333 const source = try comp.addSourceFromBuffer("fuzz.c", input_bytes);2350 var buf: [256]u8 = undefined;
2351 const contents_len = smith.slice(&buf);
2352 const source = try comp.addSourceFromBuffer("fuzz.c", buf[0..contents_len]);
23342353
2335 var tokenizer: Tokenizer = .{2354 var tokenizer: Tokenizer = .{
2336 .buf = source.buf,2355 .buf = source.buf,
...@@ -2350,9 +2369,7 @@ test "Tokenizer fuzz test" {...@@ -2350,9 +2369,7 @@ test "Tokenizer fuzz test" {
2350}2369}
23512370
2352fn expectTokensExtra(contents: []const u8, expected_tokens: []const Token.Id, langopts: ?LangOpts) !void {2371fn expectTokensExtra(contents: []const u8, expected_tokens: []const Token.Id, langopts: ?LangOpts) !void {
2353 var arena: std.heap.ArenaAllocator = .init(std.testing.allocator);2372 var comp = try Compilation.init(.testing);
2354 defer arena.deinit();
2355 var comp = Compilation.init(std.testing.allocator, arena.allocator(), std.testing.io, undefined, Io.Dir.cwd());
2356 defer comp.deinit();2373 defer comp.deinit();
2357 if (langopts) |provided| {2374 if (langopts) |provided| {
2358 comp.langopts = provided;2375 comp.langopts = provided;
lib/compiler/aro/aro/Toolchain.zig+4-7
...@@ -495,9 +495,9 @@ pub fn addSystemIncludeDir(tc: *const Toolchain, path: []const u8) !void {...@@ -495,9 +495,9 @@ pub fn addSystemIncludeDir(tc: *const Toolchain, path: []const u8) !void {
495pub fn addBuiltinIncludeDir(tc: *const Toolchain) !void {495pub fn addBuiltinIncludeDir(tc: *const Toolchain) !void {
496 const d = tc.driver;496 const d = tc.driver;
497 const comp = d.comp;497 const comp = d.comp;
498 const io = comp.io;
498 const gpa = comp.gpa;499 const gpa = comp.gpa;
499 const arena = comp.arena;500 const arena = comp.arena;
500 const io = comp.io;
501 try d.includes.ensureUnusedCapacity(gpa, 1);501 try d.includes.ensureUnusedCapacity(gpa, 1);
502 if (d.resource_dir) |resource_dir| {502 if (d.resource_dir) |resource_dir| {
503 const path = try std.fs.path.join(arena, &.{ resource_dir, "include" });503 const path = try std.fs.path.join(arena, &.{ resource_dir, "include" });
...@@ -524,14 +524,12 @@ pub fn addBuiltinIncludeDir(tc: *const Toolchain) !void {...@@ -524,14 +524,12 @@ pub fn addBuiltinIncludeDir(tc: *const Toolchain) !void {
524/// Otherwise returns a slice of `buf`. If the file is larger than `buf` partial contents are returned524/// Otherwise returns a slice of `buf`. If the file is larger than `buf` partial contents are returned
525pub fn readFile(tc: *const Toolchain, path: []const u8, buf: []u8) ?[]const u8 {525pub fn readFile(tc: *const Toolchain, path: []const u8, buf: []u8) ?[]const u8 {
526 const comp = tc.driver.comp;526 const comp = tc.driver.comp;
527 const io = comp.io;527 return comp.cwd.readFile(comp.io, path, buf) catch null;
528 return comp.cwd.readFile(io, path, buf) catch null;
529}528}
530529
531pub fn exists(tc: *const Toolchain, path: []const u8) bool {530pub fn exists(tc: *const Toolchain, path: []const u8) bool {
532 const comp = tc.driver.comp;531 const comp = tc.driver.comp;
533 const io = comp.io;532 comp.cwd.access(comp.io, path, .{}) catch return false;
534 comp.cwd.access(io, path, .{}) catch return false;
535 return true;533 return true;
536}534}
537535
...@@ -549,8 +547,7 @@ pub fn canExecute(tc: *const Toolchain, path: []const u8) bool {...@@ -549,8 +547,7 @@ pub fn canExecute(tc: *const Toolchain, path: []const u8) bool {
549 }547 }
550548
551 const comp = tc.driver.comp;549 const comp = tc.driver.comp;
552 const io = comp.io;550 comp.cwd.access(comp.io, path, .{ .execute = true }) catch return false;
553 comp.cwd.access(io, path, .{ .execute = true }) catch return false;
554 // Todo: ensure path is not a directory551 // Todo: ensure path is not a directory
555 return true;552 return true;
556}553}
lib/compiler/aro/aro/Tree.zig+178-148
...@@ -34,7 +34,7 @@ pub const TokenWithExpansionLocs = struct {...@@ -34,7 +34,7 @@ pub const TokenWithExpansionLocs = struct {
34 expansion_locs: ?[*]Source.Location = null,34 expansion_locs: ?[*]Source.Location = null,
3535
36 pub fn expansionSlice(tok: TokenWithExpansionLocs) []const Source.Location {36 pub fn expansionSlice(tok: TokenWithExpansionLocs) []const Source.Location {
37 const locs = tok.expansion_locs orelse return &[0]Source.Location{};37 const locs = tok.expansion_locs orelse return &.{};
38 var i: usize = 0;38 var i: usize = 0;
39 while (locs[i].id.index != .unused) : (i += 1) {}39 while (locs[i].id.index != .unused) : (i += 1) {}
40 return locs[0..i];40 return locs[0..i];
...@@ -243,6 +243,8 @@ pub const Node = union(enum) {...@@ -243,6 +243,8 @@ pub const Node = union(enum) {
243 builtin_choose_expr: Conditional,243 builtin_choose_expr: Conditional,
244 builtin_convertvector: Convertvector,244 builtin_convertvector: Convertvector,
245 builtin_shufflevector: Shufflevector,245 builtin_shufflevector: Shufflevector,
246 builtin_va_arg_pack: VaArgPack,
247 builtin_va_arg_pack_len: VaArgPack,
246248
247 /// C23 bool literal `true` / `false`249 /// C23 bool literal `true` / `false`
248 bool_literal: Literal,250 bool_literal: Literal,
...@@ -633,6 +635,10 @@ pub const Node = union(enum) {...@@ -633,6 +635,10 @@ pub const Node = union(enum) {
633 indexes: []const Node.Index,635 indexes: []const Node.Index,
634 };636 };
635637
638 pub const VaArgPack = struct {
639 builtin_tok: TokenIndex,
640 };
641
636 pub const Literal = struct {642 pub const Literal = struct {
637 literal_tok: TokenIndex,643 literal_tok: TokenIndex,
638 qt: QualType,644 qt: QualType,
...@@ -1689,6 +1695,16 @@ pub const Node = union(enum) {...@@ -1689,6 +1695,16 @@ pub const Node = union(enum) {
1689 .indexes = @ptrCast(tree.extra.items[node_data[1] + 2 ..][0..node_data[2]]),1695 .indexes = @ptrCast(tree.extra.items[node_data[1] + 2 ..][0..node_data[2]]),
1690 },1696 },
1691 },1697 },
1698 .builtin_va_arg_pack => .{
1699 .builtin_va_arg_pack = .{
1700 .builtin_tok = node_tok,
1701 },
1702 },
1703 .builtin_va_arg_pack_len => .{
1704 .builtin_va_arg_pack_len = .{
1705 .builtin_tok = node_tok,
1706 },
1707 },
1692 .array_init_expr_two => .{1708 .array_init_expr_two => .{
1693 .array_init_expr = .{1709 .array_init_expr = .{
1694 .l_brace_tok = node_tok,1710 .l_brace_tok = node_tok,
...@@ -1797,7 +1813,9 @@ pub const Node = union(enum) {...@@ -1797,7 +1813,9 @@ pub const Node = union(enum) {
1797 .global_asm,1813 .global_asm,
1798 .generic_association_expr,1814 .generic_association_expr,
1799 .generic_default_expr,1815 .generic_default_expr,
1816 .builtin_va_arg_pack,
1800 => null,1817 => null,
1818 .builtin_va_arg_pack_len => .int,
1801 .builtin_types_compatible_p => .int,1819 .builtin_types_compatible_p => .int,
1802 else => {1820 else => {
1803 // If a node is typed the type is stored in data[0].1821 // If a node is typed the type is stored in data[0].
...@@ -1963,6 +1981,8 @@ pub const Node = union(enum) {...@@ -1963,6 +1981,8 @@ pub const Node = union(enum) {
1963 builtin_types_compatible_p,1981 builtin_types_compatible_p,
1964 builtin_convertvector,1982 builtin_convertvector,
1965 builtin_shufflevector,1983 builtin_shufflevector,
1984 builtin_va_arg_pack,
1985 builtin_va_arg_pack_len,
1966 array_init_expr,1986 array_init_expr,
1967 array_init_expr_two,1987 array_init_expr_two,
1968 struct_init_expr,1988 struct_init_expr,
...@@ -2789,6 +2809,14 @@ pub fn setNode(tree: *Tree, node: Node, index: usize) !void {...@@ -2789,6 +2809,14 @@ pub fn setNode(tree: *Tree, node: Node, index: usize) !void {
2789 tree.extra.appendAssumeCapacity(@intFromEnum(builtin.rhs));2809 tree.extra.appendAssumeCapacity(@intFromEnum(builtin.rhs));
2790 tree.extra.appendSliceAssumeCapacity(@ptrCast(builtin.indexes));2810 tree.extra.appendSliceAssumeCapacity(@ptrCast(builtin.indexes));
2791 },2811 },
2812 .builtin_va_arg_pack => |builtin| {
2813 repr.tag = .builtin_va_arg_pack;
2814 repr.tok = builtin.builtin_tok;
2815 },
2816 .builtin_va_arg_pack_len => |builtin| {
2817 repr.tag = .builtin_va_arg_pack_len;
2818 repr.tok = builtin.builtin_tok;
2819 },
2792 .array_init_expr => |init| {2820 .array_init_expr => |init| {
2793 repr.data[0] = @bitCast(init.container_qt);2821 repr.data[0] = @bitCast(init.container_qt);
2794 if (init.items.len > 2) {2822 if (init.items.len > 2) {
...@@ -3000,12 +3028,12 @@ pub fn tokSlice(tree: *const Tree, tok_i: TokenIndex) []const u8 {...@@ -3000,12 +3028,12 @@ pub fn tokSlice(tree: *const Tree, tok_i: TokenIndex) []const u8 {
3000 return tree.comp.locSlice(loc);3028 return tree.comp.locSlice(loc);
3001}3029}
30023030
3003pub fn dump(tree: *const Tree, config: std.Io.tty.Config, w: *std.Io.Writer) std.Io.tty.Config.SetColorError!void {3031pub fn dump(tree: *const Tree, term: std.Io.Terminal) std.Io.Terminal.SetColorError!void {
3004 for (tree.root_decls.items) |i| {3032 for (tree.root_decls.items) |i| {
3005 try tree.dumpNode(i, 0, config, w);3033 try tree.dumpNode(i, 0, term);
3006 try w.writeByte('\n');3034 try term.writer.writeByte('\n');
3007 }3035 }
3008 try w.flush();3036 try term.writer.flush();
3009}3037}
30103038
3011fn dumpFieldAttributes(tree: *const Tree, attributes: []const Attribute, level: u32, w: *std.Io.Writer) !void {3039fn dumpFieldAttributes(tree: *const Tree, attributes: []const Attribute, level: u32, w: *std.Io.Writer) !void {
...@@ -3052,25 +3080,26 @@ fn dumpNode(...@@ -3052,25 +3080,26 @@ fn dumpNode(
3052 tree: *const Tree,3080 tree: *const Tree,
3053 node_index: Node.Index,3081 node_index: Node.Index,
3054 level: u32,3082 level: u32,
3055 config: std.Io.tty.Config,3083 term: std.Io.Terminal,
3056 w: *std.Io.Writer,
3057) !void {3084) !void {
3058 const delta = 2;3085 const delta = 2;
3059 const half = delta / 2;3086 const half = delta / 2;
3060 const TYPE = std.Io.tty.Color.bright_magenta;3087 const TYPE = std.Io.Terminal.Color.bright_magenta;
3061 const TAG = std.Io.tty.Color.bright_cyan;3088 const TAG = std.Io.Terminal.Color.bright_cyan;
3062 const IMPLICIT = std.Io.tty.Color.bright_blue;3089 const IMPLICIT = std.Io.Terminal.Color.bright_blue;
3063 const NAME = std.Io.tty.Color.bright_red;3090 const NAME = std.Io.Terminal.Color.bright_red;
3064 const LITERAL = std.Io.tty.Color.bright_green;3091 const LITERAL = std.Io.Terminal.Color.bright_green;
3065 const ATTRIBUTE = std.Io.tty.Color.bright_yellow;3092 const ATTRIBUTE = std.Io.Terminal.Color.bright_yellow;
3093
3094 const w = term.writer;
30663095
3067 const node = node_index.get(tree);3096 const node = node_index.get(tree);
3068 try w.splatByteAll(' ', level);3097 try w.splatByteAll(' ', level);
30693098
3070 if (config == .no_color) {3099 if (term.mode == .no_color) {
3071 if (node.isImplicit()) try w.writeAll("implicit ");3100 if (node.isImplicit()) try w.writeAll("implicit ");
3072 } else {3101 } else {
3073 try config.setColor(w, if (node.isImplicit()) IMPLICIT else TAG);3102 try term.setColor(if (node.isImplicit()) IMPLICIT else TAG);
3074 }3103 }
3075 try w.print("{s}", .{@tagName(node)});3104 try w.print("{s}", .{@tagName(node)});
30763105
...@@ -3078,36 +3107,36 @@ fn dumpNode(...@@ -3078,36 +3107,36 @@ fn dumpNode(
3078 try w.writeAll(": ");3107 try w.writeAll(": ");
3079 switch (node) {3108 switch (node) {
3080 .cast => |cast| {3109 .cast => |cast| {
3081 try config.setColor(w, .white);3110 try term.setColor(.white);
3082 try w.print("({s}) ", .{@tagName(cast.kind)});3111 try w.print("({s}) ", .{@tagName(cast.kind)});
3083 },3112 },
3084 else => {},3113 else => {},
3085 }3114 }
30863115
3087 try config.setColor(w, TYPE);3116 try term.setColor(TYPE);
3088 try w.writeByte('\'');3117 try w.writeByte('\'');
3089 try qt.dump(tree.comp, w);3118 try qt.dump(tree.comp, w);
3090 try w.writeByte('\'');3119 try w.writeByte('\'');
3091 }3120 }
30923121
3093 if (tree.isLval(node_index)) {3122 if (tree.isLval(node_index)) {
3094 try config.setColor(w, ATTRIBUTE);3123 try term.setColor(ATTRIBUTE);
3095 try w.writeAll(" lvalue");3124 try w.writeAll(" lvalue");
3096 }3125 }
3097 if (tree.isBitfield(node_index)) {3126 if (tree.isBitfield(node_index)) {
3098 try config.setColor(w, ATTRIBUTE);3127 try term.setColor(ATTRIBUTE);
3099 try w.writeAll(" bitfield");3128 try w.writeAll(" bitfield");
3100 }3129 }
3101 if (node == .asm_stmt) {3130 if (node == .asm_stmt) {
3102 const quals = node.asm_stmt.quals;3131 const quals = node.asm_stmt.quals;
3103 try config.setColor(w, ATTRIBUTE);3132 try term.setColor(ATTRIBUTE);
3104 if (quals.@"inline") try w.writeAll(" inline");3133 if (quals.@"inline") try w.writeAll(" inline");
3105 if (quals.@"volatile") try w.writeAll(" volatile");3134 if (quals.@"volatile") try w.writeAll(" volatile");
3106 if (quals.goto) try w.writeAll(" goto");3135 if (quals.goto) try w.writeAll(" goto");
3107 }3136 }
31083137
3109 if (tree.value_map.get(node_index)) |val| {3138 if (tree.value_map.get(node_index)) |val| {
3110 try config.setColor(w, LITERAL);3139 try term.setColor(LITERAL);
3111 try w.writeAll(" (value: ");3140 try w.writeAll(" (value: ");
3112 if (try val.print(node_index.qt(tree), tree.comp, w)) |nested| switch (nested) {3141 if (try val.print(node_index.qt(tree), tree.comp, w)) |nested| switch (nested) {
3113 .pointer => |ptr| {3142 .pointer => |ptr| {
...@@ -3127,15 +3156,15 @@ fn dumpNode(...@@ -3127,15 +3156,15 @@ fn dumpNode(
3127 try w.writeByte(')');3156 try w.writeByte(')');
3128 }3157 }
3129 if (node == .return_stmt and node.return_stmt.operand == .implicit and node.return_stmt.operand.implicit) {3158 if (node == .return_stmt and node.return_stmt.operand == .implicit and node.return_stmt.operand.implicit) {
3130 try config.setColor(w, IMPLICIT);3159 try term.setColor(IMPLICIT);
3131 try w.writeAll(" (value: 0)");3160 try w.writeAll(" (value: 0)");
3132 }3161 }
31333162
3134 try w.writeAll("\n");3163 try w.writeAll("\n");
3135 try config.setColor(w, .reset);3164 try term.setColor(.reset);
31363165
3137 if (node_index.qtOrNull(tree)) |qt| {3166 if (node_index.qtOrNull(tree)) |qt| {
3138 try config.setColor(w, ATTRIBUTE);3167 try term.setColor(ATTRIBUTE);
3139 var it = Attribute.Iterator.initType(qt, tree.comp);3168 var it = Attribute.Iterator.initType(qt, tree.comp);
3140 while (it.next()) |item| {3169 while (it.next()) |item| {
3141 const attr, _ = item;3170 const attr, _ = item;
...@@ -3143,56 +3172,56 @@ fn dumpNode(...@@ -3143,56 +3172,56 @@ fn dumpNode(
3143 try w.print("attr: {s}", .{@tagName(attr.tag)});3172 try w.print("attr: {s}", .{@tagName(attr.tag)});
3144 try tree.dumpAttribute(attr, w);3173 try tree.dumpAttribute(attr, w);
3145 }3174 }
3146 try config.setColor(w, .reset);3175 try term.setColor(.reset);
3147 }3176 }
31483177
3149 switch (node) {3178 switch (node) {
3150 .empty_decl => {},3179 .empty_decl => {},
3151 .global_asm => |@"asm"| {3180 .global_asm => |@"asm"| {
3152 try tree.dumpNode(@"asm".asm_str, level + delta, config, w);3181 try tree.dumpNode(@"asm".asm_str, level + delta, term);
3153 },3182 },
3154 .static_assert => |assert| {3183 .static_assert => |assert| {
3155 try w.splatByteAll(' ', level + 1);3184 try w.splatByteAll(' ', level + 1);
3156 try w.writeAll("condition:\n");3185 try w.writeAll("condition:\n");
3157 try tree.dumpNode(assert.cond, level + delta, config, w);3186 try tree.dumpNode(assert.cond, level + delta, term);
3158 if (assert.message) |some| {3187 if (assert.message) |some| {
3159 try w.splatByteAll(' ', level + 1);3188 try w.splatByteAll(' ', level + 1);
3160 try w.writeAll("diagnostic:\n");3189 try w.writeAll("diagnostic:\n");
3161 try tree.dumpNode(some, level + delta, config, w);3190 try tree.dumpNode(some, level + delta, term);
3162 }3191 }
3163 },3192 },
3164 .function => |function| {3193 .function => |function| {
3165 try w.splatByteAll(' ', level + half);3194 try w.splatByteAll(' ', level + half);
31663195
3167 try config.setColor(w, ATTRIBUTE);3196 try term.setColor(ATTRIBUTE);
3168 if (function.static) try w.writeAll("static ");3197 if (function.static) try w.writeAll("static ");
3169 if (function.@"inline") try w.writeAll("inline ");3198 if (function.@"inline") try w.writeAll("inline ");
31703199
3171 try config.setColor(w, .reset);3200 try term.setColor(.reset);
3172 try w.writeAll("name: ");3201 try w.writeAll("name: ");
3173 try config.setColor(w, NAME);3202 try term.setColor(NAME);
3174 try w.print("{s}\n", .{tree.tokSlice(function.name_tok)});3203 try w.print("{s}\n", .{tree.tokSlice(function.name_tok)});
3175 try config.setColor(w, .reset);3204 try term.setColor(.reset);
31763205
3177 if (function.body) |body| {3206 if (function.body) |body| {
3178 try w.splatByteAll(' ', level + half);3207 try w.splatByteAll(' ', level + half);
3179 try w.writeAll("body:\n");3208 try w.writeAll("body:\n");
3180 try tree.dumpNode(body, level + delta, config, w);3209 try tree.dumpNode(body, level + delta, term);
3181 }3210 }
3182 if (function.definition) |definition| {3211 if (function.definition) |definition| {
3183 try w.splatByteAll(' ', level + half);3212 try w.splatByteAll(' ', level + half);
3184 try w.writeAll("definition: ");3213 try w.writeAll("definition: ");
3185 try config.setColor(w, NAME);3214 try term.setColor(NAME);
3186 try w.print("0x{X}\n", .{@intFromEnum(definition)});3215 try w.print("0x{X}\n", .{@intFromEnum(definition)});
3187 try config.setColor(w, .reset);3216 try term.setColor(.reset);
3188 }3217 }
3189 },3218 },
3190 .typedef => |typedef| {3219 .typedef => |typedef| {
3191 try w.splatByteAll(' ', level + half);3220 try w.splatByteAll(' ', level + half);
3192 try w.writeAll("name: ");3221 try w.writeAll("name: ");
3193 try config.setColor(w, NAME);3222 try term.setColor(NAME);
3194 try w.print("{s}\n", .{tree.tokSlice(typedef.name_tok)});3223 try w.print("{s}\n", .{tree.tokSlice(typedef.name_tok)});
3195 try config.setColor(w, .reset);3224 try term.setColor(.reset);
3196 },3225 },
3197 .param => |param| {3226 .param => |param| {
3198 try w.splatByteAll(' ', level + half);3227 try w.splatByteAll(' ', level + half);
...@@ -3200,21 +3229,21 @@ fn dumpNode(...@@ -3200,21 +3229,21 @@ fn dumpNode(
3200 switch (param.storage_class) {3229 switch (param.storage_class) {
3201 .auto => {},3230 .auto => {},
3202 .register => {3231 .register => {
3203 try config.setColor(w, ATTRIBUTE);3232 try term.setColor(ATTRIBUTE);
3204 try w.writeAll("register ");3233 try w.writeAll("register ");
3205 try config.setColor(w, .reset);3234 try term.setColor(.reset);
3206 },3235 },
3207 }3236 }
32083237
3209 try w.writeAll("name: ");3238 try w.writeAll("name: ");
3210 try config.setColor(w, NAME);3239 try term.setColor(NAME);
3211 try w.print("{s}\n", .{tree.tokSlice(param.name_tok)});3240 try w.print("{s}\n", .{tree.tokSlice(param.name_tok)});
3212 try config.setColor(w, .reset);3241 try term.setColor(.reset);
3213 },3242 },
3214 .variable => |variable| {3243 .variable => |variable| {
3215 try w.splatByteAll(' ', level + half);3244 try w.splatByteAll(' ', level + half);
32163245
3217 try config.setColor(w, ATTRIBUTE);3246 try term.setColor(ATTRIBUTE);
3218 switch (variable.storage_class) {3247 switch (variable.storage_class) {
3219 .auto => {},3248 .auto => {},
3220 .static => try w.writeAll("static "),3249 .static => try w.writeAll("static "),
...@@ -3222,37 +3251,37 @@ fn dumpNode(...@@ -3222,37 +3251,37 @@ fn dumpNode(
3222 .register => try w.writeAll("register "),3251 .register => try w.writeAll("register "),
3223 }3252 }
3224 if (variable.thread_local) try w.writeAll("thread_local ");3253 if (variable.thread_local) try w.writeAll("thread_local ");
3225 try config.setColor(w, .reset);3254 try term.setColor(.reset);
32263255
3227 try w.writeAll("name: ");3256 try w.writeAll("name: ");
3228 try config.setColor(w, NAME);3257 try term.setColor(NAME);
3229 try w.print("{s}\n", .{tree.tokSlice(variable.name_tok)});3258 try w.print("{s}\n", .{tree.tokSlice(variable.name_tok)});
3230 try config.setColor(w, .reset);3259 try term.setColor(.reset);
32313260
3232 if (variable.initializer) |some| {3261 if (variable.initializer) |some| {
3233 try config.setColor(w, .reset);3262 try term.setColor(.reset);
3234 try w.splatByteAll(' ', level + half);3263 try w.splatByteAll(' ', level + half);
3235 try w.writeAll("init:\n");3264 try w.writeAll("init:\n");
3236 try tree.dumpNode(some, level + delta, config, w);3265 try tree.dumpNode(some, level + delta, term);
3237 }3266 }
3238 if (variable.definition) |definition| {3267 if (variable.definition) |definition| {
3239 try w.splatByteAll(' ', level + half);3268 try w.splatByteAll(' ', level + half);
3240 try w.writeAll("definition: ");3269 try w.writeAll("definition: ");
3241 try config.setColor(w, NAME);3270 try term.setColor(NAME);
3242 try w.print("0x{X}\n", .{@intFromEnum(definition)});3271 try w.print("0x{X}\n", .{@intFromEnum(definition)});
3243 try config.setColor(w, .reset);3272 try term.setColor(.reset);
3244 }3273 }
3245 },3274 },
3246 .enum_field => |field| {3275 .enum_field => |field| {
3247 try w.splatByteAll(' ', level + half);3276 try w.splatByteAll(' ', level + half);
3248 try w.writeAll("name: ");3277 try w.writeAll("name: ");
3249 try config.setColor(w, NAME);3278 try term.setColor(NAME);
3250 try w.print("{s}\n", .{tree.tokSlice(field.name_tok)});3279 try w.print("{s}\n", .{tree.tokSlice(field.name_tok)});
3251 try config.setColor(w, .reset);3280 try term.setColor(.reset);
3252 if (field.init) |some| {3281 if (field.init) |some| {
3253 try w.splatByteAll(' ', level + half);3282 try w.splatByteAll(' ', level + half);
3254 try w.writeAll("init:\n");3283 try w.writeAll("init:\n");
3255 try tree.dumpNode(some, level + delta, config, w);3284 try tree.dumpNode(some, level + delta, term);
3256 }3285 }
3257 },3286 },
3258 .record_field => |field| {3287 .record_field => |field| {
...@@ -3260,26 +3289,26 @@ fn dumpNode(...@@ -3260,26 +3289,26 @@ fn dumpNode(
3260 if (name_tok_id == .identifier or name_tok_id == .extended_identifier) {3289 if (name_tok_id == .identifier or name_tok_id == .extended_identifier) {
3261 try w.splatByteAll(' ', level + half);3290 try w.splatByteAll(' ', level + half);
3262 try w.writeAll("name: ");3291 try w.writeAll("name: ");
3263 try config.setColor(w, NAME);3292 try term.setColor(NAME);
3264 try w.print("{s}\n", .{tree.tokSlice(field.name_or_first_tok)});3293 try w.print("{s}\n", .{tree.tokSlice(field.name_or_first_tok)});
3265 try config.setColor(w, .reset);3294 try term.setColor(.reset);
3266 }3295 }
3267 if (field.bit_width) |some| {3296 if (field.bit_width) |some| {
3268 try w.splatByteAll(' ', level + half);3297 try w.splatByteAll(' ', level + half);
3269 try w.writeAll("bits:\n");3298 try w.writeAll("bits:\n");
3270 try tree.dumpNode(some, level + delta, config, w);3299 try tree.dumpNode(some, level + delta, term);
3271 }3300 }
3272 },3301 },
3273 .compound_stmt => |compound| {3302 .compound_stmt => |compound| {
3274 for (compound.body, 0..) |stmt, i| {3303 for (compound.body, 0..) |stmt, i| {
3275 if (i != 0) try w.writeByte('\n');3304 if (i != 0) try w.writeByte('\n');
3276 try tree.dumpNode(stmt, level + delta, config, w);3305 try tree.dumpNode(stmt, level + delta, term);
3277 }3306 }
3278 },3307 },
3279 .enum_decl => |decl| {3308 .enum_decl => |decl| {
3280 for (decl.fields, 0..) |field, i| {3309 for (decl.fields, 0..) |field, i| {
3281 if (i != 0) try w.writeByte('\n');3310 if (i != 0) try w.writeByte('\n');
3282 try tree.dumpNode(field, level + delta, config, w);3311 try tree.dumpNode(field, level + delta, term);
3283 }3312 }
3284 },3313 },
3285 .struct_decl, .union_decl => |decl| {3314 .struct_decl, .union_decl => |decl| {
...@@ -3291,7 +3320,7 @@ fn dumpNode(...@@ -3291,7 +3320,7 @@ fn dumpNode(
3291 var field_i: u32 = 0;3320 var field_i: u32 = 0;
3292 for (decl.fields, 0..) |field_node, i| {3321 for (decl.fields, 0..) |field_node, i| {
3293 if (i != 0) try w.writeByte('\n');3322 if (i != 0) try w.writeByte('\n');
3294 try tree.dumpNode(field_node, level + delta, config, w);3323 try tree.dumpNode(field_node, level + delta, term);
32953324
3296 if (field_node.get(tree) != .record_field) continue;3325 if (field_node.get(tree) != .record_field) continue;
3297 if (fields.len == 0) continue;3326 if (fields.len == 0) continue;
...@@ -3301,32 +3330,32 @@ fn dumpNode(...@@ -3301,32 +3330,32 @@ fn dumpNode(
33013330
3302 if (field_attributes.len == 0) continue;3331 if (field_attributes.len == 0) continue;
33033332
3304 try config.setColor(w, ATTRIBUTE);3333 try term.setColor(ATTRIBUTE);
3305 try tree.dumpFieldAttributes(field_attributes, level + delta + half, w);3334 try tree.dumpFieldAttributes(field_attributes, level + delta + half, w);
3306 try config.setColor(w, .reset);3335 try term.setColor(.reset);
3307 }3336 }
3308 },3337 },
3309 .array_init_expr, .struct_init_expr => |init| {3338 .array_init_expr, .struct_init_expr => |init| {
3310 for (init.items, 0..) |item, i| {3339 for (init.items, 0..) |item, i| {
3311 if (i != 0) try w.writeByte('\n');3340 if (i != 0) try w.writeByte('\n');
3312 try tree.dumpNode(item, level + delta, config, w);3341 try tree.dumpNode(item, level + delta, term);
3313 }3342 }
3314 },3343 },
3315 .union_init_expr => |init| {3344 .union_init_expr => |init| {
3316 try w.splatByteAll(' ', level + half);3345 try w.splatByteAll(' ', level + half);
3317 try w.writeAll("field index: ");3346 try w.writeAll("field index: ");
3318 try config.setColor(w, LITERAL);3347 try term.setColor(LITERAL);
3319 try w.print("{d}\n", .{init.field_index});3348 try w.print("{d}\n", .{init.field_index});
3320 try config.setColor(w, .reset);3349 try term.setColor(.reset);
3321 if (init.initializer) |some| {3350 if (init.initializer) |some| {
3322 try tree.dumpNode(some, level + delta, config, w);3351 try tree.dumpNode(some, level + delta, term);
3323 }3352 }
3324 },3353 },
3325 .compound_literal_expr => |literal| {3354 .compound_literal_expr => |literal| {
3326 if (literal.storage_class != .auto or literal.thread_local) {3355 if (literal.storage_class != .auto or literal.thread_local) {
3327 try w.splatByteAll(' ', level + half - 1);3356 try w.splatByteAll(' ', level + half - 1);
33283357
3329 try config.setColor(w, ATTRIBUTE);3358 try term.setColor(ATTRIBUTE);
3330 switch (literal.storage_class) {3359 switch (literal.storage_class) {
3331 .auto => {},3360 .auto => {},
3332 .static => try w.writeAll(" static"),3361 .static => try w.writeAll(" static"),
...@@ -3334,137 +3363,138 @@ fn dumpNode(...@@ -3334,137 +3363,138 @@ fn dumpNode(
3334 }3363 }
3335 if (literal.thread_local) try w.writeAll(" thread_local");3364 if (literal.thread_local) try w.writeAll(" thread_local");
3336 try w.writeByte('\n');3365 try w.writeByte('\n');
3337 try config.setColor(w, .reset);3366 try term.setColor(.reset);
3338 }3367 }
33393368
3340 try tree.dumpNode(literal.initializer, level + half, config, w);3369 try tree.dumpNode(literal.initializer, level + half, term);
3341 },3370 },
3342 .labeled_stmt => |labeled| {3371 .labeled_stmt => |labeled| {
3343 try w.splatByteAll(' ', level + half);3372 try w.splatByteAll(' ', level + half);
3344 try w.writeAll("label: ");3373 try w.writeAll("label: ");
3345 try config.setColor(w, LITERAL);3374 try term.setColor(LITERAL);
3346 try w.print("{s}\n", .{tree.tokSlice(labeled.label_tok)});3375 try w.print("{s}\n", .{tree.tokSlice(labeled.label_tok)});
33473376
3348 try config.setColor(w, .reset);3377 try term.setColor(.reset);
3349 try w.splatByteAll(' ', level + half);3378 try w.splatByteAll(' ', level + half);
3350 try w.writeAll("stmt:\n");3379 try w.writeAll("stmt:\n");
3351 try tree.dumpNode(labeled.body, level + delta, config, w);3380 try tree.dumpNode(labeled.body, level + delta, term);
3352 },3381 },
3353 .case_stmt => |case| {3382 .case_stmt => |case| {
3354 try w.splatByteAll(' ', level + half);3383 try w.splatByteAll(' ', level + half);
33553384
3356 if (case.end) |some| {3385 if (case.end) |some| {
3357 try w.writeAll("range start:\n");3386 try w.writeAll("range start:\n");
3358 try tree.dumpNode(case.start, level + delta, config, w);3387 try tree.dumpNode(case.start, level + delta, term);
33593388
3360 try w.splatByteAll(' ', level + half);3389 try w.splatByteAll(' ', level + half);
3361 try w.writeAll("range end:\n");3390 try w.writeAll("range end:\n");
3362 try tree.dumpNode(some, level + delta, config, w);3391 try tree.dumpNode(some, level + delta, term);
3363 } else {3392 } else {
3364 try w.writeAll("value:\n");3393 try w.writeAll("value:\n");
3365 try tree.dumpNode(case.start, level + delta, config, w);3394 try tree.dumpNode(case.start, level + delta, term);
3366 }3395 }
33673396
3368 try w.splatByteAll(' ', level + half);3397 try w.splatByteAll(' ', level + half);
3369 try w.writeAll("stmt:\n");3398 try w.writeAll("stmt:\n");
3370 try tree.dumpNode(case.body, level + delta, config, w);3399 try tree.dumpNode(case.body, level + delta, term);
3371 },3400 },
3372 .default_stmt => |default| {3401 .default_stmt => |default| {
3373 try w.splatByteAll(' ', level + half);3402 try w.splatByteAll(' ', level + half);
3374 try w.writeAll("stmt:\n");3403 try w.writeAll("stmt:\n");
3375 try tree.dumpNode(default.body, level + delta, config, w);3404 try tree.dumpNode(default.body, level + delta, term);
3376 },3405 },
3377 .binary_cond_expr, .cond_expr, .builtin_choose_expr => |conditional| {3406 .binary_cond_expr, .cond_expr, .builtin_choose_expr => |conditional| {
3378 try w.splatByteAll(' ', level + half);3407 try w.splatByteAll(' ', level + half);
3379 try w.writeAll("cond:\n");3408 try w.writeAll("cond:\n");
3380 try tree.dumpNode(conditional.cond, level + delta, config, w);3409 try tree.dumpNode(conditional.cond, level + delta, term);
33813410
3382 try w.splatByteAll(' ', level + half);3411 try w.splatByteAll(' ', level + half);
3383 try w.writeAll("then:\n");3412 try w.writeAll("then:\n");
3384 try tree.dumpNode(conditional.then_expr, level + delta, config, w);3413 try tree.dumpNode(conditional.then_expr, level + delta, term);
33853414
3386 try w.splatByteAll(' ', level + half);3415 try w.splatByteAll(' ', level + half);
3387 try w.writeAll("else:\n");3416 try w.writeAll("else:\n");
3388 try tree.dumpNode(conditional.else_expr, level + delta, config, w);3417 try tree.dumpNode(conditional.else_expr, level + delta, term);
3389 },3418 },
3390 .builtin_types_compatible_p => |call| {3419 .builtin_types_compatible_p => |call| {
3391 try w.splatByteAll(' ', level + half);3420 try w.splatByteAll(' ', level + half);
3392 try w.writeAll("lhs: ");3421 try w.writeAll("lhs: ");
3393 try config.setColor(w, TYPE);3422 try term.setColor(TYPE);
3394 try call.lhs.dump(tree.comp, w);3423 try call.lhs.dump(tree.comp, w);
3395 try w.writeByte('\n');3424 try w.writeByte('\n');
3396 try config.setColor(w, .reset);3425 try term.setColor(.reset);
33973426
3398 try w.splatByteAll(' ', level + half);3427 try w.splatByteAll(' ', level + half);
3399 try w.writeAll("rhs: ");3428 try w.writeAll("rhs: ");
3400 try config.setColor(w, TYPE);3429 try term.setColor(TYPE);
3401 try call.rhs.dump(tree.comp, w);3430 try call.rhs.dump(tree.comp, w);
3402 try w.writeByte('\n');3431 try w.writeByte('\n');
3403 try config.setColor(w, .reset);3432 try term.setColor(.reset);
3404 },3433 },
3405 .builtin_convertvector => |convert| {3434 .builtin_convertvector => |convert| {
3406 try w.splatByteAll(' ', level + half);3435 try w.splatByteAll(' ', level + half);
3407 try w.writeAll("operand:\n");3436 try w.writeAll("operand:\n");
3408 try tree.dumpNode(convert.operand, level + delta, config, w);3437 try tree.dumpNode(convert.operand, level + delta, term);
3409 },3438 },
3410 .builtin_shufflevector => |shuffle| {3439 .builtin_shufflevector => |shuffle| {
3411 try w.splatByteAll(' ', level + half);3440 try w.splatByteAll(' ', level + half);
3412 try w.writeAll("lhs:\n");3441 try w.writeAll("lhs:\n");
3413 try tree.dumpNode(shuffle.lhs, level + delta, config, w);3442 try tree.dumpNode(shuffle.lhs, level + delta, term);
34143443
3415 try w.splatByteAll(' ', level + half);3444 try w.splatByteAll(' ', level + half);
3416 try w.writeAll("rhs:\n");3445 try w.writeAll("rhs:\n");
3417 try tree.dumpNode(shuffle.rhs, level + delta, config, w);3446 try tree.dumpNode(shuffle.rhs, level + delta, term);
34183447
3419 if (shuffle.indexes.len > 0) {3448 if (shuffle.indexes.len > 0) {
3420 try w.splatByteAll(' ', level + half);3449 try w.splatByteAll(' ', level + half);
3421 try w.writeAll("indexes:\n");3450 try w.writeAll("indexes:\n");
3422 for (shuffle.indexes) |index| {3451 for (shuffle.indexes) |index| {
3423 try tree.dumpNode(index, level + delta, config, w);3452 try tree.dumpNode(index, level + delta, term);
3424 }3453 }
3425 }3454 }
3426 },3455 },
3456 .builtin_va_arg_pack, .builtin_va_arg_pack_len => {},
3427 .if_stmt => |@"if"| {3457 .if_stmt => |@"if"| {
3428 try w.splatByteAll(' ', level + half);3458 try w.splatByteAll(' ', level + half);
3429 try w.writeAll("cond:\n");3459 try w.writeAll("cond:\n");
3430 try tree.dumpNode(@"if".cond, level + delta, config, w);3460 try tree.dumpNode(@"if".cond, level + delta, term);
34313461
3432 try w.splatByteAll(' ', level + half);3462 try w.splatByteAll(' ', level + half);
3433 try w.writeAll("then:\n");3463 try w.writeAll("then:\n");
3434 try tree.dumpNode(@"if".then_body, level + delta, config, w);3464 try tree.dumpNode(@"if".then_body, level + delta, term);
34353465
3436 if (@"if".else_body) |some| {3466 if (@"if".else_body) |some| {
3437 try w.splatByteAll(' ', level + half);3467 try w.splatByteAll(' ', level + half);
3438 try w.writeAll("else:\n");3468 try w.writeAll("else:\n");
3439 try tree.dumpNode(some, level + delta, config, w);3469 try tree.dumpNode(some, level + delta, term);
3440 }3470 }
3441 },3471 },
3442 .switch_stmt => |@"switch"| {3472 .switch_stmt => |@"switch"| {
3443 try w.splatByteAll(' ', level + half);3473 try w.splatByteAll(' ', level + half);
3444 try w.writeAll("cond:\n");3474 try w.writeAll("cond:\n");
3445 try tree.dumpNode(@"switch".cond, level + delta, config, w);3475 try tree.dumpNode(@"switch".cond, level + delta, term);
34463476
3447 try w.splatByteAll(' ', level + half);3477 try w.splatByteAll(' ', level + half);
3448 try w.writeAll("body:\n");3478 try w.writeAll("body:\n");
3449 try tree.dumpNode(@"switch".body, level + delta, config, w);3479 try tree.dumpNode(@"switch".body, level + delta, term);
3450 },3480 },
3451 .while_stmt => |@"while"| {3481 .while_stmt => |@"while"| {
3452 try w.splatByteAll(' ', level + half);3482 try w.splatByteAll(' ', level + half);
3453 try w.writeAll("cond:\n");3483 try w.writeAll("cond:\n");
3454 try tree.dumpNode(@"while".cond, level + delta, config, w);3484 try tree.dumpNode(@"while".cond, level + delta, term);
34553485
3456 try w.splatByteAll(' ', level + half);3486 try w.splatByteAll(' ', level + half);
3457 try w.writeAll("body:\n");3487 try w.writeAll("body:\n");
3458 try tree.dumpNode(@"while".body, level + delta, config, w);3488 try tree.dumpNode(@"while".body, level + delta, term);
3459 },3489 },
3460 .do_while_stmt => |do| {3490 .do_while_stmt => |do| {
3461 try w.splatByteAll(' ', level + half);3491 try w.splatByteAll(' ', level + half);
3462 try w.writeAll("cond:\n");3492 try w.writeAll("cond:\n");
3463 try tree.dumpNode(do.cond, level + delta, config, w);3493 try tree.dumpNode(do.cond, level + delta, term);
34643494
3465 try w.splatByteAll(' ', level + half);3495 try w.splatByteAll(' ', level + half);
3466 try w.writeAll("body:\n");3496 try w.writeAll("body:\n");
3467 try tree.dumpNode(do.body, level + delta, config, w);3497 try tree.dumpNode(do.body, level + delta, term);
3468 },3498 },
3469 .for_stmt => |@"for"| {3499 .for_stmt => |@"for"| {
3470 switch (@"for".init) {3500 switch (@"for".init) {
...@@ -3472,48 +3502,48 @@ fn dumpNode(...@@ -3472,48 +3502,48 @@ fn dumpNode(
3472 try w.splatByteAll(' ', level + half);3502 try w.splatByteAll(' ', level + half);
3473 try w.writeAll("decl:\n");3503 try w.writeAll("decl:\n");
3474 for (decls) |decl| {3504 for (decls) |decl| {
3475 try tree.dumpNode(decl, level + delta, config, w);3505 try tree.dumpNode(decl, level + delta, term);
3476 try w.writeByte('\n');3506 try w.writeByte('\n');
3477 }3507 }
3478 },3508 },
3479 .expr => |expr| if (expr) |some| {3509 .expr => |expr| if (expr) |some| {
3480 try w.splatByteAll(' ', level + half);3510 try w.splatByteAll(' ', level + half);
3481 try w.writeAll("init:\n");3511 try w.writeAll("init:\n");
3482 try tree.dumpNode(some, level + delta, config, w);3512 try tree.dumpNode(some, level + delta, term);
3483 },3513 },
3484 }3514 }
3485 if (@"for".cond) |some| {3515 if (@"for".cond) |some| {
3486 try w.splatByteAll(' ', level + half);3516 try w.splatByteAll(' ', level + half);
3487 try w.writeAll("cond:\n");3517 try w.writeAll("cond:\n");
3488 try tree.dumpNode(some, level + delta, config, w);3518 try tree.dumpNode(some, level + delta, term);
3489 }3519 }
3490 if (@"for".incr) |some| {3520 if (@"for".incr) |some| {
3491 try w.splatByteAll(' ', level + half);3521 try w.splatByteAll(' ', level + half);
3492 try w.writeAll("incr:\n");3522 try w.writeAll("incr:\n");
3493 try tree.dumpNode(some, level + delta, config, w);3523 try tree.dumpNode(some, level + delta, term);
3494 }3524 }
3495 try w.splatByteAll(' ', level + half);3525 try w.splatByteAll(' ', level + half);
3496 try w.writeAll("body:\n");3526 try w.writeAll("body:\n");
3497 try tree.dumpNode(@"for".body, level + delta, config, w);3527 try tree.dumpNode(@"for".body, level + delta, term);
3498 },3528 },
3499 .addr_of_label => |addr| {3529 .addr_of_label => |addr| {
3500 try w.splatByteAll(' ', level + half);3530 try w.splatByteAll(' ', level + half);
3501 try w.writeAll("label: ");3531 try w.writeAll("label: ");
3502 try config.setColor(w, LITERAL);3532 try term.setColor(LITERAL);
3503 try w.print("{s}\n", .{tree.tokSlice(addr.label_tok)});3533 try w.print("{s}\n", .{tree.tokSlice(addr.label_tok)});
3504 try config.setColor(w, .reset);3534 try term.setColor(.reset);
3505 },3535 },
3506 .goto_stmt => |goto| {3536 .goto_stmt => |goto| {
3507 try w.splatByteAll(' ', level + half);3537 try w.splatByteAll(' ', level + half);
3508 try w.writeAll("label: ");3538 try w.writeAll("label: ");
3509 try config.setColor(w, LITERAL);3539 try term.setColor(LITERAL);
3510 try w.print("{s}\n", .{tree.tokSlice(goto.label_tok)});3540 try w.print("{s}\n", .{tree.tokSlice(goto.label_tok)});
3511 try config.setColor(w, .reset);3541 try term.setColor(.reset);
3512 },3542 },
3513 .computed_goto_stmt => |goto| {3543 .computed_goto_stmt => |goto| {
3514 try w.splatByteAll(' ', level + half);3544 try w.splatByteAll(' ', level + half);
3515 try w.writeAll("expr:\n");3545 try w.writeAll("expr:\n");
3516 try tree.dumpNode(goto.expr, level + delta, config, w);3546 try tree.dumpNode(goto.expr, level + delta, term);
3517 },3547 },
3518 .continue_stmt, .break_stmt, .null_stmt => {},3548 .continue_stmt, .break_stmt, .null_stmt => {},
3519 .return_stmt => |ret| {3549 .return_stmt => |ret| {
...@@ -3521,43 +3551,43 @@ fn dumpNode(...@@ -3521,43 +3551,43 @@ fn dumpNode(
3521 .expr => |expr| {3551 .expr => |expr| {
3522 try w.splatByteAll(' ', level + half);3552 try w.splatByteAll(' ', level + half);
3523 try w.writeAll("expr:\n");3553 try w.writeAll("expr:\n");
3524 try tree.dumpNode(expr, level + delta, config, w);3554 try tree.dumpNode(expr, level + delta, term);
3525 },3555 },
3526 .implicit => {},3556 .implicit => {},
3527 .none => {},3557 .none => {},
3528 }3558 }
3529 },3559 },
3530 .asm_stmt => |@"asm"| {3560 .asm_stmt => |@"asm"| {
3531 try tree.dumpNode(@"asm".asm_str, level + delta, config, w);3561 try tree.dumpNode(@"asm".asm_str, level + delta, term);
35323562
3533 const write_operand = struct {3563 const write_operand = struct {
3534 fn write_operand(3564 fn write_operand(
3535 _w: *std.Io.Writer,
3536 _level: u32,3565 _level: u32,
3537 _config: std.Io.tty.Config,3566 _term: std.Io.Terminal,
3538 _tree: *const Tree,3567 _tree: *const Tree,
3539 operands: []const Node.AsmStmt.Operand,3568 operands: []const Node.AsmStmt.Operand,
3540 ) std.Io.tty.Config.SetColorError!void {3569 ) std.Io.Terminal.SetColorError!void {
3570 const _w = _term.writer;
3541 for (operands) |operand| {3571 for (operands) |operand| {
3542 if (operand.name != 0) {3572 if (operand.name != 0) {
3543 try _w.splatByteAll(' ', _level + delta);3573 try _w.splatByteAll(' ', _level + delta);
3544 try _w.writeAll("asm name: ");3574 try _w.writeAll("asm name: ");
3545 try _config.setColor(_w, NAME);3575 try _term.setColor(NAME);
3546 try _w.writeAll(_tree.tokSlice(operand.name));3576 try _w.writeAll(_tree.tokSlice(operand.name));
3547 try _w.writeByte('\n');3577 try _w.writeByte('\n');
3548 try _config.setColor(_w, .reset);3578 try _term.setColor(.reset);
3549 }3579 }
35503580
3551 try _w.splatByteAll(' ', _level + delta);3581 try _w.splatByteAll(' ', _level + delta);
3552 try _w.writeAll("constraint: ");3582 try _w.writeAll("constraint: ");
3553 const constraint_val = _tree.value_map.get(operand.constraint).?;3583 const constraint_val = _tree.value_map.get(operand.constraint).?;
3554 try _config.setColor(_w, LITERAL);3584 try _term.setColor(LITERAL);
3555 _ = try constraint_val.print(operand.constraint.qt(_tree), _tree.comp, _w);3585 _ = try constraint_val.print(operand.constraint.qt(_tree), _tree.comp, _w);
3556 try _w.writeByte('\n');3586 try _w.writeByte('\n');
35573587
3558 try _tree.dumpNode(operand.expr, _level + delta, _config, _w);3588 try _tree.dumpNode(operand.expr, _level + delta, _term);
3559 }3589 }
3560 try _config.setColor(_w, .reset);3590 try _term.setColor(.reset);
3561 }3591 }
3562 }.write_operand;3592 }.write_operand;
35633593
...@@ -3565,18 +3595,18 @@ fn dumpNode(...@@ -3565,18 +3595,18 @@ fn dumpNode(
3565 try w.splatByteAll(' ', level + half);3595 try w.splatByteAll(' ', level + half);
3566 try w.writeAll("ouputs:\n");3596 try w.writeAll("ouputs:\n");
35673597
3568 try write_operand(w, level, config, tree, @"asm".outputs);3598 try write_operand(level, term, tree, @"asm".outputs);
3569 }3599 }
3570 if (@"asm".inputs.len > 0) {3600 if (@"asm".inputs.len > 0) {
3571 try w.splatByteAll(' ', level + half);3601 try w.splatByteAll(' ', level + half);
3572 try w.writeAll("inputs:\n");3602 try w.writeAll("inputs:\n");
35733603
3574 try write_operand(w, level, config, tree, @"asm".inputs);3604 try write_operand(level, term, tree, @"asm".inputs);
3575 }3605 }
3576 if (@"asm".clobbers.len > 0) {3606 if (@"asm".clobbers.len > 0) {
3577 try w.splatByteAll(' ', level + half);3607 try w.splatByteAll(' ', level + half);
3578 try w.writeAll("clobbers:\n");3608 try w.writeAll("clobbers:\n");
3579 try config.setColor(w, LITERAL);3609 try term.setColor(LITERAL);
3580 for (@"asm".clobbers) |clobber| {3610 for (@"asm".clobbers) |clobber| {
3581 const clobber_val = tree.value_map.get(clobber).?;3611 const clobber_val = tree.value_map.get(clobber).?;
35823612
...@@ -3584,41 +3614,41 @@ fn dumpNode(...@@ -3584,41 +3614,41 @@ fn dumpNode(
3584 _ = try clobber_val.print(clobber.qt(tree), tree.comp, w);3614 _ = try clobber_val.print(clobber.qt(tree), tree.comp, w);
3585 try w.writeByte('\n');3615 try w.writeByte('\n');
3586 }3616 }
3587 try config.setColor(w, .reset);3617 try term.setColor(.reset);
3588 }3618 }
3589 if (@"asm".labels.len > 0) {3619 if (@"asm".labels.len > 0) {
3590 try w.splatByteAll(' ', level + half);3620 try w.splatByteAll(' ', level + half);
3591 try w.writeAll("labels:\n");3621 try w.writeAll("labels:\n");
3592 for (@"asm".labels) |label| {3622 for (@"asm".labels) |label| {
3593 try tree.dumpNode(label, level + delta, config, w);3623 try tree.dumpNode(label, level + delta, term);
3594 }3624 }
3595 }3625 }
3596 },3626 },
3597 .call_expr => |call| {3627 .call_expr => |call| {
3598 try w.splatByteAll(' ', level + half);3628 try w.splatByteAll(' ', level + half);
3599 try w.writeAll("callee:\n");3629 try w.writeAll("callee:\n");
3600 try tree.dumpNode(call.callee, level + delta, config, w);3630 try tree.dumpNode(call.callee, level + delta, term);
36013631
3602 if (call.args.len > 0) {3632 if (call.args.len > 0) {
3603 try w.splatByteAll(' ', level + half);3633 try w.splatByteAll(' ', level + half);
3604 try w.writeAll("args:\n");3634 try w.writeAll("args:\n");
3605 for (call.args) |arg| {3635 for (call.args) |arg| {
3606 try tree.dumpNode(arg, level + delta, config, w);3636 try tree.dumpNode(arg, level + delta, term);
3607 }3637 }
3608 }3638 }
3609 },3639 },
3610 .builtin_call_expr => |call| {3640 .builtin_call_expr => |call| {
3611 try w.splatByteAll(' ', level + half);3641 try w.splatByteAll(' ', level + half);
3612 try w.writeAll("name: ");3642 try w.writeAll("name: ");
3613 try config.setColor(w, NAME);3643 try term.setColor(NAME);
3614 try w.print("{s}\n", .{tree.tokSlice(call.builtin_tok)});3644 try w.print("{s}\n", .{tree.tokSlice(call.builtin_tok)});
3615 try config.setColor(w, .reset);3645 try term.setColor(.reset);
36163646
3617 if (call.args.len > 0) {3647 if (call.args.len > 0) {
3618 try w.splatByteAll(' ', level + half);3648 try w.splatByteAll(' ', level + half);
3619 try w.writeAll("args:\n");3649 try w.writeAll("args:\n");
3620 for (call.args) |arg| {3650 for (call.args) |arg| {
3621 try tree.dumpNode(arg, level + delta, config, w);3651 try tree.dumpNode(arg, level + delta, term);
3622 }3652 }
3623 }3653 }
3624 },3654 },
...@@ -3655,13 +3685,13 @@ fn dumpNode(...@@ -3655,13 +3685,13 @@ fn dumpNode(
3655 => |bin| {3685 => |bin| {
3656 try w.splatByteAll(' ', level + 1);3686 try w.splatByteAll(' ', level + 1);
3657 try w.writeAll("lhs:\n");3687 try w.writeAll("lhs:\n");
3658 try tree.dumpNode(bin.lhs, level + delta, config, w);3688 try tree.dumpNode(bin.lhs, level + delta, term);
36593689
3660 try w.splatByteAll(' ', level + 1);3690 try w.splatByteAll(' ', level + 1);
3661 try w.writeAll("rhs:\n");3691 try w.writeAll("rhs:\n");
3662 try tree.dumpNode(bin.rhs, level + delta, config, w);3692 try tree.dumpNode(bin.rhs, level + delta, term);
3663 },3693 },
3664 .cast => |cast| try tree.dumpNode(cast.operand, level + delta, config, w),3694 .cast => |cast| try tree.dumpNode(cast.operand, level + delta, term),
3665 .addr_of_expr,3695 .addr_of_expr,
3666 .deref_expr,3696 .deref_expr,
3667 .plus_expr,3697 .plus_expr,
...@@ -3680,21 +3710,21 @@ fn dumpNode(...@@ -3680,21 +3710,21 @@ fn dumpNode(
3680 => |un| {3710 => |un| {
3681 try w.splatByteAll(' ', level + 1);3711 try w.splatByteAll(' ', level + 1);
3682 try w.writeAll("operand:\n");3712 try w.writeAll("operand:\n");
3683 try tree.dumpNode(un.operand, level + delta, config, w);3713 try tree.dumpNode(un.operand, level + delta, term);
3684 },3714 },
3685 .decl_ref_expr, .enumeration_ref => |dr| {3715 .decl_ref_expr, .enumeration_ref => |dr| {
3686 try w.splatByteAll(' ', level + 1);3716 try w.splatByteAll(' ', level + 1);
3687 try w.writeAll("name: ");3717 try w.writeAll("name: ");
3688 try config.setColor(w, NAME);3718 try term.setColor(NAME);
3689 try w.print("{s}\n", .{tree.tokSlice(dr.name_tok)});3719 try w.print("{s}\n", .{tree.tokSlice(dr.name_tok)});
3690 try config.setColor(w, .reset);3720 try term.setColor(.reset);
3691 },3721 },
3692 .builtin_ref => |dr| {3722 .builtin_ref => |dr| {
3693 try w.splatByteAll(' ', level + 1);3723 try w.splatByteAll(' ', level + 1);
3694 try w.writeAll("name: ");3724 try w.writeAll("name: ");
3695 try config.setColor(w, NAME);3725 try term.setColor(NAME);
3696 try w.print("{s}\n", .{tree.tokSlice(dr.name_tok)});3726 try w.print("{s}\n", .{tree.tokSlice(dr.name_tok)});
3697 try config.setColor(w, .reset);3727 try term.setColor(.reset);
3698 },3728 },
3699 .bool_literal,3729 .bool_literal,
3700 .nullptr_literal,3730 .nullptr_literal,
...@@ -3706,7 +3736,7 @@ fn dumpNode(...@@ -3706,7 +3736,7 @@ fn dumpNode(
3706 .member_access_expr, .member_access_ptr_expr => |access| {3736 .member_access_expr, .member_access_ptr_expr => |access| {
3707 try w.splatByteAll(' ', level + 1);3737 try w.splatByteAll(' ', level + 1);
3708 try w.writeAll("lhs:\n");3738 try w.writeAll("lhs:\n");
3709 try tree.dumpNode(access.base, level + delta, config, w);3739 try tree.dumpNode(access.base, level + delta, term);
37103740
3711 var base_qt = access.base.qt(tree);3741 var base_qt = access.base.qt(tree);
3712 if (base_qt.get(tree.comp, .pointer)) |some| base_qt = some.child;3742 if (base_qt.get(tree.comp, .pointer)) |some| base_qt = some.child;
...@@ -3714,61 +3744,61 @@ fn dumpNode(...@@ -3714,61 +3744,61 @@ fn dumpNode(
37143744
3715 try w.splatByteAll(' ', level + 1);3745 try w.splatByteAll(' ', level + 1);
3716 try w.writeAll("name: ");3746 try w.writeAll("name: ");
3717 try config.setColor(w, NAME);3747 try term.setColor(NAME);
3718 try w.print("{s}\n", .{fields[access.member_index].name.lookup(tree.comp)});3748 try w.print("{s}\n", .{fields[access.member_index].name.lookup(tree.comp)});
3719 try config.setColor(w, .reset);3749 try term.setColor(.reset);
3720 },3750 },
3721 .array_access_expr => |access| {3751 .array_access_expr => |access| {
3722 try w.splatByteAll(' ', level + 1);3752 try w.splatByteAll(' ', level + 1);
3723 try w.writeAll("base:\n");3753 try w.writeAll("base:\n");
3724 try tree.dumpNode(access.base, level + delta, config, w);3754 try tree.dumpNode(access.base, level + delta, term);
37253755
3726 try w.splatByteAll(' ', level + 1);3756 try w.splatByteAll(' ', level + 1);
3727 try w.writeAll("index:\n");3757 try w.writeAll("index:\n");
3728 try tree.dumpNode(access.index, level + delta, config, w);3758 try tree.dumpNode(access.index, level + delta, term);
3729 },3759 },
3730 .sizeof_expr, .alignof_expr => |type_info| {3760 .sizeof_expr, .alignof_expr => |type_info| {
3731 if (type_info.expr) |some| {3761 if (type_info.expr) |some| {
3732 try w.splatByteAll(' ', level + 1);3762 try w.splatByteAll(' ', level + 1);
3733 try w.writeAll("expr:\n");3763 try w.writeAll("expr:\n");
3734 try tree.dumpNode(some, level + delta, config, w);3764 try tree.dumpNode(some, level + delta, term);
3735 } else {3765 } else {
3736 try w.splatByteAll(' ', level + half);3766 try w.splatByteAll(' ', level + half);
3737 try w.writeAll("operand type: ");3767 try w.writeAll("operand type: ");
3738 try config.setColor(w, TYPE);3768 try term.setColor(TYPE);
3739 try type_info.operand_qt.dump(tree.comp, w);3769 try type_info.operand_qt.dump(tree.comp, w);
3740 try w.writeByte('\n');3770 try w.writeByte('\n');
3741 try config.setColor(w, .reset);3771 try term.setColor(.reset);
3742 }3772 }
3743 },3773 },
3744 .generic_expr => |generic| {3774 .generic_expr => |generic| {
3745 try w.splatByteAll(' ', level + 1);3775 try w.splatByteAll(' ', level + 1);
3746 try w.writeAll("controlling:\n");3776 try w.writeAll("controlling:\n");
3747 try tree.dumpNode(generic.controlling, level + delta, config, w);3777 try tree.dumpNode(generic.controlling, level + delta, term);
3748 try w.splatByteAll(' ', level + 1);3778 try w.splatByteAll(' ', level + 1);
3749 try w.writeAll("chosen:\n");3779 try w.writeAll("chosen:\n");
3750 try tree.dumpNode(generic.chosen, level + delta, config, w);3780 try tree.dumpNode(generic.chosen, level + delta, term);
37513781
3752 if (generic.rest.len > 0) {3782 if (generic.rest.len > 0) {
3753 try w.splatByteAll(' ', level + 1);3783 try w.splatByteAll(' ', level + 1);
3754 try w.writeAll("rest:\n");3784 try w.writeAll("rest:\n");
3755 for (generic.rest) |expr| {3785 for (generic.rest) |expr| {
3756 try tree.dumpNode(expr, level + delta, config, w);3786 try tree.dumpNode(expr, level + delta, term);
3757 }3787 }
3758 }3788 }
3759 },3789 },
3760 .generic_association_expr => |assoc| {3790 .generic_association_expr => |assoc| {
3761 try tree.dumpNode(assoc.expr, level + delta, config, w);3791 try tree.dumpNode(assoc.expr, level + delta, term);
3762 },3792 },
3763 .generic_default_expr => |default| {3793 .generic_default_expr => |default| {
3764 try tree.dumpNode(default.expr, level + delta, config, w);3794 try tree.dumpNode(default.expr, level + delta, term);
3765 },3795 },
3766 .array_filler_expr => |filler| {3796 .array_filler_expr => |filler| {
3767 try w.splatByteAll(' ', level + 1);3797 try w.splatByteAll(' ', level + 1);
3768 try w.writeAll("count: ");3798 try w.writeAll("count: ");
3769 try config.setColor(w, LITERAL);3799 try term.setColor(LITERAL);
3770 try w.print("{d}\n", .{filler.count});3800 try w.print("{d}\n", .{filler.count});
3771 try config.setColor(w, .reset);3801 try term.setColor(.reset);
3772 },3802 },
3773 .struct_forward_decl,3803 .struct_forward_decl,
3774 .union_forward_decl,3804 .union_forward_decl,
lib/compiler/aro/aro/TypeStore.zig+82-24
...@@ -219,9 +219,9 @@ pub const QualType = packed struct(u32) {...@@ -219,9 +219,9 @@ pub const QualType = packed struct(u32) {
219 .float_dfloat64 => return .{ .float = .dfloat64 },219 .float_dfloat64 => return .{ .float = .dfloat64 },
220 .float_dfloat128 => return .{ .float = .dfloat128 },220 .float_dfloat128 => return .{ .float = .dfloat128 },
221 .float_dfloat64x => return .{ .float = .dfloat64x },221 .float_dfloat64x => return .{ .float = .dfloat64x },
222 .void_pointer => return .{ .pointer = .{ .child = .void, .decayed = null } },222 .void_pointer => return .{ .pointer = .{ .child = .void } },
223 .char_pointer => return .{ .pointer = .{ .child = .char, .decayed = null } },223 .char_pointer => return .{ .pointer = .{ .child = .char } },
224 .int_pointer => return .{ .pointer = .{ .child = .int, .decayed = null } },224 .int_pointer => return .{ .pointer = .{ .child = .int } },
225225
226 else => {},226 else => {},
227 }227 }
...@@ -280,7 +280,7 @@ pub const QualType = packed struct(u32) {...@@ -280,7 +280,7 @@ pub const QualType = packed struct(u32) {
280 },280 },
281 .pointer => .{ .pointer = .{281 .pointer => .{ .pointer = .{
282 .child = @bitCast(repr.data[0]),282 .child = @bitCast(repr.data[0]),
283 .decayed = null,283 .bounds = @enumFromInt(repr.data[1]),
284 } },284 } },
285 .pointer_decayed => .{ .pointer = .{285 .pointer_decayed => .{ .pointer = .{
286 .child = @bitCast(repr.data[0]),286 .child = @bitCast(repr.data[0]),
...@@ -800,7 +800,6 @@ pub const QualType = packed struct(u32) {...@@ -800,7 +800,6 @@ pub const QualType = packed struct(u32) {
800800
801 return comp.type_store.put(comp.gpa, .{ .pointer = .{801 return comp.type_store.put(comp.gpa, .{ .pointer = .{
802 .child = qt,802 .child = qt,
803 .decayed = null,
804 } });803 } });
805 },804 },
806 else => return qt,805 else => return qt,
...@@ -1013,6 +1012,15 @@ pub const QualType = packed struct(u32) {...@@ -1013,6 +1012,15 @@ pub const QualType = packed struct(u32) {
1013 return qt.scalarKind(comp).isPointer();1012 return qt.scalarKind(comp).isPointer();
1014 }1013 }
10151014
1015 /// Function or function pointer
1016 pub fn isCallable(qt: QualType, comp: *const Compilation) bool {
1017 return switch (qt.base(comp).type) {
1018 .func => true,
1019 .pointer => |ptr| ptr.child.is(comp, .func),
1020 else => false,
1021 };
1022 }
1023
1016 pub fn eqlQualified(a_qt: QualType, b_qt: QualType, comp: *const Compilation) bool {1024 pub fn eqlQualified(a_qt: QualType, b_qt: QualType, comp: *const Compilation) bool {
1017 if (a_qt.@"const" != b_qt.@"const") return false;1025 if (a_qt.@"const" != b_qt.@"const") return false;
1018 if (a_qt.@"volatile" != b_qt.@"volatile") return false;1026 if (a_qt.@"volatile" != b_qt.@"volatile") return false;
...@@ -1632,7 +1640,25 @@ pub const Type = union(enum) {...@@ -1632,7 +1640,25 @@ pub const Type = union(enum) {
16321640
1633 pub const Pointer = struct {1641 pub const Pointer = struct {
1634 child: QualType,1642 child: QualType,
1635 decayed: ?QualType,1643 decayed: ?QualType = null,
1644 bounds: Bounds = .c,
1645
1646 pub const Bounds = enum {
1647 /// C pointer with no bounds attribute
1648 c,
1649 /// No pointer arithmetic or non-zero indexing
1650 single,
1651 /// Explicitly specified as a traditional C pointer
1652 unsafe_indexable,
1653
1654 pub fn fromTag(tag: Attribute.Tag) Bounds {
1655 return switch (tag) {
1656 .single => .single,
1657 .unsafe_indexable => .unsafe_indexable,
1658 else => unreachable,
1659 };
1660 }
1661 };
1636 };1662 };
16371663
1638 pub const Array = struct {1664 pub const Array = struct {
...@@ -1784,6 +1810,7 @@ attributes: std.ArrayList(Attribute) = .empty,...@@ -1784,6 +1810,7 @@ attributes: std.ArrayList(Attribute) = .empty,
1784anon_name_arena: std.heap.ArenaAllocator.State = .{},1810anon_name_arena: std.heap.ArenaAllocator.State = .{},
17851811
1786wchar: QualType = .invalid,1812wchar: QualType = .invalid,
1813wint: QualType = .invalid,
1787uint_least16_t: QualType = .invalid,1814uint_least16_t: QualType = .invalid,
1788uint_least32_t: QualType = .invalid,1815uint_least32_t: QualType = .invalid,
1789ptrdiff: QualType = .invalid,1816ptrdiff: QualType = .invalid,
...@@ -1918,10 +1945,12 @@ pub fn set(ts: *TypeStore, gpa: std.mem.Allocator, ty: Type, index: usize) !void...@@ -1918,10 +1945,12 @@ pub fn set(ts: *TypeStore, gpa: std.mem.Allocator, ty: Type, index: usize) !void
1918 .pointer => |pointer| {1945 .pointer => |pointer| {
1919 repr.data[0] = @bitCast(pointer.child);1946 repr.data[0] = @bitCast(pointer.child);
1920 if (pointer.decayed) |array| {1947 if (pointer.decayed) |array| {
1948 std.debug.assert(pointer.bounds == .c);
1921 repr.tag = .pointer_decayed;1949 repr.tag = .pointer_decayed;
1922 repr.data[1] = @bitCast(array);1950 repr.data[1] = @bitCast(array);
1923 } else {1951 } else {
1924 repr.tag = .pointer;1952 repr.tag = .pointer;
1953 repr.data[1] = @intFromEnum(pointer.bounds);
1925 }1954 }
1926 },1955 },
1927 .array => |array| {1956 .array => |array| {
...@@ -2070,17 +2099,44 @@ pub fn set(ts: *TypeStore, gpa: std.mem.Allocator, ty: Type, index: usize) !void...@@ -2070,17 +2099,44 @@ pub fn set(ts: *TypeStore, gpa: std.mem.Allocator, ty: Type, index: usize) !void
20702099
2071pub fn initNamedTypes(ts: *TypeStore, comp: *Compilation) !void {2100pub fn initNamedTypes(ts: *TypeStore, comp: *Compilation) !void {
2072 const os = comp.target.os.tag;2101 const os = comp.target.os.tag;
2073 ts.wchar = switch (comp.target.cpu.arch) {2102 const arch = comp.target.cpu.arch;
2074 .xcore => .uchar,2103 ts.wchar = switch (os) {
2075 .ve, .msp430 => .uint,2104 .openbsd, .netbsd => .int,
2076 .arm, .armeb, .thumb, .thumbeb => if (os != .windows and os != .netbsd and os != .openbsd) .uint else .int,2105 .ps4, .ps5 => .ushort,
2077 .aarch64, .aarch64_be => if (!os.isDarwin() and os != .netbsd) .uint else .int,2106 .uefi => .ushort,
2078 .x86_64, .x86 => if (os == .windows) .ushort else .int,2107 .windows => .ushort,
2079 else => .int,2108 .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => .int,
2109 else => switch (arch) {
2110 .aarch64, .aarch64_be => .uint,
2111 .arm, .armeb, .thumb, .thumbeb => .uint,
2112 .ve, .msp430 => .uint,
2113 .x86_64, .x86 => .int,
2114 .xcore => .uchar,
2115 else => .int,
2116 },
2117 };
2118
2119 ts.wint = switch (os) {
2120 .fuchsia => .uint,
2121 .linux => .uint,
2122 .openbsd => .int,
2123 .uefi => .ushort,
2124 .windows => .ushort,
2125 else => switch (arch) {
2126 .csky => .uint,
2127 .loongarch32, .loongarch64 => .uint,
2128 .riscv32, .riscv32be, .riscv64, .riscv64be => .uint,
2129 .ve => .uint,
2130 .xcore => .uint,
2131 .xtensa, .xtensaeb => .uint,
2132 else => .int,
2133 },
2080 };2134 };
20812135
2082 const ptr_width = comp.target.ptrBitWidth();2136 const ptr_width = comp.target.ptrBitWidth();
2083 ts.ptrdiff = if (os == .windows and ptr_width == 64)2137 ts.ptrdiff = if (arch == .wasm32)
2138 .long
2139 else if (os == .windows and ptr_width == 64)
2084 .long_long2140 .long_long
2085 else switch (ptr_width) {2141 else switch (ptr_width) {
2086 16 => .int,2142 16 => .int,
...@@ -2089,7 +2145,9 @@ pub fn initNamedTypes(ts: *TypeStore, comp: *Compilation) !void {...@@ -2089,7 +2145,9 @@ pub fn initNamedTypes(ts: *TypeStore, comp: *Compilation) !void {
2089 else => unreachable,2145 else => unreachable,
2090 };2146 };
20912147
2092 ts.size = if (os == .windows and ptr_width == 64)2148 ts.size = if (arch == .wasm32)
2149 .ulong
2150 else if (os == .windows and ptr_width == 64)
2093 .ulong_long2151 .ulong_long
2094 else switch (ptr_width) {2152 else switch (ptr_width) {
2095 16 => .uint,2153 16 => .uint,
...@@ -2206,9 +2264,9 @@ fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType {...@@ -2206,9 +2264,9 @@ fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType {
2206 };2264 };
22072265
2208 const struct_qt = switch (kind) {2266 const struct_qt = switch (kind) {
2209 .aarch64_va_list => blk: {2267 .aarch64_va_list => {
2210 var record: Type.Record = .{2268 var record: Type.Record = .{
2211 .name = try comp.internString("__va_list_tag"),2269 .name = try comp.internString("__va_list"),
2212 .decl_node = undefined, // TODO2270 .decl_node = undefined, // TODO
2213 .layout = null,2271 .layout = null,
2214 .fields = &.{},2272 .fields = &.{},
...@@ -2226,11 +2284,11 @@ fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType {...@@ -2226,11 +2284,11 @@ fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType {
2226 record.layout = record_layout.compute(&fields, qt, comp, null) catch unreachable;2284 record.layout = record_layout.compute(&fields, qt, comp, null) catch unreachable;
2227 try ts.set(comp.gpa, .{ .@"struct" = record }, @intFromEnum(qt._index));2285 try ts.set(comp.gpa, .{ .@"struct" = record }, @intFromEnum(qt._index));
22282286
2229 break :blk qt;2287 return qt;
2230 },2288 },
2231 .arm_va_list => blk: {2289 .arm_va_list => {
2232 var record: Type.Record = .{2290 var record: Type.Record = .{
2233 .name = try comp.internString("__va_list_tag"),2291 .name = try comp.internString("__va_list"),
2234 .decl_node = undefined, // TODO2292 .decl_node = undefined, // TODO
2235 .layout = null,2293 .layout = null,
2236 .fields = &.{},2294 .fields = &.{},
...@@ -2244,7 +2302,7 @@ fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType {...@@ -2244,7 +2302,7 @@ fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType {
2244 record.layout = record_layout.compute(&fields, qt, comp, null) catch unreachable;2302 record.layout = record_layout.compute(&fields, qt, comp, null) catch unreachable;
2245 try ts.set(comp.gpa, .{ .@"struct" = record }, @intFromEnum(qt._index));2303 try ts.set(comp.gpa, .{ .@"struct" = record }, @intFromEnum(qt._index));
22462304
2247 break :blk qt;2305 return qt;
2248 },2306 },
2249 .hexagon_va_list => blk: {2307 .hexagon_va_list => blk: {
2250 var record: Type.Record = .{2308 var record: Type.Record = .{
...@@ -2330,7 +2388,7 @@ fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType {...@@ -2330,7 +2388,7 @@ fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType {
23302388
2331 break :blk qt;2389 break :blk qt;
2332 },2390 },
2333 .xtensa_va_list => blk: {2391 .xtensa_va_list => {
2334 var record: Type.Record = .{2392 var record: Type.Record = .{
2335 .name = try comp.internString("__va_list_tag"),2393 .name = try comp.internString("__va_list_tag"),
2336 .decl_node = undefined, // TODO2394 .decl_node = undefined, // TODO
...@@ -2348,7 +2406,7 @@ fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType {...@@ -2348,7 +2406,7 @@ fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType {
2348 record.layout = record_layout.compute(&fields, qt, comp, null) catch unreachable;2406 record.layout = record_layout.compute(&fields, qt, comp, null) catch unreachable;
2349 try ts.set(comp.gpa, .{ .@"struct" = record }, @intFromEnum(qt._index));2407 try ts.set(comp.gpa, .{ .@"struct" = record }, @intFromEnum(qt._index));
23502408
2351 break :blk qt;2409 return qt;
2352 },2410 },
2353 };2411 };
23542412
...@@ -2830,7 +2888,7 @@ pub const Builder = struct {...@@ -2830,7 +2888,7 @@ pub const Builder = struct {
2830 }2888 }
28312889
2832 fn duplicateSpec(b: *Builder, source_tok: TokenIndex, spec: []const u8) !void {2890 fn duplicateSpec(b: *Builder, source_tok: TokenIndex, spec: []const u8) !void {
2833 if (b.parser.comp.langopts.emulate != .clang) return b.cannotCombine(source_tok);2891 if (b.parser.comp.langopts.emulate == .gcc) return b.cannotCombine(source_tok);
2834 try b.parser.err(b.parser.tok_i, .duplicate_decl_spec, .{spec});2892 try b.parser.err(b.parser.tok_i, .duplicate_decl_spec, .{spec});
2835 }2893 }
28362894
lib/compiler/aro/aro/Value.zig+13-17
...@@ -1,5 +1,4 @@...@@ -1,5 +1,4 @@
1const std = @import("std");1const std = @import("std");
2const Io = std.Io;
3const assert = std.debug.assert;2const assert = std.debug.assert;
4const BigIntConst = std.math.big.int.Const;3const BigIntConst = std.math.big.int.Const;
5const BigIntMutable = std.math.big.int.Mutable;4const BigIntMutable = std.math.big.int.Mutable;
...@@ -9,8 +8,8 @@ const BigIntSpace = Interner.Tag.Int.BigIntSpace;...@@ -9,8 +8,8 @@ const BigIntSpace = Interner.Tag.Int.BigIntSpace;
98
10const annex_g = @import("annex_g.zig");9const annex_g = @import("annex_g.zig");
11const Compilation = @import("Compilation.zig");10const Compilation = @import("Compilation.zig");
12const Target = @import("Target.zig");
13const QualType = @import("TypeStore.zig").QualType;11const QualType = @import("TypeStore.zig").QualType;
12const Target = @import("Target.zig");
1413
15const Value = @This();14const Value = @This();
1615
...@@ -77,11 +76,7 @@ test "minUnsignedBits" {...@@ -77,11 +76,7 @@ test "minUnsignedBits" {
77 }76 }
78 };77 };
7978
80 var arena_state: std.heap.ArenaAllocator = .init(std.testing.allocator);79 var comp = try Compilation.init(.testing);
81 defer arena_state.deinit();
82 const arena = arena_state.allocator();
83
84 var comp = Compilation.init(std.testing.allocator, arena, std.testing.io, undefined, Io.Dir.cwd());
85 defer comp.deinit();80 defer comp.deinit();
86 const target_query = try std.Target.Query.parse(.{ .arch_os_abi = "x86_64-linux-gnu" });81 const target_query = try std.Target.Query.parse(.{ .arch_os_abi = "x86_64-linux-gnu" });
87 comp.target = .fromZigTarget(try std.zig.system.resolveTargetQuery(std.testing.io, target_query));82 comp.target = .fromZigTarget(try std.zig.system.resolveTargetQuery(std.testing.io, target_query));
...@@ -116,11 +111,7 @@ test "minSignedBits" {...@@ -116,11 +111,7 @@ test "minSignedBits" {
116 }111 }
117 };112 };
118113
119 var arena_state: std.heap.ArenaAllocator = .init(std.testing.allocator);114 var comp = try Compilation.init(.testing);
120 defer arena_state.deinit();
121 const arena = arena_state.allocator();
122
123 var comp = Compilation.init(std.testing.allocator, arena, std.testing.io, undefined, Io.Dir.cwd());
124 defer comp.deinit();115 defer comp.deinit();
125 const target_query = try std.Target.Query.parse(.{ .arch_os_abi = "x86_64-linux-gnu" });116 const target_query = try std.Target.Query.parse(.{ .arch_os_abi = "x86_64-linux-gnu" });
126 comp.target = .fromZigTarget(try std.zig.system.resolveTargetQuery(std.testing.io, target_query));117 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 {...@@ -465,6 +456,11 @@ pub fn isNan(v: Value, comp: *const Compilation) bool {
465 };456 };
466}457}
467458
459pub fn isPointer(v: Value, comp: *const Compilation) bool {
460 if (v.opt_ref == .none) return false;
461 return comp.interner.get(v.ref()) == .pointer;
462}
463
468/// Converts value to zero or one;464/// Converts value to zero or one;
469/// `.none` value remains unchanged.465/// `.none` value remains unchanged.
470pub fn boolCast(v: *Value, comp: *const Compilation) void {466pub fn boolCast(v: *Value, comp: *const Compilation) void {
...@@ -1044,9 +1040,9 @@ fn twosCompIntLimit(limit: std.math.big.int.TwosCompIntLimit, qt: QualType, comp...@@ -1044,9 +1040,9 @@ fn twosCompIntLimit(limit: std.math.big.int.TwosCompIntLimit, qt: QualType, comp
1044 const mag_bits: usize = @intCast(qt.bitSizeof(comp));1040 const mag_bits: usize = @intCast(qt.bitSizeof(comp));
1045 switch (mag_bits) {1041 switch (mag_bits) {
1046 inline 8, 16, 32, 64 => |bits| {1042 inline 8, 16, 32, 64 => |bits| {
1047 if (limit == .min) return Value.int(@as(i64, std.math.minInt(std.meta.Int(.signed, bits))), comp);1043 if (limit == .min) return Value.int(@as(i64, std.math.minInt(@Int(.signed, bits))), comp);
1048 return switch (signedness) {1044 return switch (signedness) {
1049 inline else => |sign| Value.int(std.math.maxInt(std.meta.Int(sign, bits)), comp),1045 inline else => |sign| Value.int(std.math.maxInt(@Int(sign, bits)), comp),
1050 };1046 };
1051 },1047 },
1052 else => {},1048 else => {},
...@@ -1081,7 +1077,7 @@ const NestedPrint = union(enum) {...@@ -1081,7 +1077,7 @@ const NestedPrint = union(enum) {
1081 },1077 },
1082};1078};
10831079
1084pub fn printPointer(offset: Value, base: []const u8, comp: *const Compilation, w: *Io.Writer) Io.Writer.Error!void {1080pub fn printPointer(offset: Value, base: []const u8, comp: *const Compilation, w: *std.Io.Writer) std.Io.Writer.Error!void {
1085 try w.writeByte('&');1081 try w.writeByte('&');
1086 try w.writeAll(base);1082 try w.writeAll(base);
1087 if (!offset.isZero(comp)) {1083 if (!offset.isZero(comp)) {
...@@ -1090,7 +1086,7 @@ pub fn printPointer(offset: Value, base: []const u8, comp: *const Compilation, w...@@ -1090,7 +1086,7 @@ pub fn printPointer(offset: Value, base: []const u8, comp: *const Compilation, w
1090 }1086 }
1091}1087}
10921088
1093pub fn print(v: Value, qt: QualType, comp: *const Compilation, w: *Io.Writer) Io.Writer.Error!?NestedPrint {1089pub fn print(v: Value, qt: QualType, comp: *const Compilation, w: *std.Io.Writer) std.Io.Writer.Error!?NestedPrint {
1094 if (qt.is(comp, .bool)) {1090 if (qt.is(comp, .bool)) {
1095 try w.writeAll(if (v.isZero(comp)) "false" else "true");1091 try w.writeAll(if (v.isZero(comp)) "false" else "true");
1096 return null;1092 return null;
...@@ -1117,7 +1113,7 @@ pub fn print(v: Value, qt: QualType, comp: *const Compilation, w: *Io.Writer) Io...@@ -1117,7 +1113,7 @@ pub fn print(v: Value, qt: QualType, comp: *const Compilation, w: *Io.Writer) Io
1117 return null;1113 return null;
1118}1114}
11191115
1120pub fn printString(bytes: []const u8, qt: QualType, comp: *const Compilation, w: *Io.Writer) Io.Writer.Error!void {1116pub fn printString(bytes: []const u8, qt: QualType, comp: *const Compilation, w: *std.Io.Writer) std.Io.Writer.Error!void {
1121 const size: Compilation.CharUnitSize = @enumFromInt(qt.childType(comp).sizeof(comp));1117 const size: Compilation.CharUnitSize = @enumFromInt(qt.childType(comp).sizeof(comp));
1122 const without_null = bytes[0 .. bytes.len - @intFromEnum(size)];1118 const without_null = bytes[0 .. bytes.len - @intFromEnum(size)];
1123 try w.writeByte('"');1119 try w.writeByte('"');
lib/compiler/aro/aro/features.zig+1
...@@ -44,6 +44,7 @@ pub fn hasFeature(comp: *Compilation, ext: []const u8) bool {...@@ -44,6 +44,7 @@ pub fn hasFeature(comp: *Compilation, ext: []const u8) bool {
44 .c_generic_selections = comp.langopts.standard.atLeast(.c11),44 .c_generic_selections = comp.langopts.standard.atLeast(.c11),
45 .c_static_assert = comp.langopts.standard.atLeast(.c11),45 .c_static_assert = comp.langopts.standard.atLeast(.c11),
46 .c_thread_local = comp.langopts.standard.atLeast(.c11) and comp.target.isTlsSupported(),46 .c_thread_local = comp.langopts.standard.atLeast(.c11) and comp.target.isTlsSupported(),
47 .bounds_attributes = comp.langopts.bounds_safety == .clang,
47 };48 };
48 inline for (@typeInfo(@TypeOf(list)).@"struct".fields) |f| {49 inline for (@typeInfo(@TypeOf(list)).@"struct".fields) |f| {
49 if (std.mem.eql(u8, f.name, ext)) return @field(list, f.name);50 if (std.mem.eql(u8, f.name, ext)) return @field(list, f.name);
lib/compiler/aro/aro/pragmas/once.zig-1
...@@ -35,7 +35,6 @@ fn deinit(pragma: *Pragma, comp: *Compilation) void {...@@ -35,7 +35,6 @@ fn deinit(pragma: *Pragma, comp: *Compilation) void {
35 var self: *Once = @fieldParentPtr("pragma", pragma);35 var self: *Once = @fieldParentPtr("pragma", pragma);
36 self.pragma_once.deinit(comp.gpa);36 self.pragma_once.deinit(comp.gpa);
37 comp.gpa.destroy(self);37 comp.gpa.destroy(self);
38 pragma.* = undefined;
39}38}
4039
41fn preprocessorHandler(pragma: *Pragma, pp: *Preprocessor, start_idx: TokenIndex) Pragma.Error!void {40fn preprocessorHandler(pragma: *Pragma, pp: *Preprocessor, start_idx: TokenIndex) Pragma.Error!void {
lib/compiler/aro/aro/record_layout.zig+3-3
...@@ -332,7 +332,7 @@ const SysVContext = struct {...@@ -332,7 +332,7 @@ const SysVContext = struct {
332 }332 }
333 }333 }
334 } else {334 } else {
335 std.debug.assert(self.comp.langopts.emulate == .clang);335 std.debug.assert(self.comp.langopts.emulate == .no or self.comp.langopts.emulate == .clang);
336336
337 // On Clang, the alignment requested by annotations is not respected if it is337 // On Clang, the alignment requested by annotations is not respected if it is
338 // larger than the value of #pragma pack. See test case 0083.338 // larger than the value of #pragma pack. See test case 0083.
...@@ -569,7 +569,7 @@ const MsvcContext = struct {...@@ -569,7 +569,7 @@ const MsvcContext = struct {
569569
570pub fn compute(fields: []Type.Record.Field, qt: QualType, comp: *const Compilation, pragma_pack: ?u8) Error!Type.Record.Layout {570pub fn compute(fields: []Type.Record.Field, qt: QualType, comp: *const Compilation, pragma_pack: ?u8) Error!Type.Record.Layout {
571 switch (comp.langopts.emulate) {571 switch (comp.langopts.emulate) {
572 .gcc, .clang => {572 .no, .gcc, .clang => {
573 var context = SysVContext.init(qt, comp, pragma_pack);573 var context = SysVContext.init(qt, comp, pragma_pack);
574574
575 try context.layoutFields(fields);575 try context.layoutFields(fields);
...@@ -620,7 +620,7 @@ fn computeLayout(qt: QualType, comp: *const Compilation) RecordLayout {...@@ -620,7 +620,7 @@ fn computeLayout(qt: QualType, comp: *const Compilation) RecordLayout {
620 else => {620 else => {
621 const type_align = qt.alignof(comp) * BITS_PER_BYTE;621 const type_align = qt.alignof(comp) * BITS_PER_BYTE;
622 return .{622 return .{
623 .size_bits = qt.bitSizeofOrNull(comp) orelse 0,623 .size_bits = BITS_PER_BYTE * (qt.sizeofOrNull(comp) orelse 0),
624 .pointer_alignment_bits = type_align,624 .pointer_alignment_bits = type_align,
625 .field_alignment_bits = type_align,625 .field_alignment_bits = type_align,
626 .required_alignment_bits = BITS_PER_BYTE,626 .required_alignment_bits = BITS_PER_BYTE,
lib/compiler/aro/assembly_backend/x86_64.zig+3-4
...@@ -5,15 +5,14 @@ const assert = std.debug.assert;...@@ -5,15 +5,14 @@ const assert = std.debug.assert;
5const aro = @import("aro");5const aro = @import("aro");
6const Assembly = aro.Assembly;6const Assembly = aro.Assembly;
7const Compilation = aro.Compilation;7const Compilation = aro.Compilation;
8const Node = Tree.Node;
9const Source = aro.Source;8const Source = aro.Source;
10const Tree = aro.Tree;9const Tree = aro.Tree;
11const QualType = aro.QualType;10const QualType = aro.QualType;
12const Value = aro.Value;11const Value = aro.Value;
13
14const AsmCodeGen = @This();
15const Error = aro.Compilation.Error;12const Error = aro.Compilation.Error;
13const Node = Tree.Node;
1614
15const AsmCodeGen = @This();
17tree: *const Tree,16tree: *const Tree,
18comp: *Compilation,17comp: *Compilation,
19text: *std.Io.Writer,18text: *std.Io.Writer,
...@@ -58,7 +57,7 @@ fn serializeFloat(comptime T: type, value: T, w: *std.Io.Writer) !void {...@@ -58,7 +57,7 @@ fn serializeFloat(comptime T: type, value: T, w: *std.Io.Writer) !void {
58 },57 },
59 else => {58 else => {
60 const size = @bitSizeOf(T);59 const size = @bitSizeOf(T);
61 const storage_unit = std.enums.fromInt(StorageUnit, size).?;60 const storage_unit = std.enums.fromInt(StorageUnit, size) orelse unreachable;
62 const IntTy = @Int(.unsigned, size);61 const IntTy = @Int(.unsigned, size);
63 const int_val: IntTy = @bitCast(value);62 const int_val: IntTy = @bitCast(value);
64 return serializeInt(int_val, storage_unit, w);63 return serializeInt(int_val, storage_unit, w);
lib/compiler/aro/backend/Assembly.zig+1-2
...@@ -1,5 +1,4 @@...@@ -1,5 +1,4 @@
1const std = @import("std");1const std = @import("std");
2const Io = std.Io;
3const Allocator = std.mem.Allocator;2const Allocator = std.mem.Allocator;
43
5data: []const u8,4data: []const u8,
...@@ -12,7 +11,7 @@ pub fn deinit(self: *const Assembly, gpa: Allocator) void {...@@ -12,7 +11,7 @@ pub fn deinit(self: *const Assembly, gpa: Allocator) void {
12 gpa.free(self.text);11 gpa.free(self.text);
13}12}
1413
15pub fn writeToFile(self: Assembly, io: Io, file: Io.File) !void {14pub fn writeToFile(self: Assembly, io: std.Io, file: std.Io.File) !void {
16 var file_writer = file.writer(io, &.{});15 var file_writer = file.writer(io, &.{});
1716
18 var buffers = [_][]const u8{ self.data, self.text };17 var buffers = [_][]const u8{ self.data, self.text };
lib/compiler/aro/backend/Interner.zig+2-2
...@@ -102,13 +102,13 @@ pub const Key = union(enum) {...@@ -102,13 +102,13 @@ pub const Key = union(enum) {
102 .float => |repr| switch (repr) {102 .float => |repr| switch (repr) {
103 inline else => |data| std.hash.autoHash(103 inline else => |data| std.hash.autoHash(
104 &hasher,104 &hasher,
105 @as(std.meta.Int(.unsigned, @bitSizeOf(@TypeOf(data))), @bitCast(data)),105 @as(@Int(.unsigned, @bitSizeOf(@TypeOf(data))), @bitCast(data)),
106 ),106 ),
107 },107 },
108 .complex => |repr| switch (repr) {108 .complex => |repr| switch (repr) {
109 inline else => |data| std.hash.autoHash(109 inline else => |data| std.hash.autoHash(
110 &hasher,110 &hasher,
111 @as(std.meta.Int(.unsigned, @bitSizeOf(@TypeOf(data))), @bitCast(data)),111 @as(@Int(.unsigned, @bitSizeOf(@TypeOf(data))), @bitCast(data)),
112 ),112 ),
113 },113 },
114 .int => |repr| {114 .int => |repr| {
lib/compiler/aro/backend/Ir.zig+100-92
...@@ -374,24 +374,27 @@ pub fn deinit(ir: *Ir, gpa: std.mem.Allocator) void {...@@ -374,24 +374,27 @@ pub fn deinit(ir: *Ir, gpa: std.mem.Allocator) void {
374 ir.* = undefined;374 ir.* = undefined;
375}375}
376376
377const TYPE = std.Io.tty.Color.bright_magenta;377const TYPE = std.Io.Terminal.Color.bright_magenta;
378const INST = std.Io.tty.Color.bright_cyan;378const INST = std.Io.Terminal.Color.bright_cyan;
379const REF = std.Io.tty.Color.bright_blue;379const REF = std.Io.Terminal.Color.bright_blue;
380const LITERAL = std.Io.tty.Color.bright_green;380const LITERAL = std.Io.Terminal.Color.bright_green;
381const ATTRIBUTE = std.Io.tty.Color.bright_yellow;381const ATTRIBUTE = std.Io.Terminal.Color.bright_yellow;
382382
383const RefMap = std.AutoArrayHashMapUnmanaged(Ref, void);383const RefMap = std.AutoArrayHashMapUnmanaged(Ref, void);
384384
385pub fn dump(ir: *const Ir, gpa: Allocator, config: std.Io.tty.Config, w: *std.Io.Writer) !void {385pub const DumpError = std.Io.Terminal.SetColorError || std.mem.Allocator.Error;
386
387pub fn dump(ir: *const Ir, gpa: Allocator, term: std.Io.Terminal) DumpError!void {
386 for (ir.decls.keys(), ir.decls.values()) |name, *decl| {388 for (ir.decls.keys(), ir.decls.values()) |name, *decl| {
387 try ir.dumpDecl(decl, gpa, name, config, w);389 try ir.dumpDecl(decl, gpa, name, term);
388 }390 }
389 try w.flush();391 try term.writer.flush();
390}392}
391393
392fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8, config: std.Io.tty.Config, w: *std.Io.Writer) !void {394fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8, term: std.Io.Terminal) !void {
393 const tags = decl.instructions.items(.tag);395 const tags = decl.instructions.items(.tag);
394 const data = decl.instructions.items(.data);396 const data = decl.instructions.items(.data);
397 const w = term.writer;
395398
396 var ref_map: RefMap = .empty;399 var ref_map: RefMap = .empty;
397 defer ref_map.deinit(gpa);400 defer ref_map.deinit(gpa);
...@@ -402,10 +405,10 @@ fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8,...@@ -402,10 +405,10 @@ fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8,
402 const ret_inst = decl.body.items[decl.body.items.len - 1];405 const ret_inst = decl.body.items[decl.body.items.len - 1];
403 const ret_operand = data[@intFromEnum(ret_inst)].un;406 const ret_operand = data[@intFromEnum(ret_inst)].un;
404 const ret_ty = decl.instructions.items(.ty)[@intFromEnum(ret_operand)];407 const ret_ty = decl.instructions.items(.ty)[@intFromEnum(ret_operand)];
405 try ir.writeType(ret_ty, config, w);408 try ir.writeType(ret_ty, term);
406 try config.setColor(w, REF);409 try term.setColor(REF);
407 try w.print(" @{s}", .{name});410 try w.print(" @{s}", .{name});
408 try config.setColor(w, .reset);411 try term.setColor(.reset);
409 try w.writeAll("(");412 try w.writeAll("(");
410413
411 var arg_count: u32 = 0;414 var arg_count: u32 = 0;
...@@ -414,8 +417,8 @@ fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8,...@@ -414,8 +417,8 @@ fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8,
414 if (tags[@intFromEnum(ref)] != .arg) break;417 if (tags[@intFromEnum(ref)] != .arg) break;
415 if (arg_count != 0) try w.writeAll(", ");418 if (arg_count != 0) try w.writeAll(", ");
416 try ref_map.put(gpa, ref, {});419 try ref_map.put(gpa, ref, {});
417 try ir.writeRef(decl, &ref_map, ref, config, w);420 try ir.writeRef(decl, &ref_map, ref, term);
418 try config.setColor(w, .reset);421 try term.setColor(.reset);
419 }422 }
420 try w.writeAll(") {\n");423 try w.writeAll(") {\n");
421 for (decl.body.items[arg_count..]) |ref| {424 for (decl.body.items[arg_count..]) |ref| {
...@@ -432,7 +435,7 @@ fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8,...@@ -432,7 +435,7 @@ fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8,
432 .arg, .constant, .symbol => unreachable,435 .arg, .constant, .symbol => unreachable,
433 .label => {436 .label => {
434 const label_index = label_map.getIndex(ref).?;437 const label_index = label_map.getIndex(ref).?;
435 try config.setColor(w, REF);438 try term.setColor(REF);
436 try w.print("{s}.{d}:\n", .{ data[i].label, label_index });439 try w.print("{s}.{d}:\n", .{ data[i].label, label_index });
437 },440 },
438 // .label_val => {441 // .label_val => {
...@@ -441,35 +444,35 @@ fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8,...@@ -441,35 +444,35 @@ fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8,
441 // },444 // },
442 .jmp => {445 .jmp => {
443 const un = data[i].un;446 const un = data[i].un;
444 try config.setColor(w, INST);447 try term.setColor(INST);
445 try w.writeAll(" jmp ");448 try w.writeAll(" jmp ");
446 try writeLabel(decl, &label_map, un, config, w);449 try writeLabel(decl, &label_map, un, term);
447 try w.writeByte('\n');450 try w.writeByte('\n');
448 },451 },
449 .branch => {452 .branch => {
450 const br = data[i].branch;453 const br = data[i].branch;
451 try config.setColor(w, INST);454 try term.setColor(INST);
452 try w.writeAll(" branch ");455 try w.writeAll(" branch ");
453 try ir.writeRef(decl, &ref_map, br.cond, config, w);456 try ir.writeRef(decl, &ref_map, br.cond, term);
454 try config.setColor(w, .reset);457 try term.setColor(.reset);
455 try w.writeAll(", ");458 try w.writeAll(", ");
456 try writeLabel(decl, &label_map, br.then, config, w);459 try writeLabel(decl, &label_map, br.then, term);
457 try config.setColor(w, .reset);460 try term.setColor(.reset);
458 try w.writeAll(", ");461 try w.writeAll(", ");
459 try writeLabel(decl, &label_map, br.@"else", config, w);462 try writeLabel(decl, &label_map, br.@"else", term);
460 try w.writeByte('\n');463 try w.writeByte('\n');
461 },464 },
462 .select => {465 .select => {
463 const br = data[i].branch;466 const br = data[i].branch;
464 try ir.writeNewRef(gpa, decl, &ref_map, ref, config, w);467 try ir.writeNewRef(gpa, decl, &ref_map, ref, term);
465 try w.writeAll("select ");468 try w.writeAll("select ");
466 try ir.writeRef(decl, &ref_map, br.cond, config, w);469 try ir.writeRef(decl, &ref_map, br.cond, term);
467 try config.setColor(w, .reset);470 try term.setColor(.reset);
468 try w.writeAll(", ");471 try w.writeAll(", ");
469 try ir.writeRef(decl, &ref_map, br.then, config, w);472 try ir.writeRef(decl, &ref_map, br.then, term);
470 try config.setColor(w, .reset);473 try term.setColor(.reset);
471 try w.writeAll(", ");474 try w.writeAll(", ");
472 try ir.writeRef(decl, &ref_map, br.@"else", config, w);475 try ir.writeRef(decl, &ref_map, br.@"else", term);
473 try w.writeByte('\n');476 try w.writeByte('\n');
474 },477 },
475 // .jmp_val => {478 // .jmp_val => {
...@@ -478,91 +481,91 @@ fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8,...@@ -478,91 +481,91 @@ fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8,
478 // },481 // },
479 .@"switch" => {482 .@"switch" => {
480 const @"switch" = data[i].@"switch";483 const @"switch" = data[i].@"switch";
481 try config.setColor(w, INST);484 try term.setColor(INST);
482 try w.writeAll(" switch ");485 try w.writeAll(" switch ");
483 try ir.writeRef(decl, &ref_map, @"switch".target, config, w);486 try ir.writeRef(decl, &ref_map, @"switch".target, term);
484 try config.setColor(w, .reset);487 try term.setColor(.reset);
485 try w.writeAll(" {");488 try w.writeAll(" {");
486 for (@"switch".case_vals[0..@"switch".cases_len], @"switch".case_labels) |val_ref, label_ref| {489 for (@"switch".case_vals[0..@"switch".cases_len], @"switch".case_labels) |val_ref, label_ref| {
487 try w.writeAll("\n ");490 try w.writeAll("\n ");
488 try ir.writeValue(val_ref, config, w);491 try ir.writeValue(val_ref, term);
489 try config.setColor(w, .reset);492 try term.setColor(.reset);
490 try w.writeAll(" => ");493 try w.writeAll(" => ");
491 try writeLabel(decl, &label_map, label_ref, config, w);494 try writeLabel(decl, &label_map, label_ref, term);
492 try config.setColor(w, .reset);495 try term.setColor(.reset);
493 }496 }
494 try config.setColor(w, LITERAL);497 try term.setColor(LITERAL);
495 try w.writeAll("\n default ");498 try w.writeAll("\n default ");
496 try config.setColor(w, .reset);499 try term.setColor(.reset);
497 try w.writeAll("=> ");500 try w.writeAll("=> ");
498 try writeLabel(decl, &label_map, @"switch".default, config, w);501 try writeLabel(decl, &label_map, @"switch".default, term);
499 try config.setColor(w, .reset);502 try term.setColor(.reset);
500 try w.writeAll("\n }\n");503 try w.writeAll("\n }\n");
501 },504 },
502 .call => {505 .call => {
503 const call = data[i].call;506 const call = data[i].call;
504 try ir.writeNewRef(gpa, decl, &ref_map, ref, config, w);507 try ir.writeNewRef(gpa, decl, &ref_map, ref, term);
505 try w.writeAll("call ");508 try w.writeAll("call ");
506 try ir.writeRef(decl, &ref_map, call.func, config, w);509 try ir.writeRef(decl, &ref_map, call.func, term);
507 try config.setColor(w, .reset);510 try term.setColor(.reset);
508 try w.writeAll("(");511 try w.writeAll("(");
509 for (call.args(), 0..) |arg, arg_i| {512 for (call.args(), 0..) |arg, arg_i| {
510 if (arg_i != 0) try w.writeAll(", ");513 if (arg_i != 0) try w.writeAll(", ");
511 try ir.writeRef(decl, &ref_map, arg, config, w);514 try ir.writeRef(decl, &ref_map, arg, term);
512 try config.setColor(w, .reset);515 try term.setColor(.reset);
513 }516 }
514 try w.writeAll(")\n");517 try w.writeAll(")\n");
515 },518 },
516 .alloc => {519 .alloc => {
517 const alloc = data[i].alloc;520 const alloc = data[i].alloc;
518 try ir.writeNewRef(gpa, decl, &ref_map, ref, config, w);521 try ir.writeNewRef(gpa, decl, &ref_map, ref, term);
519 try w.writeAll("alloc ");522 try w.writeAll("alloc ");
520 try config.setColor(w, ATTRIBUTE);523 try term.setColor(ATTRIBUTE);
521 try w.writeAll("size ");524 try w.writeAll("size ");
522 try config.setColor(w, LITERAL);525 try term.setColor(LITERAL);
523 try w.print("{d}", .{alloc.size});526 try w.print("{d}", .{alloc.size});
524 try config.setColor(w, ATTRIBUTE);527 try term.setColor(ATTRIBUTE);
525 try w.writeAll(" align ");528 try w.writeAll(" align ");
526 try config.setColor(w, LITERAL);529 try term.setColor(LITERAL);
527 try w.print("{d}", .{alloc.@"align"});530 try w.print("{d}", .{alloc.@"align"});
528 try w.writeByte('\n');531 try w.writeByte('\n');
529 },532 },
530 .phi => {533 .phi => {
531 try ir.writeNewRef(gpa, decl, &ref_map, ref, config, w);534 try ir.writeNewRef(gpa, decl, &ref_map, ref, term);
532 try w.writeAll("phi");535 try w.writeAll("phi");
533 try config.setColor(w, .reset);536 try term.setColor(.reset);
534 try w.writeAll(" {");537 try w.writeAll(" {");
535 for (data[i].phi.inputs()) |input| {538 for (data[i].phi.inputs()) |input| {
536 try w.writeAll("\n ");539 try w.writeAll("\n ");
537 try writeLabel(decl, &label_map, input.label, config, w);540 try writeLabel(decl, &label_map, input.label, term);
538 try config.setColor(w, .reset);541 try term.setColor(.reset);
539 try w.writeAll(" => ");542 try w.writeAll(" => ");
540 try ir.writeRef(decl, &ref_map, input.value, config, w);543 try ir.writeRef(decl, &ref_map, input.value, term);
541 try config.setColor(w, .reset);544 try term.setColor(.reset);
542 }545 }
543 try config.setColor(w, .reset);546 try term.setColor(.reset);
544 try w.writeAll("\n }\n");547 try w.writeAll("\n }\n");
545 },548 },
546 .store => {549 .store => {
547 const bin = data[i].bin;550 const bin = data[i].bin;
548 try config.setColor(w, INST);551 try term.setColor(INST);
549 try w.writeAll(" store ");552 try w.writeAll(" store ");
550 try ir.writeRef(decl, &ref_map, bin.lhs, config, w);553 try ir.writeRef(decl, &ref_map, bin.lhs, term);
551 try config.setColor(w, .reset);554 try term.setColor(.reset);
552 try w.writeAll(", ");555 try w.writeAll(", ");
553 try ir.writeRef(decl, &ref_map, bin.rhs, config, w);556 try ir.writeRef(decl, &ref_map, bin.rhs, term);
554 try w.writeByte('\n');557 try w.writeByte('\n');
555 },558 },
556 .ret => {559 .ret => {
557 try config.setColor(w, INST);560 try term.setColor(INST);
558 try w.writeAll(" ret ");561 try w.writeAll(" ret ");
559 if (data[i].un != .none) try ir.writeRef(decl, &ref_map, data[i].un, config, w);562 if (data[i].un != .none) try ir.writeRef(decl, &ref_map, data[i].un, term);
560 try w.writeByte('\n');563 try w.writeByte('\n');
561 },564 },
562 .load => {565 .load => {
563 try ir.writeNewRef(gpa, decl, &ref_map, ref, config, w);566 try ir.writeNewRef(gpa, decl, &ref_map, ref, term);
564 try w.writeAll("load ");567 try w.writeAll("load ");
565 try ir.writeRef(decl, &ref_map, data[i].un, config, w);568 try ir.writeRef(decl, &ref_map, data[i].un, term);
566 try w.writeByte('\n');569 try w.writeByte('\n');
567 },570 },
568 .bit_or,571 .bit_or,
...@@ -583,12 +586,12 @@ fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8,...@@ -583,12 +586,12 @@ fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8,
583 .mod,586 .mod,
584 => {587 => {
585 const bin = data[i].bin;588 const bin = data[i].bin;
586 try ir.writeNewRef(gpa, decl, &ref_map, ref, config, w);589 try ir.writeNewRef(gpa, decl, &ref_map, ref, term);
587 try w.print("{s} ", .{@tagName(tag)});590 try w.print("{s} ", .{@tagName(tag)});
588 try ir.writeRef(decl, &ref_map, bin.lhs, config, w);591 try ir.writeRef(decl, &ref_map, bin.lhs, term);
589 try config.setColor(w, .reset);592 try term.setColor(.reset);
590 try w.writeAll(", ");593 try w.writeAll(", ");
591 try ir.writeRef(decl, &ref_map, bin.rhs, config, w);594 try ir.writeRef(decl, &ref_map, bin.rhs, term);
592 try w.writeByte('\n');595 try w.writeByte('\n');
593 },596 },
594 .bit_not,597 .bit_not,
...@@ -598,33 +601,34 @@ fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8,...@@ -598,33 +601,34 @@ fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8,
598 .sext,601 .sext,
599 => {602 => {
600 const un = data[i].un;603 const un = data[i].un;
601 try ir.writeNewRef(gpa, decl, &ref_map, ref, config, w);604 try ir.writeNewRef(gpa, decl, &ref_map, ref, term);
602 try w.print("{s} ", .{@tagName(tag)});605 try w.print("{s} ", .{@tagName(tag)});
603 try ir.writeRef(decl, &ref_map, un, config, w);606 try ir.writeRef(decl, &ref_map, un, term);
604 try w.writeByte('\n');607 try w.writeByte('\n');
605 },608 },
606 .label_addr, .jmp_val => {},609 .label_addr, .jmp_val => {},
607 }610 }
608 }611 }
609 try config.setColor(w, .reset);612 try term.setColor(.reset);
610 try w.writeAll("}\n\n");613 try w.writeAll("}\n\n");
611}614}
612615
613fn writeType(ir: Ir, ty_ref: Interner.Ref, config: std.Io.tty.Config, w: *std.Io.Writer) !void {616fn writeType(ir: Ir, ty_ref: Interner.Ref, term: std.Io.Terminal) !void {
617 const w = term.writer;
614 const ty = ir.interner.get(ty_ref);618 const ty = ir.interner.get(ty_ref);
615 try config.setColor(w, TYPE);619 try term.setColor(TYPE);
616 switch (ty) {620 switch (ty) {
617 .ptr_ty, .noreturn_ty, .void_ty, .func_ty => try w.writeAll(@tagName(ty)),621 .ptr_ty, .noreturn_ty, .void_ty, .func_ty => try w.writeAll(@tagName(ty)),
618 .int_ty => |bits| try w.print("i{d}", .{bits}),622 .int_ty => |bits| try w.print("i{d}", .{bits}),
619 .float_ty => |bits| try w.print("f{d}", .{bits}),623 .float_ty => |bits| try w.print("f{d}", .{bits}),
620 .array_ty => |info| {624 .array_ty => |info| {
621 try w.print("[{d} * ", .{info.len});625 try w.print("[{d} * ", .{info.len});
622 try ir.writeType(info.child, .no_color, w);626 try ir.writeType(info.child, .{ .mode = .no_color, .writer = w });
623 try w.writeByte(']');627 try w.writeByte(']');
624 },628 },
625 .vector_ty => |info| {629 .vector_ty => |info| {
626 try w.print("<{d} * ", .{info.len});630 try w.print("<{d} * ", .{info.len});
627 try ir.writeType(info.child, .no_color, w);631 try ir.writeType(info.child, .{ .mode = .no_color, .writer = w });
628 try w.writeByte('>');632 try w.writeByte('>');
629 },633 },
630 .record_ty => |elems| {634 .record_ty => |elems| {
...@@ -632,7 +636,7 @@ fn writeType(ir: Ir, ty_ref: Interner.Ref, config: std.Io.tty.Config, w: *std.Io...@@ -632,7 +636,7 @@ fn writeType(ir: Ir, ty_ref: Interner.Ref, config: std.Io.tty.Config, w: *std.Io
632 try w.writeAll("{ ");636 try w.writeAll("{ ");
633 for (elems, 0..) |elem, i| {637 for (elems, 0..) |elem, i| {
634 if (i != 0) try w.writeAll(", ");638 if (i != 0) try w.writeAll(", ");
635 try ir.writeType(elem, config, w);639 try ir.writeType(elem, .{ .mode = .no_color, .writer = w });
636 }640 }
637 try w.writeAll(" }");641 try w.writeAll(" }");
638 },642 },
...@@ -640,8 +644,9 @@ fn writeType(ir: Ir, ty_ref: Interner.Ref, config: std.Io.tty.Config, w: *std.Io...@@ -640,8 +644,9 @@ fn writeType(ir: Ir, ty_ref: Interner.Ref, config: std.Io.tty.Config, w: *std.Io
640 }644 }
641}645}
642646
643fn writeValue(ir: Ir, val: Interner.Ref, config: std.Io.tty.Config, w: *std.Io.Writer) !void {647fn writeValue(ir: Ir, val: Interner.Ref, term: std.Io.Terminal) !void {
644 try config.setColor(w, LITERAL);648 const w = term.writer;
649 try term.setColor(LITERAL);
645 const key = ir.interner.get(val);650 const key = ir.interner.get(val);
646 switch (key) {651 switch (key) {
647 .null => return w.writeAll("nullptr_t"),652 .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...@@ -656,43 +661,46 @@ fn writeValue(ir: Ir, val: Interner.Ref, config: std.Io.tty.Config, w: *std.Io.W
656 }661 }
657}662}
658663
659fn writeRef(ir: Ir, decl: *const Decl, ref_map: *RefMap, ref: Ref, config: std.Io.tty.Config, w: *std.Io.Writer) !void {664fn writeRef(ir: Ir, decl: *const Decl, ref_map: *RefMap, ref: Ref, term: std.Io.Terminal) !void {
665 const w = term.writer;
660 assert(ref != .none);666 assert(ref != .none);
661 const index = @intFromEnum(ref);667 const index = @intFromEnum(ref);
662 const ty_ref = decl.instructions.items(.ty)[index];668 const ty_ref = decl.instructions.items(.ty)[index];
663 if (decl.instructions.items(.tag)[index] == .constant) {669 if (decl.instructions.items(.tag)[index] == .constant) {
664 try ir.writeType(ty_ref, config, w);670 try ir.writeType(ty_ref, term);
665 const v_ref = decl.instructions.items(.data)[index].constant;671 const v_ref = decl.instructions.items(.data)[index].constant;
666 try w.writeByte(' ');672 try w.writeByte(' ');
667 try ir.writeValue(v_ref, config, w);673 try ir.writeValue(v_ref, term);
668 return;674 return;
669 } else if (decl.instructions.items(.tag)[index] == .symbol) {675 } else if (decl.instructions.items(.tag)[index] == .symbol) {
670 const name = decl.instructions.items(.data)[index].label;676 const name = decl.instructions.items(.data)[index].label;
671 try ir.writeType(ty_ref, config, w);677 try ir.writeType(ty_ref, term);
672 try config.setColor(w, REF);678 try term.setColor(REF);
673 try w.print(" @{s}", .{name});679 try w.print(" @{s}", .{name});
674 return;680 return;
675 }681 }
676 try ir.writeType(ty_ref, config, w);682 try ir.writeType(ty_ref, term);
677 try config.setColor(w, REF);683 try term.setColor(REF);
678 const ref_index = ref_map.getIndex(ref).?;684 const ref_index = ref_map.getIndex(ref).?;
679 try w.print(" %{d}", .{ref_index});685 try w.print(" %{d}", .{ref_index});
680}686}
681687
682fn writeNewRef(ir: Ir, gpa: Allocator, decl: *const Decl, ref_map: *RefMap, ref: Ref, config: std.Io.tty.Config, w: *std.Io.Writer) !void {688fn writeNewRef(ir: Ir, gpa: Allocator, decl: *const Decl, ref_map: *RefMap, ref: Ref, term: std.Io.Terminal) !void {
689 const w = term.writer;
683 try ref_map.put(gpa, ref, {});690 try ref_map.put(gpa, ref, {});
684 try w.writeAll(" ");691 try w.writeAll(" ");
685 try ir.writeRef(decl, ref_map, ref, config, w);692 try ir.writeRef(decl, ref_map, ref, term);
686 try config.setColor(w, .reset);693 try term.setColor(.reset);
687 try w.writeAll(" = ");694 try w.writeAll(" = ");
688 try config.setColor(w, INST);695 try term.setColor(INST);
689}696}
690697
691fn writeLabel(decl: *const Decl, label_map: *RefMap, ref: Ref, config: std.Io.tty.Config, w: *std.Io.Writer) !void {698fn writeLabel(decl: *const Decl, label_map: *RefMap, ref: Ref, term: std.Io.Terminal) !void {
699 const w = term.writer;
692 assert(ref != .none);700 assert(ref != .none);
693 const index = @intFromEnum(ref);701 const index = @intFromEnum(ref);
694 const label = decl.instructions.items(.data)[index].label;702 const label = decl.instructions.items(.data)[index].label;
695 try config.setColor(w, REF);703 try term.setColor(REF);
696 const label_index = label_map.getIndex(ref).?;704 const label_index = label_map.getIndex(ref).?;
697 try w.print("{s}.{d}", .{ label, label_index });705 try w.print("{s}.{d}", .{ label, label_index });
698}706}
lib/compiler/aro/backend/Ir/x86/Renderer.zig+3-3
...@@ -21,17 +21,17 @@ const RegisterManager = zig.RegisterManager(Renderer, Register, Ir.Ref, abi.allo...@@ -21,17 +21,17 @@ const RegisterManager = zig.RegisterManager(Renderer, Register, Ir.Ref, abi.allo
21const RegisterBitSet = RegisterManager.RegisterBitSet;21const RegisterBitSet = RegisterManager.RegisterBitSet;
22const RegisterClass = struct {22const RegisterClass = struct {
23 const gp: RegisterBitSet = blk: {23 const gp: RegisterBitSet = blk: {
24 var set = RegisterBitSet.empty;24 var set = RegisterBitSet.initEmpty();
25 for (abi.allocatable_regs, 0..) |reg, index| if (reg.class() == .general_purpose) set.set(index);25 for (abi.allocatable_regs, 0..) |reg, index| if (reg.class() == .general_purpose) set.set(index);
26 break :blk set;26 break :blk set;
27 };27 };
28 const x87: RegisterBitSet = blk: {28 const x87: RegisterBitSet = blk: {
29 var set = RegisterBitSet.empty;29 var set = RegisterBitSet.initEmpty();
30 for (abi.allocatable_regs, 0..) |reg, index| if (reg.class() == .x87) set.set(index);30 for (abi.allocatable_regs, 0..) |reg, index| if (reg.class() == .x87) set.set(index);
31 break :blk set;31 break :blk set;
32 };32 };
33 const sse: RegisterBitSet = blk: {33 const sse: RegisterBitSet = blk: {
34 var set = RegisterBitSet.empty;34 var set = RegisterBitSet.initEmpty();
35 for (abi.allocatable_regs, 0..) |reg, index| if (reg.class() == .sse) set.set(index);35 for (abi.allocatable_regs, 0..) |reg, index| if (reg.class() == .sse) set.set(index);
36 break :blk set;36 break :blk set;
37 };37 };
lib/compiler/aro/include/ptrcheck.h created+49
...@@ -0,0 +1,49 @@
1#pragma once
2
3#if defined(__has_feature) && __has_feature(bounds_attributes)
4 #define __has_ptrcheck 1
5#else
6 #define __has_ptrcheck 0
7#endif
8
9#if __has_ptrcheck
10
11#define __single __attribute__((__single__))
12#define __unsafe_indexable __attribute__((__unsafe_indexable__))
13
14#else
15
16#define __single
17#define __unsafe_indexable
18#define __counted_by(N)
19#define __counted_by_or_null(N)
20#define __sized_by(N)
21#define __sized_by_or_null(N)
22#define __ended_by(E)
23
24#define __terminated_by(T)
25#define __null_terminated
26
27/* __ptrcheck_abi_assume_indexable and __ptrcheck_abi_assume_bidi_indexable intentionally not defined */
28#define __ptrcheck_abi_assume_single()
29#define __ptrcheck_abi_assume_unsafe_indexable()
30
31#define __unsafe_forge_bidi_indexable(T, P, S) ((T)(P))
32#define __unsafe_forge_single(T, P) ((T)(P))
33#define __unsafe_forge_terminated_by(T, P, E) ((T)(P))
34#define __unsafe_forge_null_terminated(T, P) ((T)(P))
35
36#define __terminated_by_to_indexable(P) (P)
37#define __unsafe_terminated_by_to_indexable(P) (P)
38#define __null_terminated_to_indexable(P) (P)
39#define __unsafe_null_terminated_to_indexable(P) (P)
40#define __unsafe_terminated_by_from_indexable(T, P, ...) (P)
41#define __unsafe_null_terminated_from_indexable(P, ...) (P)
42
43#define __array_decay_dicards_count_in_parameters
44
45#define __ptrcheck_unavailable
46#define __ptrcheck_unavailable_r(REPLACEMENT)
47
48
49#endif
lib/compiler/aro/main.zig+26-10
...@@ -1,8 +1,9 @@...@@ -1,8 +1,9 @@
1const std = @import("std");1const std = @import("std");
2const Io = std.Io;
3const Allocator = mem.Allocator;
4const mem = std.mem;2const mem = std.mem;
5const process = std.process;3const process = std.process;
4const Allocator = mem.Allocator;
5const build_options = @import("build_options");
6
6const aro = @import("aro");7const aro = @import("aro");
7const Compilation = aro.Compilation;8const Compilation = aro.Compilation;
8const Diagnostics = aro.Diagnostics;9const Diagnostics = aro.Diagnostics;
...@@ -11,14 +12,15 @@ const Toolchain = aro.Toolchain;...@@ -11,14 +12,15 @@ const Toolchain = aro.Toolchain;
11const assembly_backend = @import("assembly_backend");12const assembly_backend = @import("assembly_backend");
1213
13var debug_allocator: std.heap.DebugAllocator(.{14var debug_allocator: std.heap.DebugAllocator(.{
14 .stack_trace_frames = 0,15 .stack_trace_frames = if (build_options.debug_allocations and std.debug.sys_can_stack_trace) 10 else 0,
16 .resize_stack_traces = build_options.debug_allocations,
15 // A unique value so that when a default-constructed17 // A unique value so that when a default-constructed
16 // DebugAllocator is incorrectly passed to testing allocator, or18 // GeneralPurposeAllocator is incorrectly passed to testing allocator, or
17 // vice versa, panic occurs.19 // vice versa, panic occurs.
18 .canary = @truncate(0xc647026dc6875134),20 .canary = @truncate(0xc647026dc6875134),
19}) = .{};21}) = .{};
2022
21pub fn main(init: std.process.Init.Minimal) u8 {23pub fn main(init: process.Init.Minimal) u8 {
22 const gpa = if (@import("builtin").link_libc)24 const gpa = if (@import("builtin").link_libc)
23 std.heap.c_allocator25 std.heap.c_allocator
24 else26 else
...@@ -31,7 +33,10 @@ pub fn main(init: std.process.Init.Minimal) u8 {...@@ -31,7 +33,10 @@ pub fn main(init: std.process.Init.Minimal) u8 {
31 defer arena_instance.deinit();33 defer arena_instance.deinit();
32 const arena = arena_instance.allocator();34 const arena = arena_instance.allocator();
3335
34 var threaded: std.Io.Threaded = .init(gpa, .{});36 var threaded: std.Io.Threaded = .init(gpa, .{
37 .argv0 = .init(init.args),
38 .environ = init.environ,
39 });
35 defer threaded.deinit();40 defer threaded.deinit();
36 const io = threaded.io();41 const io = threaded.io();
3742
...@@ -43,7 +48,11 @@ pub fn main(init: std.process.Init.Minimal) u8 {...@@ -43,7 +48,11 @@ pub fn main(init: std.process.Init.Minimal) u8 {
43 return 1;48 return 1;
44 };49 };
4550
46 const aro_name = process.executablePathAlloc(io, gpa) catch {51 var environ_map = std.process.Environ.createMap(init.environ, gpa) catch |err|
52 std.process.fatal("failed to parse environment variables: {t}", .{err});
53 defer environ_map.deinit();
54
55 const aro_name = std.process.executableDirPathAlloc(io, gpa) catch {
47 std.debug.print("unable to find Aro executable path\n", .{});56 std.debug.print("unable to find Aro executable path\n", .{});
48 if (fast_exit) process.exit(1);57 if (fast_exit) process.exit(1);
49 return 1;58 return 1;
...@@ -51,15 +60,21 @@ pub fn main(init: std.process.Init.Minimal) u8 {...@@ -51,15 +60,21 @@ pub fn main(init: std.process.Init.Minimal) u8 {
51 defer gpa.free(aro_name);60 defer gpa.free(aro_name);
5261
53 var stderr_buf: [1024]u8 = undefined;62 var stderr_buf: [1024]u8 = undefined;
54 var stderr = Io.File.stderr().writer(&stderr_buf);63 var stderr = std.Io.File.stderr().writer(io, &stderr_buf);
55 var diagnostics: Diagnostics = .{64 var diagnostics: Diagnostics = .{
56 .output = .{ .to_writer = .{65 .output = .{ .to_writer = .{
57 .color = .detect(stderr.file),66 .mode = std.Io.Terminal.Mode.detect(io, stderr.file, false, false) catch .no_color,
58 .writer = &stderr.interface,67 .writer = &stderr.interface,
59 } },68 } },
60 };69 };
6170
62 var comp = Compilation.initDefault(gpa, arena, io, &diagnostics, Io.Dir.cwd()) catch |er| switch (er) {71 var comp = Compilation.init(.{
72 .gpa = gpa,
73 .arena = arena,
74 .io = io,
75 .diagnostics = &diagnostics,
76 .environ_map = &environ_map,
77 }) catch |er| switch (er) {
63 error.OutOfMemory => {78 error.OutOfMemory => {
64 std.debug.print("out of memory\n", .{});79 std.debug.print("out of memory\n", .{});
65 if (fast_exit) process.exit(1);80 if (fast_exit) process.exit(1);
...@@ -85,6 +100,7 @@ pub fn main(init: std.process.Init.Minimal) u8 {...@@ -85,6 +100,7 @@ pub fn main(init: std.process.Init.Minimal) u8 {
85 if (fast_exit) process.exit(1);100 if (fast_exit) process.exit(1);
86 return 1;101 return 1;
87 },102 },
103 error.Canceled => unreachable,
88 };104 };
89 if (fast_exit) process.exit(@intFromBool(comp.diagnostics.errors != 0));105 if (fast_exit) process.exit(@intFromBool(comp.diagnostics.errors != 0));
90 return @intFromBool(diagnostics.errors != 0);106 return @intFromBool(diagnostics.errors != 0);