From c36f899c4485ebf602fcaf225f41c64fbea773c3 Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Mon, 2 Apr 2018 14:15:57 +0900 Subject: Be more cautious with rvalues Clang on FreeBSD doesn't seem to be playing nice in Release configuration. See the comment in the committed code. --- lib/connection.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/connection.cpp b/lib/connection.cpp index 2bdbb2e5..a2b1b94e 100644 --- a/lib/connection.cpp +++ b/lib/connection.cpp @@ -281,7 +281,8 @@ void Connection::sync(int timeout) void Connection::onSyncSuccess(SyncData &&data) { d->data->setLastEvent(data.nextBatch()); - for (auto&& roomData: data.takeRoomData()) + auto allRoomData = data.takeRoomData(); + for (auto&& roomData: allRoomData) { const auto forgetIdx = d->roomIdsToForget.indexOf(roomData.roomId); if (forgetIdx != -1) @@ -302,7 +303,12 @@ void Connection::onSyncSuccess(SyncData &&data) { r->updateData(std::move(roomData)); QCoreApplication::processEvents(); } - for (auto&& accountEvent: data.takeAccountData()) + // `for (auto&& accountEvent: data.takeAccountData())` doesn't work well + // with Clang on FreeBSD in Release configuration; it seems that + // the lifetime of the returned rvalue does not extend (violating the + // standard) and accountEvent refers to garbage in the loop body as a result. + auto allAccountData = data.takeAccountData(); + for (auto&& accountEvent: allAccountData) { if (accountEvent->type() == EventType::DirectChat) { -- cgit v1.2.3