Skip to content

Compiler segfaults #17563

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
ryuukk opened this issue Oct 16, 2023 · 8 comments
Closed

Compiler segfaults #17563

ryuukk opened this issue Oct 16, 2023 · 8 comments
Labels
bug Observed behavior contradicts documented or intended behavior frontend Tokenization, parsing, AstGen, Sema, and Liveness.
Milestone

Comments

@ryuukk
Copy link
Contributor

ryuukk commented Oct 16, 2023

Zig Version

78f2ae7

Steps to Reproduce and Observed Behavior

Initially zig build gave me:

 zig build game
zig build-exe game Debug native: error: the following command exited with error code 5:
C:\zig\zig.exe build-exe C:\dev\kdomz\projects\game\main_desktop.zig -cflags -std=c11 -Wl,--allow-multiple-definition -- C:\dev\kdomz\projects\c\nuklear\nuklear.c -cflags -std=c11 -Wl,--allow-multiple-definition -- C:\dev\kdomz\projects\c\glad\glad.c -cflags -std=c11 -Wl,--allow-multiple-definition -- C:\dev\kdomz\projects\c\mongoose\mg.c -lUser32 -lGdi32 -lshell32 -lWS2_32 -lADVAPI32 -lCRYPT32 -lglfw3 -lmbedtls -lmbedcrypto -lmbedx509 -lc --cache-dir C:\dev\kdomz\zig-cache --global-cache-dir C:\Users\ryuukk\AppData\Local\zig --name game -target x86_64-windows-msvc -mcpu x86_64 --mod dawn:rt:C:\dev\kdomz\projects\libs\dawn\dawn.zig --mod rt::C:\dev\kdomz\projects\libs\rt\rt.zig --mod shared:rt,dawn:C:\dev\kdomz\projects\shared\shared.zig --deps rt,dawn,shared -I C:\dev\kdomz\projects\c\nuklear -I C:\dev\kdomz\projects\c\stb -I C:\dev\kdomz\projects\c\glad -I C:\vcpkg\packages\glfw3_x64-windows-static\include -I C:\vcpkg\packages\mbedtls_x64-windows-static\include -I C:\dev\kdomz\projects\c\mongoose -D GLFW_INCLUDE_NONE -D GLFW_EXPOSE_NATIVE_WGL -D GLFW_EXPOSE_NATIVE_WIN32 -D MG_ENABLE_MBEDTLS=1 -L C:\vcpkg\packages\glfw3_x64-windows-static\lib -L C:\vcpkg\packages\mbedtls_x64-windows-static\lib -fno-lto --listen=-
Build Summary: 0/2 steps succeeded; 1 failed (disable with --summary none)
game transitive failure
└─ zig build-exe game Debug native failure
error: the following build command failed with exit code 1:
C:\dev\kdomz\zig-cache\o\bf9edba2b941b9943d22be0b028fd299\build.exe C:\zig\zig.exe C:\dev\kdomz C:\dev\kdomz\zig-cache C:\Users\ryuukk\AppData\Local\zig game

I tried to extract code that causes it from my project

OS tested:

  • Windows x64 [x] -> Segmentation fault
  • Linux [ ] (i can try tomorow)
  • macOS [ ] (i don't own a mac)

Expected Behavior

It should compile, or the compiler should give a proper error message if the code is erroneous

@ryuukk ryuukk added the bug Observed behavior contradicts documented or intended behavior label Oct 16, 2023
@ryuukk
Copy link
Contributor Author

ryuukk commented Oct 17, 2023

I managed to reduce it further, seems like the problem lies with the header file:

pub const c = @cImport({
    @cDefine("NK_INCLUDE_FIXED_TYPES", "");
    @cInclude("nuklear_all.h");
});

pub fn main() !void {
    _=c.nk_init(null, null);
}

@ianprime0509
Copy link
Contributor

ianprime0509 commented Oct 17, 2023

Here's the output from a debug build of Zig 0.12.0-dev.985+e44152e25 (it's massive, so I'm not pasting it directly here): https://gist.github.com/ianprime0509/2ab13dac7c2008dce1bb4bcd36d56f82

The following is a more self-contained reproduction of the same issue a possibly related issue (edit: this isn't exactly the same issue, since the original is crashing on an "attempt to use null value", and this one is an assertion failure):

const std = @import("std");

const S = extern struct {
    t: T = std.mem.zeroes(T),
};

const T = extern struct {
    s: [*c]S = std.mem.zeroes([*c]S),
    u: c_uint = std.mem.zeroes(c_uint),
};

test {
    const t: T = .{};
    _ = t;
}
LLVM Emit Object... thread 1212668 panic: reached unreachable code
Analyzing /var/home/ian/src/zig/lib/std/mem.zig: mem.zig:zeroes
      %1086 = dbg_block_begin()
      %1087 = dbg_stmt(2, 5)
      %1088 = block_comptime({
        %1089 = break(%1088, %1084)
      }) 
    > %1090 = type_info(%1088) 
      %1091 = dbg_stmt(2, 13)
      %1093 = enum_literal("ComptimeInt") 
      %1094 = enum_literal("Int") 
      %1095 = enum_literal("ComptimeFloat") 
      %1096 = enum_literal("Float") 
      %1114 = enum_literal("Enum") 
      %1115 = enum_literal("EnumLiteral") 
      %1135 = enum_literal("Void") 
      %1153 = enum_literal("Bool") 
      %1168 = enum_literal("Optional") 
      %1169 = enum_literal("Null") 
      %1184 = enum_literal("Struct") 
      %1328 = enum_literal("Pointer") 
      %1479 = enum_literal("Array") 
      %1566 = enum_literal("Vector") 
      %1591 = enum_literal("Union") 
      %1651 = enum_literal("ErrorUnion") 
      %1652 = enum_literal("ErrorSet") 
      %1653 = enum_literal("Fn") 
      %1654 = enum_literal("Type") 
      %1655 = enum_literal("NoReturn") 
      %1656 = enum_literal("Undefined") 
      %1657 = enum_literal("Opaque") 
      %1658 = enum_literal("Frame") 
      %1659 = enum_literal("AnyFrame") 
      %1092 = switch_block(%1090,
        %1135 => {
          %1136 = dbg_block_begin()
          %1137 = block({
            %1138 = dbg_block_begin()
            %1139 = dbg_stmt(10, 13)
            %1140 = ret_type() 
            %1141 = block({
              %1142 = restore_err_ret_index(%1141, %4294967211)
              %1143 = break(%1141, @InternPool.Index.void_value)
            }) 
            %1144 = as_node(%1140, @InternPool.Index.void_value) 
            %1145 = restore_err_ret_index(%4294967211, %4294967211)
            %1146 = dbg_stmt(10, 13)
            %1147 = ret_node(%1144) 
            %1148 = dbg_block_end()
            %1149 = restore_err_ret_index(%1137, %4294967211)
            %1150 = break(%1137, @InternPool.Index.void_value)
          }) 
          %1151 = dbg_block_end()
          %1152 = break(%1092, @InternPool.Index.void_value)
        },
        %1153 => {
          %1154 = dbg_block_begin()
          %1155 = block({
            %1156 = dbg_block_begin()
            %1157 = dbg_stmt(13, 13)
            %1158 = ret_type() 
            %1159 = as_node(%1158, @InternPool.Index.bool_false) 
            %1160 = dbg_stmt(13, 13)
            %1161 = restore_err_ret_index(%4294967211, %1159)
            %1162 = ret_node(%1159) 
            %1163 = dbg_block_end()
            %1164 = restore_err_ret_index(%1155, %4294967211)
            %1165 = break(%1155, @InternPool.Index.void_value)
          }) 
          %1166 = dbg_block_end()
          %1167 = break(%1092, @InternPool.Index.void_value)
        },
        by_val %1184 => {
          %1185 = dbg_block_begin()
          %1186 = dbg_var_val(%1092, "struct_info")
          %1187 = block({
            %1188 = dbg_block_begin()
            %1189 = dbg_stmt(19, 17)
            %1196 = block({
              %1190 = block_comptime({
                %1191 = break(%1190, %1084)
              }) 
              %1192 = size_of(%1190) 
              %1193 = cmp_eq(%1192, @InternPool.Index.zero) 
              %1194 = as_node(@InternPool.Index.bool_type, %1193) 
              %1195 = condbr(%1194, {
                %1197 = dbg_block_begin()
                %1198 = dbg_stmt(19, 34)
                %1199 = ret_type() 
                %1200 = as_node(%1199, @InternPool.Index.undef) 
                %1201 = dbg_stmt(19, 34)
                %1202 = restore_err_ret_index(%4294967211, %1200)
                %1203 = ret_node(%1200) 
              }, {
                %1204 = break(%1196, @InternPool.Index.void_value)
              }) 
            }) 
            %1205 = ensure_result_used(%1196) 
            %1206 = dbg_stmt(20, 17)
            %1213 = block({
              %1207 = dbg_stmt(20, 28)
              %1208 = field_val(%1092, "layout") 
              %1209 = enum_literal("Extern") 
              %1210 = cmp_eq(%1208, %1209) 
              %1211 = as_node(@InternPool.Index.bool_type, %1210) 
              %1212 = condbr(%1211, {
                %1214 = dbg_block_begin()
                %1215 = block({
                  %1216 = dbg_block_begin()
                  %1217 = dbg_stmt(21, 17)
                  %1218 = block_comptime({
                    %1219 = break(%1218, %1084)
                  }) 
                  %1220 = alloc_mut(%1218) 
                  %1221 = store_node(%1220, @InternPool.Index.undef) 
                  %1222 = dbg_var_ptr(%1220, "item")
                  %1223 = dbg_stmt(22, 17)
                  %1224 = decl_val("asBytes") 
                  %1225 = dbg_stmt(22, 32)
                  %1226 = call(.auto, %1224, [
                    {
                      %1227 = validate_ref_ty(%1226) 
                      %1228 = break_inline(%1226, %1220)
                    },
                  ]) 
                  %1229 = typeof(%1226) 
                  %1230 = indexable_ptr_elem_type(%1229) 
                  %1231 = memset(%1226, @InternPool.Index.zero) 
                  %1232 = dbg_stmt(23, 17)
                  %1233 = ret_type() 
                  %1234 = load(%1220) 
                  %1235 = as_node(%1233, %1234) 
                  %1236 = dbg_stmt(23, 17)
                  %1237 = restore_err_ret_index(%4294967211, %1235)
                  %1238 = ret_node(%1235) 
                  %1239 = dbg_block_end()
                  %1240 = restore_err_ret_index(%1215, %4294967211)
                  %1241 = break(%1215, @InternPool.Index.void_value)
                }) 
                %1242 = dbg_block_end()
                %1243 = break(%1213, @InternPool.Index.void_value)
              }, {
                %1244 = dbg_block_begin()
                %1245 = block({
                  %1246 = dbg_block_begin()
                  %1247 = dbg_stmt(25, 17)
                  %1248 = block_comptime({
                    %1249 = break(%1248, %1084)
                  }) 
                  %1250 = alloc_mut(%1248) 
                  %1251 = store_node(%1250, @InternPool.Index.undef) 
                  %1252 = dbg_var_ptr(%1250, "structure")
                  %1253 = alloc_comptime_mut(@InternPool.Index.usize_type) 
                  %1254 = store(%1253, @InternPool.Index.zero_usize)
                  %1255 = dbg_stmt(26, 29)
                  %1256 = dbg_stmt(26, 40)
                  %1257 = field_val(%1092, "fields") 
                  %1258 = for_len({%1257}) 
                  %1259 = block_inline({
                    %1260 = load(%1253) 
                    %1263 = block_inline({
                      %1261 = cmp_lt(%1260, %1258) 
                      %1262 = condbr_inline(%1261, {
                        %1264 = dbg_block_begin()
                        %1265 = elem_val(%1257, %1260) 
                        %1266 = dbg_var_val(%1265, "field")
                        %1267 = block({
                          %1268 = dbg_block_begin()
                          %1269 = dbg_stmt(27, 25)
                          %1276 = block({
                            %1270 = dbg_stmt(27, 31)
                            %1271 = field_val(%1265, "is_comptime") 
                            %1272 = as_node(@InternPool.Index.bool_type, %1271) 
                            %1273 = bool_not(%1272) 
                            %1274 = as_node(@InternPool.Index.bool_type, %1273) 
                            %1275 = condbr(%1274, {
                              %1277 = dbg_block_begin()
                              %1278 = block({
                                %1279 = dbg_block_begin()
                                %1280 = dbg_stmt(28, 25)
                                %1281 = block_comptime({
                                  %1282 = field_val(%1265, "name") 
                                  %1283 = break(%1281, %1282)
                                }) 
                                %1284 = as_node(@InternPool.Index.slice_const_u8_type, %1281) 
                                %1285 = field_ptr_named(%1250, %1284) 
                                %1286 = decl_val("zeroes") 
                                %1287 = dbg_stmt(28, 63)
                                %1288 = call(.auto, %1286, [
                                  {
                                    %1289 = dbg_stmt(28, 69)
                                    %1290 = field_val(%1265, "type") 
                                    %1291 = break_inline(%1288, %1290)
                                  },
                                ]) 
                                %1292 = store_node(%1285, %1288) 
                                %1293 = dbg_block_end()
                                %1294 = restore_err_ret_index(%1278, %4294967211)
                                %1295 = break(%1278, @InternPool.Index.void_value)
                              }) 
                              %1296 = dbg_block_end()
                              %1297 = break(%1276, @InternPool.Index.void_value)
                            }, {
                              %1298 = break(%1276, @InternPool.Index.void_value)
                            }) 
                          }) 
                          %1299 = ensure_result_used(%1276) 
                          %1300 = dbg_block_end()
                          %1301 = restore_err_ret_index(%1267, %4294967211)
                          %1302 = break(%1267, @InternPool.Index.void_value)
                        }) 
                        %1303 = dbg_block_end()
                        %1304 = break_inline(%1263, @InternPool.Index.void_value)
                      }, {
                        %1305 = break_inline(%1259, @InternPool.Index.void_value)
                      }) 
                    }) 
                    %1306 = add_unsafe(%1260, @InternPool.Index.one_usize) 
                    %1307 = store(%1253, %1306)
                    %1308 = repeat_inline() 
                  }) 
                  %1309 = ensure_result_used(%1259) 
                  %1310 = dbg_stmt(31, 17)
                  %1311 = ret_type() 
                  %1312 = load(%1250) 
                  %1313 = as_node(%1311, %1312) 
                  %1314 = dbg_stmt(31, 17)
                  %1315 = restore_err_ret_index(%4294967211, %1313)
                  %1316 = ret_node(%1313) 
                  %1317 = dbg_block_end()
                  %1318 = restore_err_ret_index(%1245, %4294967211)
                  %1319 = break(%1245, @InternPool.Index.void_value)
                }) 
                %1320 = dbg_block_end()
                %1321 = break(%1213, @InternPool.Index.void_value)
              }) 
            }) 
            %1322 = ensure_result_used(%1213) 
            %1323 = dbg_block_end()
            %1324 = restore_err_ret_index(%1187, %4294967211)
            %1325 = break(%1187, @InternPool.Index.void_value)
          }) 
          %1326 = dbg_block_end()
          %1327 = break(%1092, @InternPool.Index.void_value)
        },
        by_val %1328 => {
          %1329 = dbg_block_begin()
          %1330 = dbg_var_val(%1092, "ptr_info")
          %1331 = block({
            %1332 = dbg_block_begin()
            %1333 = dbg_stmt(35, 13)
            %1334 = dbg_stmt(35, 29)
            %1335 = field_val(%1092, "size") 
            %1336 = dbg_stmt(35, 21)
            %1338 = enum_literal("Slice") 
            %1427 = enum_literal("C") 
            %1442 = enum_literal("One") 
            %1443 = enum_literal("Many") 
            %1337 = switch_block(%1335,
              %1338 => {
                %1339 = dbg_block_begin()
                %1340 = block({
                  %1341 = dbg_block_begin()
                  %1342 = dbg_stmt(37, 25)
                  %1347 = block({
                    %1343 = dbg_stmt(37, 33)
                    %1344 = field_val(%1092, "sentinel") 
                    %1345 = is_non_null(%1344) 
                    %1346 = condbr(%1345, {
                      %1348 = dbg_block_begin()
                      %1349 = optional_payload_unsafe(%1344) 
                      %1350 = dbg_var_val(%1349, "sentinel")
                      %1351 = block({
                        %1352 = dbg_block_begin()
                        %1353 = dbg_stmt(38, 29)
                        %1372 = block({
                          %1354 = dbg_stmt(38, 37)
                          %1355 = field_val(%1092, "child") 
                          %1356 = cmp_eq(%1355, @InternPool.Index.u8_type) 
                          %1357 = as_node(@InternPool.Index.bool_type, %1356) 
                          %1358 = bool_br_and(%1357, {
                            %1359 = block_comptime({
                              %1360 = ptr_type(@InternPool.Index.u8_type, const, One) 
                              %1361 = break(%1359, %1360)
                            }) 
                            %1362 = dbg_stmt(38, 69)
                            %1363 = ptr_cast(%1359, %1349) 
                            %1364 = as_node(%1359, %1363) 
                            %1365 = validate_deref(%1364) 
                            %1366 = load(%1364) 
                            %1367 = cmp_eq(%1366, @InternPool.Index.zero) 
                            %1368 = as_node(@InternPool.Index.bool_type, %1367) 
                            %1369 = break_inline(%1358, %1368)
                          }
                          %1370 = as_node(@InternPool.Index.bool_type, %1358) 
                          %1371 = condbr(%1370, {
                            %1373 = dbg_block_begin()
                            %1374 = block({
                              %1375 = dbg_block_begin()
                              %1376 = dbg_stmt(39, 29)
                              %1377 = ret_type() 
                              %1378 = str("")
                              %1379 = as_node(%1377, %1378) 
                              %1380 = restore_err_ret_index(%4294967211, %4294967211)
                              %1381 = dbg_stmt(39, 29)
                              %1382 = ret_node(%1379) 
                              %1383 = dbg_block_end()
                              %1384 = restore_err_ret_index(%1374, %4294967211)
                              %1385 = break(%1374, @InternPool.Index.void_value)
                            }) 
                            %1386 = dbg_block_end()
                            %1387 = break(%1372, @InternPool.Index.void_value)
                          }, {
                            %1388 = break(%1372, @InternPool.Index.void_value)
                          }) 
                        }) 
                        %1389 = ensure_result_used(%1372) 
                        %1390 = dbg_stmt(41, 25)
                        %1391 = str("Can't set a sentinel slice to zero. This would require allocating memory.")
                        %1392 = as_node(@InternPool.Index.slice_const_u8_type, %1391) 
                        %1393 = compile_error(%1392) 
                        %1394 = dbg_block_end()
                        %1395 = restore_err_ret_index(%1351, %4294967211)
                        %1396 = break(%1351, @InternPool.Index.void_value)
                      }) 
                      %1397 = dbg_block_end()
                      %1398 = break(%1347, @InternPool.Index.void_value)
                    }, {
                      %1399 = dbg_block_begin()
                      %1400 = block({
                        %1401 = dbg_block_begin()
                        %1402 = dbg_stmt(43, 25)
                        %1403 = ret_type() 
                        %1404 = validate_ref_ty(%1403) 
                        %1405 = block_comptime({
                          %1406 = field_val(%1092, "child") 
                          %1407 = break(%1405, %1406)
                        }) 
                        %1408 = array_type(@InternPool.Index.zero_usize, %1405) 
                        %1409 = struct_init_empty(%1408) 
                        %1410 = coerce_ptr_elem_ty(%1403, %1409) 
                        %1411 = ref(%1410) 
                        %1412 = as_node(%1403, %1411) 
                        %1413 = restore_err_ret_index(%4294967211, %4294967211)
                        %1414 = dbg_stmt(43, 25)
                        %1415 = ret_node(%1412) 
                        %1416 = dbg_block_end()
                        %1417 = restore_err_ret_index(%1400, %4294967211)
                        %1418 = break(%1400, @InternPool.Index.void_value)
                      }) 
                      %1419 = dbg_block_end()
                      %1420 = break(%1347, @InternPool.Index.void_value)
                    }) 
                  }) 
                  %1421 = ensure_result_used(%1347) 
                  %1422 = dbg_block_end()
                  %1423 = restore_err_ret_index(%1340, %4294967211)
                  %1424 = break(%1340, @InternPool.Index.void_value)
                }) 
                %1425 = dbg_block_end()
                %1426 = break(%1337, @InternPool.Index.void_value)
              },
              %1427 => {
                %1428 = dbg_block_begin()
                %1429 = block({
                  %1430 = dbg_block_begin()
                  %1431 = dbg_stmt(47, 21)
                  %1432 = ret_type() 
                  %1433 = as_node(%1432, @InternPool.Index.null_value) 
                  %1434 = dbg_stmt(47, 21)
                  %1435 = restore_err_ret_index(%4294967211, %1433)
                  %1436 = ret_node(%1433) 
                  %1437 = dbg_block_end()
                  %1438 = restore_err_ret_index(%1429, %4294967211)
                  %1439 = break(%1429, @InternPool.Index.void_value)
                }) 
                %1440 = dbg_block_end()
                %1441 = break(%1337, @InternPool.Index.void_value)
              },
              %1442, %1443 => {
                %1444 = dbg_block_begin()
                %1445 = block({
                  %1446 = dbg_block_begin()
                  %1447 = dbg_stmt(50, 25)
                  %1452 = block({
                    %1448 = dbg_stmt(50, 33)
                    %1449 = field_val(%1092, "is_allowzero") 
                    %1450 = as_node(@InternPool.Index.bool_type, %1449) 
                    %1451 = condbr(%1450, {
                      %1453 = dbg_block_begin()
                      %1454 = dbg_stmt(50, 48)
                      %1455 = ret_type() 
                      %1456 = dbg_stmt(50, 55)
                      %1457 = ptr_from_int(%1455, @InternPool.Index.zero) 
                      %1458 = as_node(%1455, %1457) 
                      %1459 = restore_err_ret_index(%4294967211, %4294967211)
                      %1460 = dbg_stmt(50, 48)
                      %1461 = ret_node(%1458) 
                    }, {
                      %1462 = break(%1452, @InternPool.Index.void_value)
                    }) 
                  }) 
                  %1463 = ensure_result_used(%1452) 
                  %1464 = dbg_stmt(51, 21)
                  %1465 = str("Only nullable and allowzero pointers can be set to zero.")
                  %1466 = as_node(@InternPool.Index.slice_const_u8_type, %1465) 
                  %1467 = compile_error(%1466) 
                  %1468 = dbg_block_end()
                  %1469 = restore_err_ret_index(%1445, %4294967211)
                  %1470 = break(%1445, @InternPool.Index.void_value)
                }) 
                %1471 = dbg_block_end()
                %1472 = break(%1337, @InternPool.Index.void_value)
              }) 
            %1473 = ensure_result_used(%1337) 
            %1474 = dbg_block_end()
            %1475 = restore_err_ret_index(%1331, %4294967211)
            %1476 = break(%1331, @InternPool.Index.void_value)
          }) 
          %1477 = dbg_block_end()
          %1478 = break(%1092, @InternPool.Index.void_value)
        },
        by_val %1479 => {
          %1480 = dbg_block_begin()
          %1481 = dbg_var_val(%1092, "info")
          %1482 = block({
            %1483 = dbg_block_begin()
            %1484 = dbg_stmt(56, 17)
            %1489 = block({
              %1485 = dbg_stmt(56, 21)
              %1486 = field_val(%1092, "sentinel") 
              %1487 = is_non_null(%1486) 
              %1488 = condbr(%1487, {
                %1490 = dbg_block_begin()
                %1491 = optional_payload_unsafe(%1486) 
                %1492 = dbg_var_val(%1491, "sentinel_ptr")
                %1493 = block({
                  %1494 = dbg_block_begin()
                  %1495 = dbg_stmt(57, 17)
                  %1496 = block_comptime({
                    %1497 = field_val(%1092, "child") 
                    %1498 = ptr_type(%1497, const, One, align(@InternPool.Index.one)) 
                    %1499 = break(%1496, %1498)
                  }) 
                  %1500 = dbg_stmt(57, 66)
                  %1501 = ptr_cast(%1496, %1491) 
                  %1502 = as_node(%1496, %1501) 
                  %1503 = validate_deref(%1502) 
                  %1504 = load(%1502) 
                  %1505 = dbg_var_val(%1504, "sentinel")
                  %1506 = save_err_ret_index(%1504)
                  %1507 = dbg_stmt(58, 17)
                  %1508 = ret_type() 
                  %1509 = int(1)
                  %1510 = block_comptime({
                    %1511 = field_val(%1092, "child") 
                    %1512 = break(%1510, %1511)
                  }) 
                  %1513 = block_comptime({
                    %1514 = break(%1513, %1504)
                  }) 
                  %1515 = as_node(%1510, %1513) 
                  %1516 = array_type_sentinel(%1509, %1515, %1510) 
                  %1517 = decl_val("zeroes") 
                  %1518 = dbg_stmt(58, 53)
                  %1519 = call(.auto, %1517, [
                    {
                      %1520 = dbg_stmt(58, 58)
                      %1521 = field_val(%1092, "child") 
                      %1522 = break_inline(%1519, %1521)
                    },
                  ]) 
                  %1523 = array_init(%1516{%1519}) 
                  %1524 = block_comptime({
                    %1525 = field_val(%1092, "len") 
                    %1526 = break(%1524, %1525)
                  }) 
                  %1527 = array_mul(%1523, %1524) 
                  %1528 = as_node(%1508, %1527) 
                  %1529 = restore_err_ret_index(%4294967211, %4294967211)
                  %1530 = dbg_stmt(58, 17)
                  %1531 = ret_node(%1528) 
                  %1532 = dbg_block_end()
                  %1533 = restore_err_ret_index(%1493, %4294967211)
                  %1534 = break(%1493, @InternPool.Index.void_value)
                }) 
                %1535 = dbg_block_end()
                %1536 = break(%1489, @InternPool.Index.void_value)
              }, {
                %1537 = break(%1489, @InternPool.Index.void_value)
              }) 
            }) 
            %1538 = ensure_result_used(%1489) 
            %1539 = dbg_stmt(60, 13)
            %1540 = ret_type() 
            %1541 = int(1)
            %1542 = block_comptime({
              %1543 = field_val(%1092, "child") 
              %1544 = break(%1542, %1543)
            }) 
            %1545 = array_type(%1541, %1542) 
            %1546 = decl_val("zeroes") 
            %1547 = dbg_stmt(60, 40)
            %1548 = call(.auto, %1546, [
              {
                %1549 = dbg_stmt(60, 45)
                %1550 = field_val(%1092, "child") 
                %1551 = break_inline(%1548, %1550)
              },
            ]) 
            %1552 = array_init(%1545{%1548}) 
            %1553 = block_comptime({
              %1554 = field_val(%1092, "len") 
              %1555 = break(%1553, %1554)
            }) 
            %1556 = array_mul(%1552, %1553) 
            %1557 = as_node(%1540, %1556) 
            %1558 = restore_err_ret_index(%4294967211, %4294967211)
            %1559 = dbg_stmt(60, 13)
            %1560 = ret_node(%1557) 
            %1561 = dbg_block_end()
            %1562 = restore_err_ret_index(%1482, %4294967211)
            %1563 = break(%1482, @InternPool.Index.void_value)
          }) 
          %1564 = dbg_block_end()
          %1565 = break(%1092, @InternPool.Index.void_value)
        },
        by_val %1566 => {
          %1567 = dbg_block_begin()
          %1568 = dbg_var_val(%1092, "info")
          %1569 = block({
            %1570 = dbg_block_begin()
            %1571 = dbg_stmt(63, 13)
            %1572 = ret_type() 
            %1573 = vector_elem_type(%1572) 
            %1574 = decl_val("zeroes") 
            %1575 = dbg_stmt(63, 33)
            %1576 = call(.auto, %1574, [
              {
                %1577 = dbg_stmt(63, 38)
                %1578 = field_val(%1092, "child") 
                %1579 = break_inline(%1576, %1578)
              },
            ]) 
            %1580 = as_node(%1573, %1576) 
            %1581 = splat(%1572, %1580) 
            %1582 = as_node(%1572, %1581) 
            %1583 = restore_err_ret_index(%4294967211, %4294967211)
            %1584 = dbg_stmt(63, 13)
            %1585 = ret_node(%1582) 
            %1586 = dbg_block_end()
            %1587 = restore_err_ret_index(%1569, %4294967211)
            %1588 = break(%1569, @InternPool.Index.void_value)
          }) 
          %1589 = dbg_block_end()
          %1590 = break(%1092, @InternPool.Index.void_value)
        },
        by_val %1591 => {
          %1592 = dbg_block_begin()
          %1593 = dbg_var_val(%1092, "info")
          %1594 = block({
            %1595 = dbg_block_begin()
            %1596 = dbg_stmt(66, 17)
            %1603 = block({
              %1597 = dbg_stmt(66, 21)
              %1598 = field_val(%1092, "layout") 
              %1599 = enum_literal("Extern") 
              %1600 = cmp_eq(%1598, %1599) 
              %1601 = as_node(@InternPool.Index.bool_type, %1600) 
              %1602 = condbr(%1601, {
                %1604 = dbg_block_begin()
                %1605 = block({
                  %1606 = dbg_block_begin()
                  %1607 = dbg_stmt(67, 17)
                  %1608 = block_comptime({
                    %1609 = break(%1608, %1084)
                  }) 
                  %1610 = alloc_mut(%1608) 
                  %1611 = store_node(%1610, @InternPool.Index.undef) 
                  %1612 = dbg_var_ptr(%1610, "item")
                  %1613 = dbg_stmt(68, 17)
                  %1614 = decl_val("asBytes") 
                  %1615 = dbg_stmt(68, 32)
                  %1616 = call(.auto, %1614, [
                    {
                      %1617 = validate_ref_ty(%1616) 
                      %1618 = break_inline(%1616, %1610)
                    },
                  ]) 
                  %1619 = typeof(%1616) 
                  %1620 = indexable_ptr_elem_type(%1619) 
                  %1621 = memset(%1616, @InternPool.Index.zero) 
                  %1622 = dbg_stmt(69, 17)
                  %1623 = ret_type() 
                  %1624 = load(%1610) 
                  %1625 = as_node(%1623, %1624) 
                  %1626 = dbg_stmt(69, 17)
                  %1627 = restore_err_ret_index(%4294967211, %1625)
                  %1628 = ret_node(%1625) 
                  %1629 = dbg_block_end()
                  %1630 = restore_err_ret_index(%1605, %4294967211)
                  %1631 = break(%1605, @InternPool.Index.void_value)
                }) 
                %1632 = dbg_block_end()
                %1633 = break(%1603, @InternPool.Index.void_value)
              }, {
                %1634 = break(%1603, @InternPool.Index.void_value)
              }) 
            }) 
            %1635 = ensure_result_used(%1603) 
            %1636 = dbg_stmt(71, 13)
            %1637 = block_comptime({
              %1638 = str("Can't set a ")
              %1639 = type_name(%1084) 
              %1640 = array_cat(%1638, %1639) 
              %1641 = str(" to zero.")
              %1642 = array_cat(%1640, %1641) 
              %1643 = break(%1637, %1642)
            }) 
            %1644 = as_node(@InternPool.Index.slice_const_u8_type, %1637) 
            %1645 = compile_error(%1644) 
            %1646 = dbg_block_end()
            %1647 = restore_err_ret_index(%1594, %4294967211)
            %1648 = break(%1594, @InternPool.Index.void_value)
          }) 
          %1649 = dbg_block_end()
          %1650 = break(%1092, @InternPool.Index.void_value)
        },
        %1093, %1094, %1095, %1096 => {
          %1097 = dbg_block_begin()
          %1098 = block({
            %1099 = dbg_block_begin()
            %1100 = dbg_stmt(4, 13)
            %1101 = ret_type() 
            %1102 = block_comptime({
              %1103 = break(%1102, %1084)
            }) 
            %1104 = as_node(%1102, @InternPool.Index.zero) 
            %1105 = as_node(%1101, %1104) 
            %1106 = dbg_stmt(4, 13)
            %1107 = restore_err_ret_index(%4294967211, %1105)
            %1108 = ret_node(%1105) 
            %1109 = dbg_block_end()
            %1110 = restore_err_ret_index(%1098, %4294967211)
            %1111 = break(%1098, @InternPool.Index.void_value)
          }) 
          %1112 = dbg_block_end()
          %1113 = break(%1092, @InternPool.Index.void_value)
        },
        %1114, %1115 => {
          %1116 = dbg_block_begin()
          %1117 = block({
            %1118 = dbg_block_begin()
            %1119 = dbg_stmt(7, 13)
            %1120 = ret_type() 
            %1121 = block_comptime({
              %1122 = break(%1121, %1084)
            }) 
            %1123 = dbg_stmt(7, 27)
            %1124 = enum_from_int(%1121, @InternPool.Index.zero) 
            %1125 = as_node(%1121, %1124) 
            %1126 = as_node(%1120, %1125) 
            %1127 = dbg_stmt(7, 13)
            %1128 = restore_err_ret_index(%4294967211, %1126)
            %1129 = ret_node(%1126) 
            %1130 = dbg_block_end()
            %1131 = restore_err_ret_index(%1117, %4294967211)
            %1132 = break(%1117, @InternPool.Index.void_value)
          }) 
          %1133 = dbg_block_end()
          %1134 = break(%1092, @InternPool.Index.void_value)
        },
        %1168, %1169 => {
          %1170 = dbg_block_begin()
          %1171 = block({
            %1172 = dbg_block_begin()
            %1173 = dbg_stmt(16, 13)
            %1174 = ret_type() 
            %1175 = as_node(%1174, @InternPool.Index.null_value) 
            %1176 = dbg_stmt(16, 13)
            %1177 = restore_err_ret_index(%4294967211, %1175)
            %1178 = ret_node(%1175) 
            %1179 = dbg_block_end()
            %1180 = restore_err_ret_index(%1171, %4294967211)
            %1181 = break(%1171, @InternPool.Index.void_value)
          }) 
          %1182 = dbg_block_end()
          %1183 = break(%1092, @InternPool.Index.void_value)
        },
        %1651, %1652, %1653, %1654, %1655, %1656, %1657, %1658, %1659 => {
          %1660 = dbg_block_begin()
          %1661 = block({
            %1662 = dbg_block_begin()
            %1663 = dbg_stmt(83, 13)
            %1664 = block_comptime({
              %1665 = str("Can't set a ")
              %1666 = type_name(%1084) 
              %1667 = array_cat(%1665, %1666) 
              %1668 = str(" to zero.")
              %1669 = array_cat(%1667, %1668) 
              %1670 = break(%1664, %1669)
            }) 
            %1671 = as_node(@InternPool.Index.slice_const_u8_type, %1664) 
            %1672 = compile_error(%1671) 
            %1673 = dbg_block_end()
            %1674 = restore_err_ret_index(%1661, %4294967211)
            %1675 = break(%1661, @InternPool.Index.void_value)
          }) 
          %1676 = dbg_block_end()
          %1677 = break(%1092, @InternPool.Index.void_value)
        }) 
      %1678 = ensure_result_used(%1092) 
      %1679 = dbg_block_end()
      %1680 = restore_err_ret_index(%1085, %4294967211)
      %1681 = break(%1085, @InternPool.Index.void_value)
    For full context, use the command
      zig ast-check -t /var/home/ian/src/zig/lib/std/mem.zig

  in /var/home/ian/src/zig/lib/std/mem.zig: mem.zig:zeroes
    > %1085 = block({%1086..%1681}) 
  in test4.zig: test4.zig:S
    > %11 = field_call(.compile_time, %9, "zeroes", [
        {%12, %13},
      ]) node_offset:4:12 to :4:29
  in test4.zig: test4.zig:test_0
    > %46 = struct_init_empty_result(%45) node_offset:13:18 to :13:21
  in test4.zig: test4.zig:test_0
    > %37 = block({%38..%55}) node_offset:12:6 to :12:6

/var/home/ian/src/zig/lib/std/debug.zig:342:14: 0x8bf6fc in assert (zig)
    if (!ok) unreachable; // assertion failure
             ^
/var/home/ian/src/zig/src/InternPool.zig:2029:15: 0xa333b3 in toType (zig)
        assert(i != .none);
              ^
/var/home/ian/src/zig/src/Sema.zig:34848:67: 0xf3d0b5 in resolveStructLayout (zig)
        const field_ty = struct_type.field_types.get(ip)[i].toType();
                                                                  ^
/var/home/ian/src/zig/src/Sema.zig:34722:51: 0xc98613 in resolveTypeLayout (zig)
        .Struct => return sema.resolveStructLayout(ty),
                                                  ^
/var/home/ian/src/zig/src/Sema.zig:17657:39: 0x12c0a33 in zirTypeInfo (zig)
            try sema.resolveTypeLayout(ty); // Getting alignment requires type layout
                                      ^
/var/home/ian/src/zig/src/Sema.zig:1097:66: 0xf2dde5 in analyzeBodyInner (zig)
            .type_info                    => try sema.zirTypeInfo(block, inst),
                                                                 ^
/var/home/ian/src/zig/src/Sema.zig:934:45: 0xc9f6c1 in analyzeBodyBreak (zig)
    const break_inst = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                                            ^
/var/home/ian/src/zig/src/Sema.zig:1590:62: 0xf3bb75 in analyzeBodyInner (zig)
                const break_data = (try sema.analyzeBodyBreak(block, inline_body)) orelse
                                                             ^
/var/home/ian/src/zig/src/Sema.zig:917:30: 0x1223238 in analyzeBody (zig)
    _ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                             ^
/var/home/ian/src/zig/src/Sema.zig:7516:33: 0x17c15a1 in analyzeCall (zig)
                sema.analyzeBody(&child_block, fn_info.body) catch |err| switch (err) {
                                ^
/var/home/ian/src/zig/src/Sema.zig:6735:43: 0x1286bb8 in zirCall__anon_166520 (zig)
    const call_inst = try sema.analyzeCall(block, func, func_ty, callee_src, call_src, modifier, ensure_result_used, args_info, call_dbg_node, .call);
                                          ^
/var/home/ian/src/zig/src/Sema.zig:1030:62: 0xf2ac1c in analyzeBodyInner (zig)
            .field_call                   => try sema.zirCall(block, inst, .field),
                                                             ^
/var/home/ian/src/zig/src/Sema.zig:934:45: 0xc9f6c1 in analyzeBodyBreak (zig)
    const break_inst = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                                            ^
/var/home/ian/src/zig/src/Sema.zig:883:50: 0x17b8153 in resolveBody (zig)
    const break_data = (try sema.analyzeBodyBreak(block, body)) orelse
                                                 ^
/var/home/ian/src/zig/src/Sema.zig:35885:50: 0x187b395 in semaStructFields (zig)
                const init = try sema.resolveBody(&block_scope, body, zir_index);
                                                 ^
/var/home/ian/src/zig/src/Sema.zig:35390:25: 0x135b630 in resolveTypeFieldsStruct (zig)
    try semaStructFields(mod, sema.arena, struct_type);
                        ^
/var/home/ian/src/zig/src/type.zig:2689:61: 0xf40cf8 in comptimeOnlyAdvanced (zig)
                            try sema.resolveTypeFieldsStruct(ty.toIntern(), struct_type);
                                                            ^
/var/home/ian/src/zig/src/type.zig:2607:69: 0xf404ca in comptimeOnlyAdvanced (zig)
                        else => return child_ty.comptimeOnlyAdvanced(mod, opt_sema),
                                                                    ^
/var/home/ian/src/zig/src/Sema.zig:37138:35: 0xc87800 in typeRequiresComptime (zig)
    return ty.comptimeOnlyAdvanced(sema.mod, sema);
                                  ^
/var/home/ian/src/zig/src/Sema.zig:25651:70: 0xc86b25 in validateExternType (zig)
            return !(ty.isSlice(mod) or try sema.typeRequiresComptime(ty));
                                                                     ^
/var/home/ian/src/zig/src/Sema.zig:35817:56: 0x187a417 in semaStructFields (zig)
            .Extern => if (!try sema.validateExternType(field_ty, .struct_field)) {
                                                       ^
/var/home/ian/src/zig/src/Sema.zig:35390:25: 0x135b630 in resolveTypeFieldsStruct (zig)
    try semaStructFields(mod, sema.arena, struct_type);
                        ^
/var/home/ian/src/zig/src/Sema.zig:35323:48: 0xf423a1 in resolveTypeFields (zig)
            => try sema.resolveTypeFieldsStruct(ty_ip, ip.indexToKey(ty_ip).struct_type),
                                               ^
/var/home/ian/src/zig/src/Sema.zig:19165:31: 0x138e381 in structInitEmpty (zig)
    try sema.resolveTypeFields(struct_ty);
                              ^
/var/home/ian/src/zig/src/Sema.zig:19137:44: 0x12c6fed in zirStructInitEmptyResult (zig)
        .Struct => try sema.structInitEmpty(block, obj_ty, src, src),
                                           ^
/var/home/ian/src/zig/src/Sema.zig:1105:79: 0xf2e3ce in analyzeBodyInner (zig)
            .struct_init_empty_result     => try sema.zirStructInitEmptyResult(block, inst, false),
                                                                              ^
/var/home/ian/src/zig/src/Sema.zig:5897:34: 0x1874a3b in resolveBlockBody (zig)
        if (sema.analyzeBodyInner(child_block, body)) |_| {
                                 ^
/var/home/ian/src/zig/src/Sema.zig:5880:33: 0x1350614 in zirBlock (zig)
    return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
                                ^
/var/home/ian/src/zig/src/Sema.zig:1578:49: 0xf3b8ff in analyzeBodyInner (zig)
                    break :blk try sema.zirBlock(block, inst, tags[inst] == .block_comptime);
                                                ^
/var/home/ian/src/zig/src/Sema.zig:917:30: 0x1223238 in analyzeBody (zig)
    _ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                             ^
/var/home/ian/src/zig/src/Module.zig:4825:21: 0xf08916 in analyzeFnBody (zig)
    sema.analyzeBody(&inner_block, fn_info.body) catch |err| switch (err) {
                    ^
/var/home/ian/src/zig/src/Module.zig:3401:40: 0xc80a2d in ensureFuncBodyAnalyzed (zig)
            var air = mod.analyzeFnBody(func_index, sema_arena) catch |err| switch (err) {
                                       ^
/var/home/ian/src/zig/src/Compilation.zig:3513:42: 0xc7ea9d in processOneJob (zig)
            module.ensureFuncBodyAnalyzed(func) catch |err| switch (err) {
                                         ^
/var/home/ian/src/zig/src/Compilation.zig:3450:30: 0xa627db in performAllTheWork (zig)
            try processOneJob(comp, work_item, main_progress_node);
                             ^
/var/home/ian/src/zig/src/Compilation.zig:2227:31: 0xa5dd6c in update (zig)
    try comp.performAllTheWork(main_progress_node);
                              ^
/var/home/ian/src/zig/src/main.zig:4244:24: 0xa8d6b2 in updateModule (zig)
        try comp.update(main_progress_node);
                       ^
/var/home/ian/src/zig/src/main.zig:3647:17: 0xaafb55 in buildOutputType (zig)
    updateModule(comp) catch |err| switch (err) {
                ^
/var/home/ian/src/zig/src/main.zig:276:31: 0x8c1b27 in mainArgs (zig)
        return buildOutputType(gpa, arena, args, .zig_test);
                              ^
/var/home/ian/src/zig/src/main.zig:214:20: 0x8beb85 in main (zig)
    return mainArgs(gpa, arena, args);
                   ^
/var/home/ian/src/zig/lib/std/start.zig:583:37: 0x8be59e in main (zig)
            const result = root.main() catch |err| {
                                    ^
???:?:?: 0x7fd9088d8149 in ??? (libc.so.6)
Unwind information for `libc.so.6:0x7fd9088d8149` was not available, trace may be incomplete

???:?:?: 0x7fd9088d820a in ??? (libc.so.6)
???:?:?: 0x8be1a4 in ??? (???)
Aborted (core dumped)
Debug output for the smaller repro

@ianprime0509
Copy link
Contributor

Here's a variant of the above repro, this time properly reproducing the original crash:

const std = @import("std");

const S = extern struct {
    t: T = std.mem.zeroes(T),
};

const T = extern struct {
    s: [*c]S = std.mem.zeroes([*c]S),
    u: c_uint = std.mem.zeroes(c_uint),
};

const U = extern struct {
    s: [*c]S = std.mem.zeroes([*c]S),
};

test {
    const u: U = .{};
    _ = u;
}
thread 1213658 panic: attempt to use null value
Analyzing /var/home/ian/src/zig/lib/std/mem.zig: mem.zig:zeroes
      %1086 = dbg_block_begin()
      %1087 = dbg_stmt(2, 5)
      %1088 = block_comptime({
        %1089 = break(%1088, %1084)
      }) 
    > %1090 = type_info(%1088) 
      %1091 = dbg_stmt(2, 13)
      %1093 = enum_literal("ComptimeInt") 
      %1094 = enum_literal("Int") 
      %1095 = enum_literal("ComptimeFloat") 
      %1096 = enum_literal("Float") 
      %1114 = enum_literal("Enum") 
      %1115 = enum_literal("EnumLiteral") 
      %1135 = enum_literal("Void") 
      %1153 = enum_literal("Bool") 
      %1168 = enum_literal("Optional") 
      %1169 = enum_literal("Null") 
      %1184 = enum_literal("Struct") 
      %1328 = enum_literal("Pointer") 
      %1479 = enum_literal("Array") 
      %1566 = enum_literal("Vector") 
      %1591 = enum_literal("Union") 
      %1651 = enum_literal("ErrorUnion") 
      %1652 = enum_literal("ErrorSet") 
      %1653 = enum_literal("Fn") 
      %1654 = enum_literal("Type") 
      %1655 = enum_literal("NoReturn") 
      %1656 = enum_literal("Undefined") 
      %1657 = enum_literal("Opaque") 
      %1658 = enum_literal("Frame") 
      %1659 = enum_literal("AnyFrame") 
      %1092 = switch_block(%1090,
        %1135 => {
          %1136 = dbg_block_begin()
          %1137 = block({
            %1138 = dbg_block_begin()
            %1139 = dbg_stmt(10, 13)
            %1140 = ret_type() 
            %1141 = block({
              %1142 = restore_err_ret_index(%1141, %4294967211)
              %1143 = break(%1141, @InternPool.Index.void_value)
            }) 
            %1144 = as_node(%1140, @InternPool.Index.void_value) 
            %1145 = restore_err_ret_index(%4294967211, %4294967211)
            %1146 = dbg_stmt(10, 13)
            %1147 = ret_node(%1144) 
            %1148 = dbg_block_end()
            %1149 = restore_err_ret_index(%1137, %4294967211)
            %1150 = break(%1137, @InternPool.Index.void_value)
          }) 
          %1151 = dbg_block_end()
          %1152 = break(%1092, @InternPool.Index.void_value)
        },
        %1153 => {
          %1154 = dbg_block_begin()
          %1155 = block({
            %1156 = dbg_block_begin()
            %1157 = dbg_stmt(13, 13)
            %1158 = ret_type() 
            %1159 = as_node(%1158, @InternPool.Index.bool_false) 
            %1160 = dbg_stmt(13, 13)
            %1161 = restore_err_ret_index(%4294967211, %1159)
            %1162 = ret_node(%1159) 
            %1163 = dbg_block_end()
            %1164 = restore_err_ret_index(%1155, %4294967211)
            %1165 = break(%1155, @InternPool.Index.void_value)
          }) 
          %1166 = dbg_block_end()
          %1167 = break(%1092, @InternPool.Index.void_value)
        },
        by_val %1184 => {
          %1185 = dbg_block_begin()
          %1186 = dbg_var_val(%1092, "struct_info")
          %1187 = block({
            %1188 = dbg_block_begin()
            %1189 = dbg_stmt(19, 17)
            %1196 = block({
              %1190 = block_comptime({
                %1191 = break(%1190, %1084)
              }) 
              %1192 = size_of(%1190) 
              %1193 = cmp_eq(%1192, @InternPool.Index.zero) 
              %1194 = as_node(@InternPool.Index.bool_type, %1193) 
              %1195 = condbr(%1194, {
                %1197 = dbg_block_begin()
                %1198 = dbg_stmt(19, 34)
                %1199 = ret_type() 
                %1200 = as_node(%1199, @InternPool.Index.undef) 
                %1201 = dbg_stmt(19, 34)
                %1202 = restore_err_ret_index(%4294967211, %1200)
                %1203 = ret_node(%1200) 
              }, {
                %1204 = break(%1196, @InternPool.Index.void_value)
              }) 
            }) 
            %1205 = ensure_result_used(%1196) 
            %1206 = dbg_stmt(20, 17)
            %1213 = block({
              %1207 = dbg_stmt(20, 28)
              %1208 = field_val(%1092, "layout") 
              %1209 = enum_literal("Extern") 
              %1210 = cmp_eq(%1208, %1209) 
              %1211 = as_node(@InternPool.Index.bool_type, %1210) 
              %1212 = condbr(%1211, {
                %1214 = dbg_block_begin()
                %1215 = block({
                  %1216 = dbg_block_begin()
                  %1217 = dbg_stmt(21, 17)
                  %1218 = block_comptime({
                    %1219 = break(%1218, %1084)
                  }) 
                  %1220 = alloc_mut(%1218) 
                  %1221 = store_node(%1220, @InternPool.Index.undef) 
                  %1222 = dbg_var_ptr(%1220, "item")
                  %1223 = dbg_stmt(22, 17)
                  %1224 = decl_val("asBytes") 
                  %1225 = dbg_stmt(22, 32)
                  %1226 = call(.auto, %1224, [
                    {
                      %1227 = validate_ref_ty(%1226) 
                      %1228 = break_inline(%1226, %1220)
                    },
                  ]) 
                  %1229 = typeof(%1226) 
                  %1230 = indexable_ptr_elem_type(%1229) 
                  %1231 = memset(%1226, @InternPool.Index.zero) 
                  %1232 = dbg_stmt(23, 17)
                  %1233 = ret_type() 
                  %1234 = load(%1220) 
                  %1235 = as_node(%1233, %1234) 
                  %1236 = dbg_stmt(23, 17)
                  %1237 = restore_err_ret_index(%4294967211, %1235)
                  %1238 = ret_node(%1235) 
                  %1239 = dbg_block_end()
                  %1240 = restore_err_ret_index(%1215, %4294967211)
                  %1241 = break(%1215, @InternPool.Index.void_value)
                }) 
                %1242 = dbg_block_end()
                %1243 = break(%1213, @InternPool.Index.void_value)
              }, {
                %1244 = dbg_block_begin()
                %1245 = block({
                  %1246 = dbg_block_begin()
                  %1247 = dbg_stmt(25, 17)
                  %1248 = block_comptime({
                    %1249 = break(%1248, %1084)
                  }) 
                  %1250 = alloc_mut(%1248) 
                  %1251 = store_node(%1250, @InternPool.Index.undef) 
                  %1252 = dbg_var_ptr(%1250, "structure")
                  %1253 = alloc_comptime_mut(@InternPool.Index.usize_type) 
                  %1254 = store(%1253, @InternPool.Index.zero_usize)
                  %1255 = dbg_stmt(26, 29)
                  %1256 = dbg_stmt(26, 40)
                  %1257 = field_val(%1092, "fields") 
                  %1258 = for_len({%1257}) 
                  %1259 = block_inline({
                    %1260 = load(%1253) 
                    %1263 = block_inline({
                      %1261 = cmp_lt(%1260, %1258) 
                      %1262 = condbr_inline(%1261, {
                        %1264 = dbg_block_begin()
                        %1265 = elem_val(%1257, %1260) 
                        %1266 = dbg_var_val(%1265, "field")
                        %1267 = block({
                          %1268 = dbg_block_begin()
                          %1269 = dbg_stmt(27, 25)
                          %1276 = block({
                            %1270 = dbg_stmt(27, 31)
                            %1271 = field_val(%1265, "is_comptime") 
                            %1272 = as_node(@InternPool.Index.bool_type, %1271) 
                            %1273 = bool_not(%1272) 
                            %1274 = as_node(@InternPool.Index.bool_type, %1273) 
                            %1275 = condbr(%1274, {
                              %1277 = dbg_block_begin()
                              %1278 = block({
                                %1279 = dbg_block_begin()
                                %1280 = dbg_stmt(28, 25)
                                %1281 = block_comptime({
                                  %1282 = field_val(%1265, "name") 
                                  %1283 = break(%1281, %1282)
                                }) 
                                %1284 = as_node(@InternPool.Index.slice_const_u8_type, %1281) 
                                %1285 = field_ptr_named(%1250, %1284) 
                                %1286 = decl_val("zeroes") 
                                %1287 = dbg_stmt(28, 63)
                                %1288 = call(.auto, %1286, [
                                  {
                                    %1289 = dbg_stmt(28, 69)
                                    %1290 = field_val(%1265, "type") 
                                    %1291 = break_inline(%1288, %1290)
                                  },
                                ]) 
                                %1292 = store_node(%1285, %1288) 
                                %1293 = dbg_block_end()
                                %1294 = restore_err_ret_index(%1278, %4294967211)
                                %1295 = break(%1278, @InternPool.Index.void_value)
                              }) 
                              %1296 = dbg_block_end()
                              %1297 = break(%1276, @InternPool.Index.void_value)
                            }, {
                              %1298 = break(%1276, @InternPool.Index.void_value)
                            }) 
                          }) 
                          %1299 = ensure_result_used(%1276) 
                          %1300 = dbg_block_end()
                          %1301 = restore_err_ret_index(%1267, %4294967211)
                          %1302 = break(%1267, @InternPool.Index.void_value)
                        }) 
                        %1303 = dbg_block_end()
                        %1304 = break_inline(%1263, @InternPool.Index.void_value)
                      }, {
                        %1305 = break_inline(%1259, @InternPool.Index.void_value)
                      }) 
                    }) 
                    %1306 = add_unsafe(%1260, @InternPool.Index.one_usize) 
                    %1307 = store(%1253, %1306)
                    %1308 = repeat_inline() 
                  }) 
                  %1309 = ensure_result_used(%1259) 
                  %1310 = dbg_stmt(31, 17)
                  %1311 = ret_type() 
                  %1312 = load(%1250) 
                  %1313 = as_node(%1311, %1312) 
                  %1314 = dbg_stmt(31, 17)
                  %1315 = restore_err_ret_index(%4294967211, %1313)
                  %1316 = ret_node(%1313) 
                  %1317 = dbg_block_end()
                  %1318 = restore_err_ret_index(%1245, %4294967211)
                  %1319 = break(%1245, @InternPool.Index.void_value)
                }) 
                %1320 = dbg_block_end()
                %1321 = break(%1213, @InternPool.Index.void_value)
              }) 
            }) 
            %1322 = ensure_result_used(%1213) 
            %1323 = dbg_block_end()
            %1324 = restore_err_ret_index(%1187, %4294967211)
            %1325 = break(%1187, @InternPool.Index.void_value)
          }) 
          %1326 = dbg_block_end()
          %1327 = break(%1092, @InternPool.Index.void_value)
        },
        by_val %1328 => {
          %1329 = dbg_block_begin()
          %1330 = dbg_var_val(%1092, "ptr_info")
          %1331 = block({
            %1332 = dbg_block_begin()
            %1333 = dbg_stmt(35, 13)
            %1334 = dbg_stmt(35, 29)
            %1335 = field_val(%1092, "size") 
            %1336 = dbg_stmt(35, 21)
            %1338 = enum_literal("Slice") 
            %1427 = enum_literal("C") 
            %1442 = enum_literal("One") 
            %1443 = enum_literal("Many") 
            %1337 = switch_block(%1335,
              %1338 => {
                %1339 = dbg_block_begin()
                %1340 = block({
                  %1341 = dbg_block_begin()
                  %1342 = dbg_stmt(37, 25)
                  %1347 = block({
                    %1343 = dbg_stmt(37, 33)
                    %1344 = field_val(%1092, "sentinel") 
                    %1345 = is_non_null(%1344) 
                    %1346 = condbr(%1345, {
                      %1348 = dbg_block_begin()
                      %1349 = optional_payload_unsafe(%1344) 
                      %1350 = dbg_var_val(%1349, "sentinel")
                      %1351 = block({
                        %1352 = dbg_block_begin()
                        %1353 = dbg_stmt(38, 29)
                        %1372 = block({
                          %1354 = dbg_stmt(38, 37)
                          %1355 = field_val(%1092, "child") 
                          %1356 = cmp_eq(%1355, @InternPool.Index.u8_type) 
                          %1357 = as_node(@InternPool.Index.bool_type, %1356) 
                          %1358 = bool_br_and(%1357, {
                            %1359 = block_comptime({
                              %1360 = ptr_type(@InternPool.Index.u8_type, const, One) 
                              %1361 = break(%1359, %1360)
                            }) 
                            %1362 = dbg_stmt(38, 69)
                            %1363 = ptr_cast(%1359, %1349) 
                            %1364 = as_node(%1359, %1363) 
                            %1365 = validate_deref(%1364) 
                            %1366 = load(%1364) 
                            %1367 = cmp_eq(%1366, @InternPool.Index.zero) 
                            %1368 = as_node(@InternPool.Index.bool_type, %1367) 
                            %1369 = break_inline(%1358, %1368)
                          }
                          %1370 = as_node(@InternPool.Index.bool_type, %1358) 
                          %1371 = condbr(%1370, {
                            %1373 = dbg_block_begin()
                            %1374 = block({
                              %1375 = dbg_block_begin()
                              %1376 = dbg_stmt(39, 29)
                              %1377 = ret_type() 
                              %1378 = str("")
                              %1379 = as_node(%1377, %1378) 
                              %1380 = restore_err_ret_index(%4294967211, %4294967211)
                              %1381 = dbg_stmt(39, 29)
                              %1382 = ret_node(%1379) 
                              %1383 = dbg_block_end()
                              %1384 = restore_err_ret_index(%1374, %4294967211)
                              %1385 = break(%1374, @InternPool.Index.void_value)
                            }) 
                            %1386 = dbg_block_end()
                            %1387 = break(%1372, @InternPool.Index.void_value)
                          }, {
                            %1388 = break(%1372, @InternPool.Index.void_value)
                          }) 
                        }) 
                        %1389 = ensure_result_used(%1372) 
                        %1390 = dbg_stmt(41, 25)
                        %1391 = str("Can't set a sentinel slice to zero. This would require allocating memory.")
                        %1392 = as_node(@InternPool.Index.slice_const_u8_type, %1391) 
                        %1393 = compile_error(%1392) 
                        %1394 = dbg_block_end()
                        %1395 = restore_err_ret_index(%1351, %4294967211)
                        %1396 = break(%1351, @InternPool.Index.void_value)
                      }) 
                      %1397 = dbg_block_end()
                      %1398 = break(%1347, @InternPool.Index.void_value)
                    }, {
                      %1399 = dbg_block_begin()
                      %1400 = block({
                        %1401 = dbg_block_begin()
                        %1402 = dbg_stmt(43, 25)
                        %1403 = ret_type() 
                        %1404 = validate_ref_ty(%1403) 
                        %1405 = block_comptime({
                          %1406 = field_val(%1092, "child") 
                          %1407 = break(%1405, %1406)
                        }) 
                        %1408 = array_type(@InternPool.Index.zero_usize, %1405) 
                        %1409 = struct_init_empty(%1408) 
                        %1410 = coerce_ptr_elem_ty(%1403, %1409) 
                        %1411 = ref(%1410) 
                        %1412 = as_node(%1403, %1411) 
                        %1413 = restore_err_ret_index(%4294967211, %4294967211)
                        %1414 = dbg_stmt(43, 25)
                        %1415 = ret_node(%1412) 
                        %1416 = dbg_block_end()
                        %1417 = restore_err_ret_index(%1400, %4294967211)
                        %1418 = break(%1400, @InternPool.Index.void_value)
                      }) 
                      %1419 = dbg_block_end()
                      %1420 = break(%1347, @InternPool.Index.void_value)
                    }) 
                  }) 
                  %1421 = ensure_result_used(%1347) 
                  %1422 = dbg_block_end()
                  %1423 = restore_err_ret_index(%1340, %4294967211)
                  %1424 = break(%1340, @InternPool.Index.void_value)
                }) 
                %1425 = dbg_block_end()
                %1426 = break(%1337, @InternPool.Index.void_value)
              },
              %1427 => {
                %1428 = dbg_block_begin()
                %1429 = block({
                  %1430 = dbg_block_begin()
                  %1431 = dbg_stmt(47, 21)
                  %1432 = ret_type() 
                  %1433 = as_node(%1432, @InternPool.Index.null_value) 
                  %1434 = dbg_stmt(47, 21)
                  %1435 = restore_err_ret_index(%4294967211, %1433)
                  %1436 = ret_node(%1433) 
                  %1437 = dbg_block_end()
                  %1438 = restore_err_ret_index(%1429, %4294967211)
                  %1439 = break(%1429, @InternPool.Index.void_value)
                }) 
                %1440 = dbg_block_end()
                %1441 = break(%1337, @InternPool.Index.void_value)
              },
              %1442, %1443 => {
                %1444 = dbg_block_begin()
                %1445 = block({
                  %1446 = dbg_block_begin()
                  %1447 = dbg_stmt(50, 25)
                  %1452 = block({
                    %1448 = dbg_stmt(50, 33)
                    %1449 = field_val(%1092, "is_allowzero") 
                    %1450 = as_node(@InternPool.Index.bool_type, %1449) 
                    %1451 = condbr(%1450, {
                      %1453 = dbg_block_begin()
                      %1454 = dbg_stmt(50, 48)
                      %1455 = ret_type() 
                      %1456 = dbg_stmt(50, 55)
                      %1457 = ptr_from_int(%1455, @InternPool.Index.zero) 
                      %1458 = as_node(%1455, %1457) 
                      %1459 = restore_err_ret_index(%4294967211, %4294967211)
                      %1460 = dbg_stmt(50, 48)
                      %1461 = ret_node(%1458) 
                    }, {
                      %1462 = break(%1452, @InternPool.Index.void_value)
                    }) 
                  }) 
                  %1463 = ensure_result_used(%1452) 
                  %1464 = dbg_stmt(51, 21)
                  %1465 = str("Only nullable and allowzero pointers can be set to zero.")
                  %1466 = as_node(@InternPool.Index.slice_const_u8_type, %1465) 
                  %1467 = compile_error(%1466) 
                  %1468 = dbg_block_end()
                  %1469 = restore_err_ret_index(%1445, %4294967211)
                  %1470 = break(%1445, @InternPool.Index.void_value)
                }) 
                %1471 = dbg_block_end()
                %1472 = break(%1337, @InternPool.Index.void_value)
              }) 
            %1473 = ensure_result_used(%1337) 
            %1474 = dbg_block_end()
            %1475 = restore_err_ret_index(%1331, %4294967211)
            %1476 = break(%1331, @InternPool.Index.void_value)
          }) 
          %1477 = dbg_block_end()
          %1478 = break(%1092, @InternPool.Index.void_value)
        },
        by_val %1479 => {
          %1480 = dbg_block_begin()
          %1481 = dbg_var_val(%1092, "info")
          %1482 = block({
            %1483 = dbg_block_begin()
            %1484 = dbg_stmt(56, 17)
            %1489 = block({
              %1485 = dbg_stmt(56, 21)
              %1486 = field_val(%1092, "sentinel") 
              %1487 = is_non_null(%1486) 
              %1488 = condbr(%1487, {
                %1490 = dbg_block_begin()
                %1491 = optional_payload_unsafe(%1486) 
                %1492 = dbg_var_val(%1491, "sentinel_ptr")
                %1493 = block({
                  %1494 = dbg_block_begin()
                  %1495 = dbg_stmt(57, 17)
                  %1496 = block_comptime({
                    %1497 = field_val(%1092, "child") 
                    %1498 = ptr_type(%1497, const, One, align(@InternPool.Index.one)) 
                    %1499 = break(%1496, %1498)
                  }) 
                  %1500 = dbg_stmt(57, 66)
                  %1501 = ptr_cast(%1496, %1491) 
                  %1502 = as_node(%1496, %1501) 
                  %1503 = validate_deref(%1502) 
                  %1504 = load(%1502) 
                  %1505 = dbg_var_val(%1504, "sentinel")
                  %1506 = save_err_ret_index(%1504)
                  %1507 = dbg_stmt(58, 17)
                  %1508 = ret_type() 
                  %1509 = int(1)
                  %1510 = block_comptime({
                    %1511 = field_val(%1092, "child") 
                    %1512 = break(%1510, %1511)
                  }) 
                  %1513 = block_comptime({
                    %1514 = break(%1513, %1504)
                  }) 
                  %1515 = as_node(%1510, %1513) 
                  %1516 = array_type_sentinel(%1509, %1515, %1510) 
                  %1517 = decl_val("zeroes") 
                  %1518 = dbg_stmt(58, 53)
                  %1519 = call(.auto, %1517, [
                    {
                      %1520 = dbg_stmt(58, 58)
                      %1521 = field_val(%1092, "child") 
                      %1522 = break_inline(%1519, %1521)
                    },
                  ]) 
                  %1523 = array_init(%1516{%1519}) 
                  %1524 = block_comptime({
                    %1525 = field_val(%1092, "len") 
                    %1526 = break(%1524, %1525)
                  }) 
                  %1527 = array_mul(%1523, %1524) 
                  %1528 = as_node(%1508, %1527) 
                  %1529 = restore_err_ret_index(%4294967211, %4294967211)
                  %1530 = dbg_stmt(58, 17)
                  %1531 = ret_node(%1528) 
                  %1532 = dbg_block_end()
                  %1533 = restore_err_ret_index(%1493, %4294967211)
                  %1534 = break(%1493, @InternPool.Index.void_value)
                }) 
                %1535 = dbg_block_end()
                %1536 = break(%1489, @InternPool.Index.void_value)
              }, {
                %1537 = break(%1489, @InternPool.Index.void_value)
              }) 
            }) 
            %1538 = ensure_result_used(%1489) 
            %1539 = dbg_stmt(60, 13)
            %1540 = ret_type() 
            %1541 = int(1)
            %1542 = block_comptime({
              %1543 = field_val(%1092, "child") 
              %1544 = break(%1542, %1543)
            }) 
            %1545 = array_type(%1541, %1542) 
            %1546 = decl_val("zeroes") 
            %1547 = dbg_stmt(60, 40)
            %1548 = call(.auto, %1546, [
              {
                %1549 = dbg_stmt(60, 45)
                %1550 = field_val(%1092, "child") 
                %1551 = break_inline(%1548, %1550)
              },
            ]) 
            %1552 = array_init(%1545{%1548}) 
            %1553 = block_comptime({
              %1554 = field_val(%1092, "len") 
              %1555 = break(%1553, %1554)
            }) 
            %1556 = array_mul(%1552, %1553) 
            %1557 = as_node(%1540, %1556) 
            %1558 = restore_err_ret_index(%4294967211, %4294967211)
            %1559 = dbg_stmt(60, 13)
            %1560 = ret_node(%1557) 
            %1561 = dbg_block_end()
            %1562 = restore_err_ret_index(%1482, %4294967211)
            %1563 = break(%1482, @InternPool.Index.void_value)
          }) 
          %1564 = dbg_block_end()
          %1565 = break(%1092, @InternPool.Index.void_value)
        },
        by_val %1566 => {
          %1567 = dbg_block_begin()
          %1568 = dbg_var_val(%1092, "info")
          %1569 = block({
            %1570 = dbg_block_begin()
            %1571 = dbg_stmt(63, 13)
            %1572 = ret_type() 
            %1573 = vector_elem_type(%1572) 
            %1574 = decl_val("zeroes") 
            %1575 = dbg_stmt(63, 33)
            %1576 = call(.auto, %1574, [
              {
                %1577 = dbg_stmt(63, 38)
                %1578 = field_val(%1092, "child") 
                %1579 = break_inline(%1576, %1578)
              },
            ]) 
            %1580 = as_node(%1573, %1576) 
            %1581 = splat(%1572, %1580) 
            %1582 = as_node(%1572, %1581) 
            %1583 = restore_err_ret_index(%4294967211, %4294967211)
            %1584 = dbg_stmt(63, 13)
            %1585 = ret_node(%1582) 
            %1586 = dbg_block_end()
            %1587 = restore_err_ret_index(%1569, %4294967211)
            %1588 = break(%1569, @InternPool.Index.void_value)
          }) 
          %1589 = dbg_block_end()
          %1590 = break(%1092, @InternPool.Index.void_value)
        },
        by_val %1591 => {
          %1592 = dbg_block_begin()
          %1593 = dbg_var_val(%1092, "info")
          %1594 = block({
            %1595 = dbg_block_begin()
            %1596 = dbg_stmt(66, 17)
            %1603 = block({
              %1597 = dbg_stmt(66, 21)
              %1598 = field_val(%1092, "layout") 
              %1599 = enum_literal("Extern") 
              %1600 = cmp_eq(%1598, %1599) 
              %1601 = as_node(@InternPool.Index.bool_type, %1600) 
              %1602 = condbr(%1601, {
                %1604 = dbg_block_begin()
                %1605 = block({
                  %1606 = dbg_block_begin()
                  %1607 = dbg_stmt(67, 17)
                  %1608 = block_comptime({
                    %1609 = break(%1608, %1084)
                  }) 
                  %1610 = alloc_mut(%1608) 
                  %1611 = store_node(%1610, @InternPool.Index.undef) 
                  %1612 = dbg_var_ptr(%1610, "item")
                  %1613 = dbg_stmt(68, 17)
                  %1614 = decl_val("asBytes") 
                  %1615 = dbg_stmt(68, 32)
                  %1616 = call(.auto, %1614, [
                    {
                      %1617 = validate_ref_ty(%1616) 
                      %1618 = break_inline(%1616, %1610)
                    },
                  ]) 
                  %1619 = typeof(%1616) 
                  %1620 = indexable_ptr_elem_type(%1619) 
                  %1621 = memset(%1616, @InternPool.Index.zero) 
                  %1622 = dbg_stmt(69, 17)
                  %1623 = ret_type() 
                  %1624 = load(%1610) 
                  %1625 = as_node(%1623, %1624) 
                  %1626 = dbg_stmt(69, 17)
                  %1627 = restore_err_ret_index(%4294967211, %1625)
                  %1628 = ret_node(%1625) 
                  %1629 = dbg_block_end()
                  %1630 = restore_err_ret_index(%1605, %4294967211)
                  %1631 = break(%1605, @InternPool.Index.void_value)
                }) 
                %1632 = dbg_block_end()
                %1633 = break(%1603, @InternPool.Index.void_value)
              }, {
                %1634 = break(%1603, @InternPool.Index.void_value)
              }) 
            }) 
            %1635 = ensure_result_used(%1603) 
            %1636 = dbg_stmt(71, 13)
            %1637 = block_comptime({
              %1638 = str("Can't set a ")
              %1639 = type_name(%1084) 
              %1640 = array_cat(%1638, %1639) 
              %1641 = str(" to zero.")
              %1642 = array_cat(%1640, %1641) 
              %1643 = break(%1637, %1642)
            }) 
            %1644 = as_node(@InternPool.Index.slice_const_u8_type, %1637) 
            %1645 = compile_error(%1644) 
            %1646 = dbg_block_end()
            %1647 = restore_err_ret_index(%1594, %4294967211)
            %1648 = break(%1594, @InternPool.Index.void_value)
          }) 
          %1649 = dbg_block_end()
          %1650 = break(%1092, @InternPool.Index.void_value)
        },
        %1093, %1094, %1095, %1096 => {
          %1097 = dbg_block_begin()
          %1098 = block({
            %1099 = dbg_block_begin()
            %1100 = dbg_stmt(4, 13)
            %1101 = ret_type() 
            %1102 = block_comptime({
              %1103 = break(%1102, %1084)
            }) 
            %1104 = as_node(%1102, @InternPool.Index.zero) 
            %1105 = as_node(%1101, %1104) 
            %1106 = dbg_stmt(4, 13)
            %1107 = restore_err_ret_index(%4294967211, %1105)
            %1108 = ret_node(%1105) 
            %1109 = dbg_block_end()
            %1110 = restore_err_ret_index(%1098, %4294967211)
            %1111 = break(%1098, @InternPool.Index.void_value)
          }) 
          %1112 = dbg_block_end()
          %1113 = break(%1092, @InternPool.Index.void_value)
        },
        %1114, %1115 => {
          %1116 = dbg_block_begin()
          %1117 = block({
            %1118 = dbg_block_begin()
            %1119 = dbg_stmt(7, 13)
            %1120 = ret_type() 
            %1121 = block_comptime({
              %1122 = break(%1121, %1084)
            }) 
            %1123 = dbg_stmt(7, 27)
            %1124 = enum_from_int(%1121, @InternPool.Index.zero) 
            %1125 = as_node(%1121, %1124) 
            %1126 = as_node(%1120, %1125) 
            %1127 = dbg_stmt(7, 13)
            %1128 = restore_err_ret_index(%4294967211, %1126)
            %1129 = ret_node(%1126) 
            %1130 = dbg_block_end()
            %1131 = restore_err_ret_index(%1117, %4294967211)
            %1132 = break(%1117, @InternPool.Index.void_value)
          }) 
          %1133 = dbg_block_end()
          %1134 = break(%1092, @InternPool.Index.void_value)
        },
        %1168, %1169 => {
          %1170 = dbg_block_begin()
          %1171 = block({
            %1172 = dbg_block_begin()
            %1173 = dbg_stmt(16, 13)
            %1174 = ret_type() 
            %1175 = as_node(%1174, @InternPool.Index.null_value) 
            %1176 = dbg_stmt(16, 13)
            %1177 = restore_err_ret_index(%4294967211, %1175)
            %1178 = ret_node(%1175) 
            %1179 = dbg_block_end()
            %1180 = restore_err_ret_index(%1171, %4294967211)
            %1181 = break(%1171, @InternPool.Index.void_value)
          }) 
          %1182 = dbg_block_end()
          %1183 = break(%1092, @InternPool.Index.void_value)
        },
        %1651, %1652, %1653, %1654, %1655, %1656, %1657, %1658, %1659 => {
          %1660 = dbg_block_begin()
          %1661 = block({
            %1662 = dbg_block_begin()
            %1663 = dbg_stmt(83, 13)
            %1664 = block_comptime({
              %1665 = str("Can't set a ")
              %1666 = type_name(%1084) 
              %1667 = array_cat(%1665, %1666) 
              %1668 = str(" to zero.")
              %1669 = array_cat(%1667, %1668) 
              %1670 = break(%1664, %1669)
            }) 
            %1671 = as_node(@InternPool.Index.slice_const_u8_type, %1664) 
            %1672 = compile_error(%1671) 
            %1673 = dbg_block_end()
            %1674 = restore_err_ret_index(%1661, %4294967211)
            %1675 = break(%1661, @InternPool.Index.void_value)
          }) 
          %1676 = dbg_block_end()
          %1677 = break(%1092, @InternPool.Index.void_value)
        }) 
      %1678 = ensure_result_used(%1092) 
      %1679 = dbg_block_end()
      %1680 = restore_err_ret_index(%1085, %4294967211)
      %1681 = break(%1085, @InternPool.Index.void_value)
    For full context, use the command
      zig ast-check -t /var/home/ian/src/zig/lib/std/mem.zig

  in /var/home/ian/src/zig/lib/std/mem.zig: mem.zig:zeroes
    > %1085 = block({%1086..%1681}) 
  in test4.zig: test4.zig:S
    > %11 = field_call(.compile_time, %9, "zeroes", [
        {%12, %13},
      ]) node_offset:4:12 to :4:29
  in test4.zig: test4.zig:test_0
    > %60 = struct_init_empty_result(%59) node_offset:17:18 to :17:21
  in test4.zig: test4.zig:test_0
    > %51 = block({%52..%69}) node_offset:16:6 to :16:6

/var/home/ian/src/zig/src/type.zig:2684:50: 0xf40cb3 in comptimeOnlyAdvanced (zig)
                            const sema = opt_sema.?;
                                                 ^
/var/home/ian/src/zig/src/type.zig:2607:69: 0xf404ca in comptimeOnlyAdvanced (zig)
                        else => return child_ty.comptimeOnlyAdvanced(mod, opt_sema),
                                                                    ^
/var/home/ian/src/zig/src/type.zig:2589:39: 0x135bf6c in comptimeOnly (zig)
        return ty.comptimeOnlyAdvanced(mod, null) catch unreachable;
                                      ^
/var/home/ian/src/zig/src/type.zig:478:41: 0xf42706 in hasRuntimeBitsAdvanced (zig)
                    return !comptimeOnly(ty, mod);
                                        ^
/var/home/ian/src/zig/src/type.zig:767:38: 0xcae975 in hasRuntimeBits (zig)
        return hasRuntimeBitsAdvanced(ty, mod, false, .eager) catch unreachable;
                                     ^
/var/home/ian/src/zig/src/type.zig:793:45: 0xca01a8 in isFnOrHasRuntimeBits (zig)
            else => return ty.hasRuntimeBits(mod),
                                            ^
/var/home/ian/src/zig/src/Module.zig:4642:56: 0x16accde in finalizeAnonDecl (zig)
    if (mod.declPtr(decl_index).ty.isFnOrHasRuntimeBits(mod)) {
                                                       ^
/var/home/ian/src/zig/src/Sema.zig:817:42: 0x16acbdb in finish (zig)
            try sema.mod.finalizeAnonDecl(new_decl_index);
                                         ^
/var/home/ian/src/zig/src/Sema.zig:31745:38: 0x17f7418 in refValue (zig)
    const decl = try anon_decl.finish(
                                     ^
/var/home/ian/src/zig/src/Sema.zig:31765:30: 0x17f7ba8 in optRefValue (zig)
            try sema.refValue(block, ty, val),
                             ^
/var/home/ian/src/zig/src/Sema.zig:17758:65: 0x12c2987 in zirTypeInfo (zig)
                    const default_val_ptr = try sema.optRefValue(block, field_ty, opt_default_val);
                                                                ^
/var/home/ian/src/zig/src/Sema.zig:1097:66: 0xf2dde5 in analyzeBodyInner (zig)
            .type_info                    => try sema.zirTypeInfo(block, inst),
                                                                 ^
/var/home/ian/src/zig/src/Sema.zig:934:45: 0xc9f6c1 in analyzeBodyBreak (zig)
    const break_inst = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                                            ^
/var/home/ian/src/zig/src/Sema.zig:1590:62: 0xf3bb75 in analyzeBodyInner (zig)
                const break_data = (try sema.analyzeBodyBreak(block, inline_body)) orelse
                                                             ^
/var/home/ian/src/zig/src/Sema.zig:917:30: 0x1223238 in analyzeBody (zig)
    _ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                             ^
/var/home/ian/src/zig/src/Sema.zig:7516:33: 0x17c15a1 in analyzeCall (zig)
                sema.analyzeBody(&child_block, fn_info.body) catch |err| switch (err) {
                                ^
/var/home/ian/src/zig/src/Sema.zig:6735:43: 0x1286bb8 in zirCall__anon_166520 (zig)
    const call_inst = try sema.analyzeCall(block, func, func_ty, callee_src, call_src, modifier, ensure_result_used, args_info, call_dbg_node, .call);
                                          ^
/var/home/ian/src/zig/src/Sema.zig:1030:62: 0xf2ac1c in analyzeBodyInner (zig)
            .field_call                   => try sema.zirCall(block, inst, .field),
                                                             ^
/var/home/ian/src/zig/src/Sema.zig:934:45: 0xc9f6c1 in analyzeBodyBreak (zig)
    const break_inst = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                                            ^
/var/home/ian/src/zig/src/Sema.zig:883:50: 0x17b8153 in resolveBody (zig)
    const break_data = (try sema.analyzeBodyBreak(block, body)) orelse
                                                 ^
/var/home/ian/src/zig/src/Sema.zig:35885:50: 0x187b395 in semaStructFields (zig)
                const init = try sema.resolveBody(&block_scope, body, zir_index);
                                                 ^
/var/home/ian/src/zig/src/Sema.zig:35390:25: 0x135b630 in resolveTypeFieldsStruct (zig)
    try semaStructFields(mod, sema.arena, struct_type);
                        ^
/var/home/ian/src/zig/src/type.zig:2689:61: 0xf40cf8 in comptimeOnlyAdvanced (zig)
                            try sema.resolveTypeFieldsStruct(ty.toIntern(), struct_type);
                                                            ^
/var/home/ian/src/zig/src/type.zig:2607:69: 0xf404ca in comptimeOnlyAdvanced (zig)
                        else => return child_ty.comptimeOnlyAdvanced(mod, opt_sema),
                                                                    ^
/var/home/ian/src/zig/src/Sema.zig:37138:35: 0xc87800 in typeRequiresComptime (zig)
    return ty.comptimeOnlyAdvanced(sema.mod, sema);
                                  ^
/var/home/ian/src/zig/src/Sema.zig:25651:70: 0xc86b25 in validateExternType (zig)
            return !(ty.isSlice(mod) or try sema.typeRequiresComptime(ty));
                                                                     ^
/var/home/ian/src/zig/src/Sema.zig:35817:56: 0x187a417 in semaStructFields (zig)
            .Extern => if (!try sema.validateExternType(field_ty, .struct_field)) {
                                                       ^
/var/home/ian/src/zig/src/Sema.zig:35390:25: 0x135b630 in resolveTypeFieldsStruct (zig)
    try semaStructFields(mod, sema.arena, struct_type);
                        ^
/var/home/ian/src/zig/src/Sema.zig:35323:48: 0xf423a1 in resolveTypeFields (zig)
            => try sema.resolveTypeFieldsStruct(ty_ip, ip.indexToKey(ty_ip).struct_type),
                                               ^
/var/home/ian/src/zig/src/Sema.zig:19165:31: 0x138e381 in structInitEmpty (zig)
    try sema.resolveTypeFields(struct_ty);
                              ^
/var/home/ian/src/zig/src/Sema.zig:19137:44: 0x12c6fed in zirStructInitEmptyResult (zig)
        .Struct => try sema.structInitEmpty(block, obj_ty, src, src),
                                           ^
/var/home/ian/src/zig/src/Sema.zig:1105:79: 0xf2e3ce in analyzeBodyInner (zig)
            .struct_init_empty_result     => try sema.zirStructInitEmptyResult(block, inst, false),
                                                                              ^
/var/home/ian/src/zig/src/Sema.zig:5897:34: 0x1874a3b in resolveBlockBody (zig)
        if (sema.analyzeBodyInner(child_block, body)) |_| {
                                 ^
/var/home/ian/src/zig/src/Sema.zig:5880:33: 0x1350614 in zirBlock (zig)
    return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges);
                                ^
/var/home/ian/src/zig/src/Sema.zig:1578:49: 0xf3b8ff in analyzeBodyInner (zig)
                    break :blk try sema.zirBlock(block, inst, tags[inst] == .block_comptime);
                                                ^
/var/home/ian/src/zig/src/Sema.zig:917:30: 0x1223238 in analyzeBody (zig)
    _ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
                             ^
/var/home/ian/src/zig/src/Module.zig:4825:21: 0xf08916 in analyzeFnBody (zig)
    sema.analyzeBody(&inner_block, fn_info.body) catch |err| switch (err) {
                    ^
/var/home/ian/src/zig/src/Module.zig:3401:40: 0xc80a2d in ensureFuncBodyAnalyzed (zig)
            var air = mod.analyzeFnBody(func_index, sema_arena) catch |err| switch (err) {
                                       ^
/var/home/ian/src/zig/src/Compilation.zig:3513:42: 0xc7ea9d in processOneJob (zig)
            module.ensureFuncBodyAnalyzed(func) catch |err| switch (err) {
                                         ^
/var/home/ian/src/zig/src/Compilation.zig:3450:30: 0xa627db in performAllTheWork (zig)
            try processOneJob(comp, work_item, main_progress_node);
                             ^
/var/home/ian/src/zig/src/Compilation.zig:2227:31: 0xa5dd6c in update (zig)
    try comp.performAllTheWork(main_progress_node);
                              ^
/var/home/ian/src/zig/src/main.zig:4244:24: 0xa8d6b2 in updateModule (zig)
        try comp.update(main_progress_node);
                       ^
/var/home/ian/src/zig/src/main.zig:3647:17: 0xaafb55 in buildOutputType (zig)
    updateModule(comp) catch |err| switch (err) {
                ^
/var/home/ian/src/zig/src/main.zig:276:31: 0x8c1b27 in mainArgs (zig)
        return buildOutputType(gpa, arena, args, .zig_test);
                              ^
/var/home/ian/src/zig/src/main.zig:214:20: 0x8beb85 in main (zig)
    return mainArgs(gpa, arena, args);
                   ^
/var/home/ian/src/zig/lib/std/start.zig:583:37: 0x8be59e in main (zig)
            const result = root.main() catch |err| {
                                    ^
???:?:?: 0x7f79fd6cd149 in ??? (libc.so.6)
Unwind information for `libc.so.6:0x7f79fd6cd149` was not available, trace may be incomplete

???:?:?: 0x7f79fd6cd20a in ??? (libc.so.6)
???:?:?: 0x8be1a4 in ??? (???)
Aborted (core dumped)
Debug output

@ryuukk
Copy link
Contributor Author

ryuukk commented Oct 20, 2023

It now compile without crash with latest master

@ryuukk ryuukk closed this as completed Oct 20, 2023
@ryuukk
Copy link
Contributor Author

ryuukk commented Oct 20, 2023

I spoke too fast, i forgot i had the faulty code commented out.. segfault still happen

@ryuukk ryuukk reopened this Oct 20, 2023
@kcbanner
Copy link
Contributor

kcbanner commented Nov 6, 2023

I managed to reduce it further, seems like the problem lies with the header file:

pub const c = @cImport({
    @cDefine("NK_INCLUDE_FIXED_TYPES", "");
    @cInclude("nuklear_all.h");
});

pub fn main() !void {
    _=c.nk_init(null, null);
}

On my branch for this PR #17692, I get the following result:

zig-debug build-exe 17563.zig -lc -I.
17563.zig:27:8: error: expected 3 argument(s), found 2
    _=c.nk_init(null, null);
      ~^~~~~~~~
c:\cygwin64\home\kcbanner\temp\zig-cache\o\ed12e6390a4342a84aca999240ab0c32\cimport.zig:993:12: note: function declared here
pub extern fn nk_init([*c]struct_nk_context, [*c]struct_nk_allocator, [*c]const struct_nk_user_font) nk_bool;
~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
referenced by:
    callMain: C:\cygwin64\home\kcbanner\kit\zig\build-stage3-debug\lib\zig\std\start.zig:583:32
    initEventLoopAndCallMain: C:\cygwin64\home\kcbanner\kit\zig\build-stage3-debug\lib\zig\std\start.zig:517:34
    remaining reference traces hidden; use '-freference-trace' to see all reference traces

If I add another null it compiles and makes it to linking.

@Vexu Vexu added the frontend Tokenization, parsing, AstGen, Sema, and Liveness. label Nov 6, 2023
@Vexu Vexu added this to the 0.12.0 milestone Nov 6, 2023
@kcbanner
Copy link
Contributor

#17692 has been merged which solves this - the test cases above pass, and the original nuklear test case compiles.

@Vexu Vexu closed this as completed Nov 11, 2023
@ryuukk
Copy link
Contributor Author

ryuukk commented Nov 11, 2023

My project now compile, thanks

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Observed behavior contradicts documented or intended behavior frontend Tokenization, parsing, AstGen, Sema, and Liveness.
Projects
None yet
Development

No branches or pull requests

4 participants