From a51ba3553db7e04e2c736b9f5e89ef571ac51dce Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org>
Date: Fri, 7 Jul 2023 14:58:23 +0200
Subject: [PATCH] Do not use C++20 lambda capture of structured bindings

Not supported by LLVM/Clang < 16.
---
 src/ModelTree.cc     | 2 +-
 src/ParsingDriver.cc | 4 ++--
 src/Statement.cc     | 2 +-
 src/SubModel.cc      | 7 ++++---
 4 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/src/ModelTree.cc b/src/ModelTree.cc
index 1138a740..f1994476 100644
--- a/src/ModelTree.cc
+++ b/src/ModelTree.cc
@@ -390,7 +390,7 @@ ModelTree::evaluateAndReduceJacobian(const eval_context_t& eval_context) const
           int eq = indices[0];
           int var {getTypeSpecificIDByDerivID(deriv_id)};
           int lag = getLagByDerivID(deriv_id);
-          double val {[&] {
+          double val {[&, d1 = d1] {
             try
               {
                 return d1->eval(eval_context); // NOLINT(clang-analyzer-core.NullDereference)
diff --git a/src/ParsingDriver.cc b/src/ParsingDriver.cc
index 132119df..4469f8e5 100644
--- a/src/ParsingDriver.cc
+++ b/src/ParsingDriver.cc
@@ -2659,7 +2659,7 @@ ParsingDriver::add_model_equal(expr_t arg1, expr_t arg2, map<string, string> eq_
       constant.erase(constant.find_last_not_of(" \n\t") + 1);
       constant.erase(0, constant.find_first_not_of(" \n\t"));
 
-      int symb_id {[&] {
+      int symb_id {[&, &var_name = var_name] {
         try
           {
             return mod_file->symbol_table.getID(var_name);
@@ -2673,7 +2673,7 @@ ParsingDriver::add_model_equal(expr_t arg1, expr_t arg2, map<string, string> eq_
       if (mod_file->symbol_table.getType(symb_id) != SymbolType::endogenous)
         error("Left-hand side of expression in 'mcp' tag is not an endogenous variable");
 
-      expr_t matched_constant {[&] {
+      expr_t matched_constant {[&, &constant = constant] {
         char* str_end;
         double d = strtod(constant.c_str(), &str_end);
         if (str_end == constant.c_str())
diff --git a/src/Statement.cc b/src/Statement.cc
index e28d7f40..cd1f0230 100644
--- a/src/Statement.cc
+++ b/src/Statement.cc
@@ -191,7 +191,7 @@ OptionsList::writeOutputCommon(ostream& output, const string& option_group) cons
   // NOLINTBEGIN(clang-analyzer-core.CallAndMessage)
   for (const auto& [name, val] : options)
     std::visit(
-        [&]<class T>(const T& v) {
+        [&, &name = name, &val = val]<class T>(const T& v) {
           if constexpr (is_same_v<T, SymbolListVal>)
             v.writeOutput(option_group + "." + name, output);
           else
diff --git a/src/SubModel.cc b/src/SubModel.cc
index 411fb29b..be4b00f3 100644
--- a/src/SubModel.cc
+++ b/src/SubModel.cc
@@ -1284,9 +1284,10 @@ PacModelTable::transformPass(const lag_equivalence_table_t& unary_ops_nodes,
 
           // Associate the coefficients of the linear combination with the right components
           for (auto [var, coeff] : terms)
-            if (auto it = find_if(
-                    components.begin(), components.end(),
-                    [&](const auto& v) { return get<0>(v) == dynamic_model.AddVariable(var); });
+            if (auto it = find_if(components.begin(), components.end(),
+                                  [&, &var = var](const auto& v) {
+                                    return get<0>(v) == dynamic_model.AddVariable(var);
+                                  });
                 it != components.end())
               get<4>(*it) = coeff;
             else
-- 
GitLab