Commit 49c3922037

Andrew Kelley <superjoe30@gmail.com>
2018-03-12 05:08:52
fix incorrect setEvalBranchQuota compile error
closes #688
1 parent c18059a
Changed files (3)
src/all_types.hpp
@@ -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;
src/ir.cpp
@@ -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);
         }
@@ -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;
test/cases/eval.zig
@@ -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);
+}