1 //: Once all code is loaded, save operation ids of instructions and check that
 2 //: nothing's undefined.
 3 
 4 :(before "End Instruction Modifying Transforms")
 5 Transform.push_back(update_instruction_operations);  // idempotent
 6 
 7 :(code)
 8 void update_instruction_operations(const recipe_ordinal r) {
 9   trace(9991, "transform") << "--- compute instruction operations for recipe " << get(Recipe, r).name << end();
10   recipe& caller = get(Recipe, r);
11 //?   cerr << "--- compute instruction operations for recipe " << caller.name << '\n';
12   for (int index = 0;  index < SIZE(caller.steps);  ++index) {
13   ¦ instruction& inst = caller.steps.at(index);
14   ¦ if (inst.is_label) continue;
15   ¦ if (!contains_key(Recipe_ordinal, inst.name)) {
16   ¦ ¦ raise << maybe(caller.name) << "instruction '" << inst.name << "' has no recipe\n" << end();
17   ¦ ¦ continue;
18   ¦ }
19   ¦ inst.operation = get(Recipe_ordinal, inst.name);
20   ¦ // End Instruction Operation Checks
21   }
22 }
23 
24 // hook to suppress inserting recipe name into errors
25 string maybe(string s) {
26   return s + ": ";
27 }
28 
29 :(scenarios transform)
30 :(scenario missing_arrow)
31 % Hide_errors = true;
32 def main [
33   1:number , copy 0  # typo: ',' instead of '<-'
34 ]
35 +error: main: instruction '1:number' has no recipe