From 04a2a2928c795013fc28e9c6ac41edf51162349b Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Mon, 31 Oct 2016 09:16:26 -0700 Subject: 3610 - bugfix in type-checking 'call' instructions Thanks Rebecca Allard for running into this. The test is in layer 13 even though the code that regressed was fixed in layer 71, because the test was working as-is in earlier layers. --- 013update_operation.cc | 7 +++++++ 071recipe.cc | 9 +++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/013update_operation.cc b/013update_operation.cc index 418b3563..10b29714 100644 --- a/013update_operation.cc +++ b/013update_operation.cc @@ -25,3 +25,10 @@ void update_instruction_operations(const recipe_ordinal r) { string maybe(string s) { return s + ": "; } + +:(scenario missing_arrow) +% Hide_errors = true; +def main [ + 1:number , copy 0 # typo: ',' instead of '<-' +] ++error: main: instruction '1:number' has no recipe diff --git a/071recipe.cc b/071recipe.cc index e08f75db..345057d5 100644 --- a/071recipe.cc +++ b/071recipe.cc @@ -160,9 +160,10 @@ void check_indirect_calls_against_header(const recipe_ordinal r) { const recipe& caller = get(Recipe, r); for (int i = 0; i < SIZE(caller.steps); ++i) { const instruction& inst = caller.steps.at(i); - if (inst.ingredients.empty()) continue; // if indirect call, error raised above + if (!is_indirect_call(inst.operation)) continue; + if (inst.ingredients.empty()) continue; // error raised above const reagent& callee = inst.ingredients.at(0); - if (!is_mu_recipe(callee)) continue; // if indirect call, error raised above + if (!is_mu_recipe(callee)) continue; // error raised above const recipe callee_header = is_literal(callee) ? get(Recipe, callee.value) : from_reagent(inst.ingredients.at(0)); if (!callee_header.has_header) continue; if (is_indirect_call_with_ingredients(inst.operation)) { @@ -181,6 +182,10 @@ void check_indirect_calls_against_header(const recipe_ordinal r) { } } +bool is_indirect_call(const recipe_ordinal r) { + return is_indirect_call_with_ingredients(r) || is_indirect_call_with_products(r); +} + bool is_indirect_call_with_ingredients(const recipe_ordinal r) { if (r == CALL) return true; // End is_indirect_call_with_ingredients Special-cases -- cgit 1.4.1-2-gfad0