From dc1ffe019a5778e4735e089d7b0c5d5c1587cee3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien.villemot@ens.fr>
Date: Thu, 23 Sep 2010 12:13:30 +0200
Subject: [PATCH] Preprocessor: no longer crashes when some dynamic variables
 appear only in unused model local variables (closes #101) (manually
 cherry-picked from 3068fbda8fa3946aba1d7df52a2c905d8e1ee87d)

---
 preprocessor/ModelTree.cc | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/preprocessor/ModelTree.cc b/preprocessor/ModelTree.cc
index 570b57493e..7d4d342105 100644
--- a/preprocessor/ModelTree.cc
+++ b/preprocessor/ModelTree.cc
@@ -1009,11 +1009,18 @@ ModelTree::writeTemporaryTerms(const temporary_terms_type &tt, ostream &output,
 void
 ModelTree::writeModelLocalVariables(ostream &output, ExprNodeOutputType output_type) const
 {
-  for (map<int, NodeID>::const_iterator it = local_variables_table.begin();
-       it != local_variables_table.end(); it++)
+  /* Collect all model local variables appearing in equations, and print only
+     them. Printing unused model local variables can lead to a crash (see
+     ticket #101). */
+  set<int> used_local_vars;
+  for (size_t i = 0; i < equations.size(); i++)
+    equations[i]->collectModelLocalVariables(used_local_vars);
+
+  for (set<int>::const_iterator it = used_local_vars.begin();
+       it != used_local_vars.end(); ++it)
     {
-      int id = it->first;
-      NodeID value = it->second;
+      int id = *it;
+      NodeID value = local_variables_table.find(id)->second;
 
       if (IS_C(output_type))
         output << "double ";
-- 
GitLab