| author | |
| committer | |
| log | 784a493dc7114b6e6807c2a37d03dbadecee81e6 |
| tree | b2a9709664aed3f9a2d53aa4c233a3887aa93984 |
| parent | 03a6b33a73612500038635633d4c8326c2b5cf5f |
| signature |
infrastructure in place for displaying error sets6 files changed, 156 insertions(+), 20 deletions(-)
lib/std/special/docs/index.html+1| ... | ... | @@ -262,6 +262,7 @@ |
| 262 | 262 | </div> |
| 263 | 263 | <h1 id="hdrName" class="hidden"></h1> |
| 264 | 264 | <div id="fnDocs" class="hidden"></div> |
| 265 | <div id="fnErrors" class="hidden"></div> | |
| 265 | 266 | <div id="fnExamples" class="hidden"></div> |
| 266 | 267 | <div id="fnNoExamples" class="hidden"> |
| 267 | 268 | <p>This function is not tested or referenced.</p> |
lib/std/special/docs/main.js+56-8| ... | ... | @@ -11,6 +11,7 @@ |
| 11 | 11 | var domFnProto = document.getElementById("fnProto"); |
| 12 | 12 | var domFnProtoCode = document.getElementById("fnProtoCode"); |
| 13 | 13 | var domFnDocs = document.getElementById("fnDocs"); |
| 14 | var domFnErrors = document.getElementById("fnErrors"); | |
| 14 | 15 | var domFnExamples = document.getElementById("fnExamples"); |
| 15 | 16 | var domFnNoExamples = document.getElementById("fnNoExamples"); |
| 16 | 17 | var domSearch = document.getElementById("search"); |
| ... | ... | @@ -33,6 +34,8 @@ |
| 33 | 34 | var typeKindFloatId; |
| 34 | 35 | var typeKindIntId; |
| 35 | 36 | var typeKindBoolId; |
| 37 | var typeKindErrSetId; | |
| 38 | var typeKindErrUnionId; | |
| 36 | 39 | findTypeKinds(); |
| 37 | 40 | |
| 38 | 41 | // for each package, is an array with packages to get to this one |
| ... | ... | @@ -96,6 +99,7 @@ |
| 96 | 99 | domSectInfo.classList.add("hidden"); |
| 97 | 100 | domHdrName.classList.add("hidden"); |
| 98 | 101 | domSectNav.classList.add("hidden"); |
| 102 | domFnErrors.classList.add("hidden"); | |
| 99 | 103 | domFnExamples.classList.add("hidden"); |
| 100 | 104 | domFnNoExamples.classList.add("hidden"); |
| 101 | 105 | |
| ... | ... | @@ -183,7 +187,7 @@ |
| 183 | 187 | |
| 184 | 188 | protoHtml += ') '; |
| 185 | 189 | if (typeObj.ret != null) { |
| 186 | protoHtml += typeIndexName(typeObj.ret, true, true); | |
| 190 | protoHtml += typeIndexName(typeObj.ret, true, true, fnDecl.value); | |
| 187 | 191 | } else { |
| 188 | 192 | protoHtml += '<span class="tok-kw">var</span>'; |
| 189 | 193 | } |
| ... | ... | @@ -335,24 +339,24 @@ |
| 335 | 339 | } |
| 336 | 340 | } |
| 337 | 341 | |
| 338 | function typeIndexName(typeIndex, wantHtml, wantLink) { | |
| 342 | function typeIndexName(typeIndex, wantHtml, wantLink, fnIndex) { | |
| 339 | 343 | var typeObj = zigAnalysis.types[typeIndex]; |
| 340 | 344 | if (wantLink) { |
| 341 | 345 | var declIndex = getCanonTypeDecl(typeIndex); |
| 342 | 346 | var declPath = getCanonDeclPath(declIndex); |
| 343 | 347 | var haveLink = declPath != null; |
| 344 | var typeNameHtml = typeName(typeObj, true, !haveLink); | |
| 348 | var typeNameHtml = typeName(typeObj, true, !haveLink, fnIndex); | |
| 345 | 349 | if (haveLink) { |
| 346 | 350 | return '<a href="' + navLink(declPath.pkgNames, declPath.declNames) + '">' + typeNameHtml + '</a>'; |
| 347 | 351 | } else { |
| 348 | 352 | return typeNameHtml; |
| 349 | 353 | } |
| 350 | 354 | } else { |
| 351 | return typeName(typeObj, wantHtml); | |
| 355 | return typeName(typeObj, wantHtml, false, fnIndex); | |
| 352 | 356 | } |
| 353 | 357 | } |
| 354 | 358 | |
| 355 | function typeName(typeObj, wantHtml, wantSubLink) { | |
| 359 | function typeName(typeObj, wantHtml, wantSubLink, fnIndex) { | |
| 356 | 360 | switch (typeObj.kind) { |
| 357 | 361 | case typeKindPtrId: |
| 358 | 362 | var name = ""; |
| ... | ... | @@ -397,11 +401,22 @@ |
| 397 | 401 | name += typeObj.align; |
| 398 | 402 | } |
| 399 | 403 | if (typeObj.hostIntBytes != null) { |
| 400 | name += ":" + typeObj.bitOffsetInHost + ":" + typeObj.hostIntBytes; | |
| 404 | name += ":"; | |
| 405 | if (wantHtml) { | |
| 406 | name += '<span class="tok-number">' + typeObj.bitOffsetInHost + '</span>'; | |
| 407 | } else { | |
| 408 | name += typeObj.bitOffsetInHost; | |
| 409 | } | |
| 410 | name += ":"; | |
| 411 | if (wantHtml) { | |
| 412 | name += '<span class="tok-number">' + typeObj.hostIntBytes + '</span>'; | |
| 413 | } else { | |
| 414 | name += typeObj.hostIntBytes; | |
| 415 | } | |
| 401 | 416 | } |
| 402 | 417 | name += ") "; |
| 403 | 418 | } |
| 404 | name += typeIndexName(typeObj.elem, wantHtml, wantSubLink); | |
| 419 | name += typeIndexName(typeObj.elem, wantHtml, wantSubLink, null); | |
| 405 | 420 | return name; |
| 406 | 421 | case typeKindFloatId: |
| 407 | 422 | if (wantHtml) { |
| ... | ... | @@ -429,6 +444,29 @@ |
| 429 | 444 | } else { |
| 430 | 445 | return "bool"; |
| 431 | 446 | } |
| 447 | case typeKindErrSetId: | |
| 448 | if (typeObj.errors == null) { | |
| 449 | if (wantHtml) { | |
| 450 | return '<span class="tok-type">anyerror</span>'; | |
| 451 | } else { | |
| 452 | return "anyerror"; | |
| 453 | } | |
| 454 | } else { | |
| 455 | if (wantHtml) { | |
| 456 | return escapeHtml(typeObj.name); | |
| 457 | } else { | |
| 458 | return typeObj.name; | |
| 459 | } | |
| 460 | } | |
| 461 | case typeKindErrUnionId: | |
| 462 | var errSetTypeObj = zigAnalysis.types[typeObj.err]; | |
| 463 | var payloadHtml = typeIndexName(typeObj.payload, wantHtml, wantSubLink, null); | |
| 464 | if (errSetTypeObj.fn != null && errSetTypeObj.fn == fnIndex) { | |
| 465 | // function index parameter supplied and this is the inferred error set of it | |
| 466 | return "!" + payloadHtml; | |
| 467 | } else { | |
| 468 | return typeIndexName(typeObj.err, wantHtml, wantSubLink, null) + "!" + payloadHtml; | |
| 469 | } | |
| 432 | 470 | default: |
| 433 | 471 | if (wantHtml) { |
| 434 | 472 | return escapeHtml(typeObj.name); |
| ... | ... | @@ -439,7 +477,7 @@ |
| 439 | 477 | } |
| 440 | 478 | |
| 441 | 479 | function renderType(typeObj) { |
| 442 | var name = typeName(typeObj); | |
| 480 | var name = typeName(typeObj, false, false); | |
| 443 | 481 | if (name != null && name != "") { |
| 444 | 482 | domHdrName.innerText = zigAnalysis.typeKinds[typeObj.kind] + " " + name; |
| 445 | 483 | domHdrName.classList.remove("hidden"); |
| ... | ... | @@ -543,6 +581,10 @@ |
| 543 | 581 | typeKindIntId = i; |
| 544 | 582 | } else if (zigAnalysis.typeKinds[i] === "Bool") { |
| 545 | 583 | typeKindBoolId = i; |
| 584 | } else if (zigAnalysis.typeKinds[i] === "ErrorSet") { | |
| 585 | typeKindErrSetId = i; | |
| 586 | } else if (zigAnalysis.typeKinds[i] === "ErrorUnion") { | |
| 587 | typeKindErrUnionId = i; | |
| 546 | 588 | } |
| 547 | 589 | } |
| 548 | 590 | if (typeKindTypeId == null) { |
| ... | ... | @@ -563,6 +605,12 @@ |
| 563 | 605 | if (typeKindBoolId == null) { |
| 564 | 606 | throw new Error("No type kind 'Bool' found"); |
| 565 | 607 | } |
| 608 | if (typeKindErrSetId == null) { | |
| 609 | throw new Error("No type kind 'ErrorSet' found"); | |
| 610 | } | |
| 611 | if (typeKindErrUnionId == null) { | |
| 612 | throw new Error("No type kind 'ErrorUnion' found"); | |
| 613 | } | |
| 566 | 614 | } |
| 567 | 615 | |
| 568 | 616 | function findTypeTypeId() { |
src/all_types.hpp+5-1| ... | ... | @@ -1290,9 +1290,10 @@ struct ZigTypeErrorUnion { |
| 1290 | 1290 | }; |
| 1291 | 1291 | |
| 1292 | 1292 | struct ZigTypeErrorSet { |
| 1293 | uint32_t err_count; | |
| 1294 | 1293 | ErrorTableEntry **errors; |
| 1295 | 1294 | ZigFn *infer_fn; |
| 1295 | uint32_t err_count; | |
| 1296 | bool incomplete; | |
| 1296 | 1297 | }; |
| 1297 | 1298 | |
| 1298 | 1299 | struct ZigTypeEnum { |
| ... | ... | @@ -1328,6 +1329,9 @@ bool node_ptr_eql(const AstNode *a, const AstNode *b); |
| 1328 | 1329 | uint32_t fn_ptr_hash(const ZigFn *ptr); |
| 1329 | 1330 | bool fn_ptr_eql(const ZigFn *a, const ZigFn *b); |
| 1330 | 1331 | |
| 1332 | uint32_t err_ptr_hash(const ErrorTableEntry *ptr); | |
| 1333 | bool err_ptr_eql(const ErrorTableEntry *a, const ErrorTableEntry *b); | |
| 1334 | ||
| 1331 | 1335 | struct ZigTypeUnion { |
| 1332 | 1336 | AstNode *decl_node; |
| 1333 | 1337 | TypeUnionField *fields; |
src/analyze.cpp+19-6| ... | ... | @@ -1633,6 +1633,7 @@ ZigType *get_auto_err_set_type(CodeGen *g, ZigFn *fn_entry) { |
| 1633 | 1633 | err_set_type->data.error_set.err_count = 0; |
| 1634 | 1634 | err_set_type->data.error_set.errors = nullptr; |
| 1635 | 1635 | err_set_type->data.error_set.infer_fn = fn_entry; |
| 1636 | err_set_type->data.error_set.incomplete = true; | |
| 1636 | 1637 | err_set_type->size_in_bits = g->builtin_types.entry_global_error_set->size_in_bits; |
| 1637 | 1638 | err_set_type->abi_align = g->builtin_types.entry_global_error_set->abi_align; |
| 1638 | 1639 | err_set_type->abi_size = g->builtin_types.entry_global_error_set->abi_size; |
| ... | ... | @@ -4277,12 +4278,12 @@ static void define_local_param_variables(CodeGen *g, ZigFn *fn_table_entry) { |
| 4277 | 4278 | bool resolve_inferred_error_set(CodeGen *g, ZigType *err_set_type, AstNode *source_node) { |
| 4278 | 4279 | assert(err_set_type->id == ZigTypeIdErrorSet); |
| 4279 | 4280 | ZigFn *infer_fn = err_set_type->data.error_set.infer_fn; |
| 4280 | if (infer_fn != nullptr) { | |
| 4281 | if (infer_fn != nullptr && err_set_type->data.error_set.incomplete) { | |
| 4281 | 4282 | if (infer_fn->anal_state == FnAnalStateInvalid) { |
| 4282 | 4283 | return false; |
| 4283 | 4284 | } else if (infer_fn->anal_state == FnAnalStateReady) { |
| 4284 | 4285 | analyze_fn_body(g, infer_fn); |
| 4285 | if (err_set_type->data.error_set.infer_fn != nullptr) { | |
| 4286 | if (err_set_type->data.error_set.incomplete) { | |
| 4286 | 4287 | assert(g->errors.length != 0); |
| 4287 | 4288 | return false; |
| 4288 | 4289 | } |
| ... | ... | @@ -4509,7 +4510,9 @@ static void analyze_fn_ir(CodeGen *g, ZigFn *fn, AstNode *return_type_node) { |
| 4509 | 4510 | |
| 4510 | 4511 | if (fn_type_id->return_type->id == ZigTypeIdErrorUnion) { |
| 4511 | 4512 | ZigType *return_err_set_type = fn_type_id->return_type->data.error_union.err_set_type; |
| 4512 | if (return_err_set_type->data.error_set.infer_fn != nullptr) { | |
| 4513 | if (return_err_set_type->data.error_set.infer_fn != nullptr && | |
| 4514 | return_err_set_type->data.error_set.incomplete) | |
| 4515 | { | |
| 4513 | 4516 | ZigType *inferred_err_set_type; |
| 4514 | 4517 | if (fn->src_implicit_return_type->id == ZigTypeIdErrorSet) { |
| 4515 | 4518 | inferred_err_set_type = fn->src_implicit_return_type; |
| ... | ... | @@ -4522,14 +4525,16 @@ static void analyze_fn_ir(CodeGen *g, ZigFn *fn, AstNode *return_type_node) { |
| 4522 | 4525 | return; |
| 4523 | 4526 | } |
| 4524 | 4527 | |
| 4525 | if (inferred_err_set_type->data.error_set.infer_fn != nullptr) { | |
| 4528 | if (inferred_err_set_type->data.error_set.infer_fn != nullptr && | |
| 4529 | inferred_err_set_type->data.error_set.incomplete) | |
| 4530 | { | |
| 4526 | 4531 | if (!resolve_inferred_error_set(g, inferred_err_set_type, return_type_node)) { |
| 4527 | 4532 | fn->anal_state = FnAnalStateInvalid; |
| 4528 | 4533 | return; |
| 4529 | 4534 | } |
| 4530 | 4535 | } |
| 4531 | 4536 | |
| 4532 | return_err_set_type->data.error_set.infer_fn = nullptr; | |
| 4537 | return_err_set_type->data.error_set.incomplete = false; | |
| 4533 | 4538 | if (type_is_global_error_set(inferred_err_set_type)) { |
| 4534 | 4539 | return_err_set_type->data.error_set.err_count = UINT32_MAX; |
| 4535 | 4540 | } else { |
| ... | ... | @@ -7336,6 +7341,14 @@ bool fn_ptr_eql(const ZigFn *a, const ZigFn *b) { |
| 7336 | 7341 | return a == b; |
| 7337 | 7342 | } |
| 7338 | 7343 | |
| 7344 | uint32_t err_ptr_hash(const ErrorTableEntry *ptr) { | |
| 7345 | return hash_ptr((void*)ptr); | |
| 7346 | } | |
| 7347 | ||
| 7348 | bool err_ptr_eql(const ErrorTableEntry *a, const ErrorTableEntry *b) { | |
| 7349 | return a == b; | |
| 7350 | } | |
| 7351 | ||
| 7339 | 7352 | ConstExprValue *get_builtin_value(CodeGen *codegen, const char *name) { |
| 7340 | 7353 | Tld *tld = get_container_scope(codegen->compile_var_import)->decl_table.get(buf_create_from_str(name)); |
| 7341 | 7354 | resolve_top_level_decl(codegen, tld, nullptr, false); |
| ... | ... | @@ -7348,7 +7361,7 @@ ConstExprValue *get_builtin_value(CodeGen *codegen, const char *name) { |
| 7348 | 7361 | |
| 7349 | 7362 | bool type_is_global_error_set(ZigType *err_set_type) { |
| 7350 | 7363 | assert(err_set_type->id == ZigTypeIdErrorSet); |
| 7351 | assert(err_set_type->data.error_set.infer_fn == nullptr); | |
| 7364 | assert(!err_set_type->data.error_set.incomplete); | |
| 7352 | 7365 | return err_set_type->data.error_set.err_count == UINT32_MAX; |
| 7353 | 7366 | } |
| 7354 | 7367 |
src/dump_analysis.cpp+72-2| ... | ... | @@ -357,6 +357,9 @@ struct AnalDumpCtx { |
| 357 | 357 | |
| 358 | 358 | ZigList<AstNode *> node_list; |
| 359 | 359 | HashMap<const AstNode *, uint32_t, node_ptr_hash, node_ptr_eql> node_map; |
| 360 | ||
| 361 | ZigList<ErrorTableEntry *> err_list; | |
| 362 | HashMap<const ErrorTableEntry *, uint32_t, err_ptr_hash, err_ptr_eql> err_map; | |
| 360 | 363 | }; |
| 361 | 364 | |
| 362 | 365 | static uint32_t anal_dump_get_type_id(AnalDumpCtx *ctx, ZigType *ty); |
| ... | ... | @@ -444,6 +447,17 @@ static uint32_t anal_dump_get_fn_id(AnalDumpCtx *ctx, ZigFn *fn) { |
| 444 | 447 | return fn_id; |
| 445 | 448 | } |
| 446 | 449 | |
| 450 | static uint32_t anal_dump_get_err_id(AnalDumpCtx *ctx, ErrorTableEntry *err) { | |
| 451 | uint32_t err_id = ctx->err_list.length; | |
| 452 | auto existing_entry = ctx->err_map.put_unique(err, err_id); | |
| 453 | if (existing_entry == nullptr) { | |
| 454 | ctx->err_list.append(err); | |
| 455 | } else { | |
| 456 | err_id = existing_entry->value; | |
| 457 | } | |
| 458 | return err_id; | |
| 459 | } | |
| 460 | ||
| 447 | 461 | static uint32_t anal_dump_get_decl_id(AnalDumpCtx *ctx, Tld *tld) { |
| 448 | 462 | uint32_t decl_id = ctx->decl_list.length; |
| 449 | 463 | auto existing_entry = ctx->decl_map.put_unique(tld, decl_id); |
| ... | ... | @@ -513,6 +527,11 @@ static void anal_dump_fn_ref(AnalDumpCtx *ctx, ZigFn *fn) { |
| 513 | 527 | jw_int(&ctx->jw, fn_id); |
| 514 | 528 | } |
| 515 | 529 | |
| 530 | static void anal_dump_err_ref(AnalDumpCtx *ctx, ErrorTableEntry *err) { | |
| 531 | uint32_t err_id = anal_dump_get_err_id(ctx, err); | |
| 532 | jw_int(&ctx->jw, err_id); | |
| 533 | } | |
| 534 | ||
| 516 | 535 | static void anal_dump_decl_ref(AnalDumpCtx *ctx, Tld *tld) { |
| 517 | 536 | uint32_t decl_id = anal_dump_get_decl_id(ctx, tld); |
| 518 | 537 | jw_int(&ctx->jw, decl_id); |
| ... | ... | @@ -841,6 +860,33 @@ static void anal_dump_type(AnalDumpCtx *ctx, ZigType *ty) { |
| 841 | 860 | anal_dump_pointer_attrs(ctx, ty); |
| 842 | 861 | break; |
| 843 | 862 | } |
| 863 | case ZigTypeIdErrorSet: { | |
| 864 | if (type_is_global_error_set(ty)) { | |
| 865 | break; | |
| 866 | } | |
| 867 | if (ty->data.error_set.infer_fn != nullptr) { | |
| 868 | jw_object_field(jw, "fn"); | |
| 869 | anal_dump_fn_ref(ctx, ty->data.error_set.infer_fn); | |
| 870 | } | |
| 871 | jw_object_field(jw, "errors"); | |
| 872 | jw_begin_array(jw); | |
| 873 | for (uint32_t i = 0; i < ty->data.error_set.err_count; i += 1) { | |
| 874 | jw_array_elem(jw); | |
| 875 | ErrorTableEntry *err = ty->data.error_set.errors[i]; | |
| 876 | anal_dump_err_ref(ctx, err); | |
| 877 | } | |
| 878 | jw_end_array(jw); | |
| 879 | break; | |
| 880 | } | |
| 881 | case ZigTypeIdErrorUnion: { | |
| 882 | jw_object_field(jw, "err"); | |
| 883 | anal_dump_type_ref(ctx, ty->data.error_union.err_set_type); | |
| 884 | ||
| 885 | jw_object_field(jw, "payload"); | |
| 886 | anal_dump_type_ref(ctx, ty->data.error_union.payload_type); | |
| 887 | ||
| 888 | break; | |
| 889 | } | |
| 844 | 890 | default: |
| 845 | 891 | jw_object_field(jw, "name"); |
| 846 | 892 | jw_string(jw, buf_ptr(&ty->name)); |
| ... | ... | @@ -849,7 +895,7 @@ static void anal_dump_type(AnalDumpCtx *ctx, ZigType *ty) { |
| 849 | 895 | jw_end_object(jw); |
| 850 | 896 | } |
| 851 | 897 | |
| 852 | void anal_dump_node(AnalDumpCtx *ctx, const AstNode *node) { | |
| 898 | static void anal_dump_node(AnalDumpCtx *ctx, const AstNode *node) { | |
| 853 | 899 | JsonWriter *jw = &ctx->jw; |
| 854 | 900 | |
| 855 | 901 | jw_begin_object(jw); |
| ... | ... | @@ -892,7 +938,21 @@ void anal_dump_node(AnalDumpCtx *ctx, const AstNode *node) { |
| 892 | 938 | jw_end_object(jw); |
| 893 | 939 | } |
| 894 | 940 | |
| 895 | void anal_dump_fn(AnalDumpCtx *ctx, ZigFn *fn) { | |
| 941 | static void anal_dump_err(AnalDumpCtx *ctx, const ErrorTableEntry *err) { | |
| 942 | JsonWriter *jw = &ctx->jw; | |
| 943 | ||
| 944 | jw_begin_object(jw); | |
| 945 | ||
| 946 | jw_object_field(jw, "src"); | |
| 947 | anal_dump_node_ref(ctx, err->decl_node); | |
| 948 | ||
| 949 | jw_object_field(jw, "name"); | |
| 950 | jw_string(jw, buf_ptr(&err->name)); | |
| 951 | ||
| 952 | jw_end_object(jw); | |
| 953 | } | |
| 954 | ||
| 955 | static void anal_dump_fn(AnalDumpCtx *ctx, ZigFn *fn) { | |
| 896 | 956 | JsonWriter *jw = &ctx->jw; |
| 897 | 957 | |
| 898 | 958 | jw_begin_object(jw); |
| ... | ... | @@ -918,6 +978,7 @@ void zig_print_analysis_dump(CodeGen *g, FILE *f, const char *one_indent, const |
| 918 | 978 | ctx.decl_map.init(16); |
| 919 | 979 | ctx.node_map.init(16); |
| 920 | 980 | ctx.fn_map.init(16); |
| 981 | ctx.err_map.init(16); | |
| 921 | 982 | |
| 922 | 983 | jw_begin_object(jw); |
| 923 | 984 | |
| ... | ... | @@ -1055,6 +1116,15 @@ void zig_print_analysis_dump(CodeGen *g, FILE *f, const char *one_indent, const |
| 1055 | 1116 | } |
| 1056 | 1117 | jw_end_array(jw); |
| 1057 | 1118 | |
| 1119 | jw_object_field(jw, "errors"); | |
| 1120 | jw_begin_array(jw); | |
| 1121 | for (uint32_t i = 0; i < ctx.err_list.length; i += 1) { | |
| 1122 | const ErrorTableEntry *err = ctx.err_list.at(i); | |
| 1123 | jw_array_elem(jw); | |
| 1124 | anal_dump_err(&ctx, err); | |
| 1125 | } | |
| 1126 | jw_end_array(jw); | |
| 1127 | ||
| 1058 | 1128 | jw_object_field(jw, "astNodes"); |
| 1059 | 1129 | jw_begin_array(jw); |
| 1060 | 1130 | for (uint32_t i = 0; i < ctx.node_list.length; i += 1) { |
src/ir.cpp+3-3| ... | ... | @@ -9692,7 +9692,7 @@ static ConstCastOnly types_match_const_cast_only(IrAnalyze *ira, ZigType *wanted |
| 9692 | 9692 | ZigType *container_set = wanted_type; |
| 9693 | 9693 | |
| 9694 | 9694 | // if the container set is inferred, then this will always work. |
| 9695 | if (container_set->data.error_set.infer_fn != nullptr) { | |
| 9695 | if (container_set->data.error_set.infer_fn != nullptr && container_set->data.error_set.incomplete) { | |
| 9696 | 9696 | return result; |
| 9697 | 9697 | } |
| 9698 | 9698 | // if the container set is the global one, it will always work. |
| ... | ... | @@ -16157,7 +16157,7 @@ static IrInstruction *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCallSrc *c |
| 16157 | 16157 | UndefOk); |
| 16158 | 16158 | |
| 16159 | 16159 | if (inferred_err_set_type != nullptr) { |
| 16160 | inferred_err_set_type->data.error_set.infer_fn = nullptr; | |
| 16160 | inferred_err_set_type->data.error_set.incomplete = false; | |
| 16161 | 16161 | if (result->type->id == ZigTypeIdErrorUnion) { |
| 16162 | 16162 | ErrorTableEntry *err = result->data.x_err_union.error_set->data.x_err_set; |
| 16163 | 16163 | if (err != nullptr) { |
| ... | ... | @@ -23617,7 +23617,7 @@ static IrInstruction *ir_analyze_instruction_test_err(IrAnalyze *ira, IrInstruct |
| 23617 | 23617 | if (!type_is_global_error_set(err_set_type) && |
| 23618 | 23618 | err_set_type->data.error_set.err_count == 0) |
| 23619 | 23619 | { |
| 23620 | assert(err_set_type->data.error_set.infer_fn == nullptr); | |
| 23620 | assert(!err_set_type->data.error_set.incomplete); | |
| 23621 | 23621 | return ir_const_bool(ira, &instruction->base, false); |
| 23622 | 23622 | } |
| 23623 | 23623 | } |