From 93f8110e5d9ca7e3ac81b33edd38709fac2c6acd Mon Sep 17 00:00:00 2001 From: Mathieu Guay-Paquet Date: Tue, 16 Feb 2021 23:43:36 -0500 Subject: [PATCH] Allow async in nosuspend scope Starting an async function call is actually a synchronous operation, since the caller is not awaiting on the callee for a return value. This commit removes the compiler code which generates the error and updates the relevant test case. In the presence of CallModifierAsync, the callee is expected to suspend, so it should not be changed to CallModifierNoSuspend. --- src/stage1/ir.cpp | 7 +------ test/compile_errors.zig | 1 - 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/src/stage1/ir.cpp b/src/stage1/ir.cpp index c418149546c498aad10d8d8cb6502affa0f5e472..0e03f25e11c0e014d39d9c365a9c4902c0618820 100644 --- a/src/stage1/ir.cpp +++ b/src/stage1/ir.cpp @@ -7607,12 +7607,7 @@ static IrInstSrc *ir_gen_fn_call(IrBuilderSrc *irb, Scope *scope, AstNode *node, bool is_nosuspend = get_scope_nosuspend(scope) != nullptr; CallModifier modifier = node->data.fn_call_expr.modifier; - if (is_nosuspend) { - if (modifier == CallModifierAsync) { - add_node_error(irb->codegen, node, - buf_sprintf("async call in nosuspend scope")); - return irb->codegen->invalid_inst_src; - } + if (is_nosuspend && modifier != CallModifierAsync) { modifier = CallModifierNoSuspend; } diff --git a/test/compile_errors.zig b/test/compile_errors.zig index 4c2dc63e334184b54cb08f65adc86d1972e19e42..808f0b31dc07401766f733dcc09622414c27939c 100644 --- a/test/compile_errors.zig +++ b/test/compile_errors.zig @@ -1027,7 +1027,6 @@ pub fn addCases(cases: *tests.CompileErrorContext) void { \\} \\fn foo() void {} , &[_][]const u8{ - "tmp.zig:3:21: error: async call in nosuspend scope", "tmp.zig:4:9: error: suspend in nosuspend scope", }); -- 2.54.0