From a55fc8e43ba88ae33dd15838bd3de84b7238fc7a Mon Sep 17 00:00:00 2001
From: Nicolas Werner <nicolas.werner@hotmail.de>
Date: Sun, 2 Oct 2022 02:06:09 +0200
Subject: [PATCH] Work around MSVC bug with structured bindings in lambdas

Causes error messages like:
error C3493: 'key_id' cannot be implicitly captured because no default capture mode has been specified
---
 src/encryption/DeviceVerificationFlow.cpp | 20 ++++++++++++++++++--
 src/encryption/SelfVerificationStatus.cpp | 20 ++++++++++++++++++--
 2 files changed, 36 insertions(+), 4 deletions(-)

diff --git a/src/encryption/DeviceVerificationFlow.cpp b/src/encryption/DeviceVerificationFlow.cpp
index 2cf8b060b..b0e8a73b0 100644
--- a/src/encryption/DeviceVerificationFlow.cpp
+++ b/src/encryption/DeviceVerificationFlow.cpp
@@ -336,14 +336,30 @@ DeviceVerificationFlow::DeviceVerificationFlow(QObject *,
                                                 static_cast<int>(err->status_code));
                         }
 
-                        for (const auto &[user_id, tmp] : res.errors)
-                            for (const auto &[key_id, e] : tmp)
+                        // MSVC bug, error C3493: 'key_id' cannot be implicitly captured because no
+                        // default capture mode has been specified
+                        // for (const auto &[user_id, tmp] : res.errors)
+                        //     for (const auto &[key_id, e] : tmp)
+                        //         nhlog::net()->error("signature error for user {} and key "
+                        //                             "id {}: {}, {}",
+                        //                             user_id,
+                        //                             key_id,
+                        //                             mtx::errors::to_string(e.errcode),
+                        //                             e.error);
+                        for (const auto &error : res.errors) {
+                            const auto &user_id = error.first;
+                            for (const auto &key_error : error.second) {
+                                const auto &key_id = key_error.first;
+                                const auto &e      = key_error.second;
+
                                 nhlog::net()->error("signature error for user {} and key "
                                                     "id {}: {}, {}",
                                                     user_id,
                                                     key_id,
                                                     mtx::errors::to_string(e.errcode),
                                                     e.error);
+                            }
+                        }
                     });
               }
 
diff --git a/src/encryption/SelfVerificationStatus.cpp b/src/encryption/SelfVerificationStatus.cpp
index 46e71015c..86733cee0 100644
--- a/src/encryption/SelfVerificationStatus.cpp
+++ b/src/encryption/SelfVerificationStatus.cpp
@@ -172,14 +172,30 @@ SelfVerificationStatus::setupCrosssigning(bool useSSSS, QString password, bool u
                                                 static_cast<int>(err->status_code));
                         }
 
-                        for (const auto &[user_id, tmp] : res.errors)
-                            for (const auto &[key_id, e_] : tmp)
+                        // MSVC bug, error C3493: 'key_id' cannot be implicitly captured because no
+                        // default capture mode has been specified
+                        // for (const auto &[user_id, tmp] : res.errors)
+                        //    for (const auto &[key_id, e_] : tmp)
+                        //        nhlog::net()->error("signature error for user {} and key "
+                        //                            "id {}: {}, {}",
+                        //                            user_id,
+                        //                            key_id,
+                        //                            mtx::errors::to_string(e_.errcode),
+                        //                            e_.error);
+                        for (const auto &error : res.errors) {
+                            const auto &user_id = error.first;
+                            for (const auto &key_error : error.second) {
+                                const auto &key_id = key_error.first;
+                                const auto &e_     = key_error.second;
+
                                 nhlog::net()->error("signature error for user {} and key "
                                                     "id {}: {}, {}",
                                                     user_id,
                                                     key_id,
                                                     mtx::errors::to_string(e_.errcode),
                                                     e_.error);
+                            }
+                        }
                     });
               }
           }
-- 
GitLab