authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-07-24 10:13:40-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-07-24 10:21:33-04:00
log29e19ace362e7a1910b9f105257f2bce2491e32b
treeedfd46e86405f4ba646b2c1d46566ad4dc9a92e4
parent74c80d2c7fd370e6c1c588b06a3875effed9f388

fix logic for determining whether param requires comptime

closes #778 closes #1213

2 files changed, 20 insertions(+), 5 deletions(-)

src/analyze.cpp+9-5
......@@ -1585,10 +1585,6 @@ static TypeTableEntry *analyze_fn_type(CodeGen *g, AstNode *proto_node, Scope *c
15851585 case TypeTableEntryIdBlock:
15861586 case TypeTableEntryIdBoundFn:
15871587 case TypeTableEntryIdMetaType:
1588 add_node_error(g, param_node->data.param_decl.type,
1589 buf_sprintf("parameter of type '%s' must be declared comptime",
1590 buf_ptr(&type_entry->name)));
1591 return g->builtin_types.entry_invalid;
15921588 case TypeTableEntryIdVoid:
15931589 case TypeTableEntryIdBool:
15941590 case TypeTableEntryIdInt:
......@@ -1603,6 +1599,13 @@ static TypeTableEntry *analyze_fn_type(CodeGen *g, AstNode *proto_node, Scope *c
16031599 case TypeTableEntryIdUnion:
16041600 case TypeTableEntryIdFn:
16051601 case TypeTableEntryIdPromise:
1602 type_ensure_zero_bits_known(g, type_entry);
1603 if (type_requires_comptime(type_entry)) {
1604 add_node_error(g, param_node->data.param_decl.type,
1605 buf_sprintf("parameter of type '%s' must be declared comptime",
1606 buf_ptr(&type_entry->name)));
1607 return g->builtin_types.entry_invalid;
1608 }
16061609 break;
16071610 }
16081611 FnTypeParamInfo *param_info = &fn_type_id.param_info[fn_type_id.next_param_index];
......@@ -5019,9 +5022,10 @@ bool type_requires_comptime(TypeTableEntry *type_entry) {
50195022 } else {
50205023 return type_requires_comptime(type_entry->data.pointer.child_type);
50215024 }
5025 case TypeTableEntryIdFn:
5026 return type_entry->data.fn.is_generic;
50225027 case TypeTableEntryIdEnum:
50235028 case TypeTableEntryIdErrorSet:
5024 case TypeTableEntryIdFn:
50255029 case TypeTableEntryIdBool:
50265030 case TypeTableEntryIdInt:
50275031 case TypeTableEntryIdFloat:
test/compile_errors.zig+11
......@@ -1,6 +1,17 @@
11const tests = @import("tests.zig");
22
33pub fn addCases(cases: *tests.CompileErrorContext) void {
4 cases.add(
5 "generic fn as parameter without comptime keyword",
6 \\fn f(_: fn (var) void) void {}
7 \\fn g(_: var) void {}
8 \\export fn entry() void {
9 \\ f(g);
10 \\}
11 ,
12 ".tmp_source.zig:1:9: error: parameter of type 'fn(var)var' must be declared comptime",
13 );
14
415 cases.add(
516 "optional pointer to void in extern struct",
617 \\comptime {