authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-08-16 10:44:42-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-08-16 10:44:51-04:00
log1254a453b91623849dcb0a655b1212c9a179d29a
treed592ff434b8be7b7285479b9a49bc2f1c7211ff7
parent49c88e23af6fe1dc895544f91231cc3b53110c8e
signaturelock-open Commit is signed but in an unrecognized format.

add compile error for @Frame() of generic function

See #3063

3 files changed, 21 insertions(+), 0 deletions(-)

src/analyze.cpp+2
......@@ -5197,6 +5197,8 @@ static Error resolve_async_frame(CodeGen *g, ZigType *frame_type) {
51975197 return ErrorNone;
51985198
51995199 ZigFn *fn = frame_type->data.frame.fn;
5200 assert(!fn->type_entry->data.fn.is_generic);
5201
52005202 switch (fn->anal_state) {
52015203 case FnAnalStateInvalid:
52025204 return ErrorSemanticAnalyzeFail;
src/ir.cpp+6
......@@ -22095,6 +22095,12 @@ static IrInstruction *ir_analyze_instruction_frame_type(IrAnalyze *ira, IrInstru
2209522095 if (fn == nullptr)
2209622096 return ira->codegen->invalid_instruction;
2209722097
22098 if (fn->type_entry->data.fn.is_generic) {
22099 ir_add_error(ira, &instruction->base,
22100 buf_sprintf("@Frame() of generic function"));
22101 return ira->codegen->invalid_instruction;
22102 }
22103
2209822104 ZigType *ty = get_fn_frame_type(ira->codegen, fn);
2209922105 return ir_const_type(ira, &instruction->base, ty);
2210022106}
test/compile_errors.zig+13
......@@ -2,6 +2,18 @@ const tests = @import("tests.zig");
22const builtin = @import("builtin");
33
44pub fn addCases(cases: *tests.CompileErrorContext) void {
5 cases.add(
6 "@Frame() of generic function",
7 \\export fn entry() void {
8 \\ var frame: @Frame(func) = undefined;
9 \\}
10 \\fn func(comptime T: type) void {
11 \\ var x: T = undefined;
12 \\}
13 ,
14 "tmp.zig:2:16: error: @Frame() of generic function",
15 );
16
517 cases.add(
618 "@frame() causes function to be async",
719 \\export fn entry() void {
......@@ -14,6 +26,7 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {
1426 "tmp.zig:1:1: error: function with calling convention 'ccc' cannot be async",
1527 "tmp.zig:5:9: note: @frame() causes function to be async",
1628 );
29
1730 cases.add(
1831 "invalid suspend in exported function",
1932 \\export fn entry() void {