Skip to content

Commit

Permalink
fix incorrect setEvalBranchQuota compile error
Browse files Browse the repository at this point in the history
closes #688
  • Loading branch information
andrewrk committed Mar 12, 2018
1 parent c18059a commit 49c3922
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 1 deletion.
1 change: 1 addition & 0 deletions src/all_types.hpp
Expand Up @@ -49,6 +49,7 @@ struct IrExecutable {
size_t backward_branch_quota;
bool invalid;
bool is_inline;
bool is_generic_instantiation;
FnTableEntry *fn_entry;
Buf *c_import_buf;
AstNode *source_node;
Expand Down
3 changes: 2 additions & 1 deletion src/ir.cpp
Expand Up @@ -12127,6 +12127,7 @@ static TypeTableEntry *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCall *cal
impl_fn->ir_executable.parent_exec = ira->new_irb.exec;
impl_fn->analyzed_executable.source_node = call_instruction->base.source_node;
impl_fn->analyzed_executable.parent_exec = ira->new_irb.exec;
impl_fn->analyzed_executable.is_generic_instantiation = true;

ira->codegen->fn_defs.append(impl_fn);
}
Expand Down Expand Up @@ -15234,7 +15235,7 @@ static TypeTableEntry *ir_analyze_instruction_type_id(IrAnalyze *ira,
static TypeTableEntry *ir_analyze_instruction_set_eval_branch_quota(IrAnalyze *ira,
IrInstructionSetEvalBranchQuota *instruction)
{
if (ira->new_irb.exec->parent_exec != nullptr) {
if (ira->new_irb.exec->parent_exec != nullptr && !ira->new_irb.exec->is_generic_instantiation) {
ir_add_error(ira, &instruction->base,
buf_sprintf("@setEvalBranchQuota must be called from the top of the comptime stack"));
return ira->codegen->builtin_types.entry_invalid;
Expand Down
21 changes: 21 additions & 0 deletions test/cases/eval.zig
Expand Up @@ -448,3 +448,24 @@ test "comptime function with mutable pointer is not memoized" {
fn increment(value: &i32) void {
*value += 1;
}

fn generateTable(comptime T: type) [1010]T {
var res : [1010]T = undefined;
var i : usize = 0;
while (i < 1010) : (i += 1) {
res[i] = T(i);
}
return res;
}

fn doesAlotT(comptime T: type, value: usize) T {
@setEvalBranchQuota(5000);
const table = comptime blk: {
break :blk generateTable(T);
};
return table[value];
}

test "@setEvalBranchQuota at same scope as generic function call" {
assert(doesAlotT(u32, 2) == 2);
}

0 comments on commit 49c3922

Please sign in to comment.