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...@@ -1585,10 +1585,6 @@ static TypeTableEntry *analyze_fn_type(CodeGen *g, AstNode *proto_node, Scope *c
1585 case TypeTableEntryIdBlock:1585 case TypeTableEntryIdBlock:
1586 case TypeTableEntryIdBoundFn:1586 case TypeTableEntryIdBoundFn:
1587 case TypeTableEntryIdMetaType:1587 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;
1592 case TypeTableEntryIdVoid:1588 case TypeTableEntryIdVoid:
1593 case TypeTableEntryIdBool:1589 case TypeTableEntryIdBool:
1594 case TypeTableEntryIdInt:1590 case TypeTableEntryIdInt:
...@@ -1603,6 +1599,13 @@ static TypeTableEntry *analyze_fn_type(CodeGen *g, AstNode *proto_node, Scope *c...@@ -1603,6 +1599,13 @@ static TypeTableEntry *analyze_fn_type(CodeGen *g, AstNode *proto_node, Scope *c
1603 case TypeTableEntryIdUnion:1599 case TypeTableEntryIdUnion:
1604 case TypeTableEntryIdFn:1600 case TypeTableEntryIdFn:
1605 case TypeTableEntryIdPromise:1601 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 }
1606 break;1609 break;
1607 }1610 }
1608 FnTypeParamInfo *param_info = &fn_type_id.param_info[fn_type_id.next_param_index];1611 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) {...@@ -5019,9 +5022,10 @@ bool type_requires_comptime(TypeTableEntry *type_entry) {
5019 } else {5022 } else {
5020 return type_requires_comptime(type_entry->data.pointer.child_type);5023 return type_requires_comptime(type_entry->data.pointer.child_type);
5021 }5024 }
5025 case TypeTableEntryIdFn:
5026 return type_entry->data.fn.is_generic;
5022 case TypeTableEntryIdEnum:5027 case TypeTableEntryIdEnum:
5023 case TypeTableEntryIdErrorSet:5028 case TypeTableEntryIdErrorSet:
5024 case TypeTableEntryIdFn:
5025 case TypeTableEntryIdBool:5029 case TypeTableEntryIdBool:
5026 case TypeTableEntryIdInt:5030 case TypeTableEntryIdInt:
5027 case TypeTableEntryIdFloat:5031 case TypeTableEntryIdFloat:
test/compile_errors.zig+11
...@@ -1,6 +1,17 @@...@@ -1,6 +1,17 @@
1const tests = @import("tests.zig");1const tests = @import("tests.zig");
22
3pub fn addCases(cases: *tests.CompileErrorContext) void {3pub 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
4 cases.add(15 cases.add(
5 "optional pointer to void in extern struct",16 "optional pointer to void in extern struct",
6 \\comptime {17 \\comptime {