authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-05-05 11:21:02-04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2020-05-05 11:21:02-04:00
loge6955688ac2255d3813e8d2994b6661bc651369b
tree9879154a5e02b77e95c1cf04a7cde64cb7adc727
parentfde6d28c237fbeae2ace8f2834190c6f9752712a
parentfdfdac493998a180eeffdcab66e579e7af250039
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #5272 from tadeokondrak/noasync-to-nosuspend

Noasync to nosuspend

28 files changed, 233 insertions(+), 208 deletions(-)

doc/docgen.zig+1-1
......@@ -802,8 +802,8 @@ fn tokenizeAndPrintRaw(docgen_tokenizer: *Tokenizer, out: var, source_token: Tok
802802 .Keyword_inline,
803803 .Keyword_nakedcc,
804804 .Keyword_noalias,
805 .Keyword_noasync,
806805 .Keyword_noinline,
806 .Keyword_nosuspend,
807807 .Keyword_or,
808808 .Keyword_orelse,
809809 .Keyword_packed,
lib/std/debug.zig+15-15
......@@ -62,7 +62,7 @@ pub fn warn(comptime fmt: []const u8, args: var) void {
6262 const held = stderr_mutex.acquire();
6363 defer held.release();
6464 const stderr = getStderrStream();
65 noasync stderr.print(fmt, args) catch return;
65 nosuspend stderr.print(fmt, args) catch return;
6666}
6767
6868pub fn getStderrStream() *File.OutStream {
......@@ -112,7 +112,7 @@ pub fn detectTTYConfig() TTY.Config {
112112/// Tries to print the current stack trace to stderr, unbuffered, and ignores any error returned.
113113/// TODO multithreaded awareness
114114pub fn dumpCurrentStackTrace(start_addr: ?usize) void {
115 noasync {
115 nosuspend {
116116 const stderr = getStderrStream();
117117 if (builtin.strip_debug_info) {
118118 stderr.print("Unable to dump stack trace: debug info stripped\n", .{}) catch return;
......@@ -133,7 +133,7 @@ pub fn dumpCurrentStackTrace(start_addr: ?usize) void {
133133/// unbuffered, and ignores any error returned.
134134/// TODO multithreaded awareness
135135pub fn dumpStackTraceFromBase(bp: usize, ip: usize) void {
136 noasync {
136 nosuspend {
137137 const stderr = getStderrStream();
138138 if (builtin.strip_debug_info) {
139139 stderr.print("Unable to dump stack trace: debug info stripped\n", .{}) catch return;
......@@ -203,7 +203,7 @@ pub fn captureStackTrace(first_address: ?usize, stack_trace: *builtin.StackTrace
203203/// Tries to print a stack trace to stderr, unbuffered, and ignores any error returned.
204204/// TODO multithreaded awareness
205205pub fn dumpStackTrace(stack_trace: builtin.StackTrace) void {
206 noasync {
206 nosuspend {
207207 const stderr = getStderrStream();
208208 if (builtin.strip_debug_info) {
209209 stderr.print("Unable to dump stack trace: debug info stripped\n", .{}) catch return;
......@@ -261,7 +261,7 @@ pub fn panicExtra(trace: ?*const builtin.StackTrace, first_trace_addr: ?usize, c
261261 resetSegfaultHandler();
262262 }
263263
264 noasync switch (panic_stage) {
264 nosuspend switch (panic_stage) {
265265 0 => {
266266 panic_stage = 1;
267267
......@@ -447,7 +447,7 @@ pub const TTY = struct {
447447 windows_api,
448448
449449 fn setColor(conf: Config, out_stream: var, color: Color) void {
450 noasync switch (conf) {
450 nosuspend switch (conf) {
451451 .no_color => return,
452452 .escape_codes => switch (color) {
453453 .Red => out_stream.writeAll(RED) catch return,
......@@ -604,7 +604,7 @@ fn printLineInfo(
604604 tty_config: TTY.Config,
605605 comptime printLineFromFile: var,
606606) !void {
607 noasync {
607 nosuspend {
608608 tty_config.setColor(out_stream, .White);
609609
610610 if (line_info) |*li| {
......@@ -651,7 +651,7 @@ pub const OpenSelfDebugInfoError = error{
651651
652652/// TODO resources https://github.com/ziglang/zig/issues/4353
653653pub fn openSelfDebugInfo(allocator: *mem.Allocator) anyerror!DebugInfo {
654 noasync {
654 nosuspend {
655655 if (builtin.strip_debug_info)
656656 return error.MissingDebugInfo;
657657 if (@hasDecl(root, "os") and @hasDecl(root.os, "debug") and @hasDecl(root.os.debug, "openSelfDebugInfo")) {
......@@ -672,7 +672,7 @@ pub fn openSelfDebugInfo(allocator: *mem.Allocator) anyerror!DebugInfo {
672672
673673/// TODO resources https://github.com/ziglang/zig/issues/4353
674674fn openCoffDebugInfo(allocator: *mem.Allocator, coff_file_path: [:0]const u16) !ModuleDebugInfo {
675 noasync {
675 nosuspend {
676676 const coff_file = try std.fs.openFileAbsoluteW(coff_file_path, .{ .intended_io_mode = .blocking });
677677 errdefer coff_file.close();
678678
......@@ -853,7 +853,7 @@ fn chopSlice(ptr: []const u8, offset: u64, size: u64) ![]const u8 {
853853
854854/// TODO resources https://github.com/ziglang/zig/issues/4353
855855pub fn openElfDebugInfo(allocator: *mem.Allocator, elf_file_path: []const u8) !ModuleDebugInfo {
856 noasync {
856 nosuspend {
857857 const mapped_mem = try mapWholeFile(elf_file_path);
858858 const hdr = @ptrCast(*const elf.Ehdr, &mapped_mem[0]);
859859 if (!mem.eql(u8, hdr.e_ident[0..4], "\x7fELF")) return error.InvalidElfMagic;
......@@ -1056,7 +1056,7 @@ const MachoSymbol = struct {
10561056};
10571057
10581058fn mapWholeFile(path: []const u8) ![]align(mem.page_size) const u8 {
1059 noasync {
1059 nosuspend {
10601060 const file = try fs.cwd().openFile(path, .{ .intended_io_mode = .blocking });
10611061 defer file.close();
10621062
......@@ -1418,7 +1418,7 @@ pub const ModuleDebugInfo = switch (builtin.os.tag) {
14181418 }
14191419
14201420 fn getSymbolAtAddress(self: *@This(), address: usize) !SymbolInfo {
1421 noasync {
1421 nosuspend {
14221422 // Translate the VA into an address into this object
14231423 const relocated_address = address - self.base_address;
14241424 assert(relocated_address >= 0x100000000);
......@@ -1643,14 +1643,14 @@ pub const ModuleDebugInfo = switch (builtin.os.tag) {
16431643 // Translate the VA into an address into this object
16441644 const relocated_address = address - self.base_address;
16451645
1646 if (noasync self.dwarf.findCompileUnit(relocated_address)) |compile_unit| {
1646 if (nosuspend self.dwarf.findCompileUnit(relocated_address)) |compile_unit| {
16471647 return SymbolInfo{
1648 .symbol_name = noasync self.dwarf.getSymbolName(relocated_address) orelse "???",
1648 .symbol_name = nosuspend self.dwarf.getSymbolName(relocated_address) orelse "???",
16491649 .compile_unit_name = compile_unit.die.getAttrString(&self.dwarf, DW.AT_name) catch |err| switch (err) {
16501650 error.MissingDebugInfo, error.InvalidDebugInfo => "???",
16511651 else => return err,
16521652 },
1653 .line_info = noasync self.dwarf.getLineNumberInfo(compile_unit.*, relocated_address) catch |err| switch (err) {
1653 .line_info = nosuspend self.dwarf.getLineNumberInfo(compile_unit.*, relocated_address) catch |err| switch (err) {
16541654 error.MissingDebugInfo, error.InvalidDebugInfo => null,
16551655 else => return err,
16561656 },
lib/std/dwarf.zig+25-25
......@@ -248,17 +248,17 @@ fn readUnitLength(in_stream: var, endian: builtin.Endian, is_64: *bool) !u64 {
248248 }
249249}
250250
251// TODO the noasyncs here are workarounds
251// TODO the nosuspends here are workarounds
252252fn readAllocBytes(allocator: *mem.Allocator, in_stream: var, size: usize) ![]u8 {
253253 const buf = try allocator.alloc(u8, size);
254254 errdefer allocator.free(buf);
255 if ((try noasync in_stream.read(buf)) < size) return error.EndOfFile;
255 if ((try nosuspend in_stream.read(buf)) < size) return error.EndOfFile;
256256 return buf;
257257}
258258
259// TODO the noasyncs here are workarounds
259// TODO the nosuspends here are workarounds
260260fn readAddress(in_stream: var, endian: builtin.Endian, is_64: bool) !u64 {
261 return noasync if (is_64)
261 return nosuspend if (is_64)
262262 try in_stream.readInt(u64, endian)
263263 else
264264 @as(u64, try in_stream.readInt(u32, endian));
......@@ -269,29 +269,29 @@ fn parseFormValueBlockLen(allocator: *mem.Allocator, in_stream: var, size: usize
269269 return FormValue{ .Block = buf };
270270}
271271
272// TODO the noasyncs here are workarounds
272// TODO the nosuspends here are workarounds
273273fn parseFormValueBlock(allocator: *mem.Allocator, in_stream: var, endian: builtin.Endian, size: usize) !FormValue {
274 const block_len = try noasync in_stream.readVarInt(usize, endian, size);
274 const block_len = try nosuspend in_stream.readVarInt(usize, endian, size);
275275 return parseFormValueBlockLen(allocator, in_stream, block_len);
276276}
277277
278278fn parseFormValueConstant(allocator: *mem.Allocator, in_stream: var, signed: bool, endian: builtin.Endian, comptime size: i32) !FormValue {
279279 // TODO: Please forgive me, I've worked around zig not properly spilling some intermediate values here.
280 // `noasync` should be removed from all the function calls once it is fixed.
280 // `nosuspend` should be removed from all the function calls once it is fixed.
281281 return FormValue{
282282 .Const = Constant{
283283 .signed = signed,
284284 .payload = switch (size) {
285 1 => try noasync in_stream.readInt(u8, endian),
286 2 => try noasync in_stream.readInt(u16, endian),
287 4 => try noasync in_stream.readInt(u32, endian),
288 8 => try noasync in_stream.readInt(u64, endian),
285 1 => try nosuspend in_stream.readInt(u8, endian),
286 2 => try nosuspend in_stream.readInt(u16, endian),
287 4 => try nosuspend in_stream.readInt(u32, endian),
288 8 => try nosuspend in_stream.readInt(u64, endian),
289289 -1 => blk: {
290290 if (signed) {
291 const x = try noasync leb.readILEB128(i64, in_stream);
291 const x = try nosuspend leb.readILEB128(i64, in_stream);
292292 break :blk @bitCast(u64, x);
293293 } else {
294 const x = try noasync leb.readULEB128(u64, in_stream);
294 const x = try nosuspend leb.readULEB128(u64, in_stream);
295295 break :blk x;
296296 }
297297 },
......@@ -301,21 +301,21 @@ fn parseFormValueConstant(allocator: *mem.Allocator, in_stream: var, signed: boo
301301 };
302302}
303303
304// TODO the noasyncs here are workarounds
304// TODO the nosuspends here are workarounds
305305fn parseFormValueRef(allocator: *mem.Allocator, in_stream: var, endian: builtin.Endian, size: i32) !FormValue {
306306 return FormValue{
307307 .Ref = switch (size) {
308 1 => try noasync in_stream.readInt(u8, endian),
309 2 => try noasync in_stream.readInt(u16, endian),
310 4 => try noasync in_stream.readInt(u32, endian),
311 8 => try noasync in_stream.readInt(u64, endian),
312 -1 => try noasync leb.readULEB128(u64, in_stream),
308 1 => try nosuspend in_stream.readInt(u8, endian),
309 2 => try nosuspend in_stream.readInt(u16, endian),
310 4 => try nosuspend in_stream.readInt(u32, endian),
311 8 => try nosuspend in_stream.readInt(u64, endian),
312 -1 => try nosuspend leb.readULEB128(u64, in_stream),
313313 else => unreachable,
314314 },
315315 };
316316}
317317
318// TODO the noasyncs here are workarounds
318// TODO the nosuspends here are workarounds
319319fn parseFormValue(allocator: *mem.Allocator, in_stream: var, form_id: u64, endian: builtin.Endian, is_64: bool) anyerror!FormValue {
320320 return switch (form_id) {
321321 FORM_addr => FormValue{ .Address = try readAddress(in_stream, endian, @sizeOf(usize) == 8) },
......@@ -323,7 +323,7 @@ fn parseFormValue(allocator: *mem.Allocator, in_stream: var, form_id: u64, endia
323323 FORM_block2 => parseFormValueBlock(allocator, in_stream, endian, 2),
324324 FORM_block4 => parseFormValueBlock(allocator, in_stream, endian, 4),
325325 FORM_block => x: {
326 const block_len = try noasync leb.readULEB128(usize, in_stream);
326 const block_len = try nosuspend leb.readULEB128(usize, in_stream);
327327 return parseFormValueBlockLen(allocator, in_stream, block_len);
328328 },
329329 FORM_data1 => parseFormValueConstant(allocator, in_stream, false, endian, 1),
......@@ -335,11 +335,11 @@ fn parseFormValue(allocator: *mem.Allocator, in_stream: var, form_id: u64, endia
335335 return parseFormValueConstant(allocator, in_stream, signed, endian, -1);
336336 },
337337 FORM_exprloc => {
338 const size = try noasync leb.readULEB128(usize, in_stream);
338 const size = try nosuspend leb.readULEB128(usize, in_stream);
339339 const buf = try readAllocBytes(allocator, in_stream, size);
340340 return FormValue{ .ExprLoc = buf };
341341 },
342 FORM_flag => FormValue{ .Flag = (try noasync in_stream.readByte()) != 0 },
342 FORM_flag => FormValue{ .Flag = (try nosuspend in_stream.readByte()) != 0 },
343343 FORM_flag_present => FormValue{ .Flag = true },
344344 FORM_sec_offset => FormValue{ .SecOffset = try readAddress(in_stream, endian, is_64) },
345345
......@@ -350,12 +350,12 @@ fn parseFormValue(allocator: *mem.Allocator, in_stream: var, form_id: u64, endia
350350 FORM_ref_udata => parseFormValueRef(allocator, in_stream, endian, -1),
351351
352352 FORM_ref_addr => FormValue{ .RefAddr = try readAddress(in_stream, endian, is_64) },
353 FORM_ref_sig8 => FormValue{ .Ref = try noasync in_stream.readInt(u64, endian) },
353 FORM_ref_sig8 => FormValue{ .Ref = try nosuspend in_stream.readInt(u64, endian) },
354354
355355 FORM_string => FormValue{ .String = try in_stream.readUntilDelimiterAlloc(allocator, 0, math.maxInt(usize)) },
356356 FORM_strp => FormValue{ .StrPtr = try readAddress(in_stream, endian, is_64) },
357357 FORM_indirect => {
358 const child_form_id = try noasync leb.readULEB128(u64, in_stream);
358 const child_form_id = try nosuspend leb.readULEB128(u64, in_stream);
359359 const F = @TypeOf(async parseFormValue(allocator, in_stream, child_form_id, endian, is_64));
360360 var frame = try allocator.create(F);
361361 defer allocator.destroy(frame);
lib/std/event/batch.zig+3-3
......@@ -21,7 +21,7 @@ pub fn Batch(
2121 /// usual recommended option for this parameter.
2222 auto_async,
2323
24 /// Always uses the `noasync` keyword when using `await` on the jobs,
24 /// Always uses the `nosuspend` keyword when using `await` on the jobs,
2525 /// making `add` and `wait` non-async functions. Asserts that the jobs do not suspend.
2626 never_async,
2727
......@@ -75,7 +75,7 @@ pub fn Batch(
7575 const job = &self.jobs[self.next_job_index];
7676 self.next_job_index = (self.next_job_index + 1) % max_jobs;
7777 if (job.frame) |existing| {
78 job.result = if (async_ok) await existing else noasync await existing;
78 job.result = if (async_ok) await existing else nosuspend await existing;
7979 if (CollectedResult != void) {
8080 job.result catch |err| {
8181 self.collected_result = err;
......@@ -94,7 +94,7 @@ pub fn Batch(
9494 /// a time, however, it need not be the same thread.
9595 pub fn wait(self: *Self) CollectedResult {
9696 for (self.jobs) |*job| if (job.frame) |f| {
97 job.result = if (async_ok) await f else noasync await f;
97 job.result = if (async_ok) await f else nosuspend await f;
9898 if (CollectedResult != void) {
9999 job.result catch |err| {
100100 self.collected_result = err;
lib/std/event/loop.zig+4-4
......@@ -195,7 +195,7 @@ pub const Loop = struct {
195195 const wakeup_bytes = [_]u8{0x1} ** 8;
196196
197197 fn initOsData(self: *Loop, extra_thread_count: usize) InitOsDataError!void {
198 noasync switch (builtin.os.tag) {
198 nosuspend switch (builtin.os.tag) {
199199 .linux => {
200200 errdefer {
201201 while (self.available_eventfd_resume_nodes.pop()) |node| os.close(node.data.eventfd);
......@@ -371,7 +371,7 @@ pub const Loop = struct {
371371 }
372372
373373 fn deinitOsData(self: *Loop) void {
374 noasync switch (builtin.os.tag) {
374 nosuspend switch (builtin.os.tag) {
375375 .linux => {
376376 os.close(self.os_data.final_eventfd);
377377 while (self.available_eventfd_resume_nodes.pop()) |node| os.close(node.data.eventfd);
......@@ -663,7 +663,7 @@ pub const Loop = struct {
663663 }
664664
665665 pub fn finishOneEvent(self: *Loop) void {
666 noasync {
666 nosuspend {
667667 const prev = @atomicRmw(usize, &self.pending_event_count, .Sub, 1, .SeqCst);
668668 if (prev != 1) return;
669669
......@@ -1041,7 +1041,7 @@ pub const Loop = struct {
10411041 }
10421042
10431043 fn posixFsRun(self: *Loop) void {
1044 noasync while (true) {
1044 nosuspend while (true) {
10451045 self.fs_thread_wakeup.reset();
10461046 while (self.fs_queue.get()) |node| {
10471047 switch (node.data.msg) {
lib/std/fs/file.zig+2-2
......@@ -66,7 +66,7 @@ pub const File = struct {
6666 lock_nonblocking: bool = false,
6767
6868 /// Setting this to `.blocking` prevents `O_NONBLOCK` from being passed even
69 /// if `std.io.is_async`. It allows the use of `noasync` when calling functions
69 /// if `std.io.is_async`. It allows the use of `nosuspend` when calling functions
7070 /// related to opening the file, reading, writing, and locking.
7171 intended_io_mode: io.ModeOverride = io.default_mode,
7272 };
......@@ -112,7 +112,7 @@ pub const File = struct {
112112 mode: Mode = default_mode,
113113
114114 /// Setting this to `.blocking` prevents `O_NONBLOCK` from being passed even
115 /// if `std.io.is_async`. It allows the use of `noasync` when calling functions
115 /// if `std.io.is_async`. It allows the use of `nosuspend` when calling functions
116116 /// related to opening the file, reading, writing, and locking.
117117 intended_io_mode: io.ModeOverride = io.default_mode,
118118 };
lib/std/zig/ast.zig+11-11
......@@ -438,7 +438,7 @@ pub const Node = struct {
438438 ContainerDecl,
439439 Asm,
440440 Comptime,
441 Noasync,
441 Nosuspend,
442442 Block,
443443
444444 // Misc
......@@ -569,9 +569,9 @@ pub const Node = struct {
569569
570570 return true;
571571 },
572 .Noasync => {
573 const noasync_node = @fieldParentPtr(Noasync, "base", n);
574 return noasync_node.expr.id != .Block;
572 .Nosuspend => {
573 const nosuspend_node = @fieldParentPtr(Nosuspend, "base", n);
574 return nosuspend_node.expr.id != .Block;
575575 },
576576 else => return true,
577577 }
......@@ -1084,12 +1084,12 @@ pub const Node = struct {
10841084 }
10851085 };
10861086
1087 pub const Noasync = struct {
1088 base: Node = Node{ .id = .Noasync },
1089 noasync_token: TokenIndex,
1087 pub const Nosuspend = struct {
1088 base: Node = Node{ .id = .Nosuspend },
1089 nosuspend_token: TokenIndex,
10901090 expr: *Node,
10911091
1092 pub fn iterate(self: *Noasync, index: usize) ?*Node {
1092 pub fn iterate(self: *Nosuspend, index: usize) ?*Node {
10931093 var i = index;
10941094
10951095 if (i < 1) return self.expr;
......@@ -1098,11 +1098,11 @@ pub const Node = struct {
10981098 return null;
10991099 }
11001100
1101 pub fn firstToken(self: *const Noasync) TokenIndex {
1102 return self.noasync_token;
1101 pub fn firstToken(self: *const Nosuspend) TokenIndex {
1102 return self.nosuspend_token;
11031103 }
11041104
1105 pub fn lastToken(self: *const Noasync) TokenIndex {
1105 pub fn lastToken(self: *const Nosuspend) TokenIndex {
11061106 return self.expr.lastToken();
11071107 }
11081108 };
lib/std/zig/parse.zig+12-12
......@@ -495,7 +495,7 @@ fn parseContainerField(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*No
495495/// Statement
496496/// <- KEYWORD_comptime? VarDecl
497497/// / KEYWORD_comptime BlockExprStatement
498/// / KEYWORD_noasync BlockExprStatement
498/// / KEYWORD_nosuspend BlockExprStatement
499499/// / KEYWORD_suspend (SEMICOLON / BlockExprStatement)
500500/// / KEYWORD_defer BlockExprStatement
501501/// / KEYWORD_errdefer Payload? BlockExprStatement
......@@ -527,14 +527,14 @@ fn parseStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) Error!?*No
527527 return &node.base;
528528 }
529529
530 if (eatToken(it, .Keyword_noasync)) |noasync_token| {
530 if (eatToken(it, .Keyword_nosuspend)) |nosuspend_token| {
531531 const block_expr = try expectNode(arena, it, tree, parseBlockExprStatement, .{
532532 .ExpectedBlockOrAssignment = .{ .token = it.index },
533533 });
534534
535 const node = try arena.create(Node.Noasync);
535 const node = try arena.create(Node.Nosuspend);
536536 node.* = .{
537 .noasync_token = noasync_token,
537 .nosuspend_token = nosuspend_token,
538538 .expr = block_expr,
539539 };
540540 return &node.base;
......@@ -908,7 +908,7 @@ fn parsePrefixExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
908908/// / IfExpr
909909/// / KEYWORD_break BreakLabel? Expr?
910910/// / KEYWORD_comptime Expr
911/// / KEYWORD_noasync Expr
911/// / KEYWORD_nosuspend Expr
912912/// / KEYWORD_continue BreakLabel?
913913/// / KEYWORD_resume Expr
914914/// / KEYWORD_return Expr?
......@@ -944,13 +944,13 @@ fn parsePrimaryExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
944944 return &node.base;
945945 }
946946
947 if (eatToken(it, .Keyword_noasync)) |token| {
947 if (eatToken(it, .Keyword_nosuspend)) |token| {
948948 const expr_node = try expectNode(arena, it, tree, parseExpr, .{
949949 .ExpectedExpr = .{ .token = it.index },
950950 });
951 const node = try arena.create(Node.Noasync);
951 const node = try arena.create(Node.Nosuspend);
952952 node.* = .{
953 .noasync_token = token,
953 .nosuspend_token = token,
954954 .expr = expr_node,
955955 };
956956 return &node.base;
......@@ -1288,7 +1288,7 @@ fn parseSuffixExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
12881288/// / IfTypeExpr
12891289/// / INTEGER
12901290/// / KEYWORD_comptime TypeExpr
1291/// / KEYWORD_noasync TypeExpr
1291/// / KEYWORD_nosuspend TypeExpr
12921292/// / KEYWORD_error DOT IDENTIFIER
12931293/// / KEYWORD_false
12941294/// / KEYWORD_null
......@@ -1327,11 +1327,11 @@ fn parsePrimaryTypeExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*N
13271327 };
13281328 return &node.base;
13291329 }
1330 if (eatToken(it, .Keyword_noasync)) |token| {
1330 if (eatToken(it, .Keyword_nosuspend)) |token| {
13311331 const expr = (try parseTypeExpr(arena, it, tree)) orelse return null;
1332 const node = try arena.create(Node.Noasync);
1332 const node = try arena.create(Node.Nosuspend);
13331333 node.* = .{
1334 .noasync_token = token,
1334 .nosuspend_token = token,
13351335 .expr = expr,
13361336 };
13371337 return &node.base;
lib/std/zig/parser_test.zig+20-6
......@@ -35,10 +35,10 @@ test "zig fmt: errdefer with payload" {
3535 );
3636}
3737
38test "zig fmt: noasync block" {
38test "zig fmt: nosuspend block" {
3939 try testCanonical(
4040 \\pub fn main() anyerror!void {
41 \\ noasync {
41 \\ nosuspend {
4242 \\ var foo: Foo = .{ .bar = 42 };
4343 \\ }
4444 \\}
......@@ -46,10 +46,10 @@ test "zig fmt: noasync block" {
4646 );
4747}
4848
49test "zig fmt: noasync await" {
49test "zig fmt: nosuspend await" {
5050 try testCanonical(
5151 \\fn foo() void {
52 \\ x = noasync await y;
52 \\ x = nosuspend await y;
5353 \\}
5454 \\
5555 );
......@@ -2519,9 +2519,9 @@ test "zig fmt: async functions" {
25192519 );
25202520}
25212521
2522test "zig fmt: noasync" {
2522test "zig fmt: nosuspend" {
25232523 try testCanonical(
2524 \\const a = noasync foo();
2524 \\const a = nosuspend foo();
25252525 \\
25262526 );
25272527}
......@@ -2926,6 +2926,20 @@ test "zig fmt: hexadeciaml float literals with underscore separators" {
29262926 );
29272927}
29282928
2929test "zig fmt: noasync to nosuspend" {
2930 // TODO: remove this
2931 try testTransform(
2932 \\pub fn main() void {
2933 \\ noasync call();
2934 \\}
2935 ,
2936 \\pub fn main() void {
2937 \\ nosuspend call();
2938 \\}
2939 \\
2940 );
2941}
2942
29292943const std = @import("std");
29302944const mem = std.mem;
29312945const warn = std.debug.warn;
lib/std/zig/render.zig+9-5
......@@ -391,11 +391,15 @@ fn renderExpression(
391391 try renderToken(tree, stream, comptime_node.comptime_token, indent, start_col, Space.Space);
392392 return renderExpression(allocator, stream, tree, indent, start_col, comptime_node.expr, space);
393393 },
394 .Noasync => {
395 const noasync_node = @fieldParentPtr(ast.Node.Noasync, "base", base);
396
397 try renderToken(tree, stream, noasync_node.noasync_token, indent, start_col, Space.Space);
398 return renderExpression(allocator, stream, tree, indent, start_col, noasync_node.expr, space);
394 .Nosuspend => {
395 const nosuspend_node = @fieldParentPtr(ast.Node.Nosuspend, "base", base);
396 if (mem.eql(u8, tree.tokenSlice(nosuspend_node.nosuspend_token), "noasync")) {
397 // TODO: remove this
398 try stream.writeAll("nosuspend ");
399 } else {
400 try renderToken(tree, stream, nosuspend_node.nosuspend_token, indent, start_col, Space.Space);
401 }
402 return renderExpression(allocator, stream, tree, indent, start_col, nosuspend_node.expr, space);
399403 },
400404
401405 .Suspend => {
lib/std/zig/system/macos.zig+9-4
......@@ -39,7 +39,7 @@ pub fn version_from_build(build: []const u8) !std.builtin.Version {
3939 zend += 1;
4040 }
4141 if (zend == yindex + 1) return error.InvalidVersion;
42 const z = std.fmt.parseUnsigned(u16, build[yindex + 1..zend], 10) catch return error.InvalidVersion;
42 const z = std.fmt.parseUnsigned(u16, build[yindex + 1 .. zend], 10) catch return error.InvalidVersion;
4343
4444 result.patch = switch (result.minor) {
4545 // TODO: compiler complains without explicit @as() coercion
......@@ -97,7 +97,9 @@ pub fn version_from_build(build: []const u8) !std.builtin.Version {
9797 4 => @as(u32, switch (y) { // Tiger: 10.4
9898 'A' => 0,
9999 'B' => 1,
100 'C', 'E', => 2,
100 'C',
101 'E',
102 => 2,
101103 'F' => 3,
102104 'G' => @as(u32, block: {
103105 if (z >= 1454) break :block 5;
......@@ -105,7 +107,10 @@ pub fn version_from_build(build: []const u8) !std.builtin.Version {
105107 }),
106108 'H' => 5,
107109 'I' => 6,
108 'J', 'K', 'N', => 7,
110 'J',
111 'K',
112 'N',
113 => 7,
109114 'L' => 8,
110115 'P' => 9,
111116 'R' => 10,
......@@ -438,7 +443,7 @@ test "version_from_build" {
438443 for (known) |pair| {
439444 var buf: [32]u8 = undefined;
440445 const ver = try version_from_build(pair[0]);
441 const sver = try std.fmt.bufPrint(buf[0..], "{}.{}.{}", .{ver.major, ver.minor, ver.patch});
446 const sver = try std.fmt.bufPrint(buf[0..], "{}.{}.{}", .{ ver.major, ver.minor, ver.patch });
442447 std.testing.expect(std.mem.eql(u8, sver, pair[1]));
443448 }
444449}
lib/std/zig/tokenizer.zig+4-3
......@@ -49,8 +49,9 @@ pub const Token = struct {
4949 Keyword.init("inline", .Keyword_inline),
5050 Keyword.init("nakedcc", .Keyword_nakedcc),
5151 Keyword.init("noalias", .Keyword_noalias),
52 Keyword.init("noasync", .Keyword_noasync),
52 Keyword.init("noasync", .Keyword_nosuspend), // TODO: remove this
5353 Keyword.init("noinline", .Keyword_noinline),
54 Keyword.init("nosuspend", .Keyword_nosuspend),
5455 Keyword.init("null", .Keyword_null),
5556 Keyword.init("or", .Keyword_or),
5657 Keyword.init("orelse", .Keyword_orelse),
......@@ -182,8 +183,8 @@ pub const Token = struct {
182183 Keyword_inline,
183184 Keyword_nakedcc,
184185 Keyword_noalias,
185 Keyword_noasync,
186186 Keyword_noinline,
187 Keyword_nosuspend,
187188 Keyword_null,
188189 Keyword_or,
189190 Keyword_orelse,
......@@ -307,8 +308,8 @@ pub const Token = struct {
307308 .Keyword_inline => "inline",
308309 .Keyword_nakedcc => "nakedcc",
309310 .Keyword_noalias => "noalias",
310 .Keyword_noasync => "noasync",
311311 .Keyword_noinline => "noinline",
312 .Keyword_nosuspend => "nosuspend",
312313 .Keyword_null => "null",
313314 .Keyword_or => "or",
314315 .Keyword_orelse => "orelse",
src/all_types.hpp+11-11
......@@ -672,7 +672,7 @@ enum NodeType {
672672 NodeTypeSwitchProng,
673673 NodeTypeSwitchRange,
674674 NodeTypeCompTime,
675 NodeTypeNoAsync,
675 NodeTypeNoSuspend,
676676 NodeTypeBreak,
677677 NodeTypeContinue,
678678 NodeTypeAsmExpr,
......@@ -862,7 +862,7 @@ enum CallModifier {
862862 CallModifierAsync,
863863 CallModifierNeverTail,
864864 CallModifierNeverInline,
865 CallModifierNoAsync,
865 CallModifierNoSuspend,
866866 CallModifierAlwaysTail,
867867 CallModifierAlwaysInline,
868868 CallModifierCompileTime,
......@@ -1014,7 +1014,7 @@ struct AstNodeCompTime {
10141014 AstNode *expr;
10151015};
10161016
1017struct AstNodeNoAsync {
1017struct AstNodeNoSuspend {
10181018 AstNode *expr;
10191019};
10201020
......@@ -1225,7 +1225,7 @@ struct AstNode {
12251225 AstNodeSwitchProng switch_prong;
12261226 AstNodeSwitchRange switch_range;
12271227 AstNodeCompTime comptime_expr;
1228 AstNodeNoAsync noasync_expr;
1228 AstNodeNoSuspend nosuspend_expr;
12291229 AstNodeAsmExpr asm_expr;
12301230 AstNodeFieldAccessExpr field_access_expr;
12311231 AstNodePtrDerefExpr ptr_deref_expr;
......@@ -1858,7 +1858,7 @@ enum PanicMsgId {
18581858 PanicMsgIdResumedAnAwaitingFn,
18591859 PanicMsgIdFrameTooSmall,
18601860 PanicMsgIdResumedFnPendingAwait,
1861 PanicMsgIdBadNoAsyncCall,
1861 PanicMsgIdBadNoSuspendCall,
18621862 PanicMsgIdResumeNotSuspendedFn,
18631863 PanicMsgIdBadSentinel,
18641864 PanicMsgIdShxTooBigRhs,
......@@ -2376,7 +2376,7 @@ enum ScopeId {
23762376 ScopeIdRuntime,
23772377 ScopeIdTypeOf,
23782378 ScopeIdExpr,
2379 ScopeIdNoAsync,
2379 ScopeIdNoSuspend,
23802380};
23812381
23822382struct Scope {
......@@ -2510,9 +2510,9 @@ struct ScopeCompTime {
25102510 Scope base;
25112511};
25122512
2513// This scope is created for a noasync expression.
2514// NodeTypeNoAsync
2515struct ScopeNoAsync {
2513// This scope is created for a nosuspend expression.
2514// NodeTypeNoSuspend
2515struct ScopeNoSuspend {
25162516 Scope base;
25172517};
25182518
......@@ -4488,7 +4488,7 @@ struct IrInstSrcAwait {
44884488
44894489 IrInstSrc *frame;
44904490 ResultLoc *result_loc;
4491 bool is_noasync;
4491 bool is_nosuspend;
44924492};
44934493
44944494struct IrInstGenAwait {
......@@ -4497,7 +4497,7 @@ struct IrInstGenAwait {
44974497 IrInstGen *frame;
44984498 IrInstGen *result_loc;
44994499 ZigFn *target_fn;
4500 bool is_noasync;
4500 bool is_nosuspend;
45014501};
45024502
45034503struct IrInstSrcResume {
src/analyze.cpp+9-9
......@@ -106,7 +106,7 @@ static ScopeExpr *find_expr_scope(Scope *scope) {
106106 case ScopeIdDecls:
107107 case ScopeIdFnDef:
108108 case ScopeIdCompTime:
109 case ScopeIdNoAsync:
109 case ScopeIdNoSuspend:
110110 case ScopeIdVarDecl:
111111 case ScopeIdCImport:
112112 case ScopeIdSuspend:
......@@ -227,9 +227,9 @@ Scope *create_comptime_scope(CodeGen *g, AstNode *node, Scope *parent) {
227227 return &scope->base;
228228}
229229
230Scope *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);
230Scope *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);
233233 return &scope->base;
234234}
235235
......@@ -3771,7 +3771,7 @@ void scan_decls(CodeGen *g, ScopeDecls *decls_scope, AstNode *node) {
37713771 case NodeTypeCompTime:
37723772 preview_comptime_decl(g, node, decls_scope);
37733773 break;
3774 case NodeTypeNoAsync:
3774 case NodeTypeNoSuspend:
37753775 case NodeTypeParamDecl:
37763776 case NodeTypeReturnExpr:
37773777 case NodeTypeDefer:
......@@ -4689,7 +4689,7 @@ void add_async_error_notes(CodeGen *g, ErrorMsg *msg, ZigFn *fn) {
46894689static Error analyze_callee_async(CodeGen *g, ZigFn *fn, ZigFn *callee, AstNode *call_node,
46904690 bool must_not_be_async, CallModifier modifier)
46914691{
4692 if (modifier == CallModifierNoAsync)
4692 if (modifier == CallModifierNoSuspend)
46934693 return ErrorNone;
46944694 bool callee_is_async = false;
46954695 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) {
48124812 }
48134813 for (size_t i = 0; i < fn->await_list.length; i += 1) {
48144814 IrInstGenAwait *await = fn->await_list.at(i);
4815 if (await->is_noasync) continue;
4815 if (await->is_nosuspend) continue;
48164816 switch (analyze_callee_async(g, fn, await->target_fn, await->base.base.source_node, must_not_be_async,
48174817 CallModifierNone))
48184818 {
......@@ -6239,7 +6239,7 @@ static void mark_suspension_point(Scope *scope) {
62396239 case ScopeIdDecls:
62406240 case ScopeIdFnDef:
62416241 case ScopeIdCompTime:
6242 case ScopeIdNoAsync:
6242 case ScopeIdNoSuspend:
62436243 case ScopeIdCImport:
62446244 case ScopeIdSuspend:
62456245 case ScopeIdTypeOf:
......@@ -6472,7 +6472,7 @@ static Error resolve_async_frame(CodeGen *g, ZigType *frame_type) {
64726472 // The funtion call result of foo() must be spilled.
64736473 for (size_t i = 0; i < fn->await_list.length; i += 1) {
64746474 IrInstGenAwait *await = fn->await_list.at(i);
6475 if (await->is_noasync) {
6475 if (await->is_nosuspend) {
64766476 continue;
64776477 }
64786478 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);
125125ScopeSuspend *create_suspend_scope(CodeGen *g, AstNode *node, Scope *parent);
126126ScopeFnDef *create_fndef_scope(CodeGen *g, AstNode *node, Scope *parent, ZigFn *fn_entry);
127127Scope *create_comptime_scope(CodeGen *g, AstNode *node, Scope *parent);
128Scope *create_noasync_scope(CodeGen *g, AstNode *node, Scope *parent);
128Scope *create_nosuspend_scope(CodeGen *g, AstNode *node, Scope *parent);
129129Scope *create_runtime_scope(CodeGen *g, AstNode *node, Scope *parent, IrInstSrc *is_comptime);
130130Scope *create_typeof_scope(CodeGen *g, AstNode *node, Scope *parent);
131131ScopeExpr *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) {
220220 return "SwitchRange";
221221 case NodeTypeCompTime:
222222 return "CompTime";
223 case NodeTypeNoAsync:
224 return "NoAsync";
223 case NodeTypeNoSuspend:
224 return "NoSuspend";
225225 case NodeTypeBreak:
226226 return "Break";
227227 case NodeTypeContinue:
......@@ -709,8 +709,8 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) {
709709 switch (node->data.fn_call_expr.modifier) {
710710 case CallModifierNone:
711711 break;
712 case CallModifierNoAsync:
713 fprintf(ar->f, "noasync ");
712 case CallModifierNoSuspend:
713 fprintf(ar->f, "nosuspend ");
714714 break;
715715 case CallModifierAsync:
716716 fprintf(ar->f, "async ");
......@@ -1093,10 +1093,10 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) {
10931093 render_node_grouped(ar, node->data.comptime_expr.expr);
10941094 break;
10951095 }
1096 case NodeTypeNoAsync:
1096 case NodeTypeNoSuspend:
10971097 {
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);
11001100 break;
11011101 }
11021102 case NodeTypeForExpr:
src/codegen.cpp+15-15
......@@ -685,7 +685,7 @@ static ZigLLVMDIScope *get_di_scope(CodeGen *g, Scope *scope) {
685685 case ScopeIdLoop:
686686 case ScopeIdSuspend:
687687 case ScopeIdCompTime:
688 case ScopeIdNoAsync:
688 case ScopeIdNoSuspend:
689689 case ScopeIdRuntime:
690690 case ScopeIdTypeOf:
691691 case ScopeIdExpr:
......@@ -966,8 +966,8 @@ static Buf *panic_msg_buf(PanicMsgId msg_id) {
966966 return buf_create_from_str("frame too small");
967967 case PanicMsgIdResumedFnPendingAwait:
968968 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");
971971 case PanicMsgIdResumeNotSuspendedFn:
972972 return buf_create_from_str("resumed a non-suspended function");
973973 case PanicMsgIdBadSentinel:
......@@ -4061,7 +4061,7 @@ static void render_async_var_decls(CodeGen *g, Scope *scope) {
40614061 case ScopeIdLoop:
40624062 case ScopeIdSuspend:
40634063 case ScopeIdCompTime:
4064 case ScopeIdNoAsync:
4064 case ScopeIdNoSuspend:
40654065 case ScopeIdRuntime:
40664066 case ScopeIdTypeOf:
40674067 case ScopeIdExpr:
......@@ -4212,9 +4212,9 @@ static LLVMValueRef ir_render_call(CodeGen *g, IrExecutableGen *executable, IrIn
42124212 // even if prefix_arg_err_ret_stack is true, let the async function do its own
42134213 // initialization.
42144214 } else {
4215 if (instruction->modifier == CallModifierNoAsync && !fn_is_async(g->cur_fn)) {
4215 if (instruction->modifier == CallModifierNoSuspend && !fn_is_async(g->cur_fn)) {
42164216 // 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
42184218 // never suspend.
42194219 awaiter_init_val = zero;
42204220 } else {
......@@ -4325,7 +4325,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, IrExecutableGen *executable, IrIn
43254325 case CallModifierCompileTime:
43264326 zig_unreachable();
43274327 case CallModifierNone:
4328 case CallModifierNoAsync:
4328 case CallModifierNoSuspend:
43294329 case CallModifierAsync:
43304330 call_attr = ZigLLVM_CallAttrAuto;
43314331 break;
......@@ -4401,7 +4401,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, IrExecutableGen *executable, IrIn
44014401 get_llvm_type(g, instruction->base.value->type), "");
44024402 }
44034403 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)) {
44054405 gen_resume(g, fn_val, frame_result_loc, ResumeIdCall);
44064406
44074407 if (ir_want_runtime_safety(g, &instruction->base)) {
......@@ -4412,13 +4412,13 @@ static LLVMValueRef ir_render_call(CodeGen *g, IrExecutableGen *executable, IrIn
44124412 all_ones, LLVMAtomicOrderingRelease);
44134413 LLVMValueRef ok_val = LLVMBuildICmp(g->builder, LLVMIntEQ, prev_val, all_ones, "");
44144414
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");
44174417 LLVMBuildCondBr(g->builder, ok_val, ok_block, bad_block);
44184418
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.
44204420 LLVMPositionBuilderAtEnd(g->builder, bad_block);
4421 gen_safety_crash(g, PanicMsgIdBadNoAsyncCall);
4421 gen_safety_crash(g, PanicMsgIdBadNoSuspendCall);
44224422
44234423 LLVMPositionBuilderAtEnd(g->builder, ok_block);
44244424 }
......@@ -6391,7 +6391,7 @@ static LLVMValueRef ir_render_await(CodeGen *g, IrExecutableGen *executable, IrI
63916391 LLVMValueRef result_loc = (instruction->result_loc == nullptr) ?
63926392 nullptr : ir_llvm_value(g, instruction->result_loc);
63936393
6394 if (instruction->is_noasync ||
6394 if (instruction->is_nosuspend ||
63956395 (instruction->target_fn != nullptr && !fn_is_async(instruction->target_fn)))
63966396 {
63976397 return gen_await_early_return(g, &instruction->base, target_frame_ptr, result_type,
......@@ -7918,7 +7918,7 @@ static void do_code_gen(CodeGen *g) {
79187918 }
79197919
79207920 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
79227922 ZigType *largest_call_frame_type = nullptr;
79237923 IrInstGen *all_calls_alloca = ir_create_alloca(g, &fn_table_entry->fndef_scope->base,
79247924 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) {
79287928 continue;
79297929 if (!fn_is_async(call->fn_entry))
79307930 continue;
7931 if (call->modifier != CallModifierNoAsync)
7931 if (call->modifier != CallModifierNoSuspend)
79327932 continue;
79337933 if (call->frame_result_loc != nullptr)
79347934 continue;
src/ir.cpp+30-30
......@@ -4846,12 +4846,12 @@ static IrInstGen *ir_build_suspend_finish_gen(IrAnalyze *ira, IrInst *source_ins
48464846}
48474847
48484848static 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)
48504850{
48514851 IrInstSrcAwait *instruction = ir_build_instruction<IrInstSrcAwait>(irb, scope, source_node);
48524852 instruction->frame = frame;
48534853 instruction->result_loc = result_loc;
4854 instruction->is_noasync = is_noasync;
4854 instruction->is_nosuspend = is_nosuspend;
48554855
48564856 ir_ref_instruction(frame, irb->current_basic_block);
48574857
......@@ -4859,14 +4859,14 @@ static IrInstSrc *ir_build_await_src(IrBuilderSrc *irb, Scope *scope, AstNode *s
48594859}
48604860
48614861static 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)
48634863{
48644864 IrInstGenAwait *instruction = ir_build_inst_gen<IrInstGenAwait>(&ira->new_irb,
48654865 source_instruction->scope, source_instruction->source_node);
48664866 instruction->base.value->type = result_type;
48674867 instruction->frame = frame;
48684868 instruction->result_loc = result_loc;
4869 instruction->is_noasync = is_noasync;
4869 instruction->is_nosuspend = is_nosuspend;
48704870
48714871 ir_ref_inst_gen(frame);
48724872 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_
49824982 case ScopeIdLoop:
49834983 case ScopeIdSuspend:
49844984 case ScopeIdCompTime:
4985 case ScopeIdNoAsync:
4985 case ScopeIdNoSuspend:
49864986 case ScopeIdRuntime:
49874987 case ScopeIdTypeOf:
49884988 case ScopeIdExpr:
......@@ -5072,7 +5072,7 @@ static bool ir_gen_defers_for_block(IrBuilderSrc *irb, Scope *inner_scope, Scope
50725072 case ScopeIdLoop:
50735073 case ScopeIdSuspend:
50745074 case ScopeIdCompTime:
5075 case ScopeIdNoAsync:
5075 case ScopeIdNoSuspend:
50765076 case ScopeIdRuntime:
50775077 case ScopeIdTypeOf:
50785078 case ScopeIdExpr:
......@@ -7335,10 +7335,10 @@ static IrInstSrc *ir_gen_builtin_fn_call(IrBuilderSrc *irb, Scope *scope, AstNod
73357335 zig_unreachable();
73367336}
73377337
7338static ScopeNoAsync *get_scope_noasync(Scope *scope) {
7338static ScopeNoSuspend *get_scope_nosuspend(Scope *scope) {
73397339 while (scope) {
7340 if (scope->id == ScopeIdNoAsync)
7341 return (ScopeNoAsync *)scope;
7340 if (scope->id == ScopeIdNoSuspend)
7341 return (ScopeNoSuspend *)scope;
73427342 if (scope->id == ScopeIdFnDef)
73437343 return nullptr;
73447344
......@@ -7355,15 +7355,15 @@ static IrInstSrc *ir_gen_fn_call(IrBuilderSrc *irb, Scope *scope, AstNode *node,
73557355 if (node->data.fn_call_expr.modifier == CallModifierBuiltin)
73567356 return ir_gen_builtin_fn_call(irb, scope, node, lval, result_loc);
73577357
7358 bool is_noasync = get_scope_noasync(scope) != nullptr;
7358 bool is_nosuspend = get_scope_nosuspend(scope) != nullptr;
73597359 CallModifier modifier = node->data.fn_call_expr.modifier;
7360 if (is_noasync) {
7360 if (is_nosuspend) {
73617361 if (modifier == CallModifierAsync) {
73627362 add_node_error(irb->codegen, node,
7363 buf_sprintf("async call in noasync scope"));
7363 buf_sprintf("async call in nosuspend scope"));
73647364 return irb->codegen->invalid_inst_src;
73657365 }
7366 modifier = CallModifierNoAsync;
7366 modifier = CallModifierNoSuspend;
73677367 }
73687368
73697369 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
92229222 return ir_gen_node_extra(irb, node->data.comptime_expr.expr, child_scope, lval, nullptr);
92239223}
92249224
9225static IrInstSrc *ir_gen_noasync(IrBuilderSrc *irb, Scope *parent_scope, AstNode *node, LVal lval) {
9226 assert(node->type == NodeTypeNoAsync);
9225static IrInstSrc *ir_gen_nosuspend(IrBuilderSrc *irb, Scope *parent_scope, AstNode *node, LVal lval) {
9226 assert(node->type == NodeTypeNoSuspend);
92279227
9228 Scope *child_scope = create_noasync_scope(irb->codegen, node, parent_scope);
9228 Scope *child_scope = create_nosuspend_scope(irb->codegen, node, parent_scope);
92299229 // purposefully pass null for result_loc and let EndExpr handle it
92309230 return ir_gen_node_extra(irb, node->data.comptime_expr.expr, child_scope, lval, nullptr);
92319231}
......@@ -9813,8 +9813,8 @@ static IrInstSrc *ir_gen_fn_proto(IrBuilderSrc *irb, Scope *parent_scope, AstNod
98139813
98149814static IrInstSrc *ir_gen_resume(IrBuilderSrc *irb, Scope *scope, AstNode *node) {
98159815 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"));
98189818 return irb->codegen->invalid_inst_src;
98199819 }
98209820
......@@ -9830,7 +9830,7 @@ static IrInstSrc *ir_gen_await_expr(IrBuilderSrc *irb, Scope *scope, AstNode *no
98309830{
98319831 assert(node->type == NodeTypeAwaitExpr);
98329832
9833 bool is_noasync = get_scope_noasync(scope) != nullptr;
9833 bool is_nosuspend = get_scope_nosuspend(scope) != nullptr;
98349834
98359835 AstNode *expr_node = node->data.await_expr.expr;
98369836 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
98649864 if (target_inst == irb->codegen->invalid_inst_src)
98659865 return irb->codegen->invalid_inst_src;
98669866
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);
98689868 return ir_lval_wrap(irb, scope, await_inst, lval, result_loc);
98699869}
98709870
......@@ -9876,8 +9876,8 @@ static IrInstSrc *ir_gen_suspend(IrBuilderSrc *irb, Scope *parent_scope, AstNode
98769876 add_node_error(irb->codegen, node, buf_sprintf("suspend outside function definition"));
98779877 return irb->codegen->invalid_inst_src;
98789878 }
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"));
98819881 return irb->codegen->invalid_inst_src;
98829882 }
98839883
......@@ -10017,8 +10017,8 @@ static IrInstSrc *ir_gen_node_raw(IrBuilderSrc *irb, AstNode *node, Scope *scope
1001710017 return ir_gen_switch_expr(irb, scope, node, lval, result_loc);
1001810018 case NodeTypeCompTime:
1001910019 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);
1002210022 case NodeTypeErrorType:
1002310023 return ir_lval_wrap(irb, scope, ir_gen_error_type(irb, scope, node), lval, result_loc);
1002410024 case NodeTypeBreak:
......@@ -10105,7 +10105,7 @@ static IrInstSrc *ir_gen_node_extra(IrBuilderSrc *irb, AstNode *node, Scope *sco
1010510105 case NodeTypeIfOptional:
1010610106 case NodeTypeSwitchExpr:
1010710107 case NodeTypeCompTime:
10108 case NodeTypeNoAsync:
10108 case NodeTypeNoSuspend:
1010910109 case NodeTypeErrorType:
1011010110 case NodeTypeBreak:
1011110111 case NodeTypeContinue:
......@@ -20030,7 +20030,7 @@ static IrInstGen *ir_analyze_fn_call(IrAnalyze *ira, IrInst* source_instr,
2003020030
2003120031 if (impl_fn_type_id->cc == CallingConventionAsync &&
2003220032 parent_fn_entry->inferred_async_node == nullptr &&
20033 modifier != CallModifierNoAsync)
20033 modifier != CallModifierNoSuspend)
2003420034 {
2003520035 parent_fn_entry->inferred_async_node = fn_ref->base.source_node;
2003620036 parent_fn_entry->inferred_async_fn = impl_fn;
......@@ -20128,7 +20128,7 @@ static IrInstGen *ir_analyze_fn_call(IrAnalyze *ira, IrInst* source_instr,
2012820128
2012920129 if (fn_type_id->cc == CallingConventionAsync &&
2013020130 parent_fn_entry->inferred_async_node == nullptr &&
20131 modifier != CallModifierNoAsync)
20131 modifier != CallModifierNoSuspend)
2013220132 {
2013320133 parent_fn_entry->inferred_async_node = fn_ref->base.source_node;
2013420134 parent_fn_entry->inferred_async_fn = fn_entry;
......@@ -20243,7 +20243,7 @@ static IrInstGen *ir_analyze_call_extra(IrAnalyze *ira, IrInst* source_instr,
2024320243 case CallModifierNone:
2024420244 case CallModifierAlwaysInline:
2024520245 case CallModifierAlwaysTail:
20246 case CallModifierNoAsync:
20246 case CallModifierNoSuspend:
2024720247 modifier = CallModifierCompileTime;
2024820248 break;
2024920249 case CallModifierNeverInline:
......@@ -30287,7 +30287,7 @@ static IrInstGen *ir_analyze_instruction_await(IrAnalyze *ira, IrInstSrcAwait *i
3028730287 ir_assert(fn_entry != nullptr, &instruction->base.base);
3028830288
3028930289 // If it's not @Frame(func) then it's definitely a suspend point
30290 if (target_fn == nullptr && !instruction->is_noasync) {
30290 if (target_fn == nullptr && !instruction->is_nosuspend) {
3029130291 if (fn_entry->inferred_async_node == nullptr) {
3029230292 fn_entry->inferred_async_node = instruction->base.base.source_node;
3029330293 }
......@@ -30311,7 +30311,7 @@ static IrInstGen *ir_analyze_instruction_await(IrAnalyze *ira, IrInstSrcAwait *i
3031130311 }
3031230312
3031330313 IrInstGenAwait *result = ir_build_await_gen(ira, &instruction->base.base, frame, result_type, result_loc,
30314 instruction->is_noasync);
30314 instruction->is_nosuspend);
3031530315 result->target_fn = target_fn;
3031630316 fn_entry->await_list.append(result);
3031730317 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)
861861 switch (call_instruction->modifier) {
862862 case CallModifierNone:
863863 break;
864 case CallModifierNoAsync:
865 fprintf(irp->f, "noasync ");
864 case CallModifierNoSuspend:
865 fprintf(irp->f, "nosuspend ");
866866 break;
867867 case CallModifierAsync:
868868 fprintf(irp->f, "async ");
......@@ -906,8 +906,8 @@ static void ir_print_call_gen(IrPrintGen *irp, IrInstGenCall *call_instruction)
906906 switch (call_instruction->modifier) {
907907 case CallModifierNone:
908908 break;
909 case CallModifierNoAsync:
910 fprintf(irp->f, "noasync ");
909 case CallModifierNoSuspend:
910 fprintf(irp->f, "nosuspend ");
911911 break;
912912 case CallModifierAsync:
913913 fprintf(irp->f, "async ");
src/parser.cpp+16-16
......@@ -913,7 +913,7 @@ static AstNode *ast_parse_container_field(ParseContext *pc) {
913913// Statement
914914// <- KEYWORD_comptime? VarDecl
915915// / KEYWORD_comptime BlockExprStatement
916// / KEYWORD_noasync BlockExprStatement
916// / KEYWORD_nosuspend BlockExprStatement
917917// / KEYWORD_suspend (SEMICOLON / BlockExprStatement)
918918// / KEYWORD_defer BlockExprStatement
919919// / KEYWORD_errdefer Payload? BlockExprStatement
......@@ -937,11 +937,11 @@ static AstNode *ast_parse_statement(ParseContext *pc) {
937937 return res;
938938 }
939939
940 Token *noasync = eat_token_if(pc, TokenIdKeywordNoAsync);
941 if (noasync != nullptr) {
940 Token *nosuspend = eat_token_if(pc, TokenIdKeywordNoSuspend);
941 if (nosuspend != nullptr) {
942942 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;
945945 return res;
946946 }
947947
......@@ -1289,7 +1289,7 @@ static AstNode *ast_parse_prefix_expr(ParseContext *pc) {
12891289// / IfExpr
12901290// / KEYWORD_break BreakLabel? Expr?
12911291// / KEYWORD_comptime Expr
1292// / KEYWORD_noasync Expr
1292// / KEYWORD_nosuspend Expr
12931293// / KEYWORD_continue BreakLabel?
12941294// / KEYWORD_resume Expr
12951295// / KEYWORD_return Expr?
......@@ -1324,11 +1324,11 @@ static AstNode *ast_parse_primary_expr(ParseContext *pc) {
13241324 return res;
13251325 }
13261326
1327 Token *noasync = eat_token_if(pc, TokenIdKeywordNoAsync);
1328 if (noasync != nullptr) {
1327 Token *nosuspend = eat_token_if(pc, TokenIdKeywordNoSuspend);
1328 if (nosuspend != nullptr) {
13291329 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;
13321332 return res;
13331333 }
13341334
......@@ -1640,7 +1640,7 @@ static AstNode *ast_parse_suffix_expr(ParseContext *pc) {
16401640// / IfTypeExpr
16411641// / INTEGER
16421642// / KEYWORD_comptime TypeExpr
1643// / KEYWORD_noasync TypeExpr
1643// / KEYWORD_nosuspend TypeExpr
16441644// / KEYWORD_error DOT IDENTIFIER
16451645// / KEYWORD_false
16461646// / KEYWORD_null
......@@ -1742,11 +1742,11 @@ static AstNode *ast_parse_primary_type_expr(ParseContext *pc) {
17421742 return res;
17431743 }
17441744
1745 Token *noasync = eat_token_if(pc, TokenIdKeywordNoAsync);
1746 if (noasync != nullptr) {
1745 Token *nosuspend = eat_token_if(pc, TokenIdKeywordNoSuspend);
1746 if (nosuspend != nullptr) {
17471747 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;
17501750 return res;
17511751 }
17521752
......@@ -3189,7 +3189,7 @@ void ast_visit_node_children(AstNode *node, void (*visit)(AstNode **, void *cont
31893189 case NodeTypeCompTime:
31903190 visit_field(&node->data.comptime_expr.expr, visit, context);
31913191 break;
3192 case NodeTypeNoAsync:
3192 case NodeTypeNoSuspend:
31933193 visit_field(&node->data.comptime_expr.expr, visit, context);
31943194 break;
31953195 case NodeTypeBreak:
src/tokenizer.cpp+2-2
......@@ -128,8 +128,8 @@ static const struct ZigKeyword zig_keywords[] = {
128128 {"if", TokenIdKeywordIf},
129129 {"inline", TokenIdKeywordInline},
130130 {"noalias", TokenIdKeywordNoAlias},
131 {"noasync", TokenIdKeywordNoAsync},
132131 {"noinline", TokenIdKeywordNoInline},
132 {"nosuspend", TokenIdKeywordNoSuspend},
133133 {"null", TokenIdKeywordNull},
134134 {"or", TokenIdKeywordOr},
135135 {"orelse", TokenIdKeywordOrElse},
......@@ -1589,8 +1589,8 @@ const char * token_name(TokenId id) {
15891589 case TokenIdKeywordIf: return "if";
15901590 case TokenIdKeywordInline: return "inline";
15911591 case TokenIdKeywordNoAlias: return "noalias";
1592 case TokenIdKeywordNoAsync: return "noasync";
15931592 case TokenIdKeywordNoInline: return "noinline";
1593 case TokenIdKeywordNoSuspend: return "nosuspend";
15941594 case TokenIdKeywordNull: return "null";
15951595 case TokenIdKeywordOr: return "or";
15961596 case TokenIdKeywordOrElse: return "orelse";
src/tokenizer.hpp+1-1
......@@ -78,7 +78,7 @@ enum TokenId {
7878 TokenIdKeywordNoInline,
7979 TokenIdKeywordLinkSection,
8080 TokenIdKeywordNoAlias,
81 TokenIdKeywordNoAsync,
81 TokenIdKeywordNoSuspend,
8282 TokenIdKeywordNull,
8383 TokenIdKeywordOr,
8484 TokenIdKeywordOrElse,
test/compile_errors.zig+5-5
......@@ -266,9 +266,9 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {
266266 "tmp.zig:17:17: error: RHS of shift is too large for LHS type",
267267 });
268268
269 cases.addTest("combination of noasync and async",
269 cases.addTest("combination of nosuspend and async",
270270 \\export fn entry() void {
271 \\ noasync {
271 \\ nosuspend {
272272 \\ const bar = async foo();
273273 \\ suspend;
274274 \\ resume bar;
......@@ -276,9 +276,9 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {
276276 \\}
277277 \\fn foo() void {}
278278 , &[_][]const u8{
279 "tmp.zig:3:21: error: async call in noasync scope",
280 "tmp.zig:4:9: error: suspend in noasync scope",
281 "tmp.zig:5:9: error: resume in noasync scope",
279 "tmp.zig:3:21: error: async call in nosuspend scope",
280 "tmp.zig:4:9: error: suspend in nosuspend scope",
281 "tmp.zig:5:9: error: resume in nosuspend scope",
282282 });
283283
284284 cases.add("atomicrmw with bool op not .Xchg",
test/runtime_safety.zig+2-2
......@@ -234,12 +234,12 @@ pub fn addCases(cases: *tests.CompareOutputContext) void {
234234 \\}
235235 );
236236
237 cases.addRuntimeSafety("noasync function call, callee suspends",
237 cases.addRuntimeSafety("nosuspend function call, callee suspends",
238238 \\pub fn panic(message: []const u8, stack_trace: ?*@import("builtin").StackTrace) noreturn {
239239 \\ @import("std").os.exit(126);
240240 \\}
241241 \\pub fn main() void {
242 \\ _ = noasync add(101, 100);
242 \\ _ = nosuspend add(101, 100);
243243 \\}
244244 \\fn add(a: i32, b: i32) i32 {
245245 \\ if (a > 100) {
test/stage1/behavior/async_fn.zig+8-8
......@@ -1090,10 +1090,10 @@ test "recursive call of await @asyncCall with struct return type" {
10901090 expect(res.z == 3);
10911091}
10921092
1093test "noasync function call" {
1093test "nosuspend function call" {
10941094 const S = struct {
10951095 fn doTheTest() void {
1096 const result = noasync add(50, 100);
1096 const result = nosuspend add(50, 100);
10971097 expect(result == 150);
10981098 }
10991099 fn add(a: i32, b: i32) i32 {
......@@ -1511,13 +1511,13 @@ test "take address of temporary async frame" {
15111511 S.doTheTest();
15121512}
15131513
1514test "noasync await" {
1514test "nosuspend await" {
15151515 const S = struct {
15161516 var finished = false;
15171517
15181518 fn doTheTest() void {
15191519 var frame = async foo(false);
1520 expect(noasync await frame == 42);
1520 expect(nosuspend await frame == 42);
15211521 finished = true;
15221522 }
15231523
......@@ -1532,7 +1532,7 @@ test "noasync await" {
15321532 expect(S.finished);
15331533}
15341534
1535test "noasync on function calls" {
1535test "nosuspend on function calls" {
15361536 const S0 = struct {
15371537 b: i32 = 42,
15381538 };
......@@ -1544,8 +1544,8 @@ test "noasync on function calls" {
15441544 return S0{};
15451545 }
15461546 };
1547 expectEqual(@as(i32, 42), noasync S1.c().b);
1548 expectEqual(@as(i32, 42), (try noasync S1.d()).b);
1547 expectEqual(@as(i32, 42), nosuspend S1.c().b);
1548 expectEqual(@as(i32, 42), (try nosuspend S1.d()).b);
15491549}
15501550
15511551test "avoid forcing frame alignment resolution implicit cast to *c_void" {
......@@ -1561,5 +1561,5 @@ test "avoid forcing frame alignment resolution implicit cast to *c_void" {
15611561 };
15621562 var frame = async S.foo();
15631563 resume @ptrCast(anyframe->bool, @alignCast(@alignOf(@Frame(S.foo)), S.x));
1564 expect(noasync await frame);
1564 expect(nosuspend await frame);
15651565}
test/stage1/behavior/cast.zig+1-1
......@@ -823,7 +823,7 @@ test "peer type resolve array pointer and unknown pointer" {
823823
824824 comptime expect(@TypeOf(&array, const_ptr) == [*]const u8);
825825 comptime expect(@TypeOf(const_ptr, &array) == [*]const u8);
826
826
827827 comptime expect(@TypeOf(&const_array, const_ptr) == [*]const u8);
828828 comptime expect(@TypeOf(const_ptr, &const_array) == [*]const u8);
829829}
test/standalone/main_return_error/error_u8.zig+1-3
......@@ -1,6 +1,4 @@
1const Err = error {
2 Foo
3};
1const Err = error{Foo};
42
53pub fn main() !u8 {
64 return Err.Foo;
test/standalone/main_return_error/error_u8_non_zero.zig+5-2
......@@ -1,6 +1,9 @@
1const Err = error { Foo };
1const Err = error{Foo};
22
3fn foo() u8 { var x = @intCast(u8, 9); return x; }
3fn foo() u8 {
4 var x = @intCast(u8, 9);
5 return x;
6}
47
58pub fn main() !u8 {
69 if (foo() == 7) return Err.Foo;