From eb4024036d3e8e0c4a8b0dcf09da107421f3fa01 Mon Sep 17 00:00:00 2001 From: David Rubin <87927264+Rexicon226@users.noreply.github.com> Date: Sat, 3 Feb 2024 11:16:27 -0800 Subject: [PATCH] Add error hint when looping over `ErrorUnion` --- src/Sema.zig | 5 +++++ .../cases/compile_errors/for_loop_error_union.zig | 15 +++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 test/cases/compile_errors/for_loop_error_union.zig diff --git a/src/Sema.zig b/src/Sema.zig index 8a30d2bb33..35dc1089b6 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -4221,6 +4221,11 @@ fn zirForLen(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. const msg = try sema.errMsg(block, arg_src, "type '{}' is not indexable and not a range", .{object_ty.fmt(sema.mod)}); errdefer msg.destroy(sema.gpa); try sema.errNote(block, arg_src, msg, "for loop operand must be a range, array, slice, tuple, or vector", .{}); + + if (object_ty.zigTypeTag(mod) == .ErrorUnion) { + try sema.errNote(block, arg_src, msg, "consider using 'try', 'catch', or 'if'", .{}); + } + break :msg msg; }; return sema.failWithOwnedErrorMsg(block, msg); diff --git a/test/cases/compile_errors/for_loop_error_union.zig b/test/cases/compile_errors/for_loop_error_union.zig new file mode 100644 index 0000000000..d7a8d1952e --- /dev/null +++ b/test/cases/compile_errors/for_loop_error_union.zig @@ -0,0 +1,15 @@ +fn b() !u32 { + return 2; +} + +export fn a() void { + for (b()) |_| {} +} + +// error +// backend=stage2 +// target=native +// +// :6:11: error: type '@typeInfo(@typeInfo(@TypeOf(tmp.b)).Fn.return_type.?).ErrorUnion.error_set!u32' is not indexable and not a range +// :6:11: note: for loop operand must be a range, array, slice, tuple, or vector +// :6:11: note: consider using 'try', 'catch', or 'if'