| author | |
| committer | |
| log | b957dc29a4e3f025e446e717b0ae8c69602545ca |
| tree | 848b3648266fccbf887d317217936fb051661810 |
| parent | 8d5636ebe4b1d70db14e28c67f7986fb2a1ce3cf |
| signature | Commit is signed but in an unrecognized format. |
10 files changed, 96 insertions(+), 96 deletions(-)
src/all_types.hpp+11-11| ... | ... | @@ -672,7 +672,7 @@ enum NodeType { |
| 672 | 672 | NodeTypeSwitchProng, |
| 673 | 673 | NodeTypeSwitchRange, |
| 674 | 674 | NodeTypeCompTime, |
| 675 | NodeTypeNoAsync, | |
| 675 | NodeTypeNoSuspend, | |
| 676 | 676 | NodeTypeBreak, |
| 677 | 677 | NodeTypeContinue, |
| 678 | 678 | NodeTypeAsmExpr, |
| ... | ... | @@ -862,7 +862,7 @@ enum CallModifier { |
| 862 | 862 | CallModifierAsync, |
| 863 | 863 | CallModifierNeverTail, |
| 864 | 864 | CallModifierNeverInline, |
| 865 | CallModifierNoAsync, | |
| 865 | CallModifierNoSuspend, | |
| 866 | 866 | CallModifierAlwaysTail, |
| 867 | 867 | CallModifierAlwaysInline, |
| 868 | 868 | CallModifierCompileTime, |
| ... | ... | @@ -1014,7 +1014,7 @@ struct AstNodeCompTime { |
| 1014 | 1014 | AstNode *expr; |
| 1015 | 1015 | }; |
| 1016 | 1016 | |
| 1017 | struct AstNodeNoAsync { | |
| 1017 | struct AstNodeNoSuspend { | |
| 1018 | 1018 | AstNode *expr; |
| 1019 | 1019 | }; |
| 1020 | 1020 | |
| ... | ... | @@ -1225,7 +1225,7 @@ struct AstNode { |
| 1225 | 1225 | AstNodeSwitchProng switch_prong; |
| 1226 | 1226 | AstNodeSwitchRange switch_range; |
| 1227 | 1227 | AstNodeCompTime comptime_expr; |
| 1228 | AstNodeNoAsync noasync_expr; | |
| 1228 | AstNodeNoSuspend nosuspend_expr; | |
| 1229 | 1229 | AstNodeAsmExpr asm_expr; |
| 1230 | 1230 | AstNodeFieldAccessExpr field_access_expr; |
| 1231 | 1231 | AstNodePtrDerefExpr ptr_deref_expr; |
| ... | ... | @@ -1858,7 +1858,7 @@ enum PanicMsgId { |
| 1858 | 1858 | PanicMsgIdResumedAnAwaitingFn, |
| 1859 | 1859 | PanicMsgIdFrameTooSmall, |
| 1860 | 1860 | PanicMsgIdResumedFnPendingAwait, |
| 1861 | PanicMsgIdBadNoAsyncCall, | |
| 1861 | PanicMsgIdBadNoSuspendCall, | |
| 1862 | 1862 | PanicMsgIdResumeNotSuspendedFn, |
| 1863 | 1863 | PanicMsgIdBadSentinel, |
| 1864 | 1864 | PanicMsgIdShxTooBigRhs, |
| ... | ... | @@ -2376,7 +2376,7 @@ enum ScopeId { |
| 2376 | 2376 | ScopeIdRuntime, |
| 2377 | 2377 | ScopeIdTypeOf, |
| 2378 | 2378 | ScopeIdExpr, |
| 2379 | ScopeIdNoAsync, | |
| 2379 | ScopeIdNoSuspend, | |
| 2380 | 2380 | }; |
| 2381 | 2381 | |
| 2382 | 2382 | struct Scope { |
| ... | ... | @@ -2510,9 +2510,9 @@ struct ScopeCompTime { |
| 2510 | 2510 | Scope base; |
| 2511 | 2511 | }; |
| 2512 | 2512 | |
| 2513 | // This scope is created for a noasync expression. | |
| 2514 | // NodeTypeNoAsync | |
| 2515 | struct ScopeNoAsync { | |
| 2513 | // This scope is created for a nosuspend expression. | |
| 2514 | // NodeTypeNoSuspend | |
| 2515 | struct ScopeNoSuspend { | |
| 2516 | 2516 | Scope base; |
| 2517 | 2517 | }; |
| 2518 | 2518 | |
| ... | ... | @@ -4488,7 +4488,7 @@ struct IrInstSrcAwait { |
| 4488 | 4488 | |
| 4489 | 4489 | IrInstSrc *frame; |
| 4490 | 4490 | ResultLoc *result_loc; |
| 4491 | bool is_noasync; | |
| 4491 | bool is_nosuspend; | |
| 4492 | 4492 | }; |
| 4493 | 4493 | |
| 4494 | 4494 | struct IrInstGenAwait { |
| ... | ... | @@ -4497,7 +4497,7 @@ struct IrInstGenAwait { |
| 4497 | 4497 | IrInstGen *frame; |
| 4498 | 4498 | IrInstGen *result_loc; |
| 4499 | 4499 | ZigFn *target_fn; |
| 4500 | bool is_noasync; | |
| 4500 | bool is_nosuspend; | |
| 4501 | 4501 | }; |
| 4502 | 4502 | |
| 4503 | 4503 | struct IrInstSrcResume { |
src/analyze.cpp+9-9| ... | ... | @@ -106,7 +106,7 @@ static ScopeExpr *find_expr_scope(Scope *scope) { |
| 106 | 106 | case ScopeIdDecls: |
| 107 | 107 | case ScopeIdFnDef: |
| 108 | 108 | case ScopeIdCompTime: |
| 109 | case ScopeIdNoAsync: | |
| 109 | case ScopeIdNoSuspend: | |
| 110 | 110 | case ScopeIdVarDecl: |
| 111 | 111 | case ScopeIdCImport: |
| 112 | 112 | case ScopeIdSuspend: |
| ... | ... | @@ -227,9 +227,9 @@ Scope *create_comptime_scope(CodeGen *g, AstNode *node, Scope *parent) { |
| 227 | 227 | return &scope->base; |
| 228 | 228 | } |
| 229 | 229 | |
| 230 | Scope *create_noasync_scope(CodeGen *g, AstNode *node, Scope *parent) { | |
| 231 | ScopeNoAsync *scope = heap::c_allocator.create<ScopeNoAsync>(); | |
| 232 | init_scope(g, &scope->base, ScopeIdNoAsync, node, parent); | |
| 230 | Scope *create_nosuspend_scope(CodeGen *g, AstNode *node, Scope *parent) { | |
| 231 | ScopeNoSuspend *scope = heap::c_allocator.create<ScopeNoSuspend>(); | |
| 232 | init_scope(g, &scope->base, ScopeIdNoSuspend, node, parent); | |
| 233 | 233 | return &scope->base; |
| 234 | 234 | } |
| 235 | 235 | |
| ... | ... | @@ -3771,7 +3771,7 @@ void scan_decls(CodeGen *g, ScopeDecls *decls_scope, AstNode *node) { |
| 3771 | 3771 | case NodeTypeCompTime: |
| 3772 | 3772 | preview_comptime_decl(g, node, decls_scope); |
| 3773 | 3773 | break; |
| 3774 | case NodeTypeNoAsync: | |
| 3774 | case NodeTypeNoSuspend: | |
| 3775 | 3775 | case NodeTypeParamDecl: |
| 3776 | 3776 | case NodeTypeReturnExpr: |
| 3777 | 3777 | case NodeTypeDefer: |
| ... | ... | @@ -4689,7 +4689,7 @@ void add_async_error_notes(CodeGen *g, ErrorMsg *msg, ZigFn *fn) { |
| 4689 | 4689 | static Error analyze_callee_async(CodeGen *g, ZigFn *fn, ZigFn *callee, AstNode *call_node, |
| 4690 | 4690 | bool must_not_be_async, CallModifier modifier) |
| 4691 | 4691 | { |
| 4692 | if (modifier == CallModifierNoAsync) | |
| 4692 | if (modifier == CallModifierNoSuspend) | |
| 4693 | 4693 | return ErrorNone; |
| 4694 | 4694 | bool callee_is_async = false; |
| 4695 | 4695 | switch (callee->type_entry->data.fn.fn_type_id.cc) { |
| ... | ... | @@ -4812,7 +4812,7 @@ static void analyze_fn_async(CodeGen *g, ZigFn *fn, bool resolve_frame) { |
| 4812 | 4812 | } |
| 4813 | 4813 | for (size_t i = 0; i < fn->await_list.length; i += 1) { |
| 4814 | 4814 | IrInstGenAwait *await = fn->await_list.at(i); |
| 4815 | if (await->is_noasync) continue; | |
| 4815 | if (await->is_nosuspend) continue; | |
| 4816 | 4816 | switch (analyze_callee_async(g, fn, await->target_fn, await->base.base.source_node, must_not_be_async, |
| 4817 | 4817 | CallModifierNone)) |
| 4818 | 4818 | { |
| ... | ... | @@ -6239,7 +6239,7 @@ static void mark_suspension_point(Scope *scope) { |
| 6239 | 6239 | case ScopeIdDecls: |
| 6240 | 6240 | case ScopeIdFnDef: |
| 6241 | 6241 | case ScopeIdCompTime: |
| 6242 | case ScopeIdNoAsync: | |
| 6242 | case ScopeIdNoSuspend: | |
| 6243 | 6243 | case ScopeIdCImport: |
| 6244 | 6244 | case ScopeIdSuspend: |
| 6245 | 6245 | case ScopeIdTypeOf: |
| ... | ... | @@ -6472,7 +6472,7 @@ static Error resolve_async_frame(CodeGen *g, ZigType *frame_type) { |
| 6472 | 6472 | // The funtion call result of foo() must be spilled. |
| 6473 | 6473 | for (size_t i = 0; i < fn->await_list.length; i += 1) { |
| 6474 | 6474 | IrInstGenAwait *await = fn->await_list.at(i); |
| 6475 | if (await->is_noasync) { | |
| 6475 | if (await->is_nosuspend) { | |
| 6476 | 6476 | continue; |
| 6477 | 6477 | } |
| 6478 | 6478 | if (await->base.value->special != ConstValSpecialRuntime) { |
src/analyze.hpp+1-1| ... | ... | @@ -125,7 +125,7 @@ ScopeLoop *create_loop_scope(CodeGen *g, AstNode *node, Scope *parent); |
| 125 | 125 | ScopeSuspend *create_suspend_scope(CodeGen *g, AstNode *node, Scope *parent); |
| 126 | 126 | ScopeFnDef *create_fndef_scope(CodeGen *g, AstNode *node, Scope *parent, ZigFn *fn_entry); |
| 127 | 127 | Scope *create_comptime_scope(CodeGen *g, AstNode *node, Scope *parent); |
| 128 | Scope *create_noasync_scope(CodeGen *g, AstNode *node, Scope *parent); | |
| 128 | Scope *create_nosuspend_scope(CodeGen *g, AstNode *node, Scope *parent); | |
| 129 | 129 | Scope *create_runtime_scope(CodeGen *g, AstNode *node, Scope *parent, IrInstSrc *is_comptime); |
| 130 | 130 | Scope *create_typeof_scope(CodeGen *g, AstNode *node, Scope *parent); |
| 131 | 131 | ScopeExpr *create_expr_scope(CodeGen *g, AstNode *node, Scope *parent); |
src/ast_render.cpp+7-7| ... | ... | @@ -220,8 +220,8 @@ static const char *node_type_str(NodeType node_type) { |
| 220 | 220 | return "SwitchRange"; |
| 221 | 221 | case NodeTypeCompTime: |
| 222 | 222 | return "CompTime"; |
| 223 | case NodeTypeNoAsync: | |
| 224 | return "NoAsync"; | |
| 223 | case NodeTypeNoSuspend: | |
| 224 | return "NoSuspend"; | |
| 225 | 225 | case NodeTypeBreak: |
| 226 | 226 | return "Break"; |
| 227 | 227 | case NodeTypeContinue: |
| ... | ... | @@ -709,8 +709,8 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) { |
| 709 | 709 | switch (node->data.fn_call_expr.modifier) { |
| 710 | 710 | case CallModifierNone: |
| 711 | 711 | break; |
| 712 | case CallModifierNoAsync: | |
| 713 | fprintf(ar->f, "noasync "); | |
| 712 | case CallModifierNoSuspend: | |
| 713 | fprintf(ar->f, "nosuspend "); | |
| 714 | 714 | break; |
| 715 | 715 | case CallModifierAsync: |
| 716 | 716 | fprintf(ar->f, "async "); |
| ... | ... | @@ -1093,10 +1093,10 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) { |
| 1093 | 1093 | render_node_grouped(ar, node->data.comptime_expr.expr); |
| 1094 | 1094 | break; |
| 1095 | 1095 | } |
| 1096 | case NodeTypeNoAsync: | |
| 1096 | case NodeTypeNoSuspend: | |
| 1097 | 1097 | { |
| 1098 | fprintf(ar->f, "noasync "); | |
| 1099 | render_node_grouped(ar, node->data.noasync_expr.expr); | |
| 1098 | fprintf(ar->f, "nosuspend "); | |
| 1099 | render_node_grouped(ar, node->data.nosuspend_expr.expr); | |
| 1100 | 1100 | break; |
| 1101 | 1101 | } |
| 1102 | 1102 | case NodeTypeForExpr: |
src/codegen.cpp+15-15| ... | ... | @@ -685,7 +685,7 @@ static ZigLLVMDIScope *get_di_scope(CodeGen *g, Scope *scope) { |
| 685 | 685 | case ScopeIdLoop: |
| 686 | 686 | case ScopeIdSuspend: |
| 687 | 687 | case ScopeIdCompTime: |
| 688 | case ScopeIdNoAsync: | |
| 688 | case ScopeIdNoSuspend: | |
| 689 | 689 | case ScopeIdRuntime: |
| 690 | 690 | case ScopeIdTypeOf: |
| 691 | 691 | case ScopeIdExpr: |
| ... | ... | @@ -966,8 +966,8 @@ static Buf *panic_msg_buf(PanicMsgId msg_id) { |
| 966 | 966 | return buf_create_from_str("frame too small"); |
| 967 | 967 | case PanicMsgIdResumedFnPendingAwait: |
| 968 | 968 | return buf_create_from_str("resumed an async function which can only be awaited"); |
| 969 | case PanicMsgIdBadNoAsyncCall: | |
| 970 | return buf_create_from_str("async function called in noasync scope suspended"); | |
| 969 | case PanicMsgIdBadNoSuspendCall: | |
| 970 | return buf_create_from_str("async function called in nosuspend scope suspended"); | |
| 971 | 971 | case PanicMsgIdResumeNotSuspendedFn: |
| 972 | 972 | return buf_create_from_str("resumed a non-suspended function"); |
| 973 | 973 | case PanicMsgIdBadSentinel: |
| ... | ... | @@ -4061,7 +4061,7 @@ static void render_async_var_decls(CodeGen *g, Scope *scope) { |
| 4061 | 4061 | case ScopeIdLoop: |
| 4062 | 4062 | case ScopeIdSuspend: |
| 4063 | 4063 | case ScopeIdCompTime: |
| 4064 | case ScopeIdNoAsync: | |
| 4064 | case ScopeIdNoSuspend: | |
| 4065 | 4065 | case ScopeIdRuntime: |
| 4066 | 4066 | case ScopeIdTypeOf: |
| 4067 | 4067 | case ScopeIdExpr: |
| ... | ... | @@ -4212,9 +4212,9 @@ static LLVMValueRef ir_render_call(CodeGen *g, IrExecutableGen *executable, IrIn |
| 4212 | 4212 | // even if prefix_arg_err_ret_stack is true, let the async function do its own |
| 4213 | 4213 | // initialization. |
| 4214 | 4214 | } else { |
| 4215 | if (instruction->modifier == CallModifierNoAsync && !fn_is_async(g->cur_fn)) { | |
| 4215 | if (instruction->modifier == CallModifierNoSuspend && !fn_is_async(g->cur_fn)) { | |
| 4216 | 4216 | // Async function called as a normal function, and calling function is not async. |
| 4217 | // This is allowed because it was called with `noasync` which asserts that it will | |
| 4217 | // This is allowed because it was called with `nosuspend` which asserts that it will | |
| 4218 | 4218 | // never suspend. |
| 4219 | 4219 | awaiter_init_val = zero; |
| 4220 | 4220 | } else { |
| ... | ... | @@ -4325,7 +4325,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, IrExecutableGen *executable, IrIn |
| 4325 | 4325 | case CallModifierCompileTime: |
| 4326 | 4326 | zig_unreachable(); |
| 4327 | 4327 | case CallModifierNone: |
| 4328 | case CallModifierNoAsync: | |
| 4328 | case CallModifierNoSuspend: | |
| 4329 | 4329 | case CallModifierAsync: |
| 4330 | 4330 | call_attr = ZigLLVM_CallAttrAuto; |
| 4331 | 4331 | break; |
| ... | ... | @@ -4401,7 +4401,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, IrExecutableGen *executable, IrIn |
| 4401 | 4401 | get_llvm_type(g, instruction->base.value->type), ""); |
| 4402 | 4402 | } |
| 4403 | 4403 | return nullptr; |
| 4404 | } else if (instruction->modifier == CallModifierNoAsync && !fn_is_async(g->cur_fn)) { | |
| 4404 | } else if (instruction->modifier == CallModifierNoSuspend && !fn_is_async(g->cur_fn)) { | |
| 4405 | 4405 | gen_resume(g, fn_val, frame_result_loc, ResumeIdCall); |
| 4406 | 4406 | |
| 4407 | 4407 | if (ir_want_runtime_safety(g, &instruction->base)) { |
| ... | ... | @@ -4412,13 +4412,13 @@ static LLVMValueRef ir_render_call(CodeGen *g, IrExecutableGen *executable, IrIn |
| 4412 | 4412 | all_ones, LLVMAtomicOrderingRelease); |
| 4413 | 4413 | LLVMValueRef ok_val = LLVMBuildICmp(g->builder, LLVMIntEQ, prev_val, all_ones, ""); |
| 4414 | 4414 | |
| 4415 | LLVMBasicBlockRef bad_block = LLVMAppendBasicBlock(g->cur_fn_val, "NoAsyncPanic"); | |
| 4416 | LLVMBasicBlockRef ok_block = LLVMAppendBasicBlock(g->cur_fn_val, "NoAsyncOk"); | |
| 4415 | LLVMBasicBlockRef bad_block = LLVMAppendBasicBlock(g->cur_fn_val, "NoSuspendPanic"); | |
| 4416 | LLVMBasicBlockRef ok_block = LLVMAppendBasicBlock(g->cur_fn_val, "NoSuspendOk"); | |
| 4417 | 4417 | LLVMBuildCondBr(g->builder, ok_val, ok_block, bad_block); |
| 4418 | 4418 | |
| 4419 | // The async function suspended, but this noasync call asserted it wouldn't. | |
| 4419 | // The async function suspended, but this nosuspend call asserted it wouldn't. | |
| 4420 | 4420 | LLVMPositionBuilderAtEnd(g->builder, bad_block); |
| 4421 | gen_safety_crash(g, PanicMsgIdBadNoAsyncCall); | |
| 4421 | gen_safety_crash(g, PanicMsgIdBadNoSuspendCall); | |
| 4422 | 4422 | |
| 4423 | 4423 | LLVMPositionBuilderAtEnd(g->builder, ok_block); |
| 4424 | 4424 | } |
| ... | ... | @@ -6391,7 +6391,7 @@ static LLVMValueRef ir_render_await(CodeGen *g, IrExecutableGen *executable, IrI |
| 6391 | 6391 | LLVMValueRef result_loc = (instruction->result_loc == nullptr) ? |
| 6392 | 6392 | nullptr : ir_llvm_value(g, instruction->result_loc); |
| 6393 | 6393 | |
| 6394 | if (instruction->is_noasync || | |
| 6394 | if (instruction->is_nosuspend || | |
| 6395 | 6395 | (instruction->target_fn != nullptr && !fn_is_async(instruction->target_fn))) |
| 6396 | 6396 | { |
| 6397 | 6397 | return gen_await_early_return(g, &instruction->base, target_frame_ptr, result_type, |
| ... | ... | @@ -7918,7 +7918,7 @@ static void do_code_gen(CodeGen *g) { |
| 7918 | 7918 | } |
| 7919 | 7919 | |
| 7920 | 7920 | if (!is_async) { |
| 7921 | // allocate async frames for noasync calls & awaits to async functions | |
| 7921 | // allocate async frames for nosuspend calls & awaits to async functions | |
| 7922 | 7922 | ZigType *largest_call_frame_type = nullptr; |
| 7923 | 7923 | IrInstGen *all_calls_alloca = ir_create_alloca(g, &fn_table_entry->fndef_scope->base, |
| 7924 | 7924 | fn_table_entry->body_node, fn_table_entry, g->builtin_types.entry_void, "@async_call_frame"); |
| ... | ... | @@ -7928,7 +7928,7 @@ static void do_code_gen(CodeGen *g) { |
| 7928 | 7928 | continue; |
| 7929 | 7929 | if (!fn_is_async(call->fn_entry)) |
| 7930 | 7930 | continue; |
| 7931 | if (call->modifier != CallModifierNoAsync) | |
| 7931 | if (call->modifier != CallModifierNoSuspend) | |
| 7932 | 7932 | continue; |
| 7933 | 7933 | if (call->frame_result_loc != nullptr) |
| 7934 | 7934 | continue; |
src/ir.cpp+30-30| ... | ... | @@ -4846,12 +4846,12 @@ static IrInstGen *ir_build_suspend_finish_gen(IrAnalyze *ira, IrInst *source_ins |
| 4846 | 4846 | } |
| 4847 | 4847 | |
| 4848 | 4848 | static IrInstSrc *ir_build_await_src(IrBuilderSrc *irb, Scope *scope, AstNode *source_node, |
| 4849 | IrInstSrc *frame, ResultLoc *result_loc, bool is_noasync) | |
| 4849 | IrInstSrc *frame, ResultLoc *result_loc, bool is_nosuspend) | |
| 4850 | 4850 | { |
| 4851 | 4851 | IrInstSrcAwait *instruction = ir_build_instruction<IrInstSrcAwait>(irb, scope, source_node); |
| 4852 | 4852 | instruction->frame = frame; |
| 4853 | 4853 | instruction->result_loc = result_loc; |
| 4854 | instruction->is_noasync = is_noasync; | |
| 4854 | instruction->is_nosuspend = is_nosuspend; | |
| 4855 | 4855 | |
| 4856 | 4856 | ir_ref_instruction(frame, irb->current_basic_block); |
| 4857 | 4857 | |
| ... | ... | @@ -4859,14 +4859,14 @@ static IrInstSrc *ir_build_await_src(IrBuilderSrc *irb, Scope *scope, AstNode *s |
| 4859 | 4859 | } |
| 4860 | 4860 | |
| 4861 | 4861 | static IrInstGenAwait *ir_build_await_gen(IrAnalyze *ira, IrInst *source_instruction, |
| 4862 | IrInstGen *frame, ZigType *result_type, IrInstGen *result_loc, bool is_noasync) | |
| 4862 | IrInstGen *frame, ZigType *result_type, IrInstGen *result_loc, bool is_nosuspend) | |
| 4863 | 4863 | { |
| 4864 | 4864 | IrInstGenAwait *instruction = ir_build_inst_gen<IrInstGenAwait>(&ira->new_irb, |
| 4865 | 4865 | source_instruction->scope, source_instruction->source_node); |
| 4866 | 4866 | instruction->base.value->type = result_type; |
| 4867 | 4867 | instruction->frame = frame; |
| 4868 | 4868 | instruction->result_loc = result_loc; |
| 4869 | instruction->is_noasync = is_noasync; | |
| 4869 | instruction->is_nosuspend = is_nosuspend; | |
| 4870 | 4870 | |
| 4871 | 4871 | ir_ref_inst_gen(frame); |
| 4872 | 4872 | if (result_loc != nullptr) ir_ref_inst_gen(result_loc); |
| ... | ... | @@ -4982,7 +4982,7 @@ static void ir_count_defers(IrBuilderSrc *irb, Scope *inner_scope, Scope *outer_ |
| 4982 | 4982 | case ScopeIdLoop: |
| 4983 | 4983 | case ScopeIdSuspend: |
| 4984 | 4984 | case ScopeIdCompTime: |
| 4985 | case ScopeIdNoAsync: | |
| 4985 | case ScopeIdNoSuspend: | |
| 4986 | 4986 | case ScopeIdRuntime: |
| 4987 | 4987 | case ScopeIdTypeOf: |
| 4988 | 4988 | case ScopeIdExpr: |
| ... | ... | @@ -5072,7 +5072,7 @@ static bool ir_gen_defers_for_block(IrBuilderSrc *irb, Scope *inner_scope, Scope |
| 5072 | 5072 | case ScopeIdLoop: |
| 5073 | 5073 | case ScopeIdSuspend: |
| 5074 | 5074 | case ScopeIdCompTime: |
| 5075 | case ScopeIdNoAsync: | |
| 5075 | case ScopeIdNoSuspend: | |
| 5076 | 5076 | case ScopeIdRuntime: |
| 5077 | 5077 | case ScopeIdTypeOf: |
| 5078 | 5078 | case ScopeIdExpr: |
| ... | ... | @@ -7335,10 +7335,10 @@ static IrInstSrc *ir_gen_builtin_fn_call(IrBuilderSrc *irb, Scope *scope, AstNod |
| 7335 | 7335 | zig_unreachable(); |
| 7336 | 7336 | } |
| 7337 | 7337 | |
| 7338 | static ScopeNoAsync *get_scope_noasync(Scope *scope) { | |
| 7338 | static ScopeNoSuspend *get_scope_nosuspend(Scope *scope) { | |
| 7339 | 7339 | while (scope) { |
| 7340 | if (scope->id == ScopeIdNoAsync) | |
| 7341 | return (ScopeNoAsync *)scope; | |
| 7340 | if (scope->id == ScopeIdNoSuspend) | |
| 7341 | return (ScopeNoSuspend *)scope; | |
| 7342 | 7342 | if (scope->id == ScopeIdFnDef) |
| 7343 | 7343 | return nullptr; |
| 7344 | 7344 | |
| ... | ... | @@ -7355,15 +7355,15 @@ static IrInstSrc *ir_gen_fn_call(IrBuilderSrc *irb, Scope *scope, AstNode *node, |
| 7355 | 7355 | if (node->data.fn_call_expr.modifier == CallModifierBuiltin) |
| 7356 | 7356 | return ir_gen_builtin_fn_call(irb, scope, node, lval, result_loc); |
| 7357 | 7357 | |
| 7358 | bool is_noasync = get_scope_noasync(scope) != nullptr; | |
| 7358 | bool is_nosuspend = get_scope_nosuspend(scope) != nullptr; | |
| 7359 | 7359 | CallModifier modifier = node->data.fn_call_expr.modifier; |
| 7360 | if (is_noasync) { | |
| 7360 | if (is_nosuspend) { | |
| 7361 | 7361 | if (modifier == CallModifierAsync) { |
| 7362 | 7362 | add_node_error(irb->codegen, node, |
| 7363 | buf_sprintf("async call in noasync scope")); | |
| 7363 | buf_sprintf("async call in nosuspend scope")); | |
| 7364 | 7364 | return irb->codegen->invalid_inst_src; |
| 7365 | 7365 | } |
| 7366 | modifier = CallModifierNoAsync; | |
| 7366 | modifier = CallModifierNoSuspend; | |
| 7367 | 7367 | } |
| 7368 | 7368 | |
| 7369 | 7369 | AstNode *fn_ref_node = node->data.fn_call_expr.fn_ref_expr; |
| ... | ... | @@ -9222,10 +9222,10 @@ static IrInstSrc *ir_gen_comptime(IrBuilderSrc *irb, Scope *parent_scope, AstNod |
| 9222 | 9222 | return ir_gen_node_extra(irb, node->data.comptime_expr.expr, child_scope, lval, nullptr); |
| 9223 | 9223 | } |
| 9224 | 9224 | |
| 9225 | static IrInstSrc *ir_gen_noasync(IrBuilderSrc *irb, Scope *parent_scope, AstNode *node, LVal lval) { | |
| 9226 | assert(node->type == NodeTypeNoAsync); | |
| 9225 | static IrInstSrc *ir_gen_nosuspend(IrBuilderSrc *irb, Scope *parent_scope, AstNode *node, LVal lval) { | |
| 9226 | assert(node->type == NodeTypeNoSuspend); | |
| 9227 | 9227 | |
| 9228 | Scope *child_scope = create_noasync_scope(irb->codegen, node, parent_scope); | |
| 9228 | Scope *child_scope = create_nosuspend_scope(irb->codegen, node, parent_scope); | |
| 9229 | 9229 | // purposefully pass null for result_loc and let EndExpr handle it |
| 9230 | 9230 | return ir_gen_node_extra(irb, node->data.comptime_expr.expr, child_scope, lval, nullptr); |
| 9231 | 9231 | } |
| ... | ... | @@ -9813,8 +9813,8 @@ static IrInstSrc *ir_gen_fn_proto(IrBuilderSrc *irb, Scope *parent_scope, AstNod |
| 9813 | 9813 | |
| 9814 | 9814 | static IrInstSrc *ir_gen_resume(IrBuilderSrc *irb, Scope *scope, AstNode *node) { |
| 9815 | 9815 | assert(node->type == NodeTypeResume); |
| 9816 | if (get_scope_noasync(scope) != nullptr) { | |
| 9817 | add_node_error(irb->codegen, node, buf_sprintf("resume in noasync scope")); | |
| 9816 | if (get_scope_nosuspend(scope) != nullptr) { | |
| 9817 | add_node_error(irb->codegen, node, buf_sprintf("resume in nosuspend scope")); | |
| 9818 | 9818 | return irb->codegen->invalid_inst_src; |
| 9819 | 9819 | } |
| 9820 | 9820 | |
| ... | ... | @@ -9830,7 +9830,7 @@ static IrInstSrc *ir_gen_await_expr(IrBuilderSrc *irb, Scope *scope, AstNode *no |
| 9830 | 9830 | { |
| 9831 | 9831 | assert(node->type == NodeTypeAwaitExpr); |
| 9832 | 9832 | |
| 9833 | bool is_noasync = get_scope_noasync(scope) != nullptr; | |
| 9833 | bool is_nosuspend = get_scope_nosuspend(scope) != nullptr; | |
| 9834 | 9834 | |
| 9835 | 9835 | AstNode *expr_node = node->data.await_expr.expr; |
| 9836 | 9836 | if (expr_node->type == NodeTypeFnCallExpr && expr_node->data.fn_call_expr.modifier == CallModifierBuiltin) { |
| ... | ... | @@ -9864,7 +9864,7 @@ static IrInstSrc *ir_gen_await_expr(IrBuilderSrc *irb, Scope *scope, AstNode *no |
| 9864 | 9864 | if (target_inst == irb->codegen->invalid_inst_src) |
| 9865 | 9865 | return irb->codegen->invalid_inst_src; |
| 9866 | 9866 | |
| 9867 | IrInstSrc *await_inst = ir_build_await_src(irb, scope, node, target_inst, result_loc, is_noasync); | |
| 9867 | IrInstSrc *await_inst = ir_build_await_src(irb, scope, node, target_inst, result_loc, is_nosuspend); | |
| 9868 | 9868 | return ir_lval_wrap(irb, scope, await_inst, lval, result_loc); |
| 9869 | 9869 | } |
| 9870 | 9870 | |
| ... | ... | @@ -9876,8 +9876,8 @@ static IrInstSrc *ir_gen_suspend(IrBuilderSrc *irb, Scope *parent_scope, AstNode |
| 9876 | 9876 | add_node_error(irb->codegen, node, buf_sprintf("suspend outside function definition")); |
| 9877 | 9877 | return irb->codegen->invalid_inst_src; |
| 9878 | 9878 | } |
| 9879 | if (get_scope_noasync(parent_scope) != nullptr) { | |
| 9880 | add_node_error(irb->codegen, node, buf_sprintf("suspend in noasync scope")); | |
| 9879 | if (get_scope_nosuspend(parent_scope) != nullptr) { | |
| 9880 | add_node_error(irb->codegen, node, buf_sprintf("suspend in nosuspend scope")); | |
| 9881 | 9881 | return irb->codegen->invalid_inst_src; |
| 9882 | 9882 | } |
| 9883 | 9883 | |
| ... | ... | @@ -10017,8 +10017,8 @@ static IrInstSrc *ir_gen_node_raw(IrBuilderSrc *irb, AstNode *node, Scope *scope |
| 10017 | 10017 | return ir_gen_switch_expr(irb, scope, node, lval, result_loc); |
| 10018 | 10018 | case NodeTypeCompTime: |
| 10019 | 10019 | return ir_expr_wrap(irb, scope, ir_gen_comptime(irb, scope, node, lval), result_loc); |
| 10020 | case NodeTypeNoAsync: | |
| 10021 | return ir_expr_wrap(irb, scope, ir_gen_noasync(irb, scope, node, lval), result_loc); | |
| 10020 | case NodeTypeNoSuspend: | |
| 10021 | return ir_expr_wrap(irb, scope, ir_gen_nosuspend(irb, scope, node, lval), result_loc); | |
| 10022 | 10022 | case NodeTypeErrorType: |
| 10023 | 10023 | return ir_lval_wrap(irb, scope, ir_gen_error_type(irb, scope, node), lval, result_loc); |
| 10024 | 10024 | case NodeTypeBreak: |
| ... | ... | @@ -10105,7 +10105,7 @@ static IrInstSrc *ir_gen_node_extra(IrBuilderSrc *irb, AstNode *node, Scope *sco |
| 10105 | 10105 | case NodeTypeIfOptional: |
| 10106 | 10106 | case NodeTypeSwitchExpr: |
| 10107 | 10107 | case NodeTypeCompTime: |
| 10108 | case NodeTypeNoAsync: | |
| 10108 | case NodeTypeNoSuspend: | |
| 10109 | 10109 | case NodeTypeErrorType: |
| 10110 | 10110 | case NodeTypeBreak: |
| 10111 | 10111 | case NodeTypeContinue: |
| ... | ... | @@ -20025,7 +20025,7 @@ static IrInstGen *ir_analyze_fn_call(IrAnalyze *ira, IrInst* source_instr, |
| 20025 | 20025 | |
| 20026 | 20026 | if (impl_fn_type_id->cc == CallingConventionAsync && |
| 20027 | 20027 | parent_fn_entry->inferred_async_node == nullptr && |
| 20028 | modifier != CallModifierNoAsync) | |
| 20028 | modifier != CallModifierNoSuspend) | |
| 20029 | 20029 | { |
| 20030 | 20030 | parent_fn_entry->inferred_async_node = fn_ref->base.source_node; |
| 20031 | 20031 | parent_fn_entry->inferred_async_fn = impl_fn; |
| ... | ... | @@ -20123,7 +20123,7 @@ static IrInstGen *ir_analyze_fn_call(IrAnalyze *ira, IrInst* source_instr, |
| 20123 | 20123 | |
| 20124 | 20124 | if (fn_type_id->cc == CallingConventionAsync && |
| 20125 | 20125 | parent_fn_entry->inferred_async_node == nullptr && |
| 20126 | modifier != CallModifierNoAsync) | |
| 20126 | modifier != CallModifierNoSuspend) | |
| 20127 | 20127 | { |
| 20128 | 20128 | parent_fn_entry->inferred_async_node = fn_ref->base.source_node; |
| 20129 | 20129 | parent_fn_entry->inferred_async_fn = fn_entry; |
| ... | ... | @@ -20233,7 +20233,7 @@ static IrInstGen *ir_analyze_call_extra(IrAnalyze *ira, IrInst* source_instr, |
| 20233 | 20233 | case CallModifierNone: |
| 20234 | 20234 | case CallModifierAlwaysInline: |
| 20235 | 20235 | case CallModifierAlwaysTail: |
| 20236 | case CallModifierNoAsync: | |
| 20236 | case CallModifierNoSuspend: | |
| 20237 | 20237 | modifier = CallModifierCompileTime; |
| 20238 | 20238 | break; |
| 20239 | 20239 | case CallModifierNeverInline: |
| ... | ... | @@ -30277,7 +30277,7 @@ static IrInstGen *ir_analyze_instruction_await(IrAnalyze *ira, IrInstSrcAwait *i |
| 30277 | 30277 | ir_assert(fn_entry != nullptr, &instruction->base.base); |
| 30278 | 30278 | |
| 30279 | 30279 | // If it's not @Frame(func) then it's definitely a suspend point |
| 30280 | if (target_fn == nullptr && !instruction->is_noasync) { | |
| 30280 | if (target_fn == nullptr && !instruction->is_nosuspend) { | |
| 30281 | 30281 | if (fn_entry->inferred_async_node == nullptr) { |
| 30282 | 30282 | fn_entry->inferred_async_node = instruction->base.base.source_node; |
| 30283 | 30283 | } |
| ... | ... | @@ -30301,7 +30301,7 @@ static IrInstGen *ir_analyze_instruction_await(IrAnalyze *ira, IrInstSrcAwait *i |
| 30301 | 30301 | } |
| 30302 | 30302 | |
| 30303 | 30303 | IrInstGenAwait *result = ir_build_await_gen(ira, &instruction->base.base, frame, result_type, result_loc, |
| 30304 | instruction->is_noasync); | |
| 30304 | instruction->is_nosuspend); | |
| 30305 | 30305 | result->target_fn = target_fn; |
| 30306 | 30306 | fn_entry->await_list.append(result); |
| 30307 | 30307 | return ir_finish_anal(ira, &result->base); |
src/ir_print.cpp+4-4| ... | ... | @@ -861,8 +861,8 @@ static void ir_print_call_src(IrPrintSrc *irp, IrInstSrcCall *call_instruction) |
| 861 | 861 | switch (call_instruction->modifier) { |
| 862 | 862 | case CallModifierNone: |
| 863 | 863 | break; |
| 864 | case CallModifierNoAsync: | |
| 865 | fprintf(irp->f, "noasync "); | |
| 864 | case CallModifierNoSuspend: | |
| 865 | fprintf(irp->f, "nosuspend "); | |
| 866 | 866 | break; |
| 867 | 867 | case CallModifierAsync: |
| 868 | 868 | fprintf(irp->f, "async "); |
| ... | ... | @@ -906,8 +906,8 @@ static void ir_print_call_gen(IrPrintGen *irp, IrInstGenCall *call_instruction) |
| 906 | 906 | switch (call_instruction->modifier) { |
| 907 | 907 | case CallModifierNone: |
| 908 | 908 | break; |
| 909 | case CallModifierNoAsync: | |
| 910 | fprintf(irp->f, "noasync "); | |
| 909 | case CallModifierNoSuspend: | |
| 910 | fprintf(irp->f, "nosuspend "); | |
| 911 | 911 | break; |
| 912 | 912 | case CallModifierAsync: |
| 913 | 913 | fprintf(irp->f, "async "); |
src/parser.cpp+16-16| ... | ... | @@ -913,7 +913,7 @@ static AstNode *ast_parse_container_field(ParseContext *pc) { |
| 913 | 913 | // Statement |
| 914 | 914 | // <- KEYWORD_comptime? VarDecl |
| 915 | 915 | // / KEYWORD_comptime BlockExprStatement |
| 916 | // / KEYWORD_noasync BlockExprStatement | |
| 916 | // / KEYWORD_nosuspend BlockExprStatement | |
| 917 | 917 | // / KEYWORD_suspend (SEMICOLON / BlockExprStatement) |
| 918 | 918 | // / KEYWORD_defer BlockExprStatement |
| 919 | 919 | // / KEYWORD_errdefer Payload? BlockExprStatement |
| ... | ... | @@ -937,11 +937,11 @@ static AstNode *ast_parse_statement(ParseContext *pc) { |
| 937 | 937 | return res; |
| 938 | 938 | } |
| 939 | 939 | |
| 940 | Token *noasync = eat_token_if(pc, TokenIdKeywordNoAsync); | |
| 941 | if (noasync != nullptr) { | |
| 940 | Token *nosuspend = eat_token_if(pc, TokenIdKeywordNoSuspend); | |
| 941 | if (nosuspend != nullptr) { | |
| 942 | 942 | AstNode *statement = ast_expect(pc, ast_parse_block_expr_statement); |
| 943 | AstNode *res = ast_create_node(pc, NodeTypeNoAsync, noasync); | |
| 944 | res->data.noasync_expr.expr = statement; | |
| 943 | AstNode *res = ast_create_node(pc, NodeTypeNoSuspend, nosuspend); | |
| 944 | res->data.nosuspend_expr.expr = statement; | |
| 945 | 945 | return res; |
| 946 | 946 | } |
| 947 | 947 | |
| ... | ... | @@ -1289,7 +1289,7 @@ static AstNode *ast_parse_prefix_expr(ParseContext *pc) { |
| 1289 | 1289 | // / IfExpr |
| 1290 | 1290 | // / KEYWORD_break BreakLabel? Expr? |
| 1291 | 1291 | // / KEYWORD_comptime Expr |
| 1292 | // / KEYWORD_noasync Expr | |
| 1292 | // / KEYWORD_nosuspend Expr | |
| 1293 | 1293 | // / KEYWORD_continue BreakLabel? |
| 1294 | 1294 | // / KEYWORD_resume Expr |
| 1295 | 1295 | // / KEYWORD_return Expr? |
| ... | ... | @@ -1324,11 +1324,11 @@ static AstNode *ast_parse_primary_expr(ParseContext *pc) { |
| 1324 | 1324 | return res; |
| 1325 | 1325 | } |
| 1326 | 1326 | |
| 1327 | Token *noasync = eat_token_if(pc, TokenIdKeywordNoAsync); | |
| 1328 | if (noasync != nullptr) { | |
| 1327 | Token *nosuspend = eat_token_if(pc, TokenIdKeywordNoSuspend); | |
| 1328 | if (nosuspend != nullptr) { | |
| 1329 | 1329 | AstNode *expr = ast_expect(pc, ast_parse_expr); |
| 1330 | AstNode *res = ast_create_node(pc, NodeTypeNoAsync, noasync); | |
| 1331 | res->data.noasync_expr.expr = expr; | |
| 1330 | AstNode *res = ast_create_node(pc, NodeTypeNoSuspend, nosuspend); | |
| 1331 | res->data.nosuspend_expr.expr = expr; | |
| 1332 | 1332 | return res; |
| 1333 | 1333 | } |
| 1334 | 1334 | |
| ... | ... | @@ -1640,7 +1640,7 @@ static AstNode *ast_parse_suffix_expr(ParseContext *pc) { |
| 1640 | 1640 | // / IfTypeExpr |
| 1641 | 1641 | // / INTEGER |
| 1642 | 1642 | // / KEYWORD_comptime TypeExpr |
| 1643 | // / KEYWORD_noasync TypeExpr | |
| 1643 | // / KEYWORD_nosuspend TypeExpr | |
| 1644 | 1644 | // / KEYWORD_error DOT IDENTIFIER |
| 1645 | 1645 | // / KEYWORD_false |
| 1646 | 1646 | // / KEYWORD_null |
| ... | ... | @@ -1742,11 +1742,11 @@ static AstNode *ast_parse_primary_type_expr(ParseContext *pc) { |
| 1742 | 1742 | return res; |
| 1743 | 1743 | } |
| 1744 | 1744 | |
| 1745 | Token *noasync = eat_token_if(pc, TokenIdKeywordNoAsync); | |
| 1746 | if (noasync != nullptr) { | |
| 1745 | Token *nosuspend = eat_token_if(pc, TokenIdKeywordNoSuspend); | |
| 1746 | if (nosuspend != nullptr) { | |
| 1747 | 1747 | AstNode *expr = ast_expect(pc, ast_parse_type_expr); |
| 1748 | AstNode *res = ast_create_node(pc, NodeTypeNoAsync, noasync); | |
| 1749 | res->data.noasync_expr.expr = expr; | |
| 1748 | AstNode *res = ast_create_node(pc, NodeTypeNoSuspend, nosuspend); | |
| 1749 | res->data.nosuspend_expr.expr = expr; | |
| 1750 | 1750 | return res; |
| 1751 | 1751 | } |
| 1752 | 1752 | |
| ... | ... | @@ -3189,7 +3189,7 @@ void ast_visit_node_children(AstNode *node, void (*visit)(AstNode **, void *cont |
| 3189 | 3189 | case NodeTypeCompTime: |
| 3190 | 3190 | visit_field(&node->data.comptime_expr.expr, visit, context); |
| 3191 | 3191 | break; |
| 3192 | case NodeTypeNoAsync: | |
| 3192 | case NodeTypeNoSuspend: | |
| 3193 | 3193 | visit_field(&node->data.comptime_expr.expr, visit, context); |
| 3194 | 3194 | break; |
| 3195 | 3195 | case NodeTypeBreak: |
src/tokenizer.cpp+2-2| ... | ... | @@ -128,8 +128,8 @@ static const struct ZigKeyword zig_keywords[] = { |
| 128 | 128 | {"if", TokenIdKeywordIf}, |
| 129 | 129 | {"inline", TokenIdKeywordInline}, |
| 130 | 130 | {"noalias", TokenIdKeywordNoAlias}, |
| 131 | {"noasync", TokenIdKeywordNoAsync}, | |
| 132 | 131 | {"noinline", TokenIdKeywordNoInline}, |
| 132 | {"nosuspend", TokenIdKeywordNoSuspend}, | |
| 133 | 133 | {"null", TokenIdKeywordNull}, |
| 134 | 134 | {"or", TokenIdKeywordOr}, |
| 135 | 135 | {"orelse", TokenIdKeywordOrElse}, |
| ... | ... | @@ -1589,8 +1589,8 @@ const char * token_name(TokenId id) { |
| 1589 | 1589 | case TokenIdKeywordIf: return "if"; |
| 1590 | 1590 | case TokenIdKeywordInline: return "inline"; |
| 1591 | 1591 | case TokenIdKeywordNoAlias: return "noalias"; |
| 1592 | case TokenIdKeywordNoAsync: return "noasync"; | |
| 1593 | 1592 | case TokenIdKeywordNoInline: return "noinline"; |
| 1593 | case TokenIdKeywordNoSuspend: return "nosuspend"; | |
| 1594 | 1594 | case TokenIdKeywordNull: return "null"; |
| 1595 | 1595 | case TokenIdKeywordOr: return "or"; |
| 1596 | 1596 | case TokenIdKeywordOrElse: return "orelse"; |
src/tokenizer.hpp+1-1| ... | ... | @@ -78,7 +78,7 @@ enum TokenId { |
| 78 | 78 | TokenIdKeywordNoInline, |
| 79 | 79 | TokenIdKeywordLinkSection, |
| 80 | 80 | TokenIdKeywordNoAlias, |
| 81 | TokenIdKeywordNoAsync, | |
| 81 | TokenIdKeywordNoSuspend, | |
| 82 | 82 | TokenIdKeywordNull, |
| 83 | 83 | TokenIdKeywordOr, |
| 84 | 84 | TokenIdKeywordOrElse, |