From 5031c49cfec72727c52e3667468081bdf288ed01 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Thu, 6 Mar 2014 13:54:56 -0300 Subject: [PATCH] Clang: Fix crash if updating pch info Function-local variable 'updateParams' was referenced after destruction. Change-Id: Iac9663ba4ca9c3a603bc530f57f419b734782694 Reviewed-by: Erik Verbruggen --- src/plugins/clangcodemodel/pchmanager.cpp | 19 +++++++++++-------- src/plugins/clangcodemodel/pchmanager.h | 8 ++++---- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/plugins/clangcodemodel/pchmanager.cpp b/src/plugins/clangcodemodel/pchmanager.cpp index 295cf4fc4e9..2702ecd60fd 100644 --- a/src/plugins/clangcodemodel/pchmanager.cpp +++ b/src/plugins/clangcodemodel/pchmanager.cpp @@ -161,7 +161,7 @@ void PchManager::updatePchInfo(ClangProjectSettings *cps, const ClangProjectSettings::PchUsage pchUsage = cps->pchUsage(); void (*updateFunction)(QFutureInterface &future, - const PchManager::UpdateParams ¶ms) = 0; + const PchManager::UpdateParams params) = 0; QString message; if (pchUsage == ClangProjectSettings::PchUse_None || (pchUsage == ClangProjectSettings::PchUse_Custom && customPchFile.isEmpty())) { @@ -181,9 +181,8 @@ void PchManager::updatePchInfo(ClangProjectSettings *cps, QTC_ASSERT(updateFunction && !message.isEmpty(), return); Core::MessageManager::write(message, Core::MessageManager::Silent); - const UpdateParams updateParams = UpdateParams(customPchFile, projectParts); - QFuture future - = QtConcurrent::run(updateFunction, updateParams); + QFuture future = QtConcurrent::run(updateFunction, + UpdateParams(customPchFile, projectParts)); m_pchGenerationWatcher.setFuture(future); Core::ProgressManager::addTask(future, tr("Precompiling..."), "Key.Tmp.Precompiling"); } @@ -237,7 +236,8 @@ CppTools::ProjectFile::Kind getPrefixFileKind(bool hasObjectiveC, bool hasCPlusP } -void PchManager::doPchInfoUpdateNone(QFutureInterface &future, const PchManager::UpdateParams ¶ms) +void PchManager::doPchInfoUpdateNone(QFutureInterface &future, + const PchManager::UpdateParams params) { future.setProgressRange(0, 1); PchInfo::Ptr emptyPch = PchInfo::createEmpty(); @@ -246,7 +246,8 @@ void PchManager::doPchInfoUpdateNone(QFutureInterface &future, const PchMa future.setProgressValue(1); } -void PchManager::doPchInfoUpdateFuzzy(QFutureInterface &future, const PchManager::UpdateParams ¶ms) +void PchManager::doPchInfoUpdateFuzzy(QFutureInterface &future, + const PchManager::UpdateParams params) { QHash > includes, frameworks; QHash > definesPerPCH; @@ -338,7 +339,8 @@ void PchManager::doPchInfoUpdateFuzzy(QFutureInterface &future, const PchM future.setProgressValue(future.progressValue() + 1); } -void PchManager::doPchInfoUpdateExact(QFutureInterface &future, const PchManager::UpdateParams ¶ms) +void PchManager::doPchInfoUpdateExact(QFutureInterface &future, + const PchManager::UpdateParams params) { future.setProgressRange(0, params.projectParts.size() + 1); future.setProgressValue(0); @@ -370,7 +372,8 @@ void PchManager::doPchInfoUpdateExact(QFutureInterface &future, const PchM future.setProgressValue(future.progressValue() + 1); } -void PchManager::doPchInfoUpdateCustom(QFutureInterface &future, const PchManager::UpdateParams ¶ms) +void PchManager::doPchInfoUpdateCustom(QFutureInterface &future, + const PchManager::UpdateParams params) { future.setProgressRange(0, 1); future.setProgressValue(0); diff --git a/src/plugins/clangcodemodel/pchmanager.h b/src/plugins/clangcodemodel/pchmanager.h index 263258f9165..7b57345d94f 100644 --- a/src/plugins/clangcodemodel/pchmanager.h +++ b/src/plugins/clangcodemodel/pchmanager.h @@ -85,10 +85,10 @@ private: void updatePchInfo(ClangProjectSettings *cps, const QList &projectParts); - static void doPchInfoUpdateNone(QFutureInterface &future, const UpdateParams ¶ms); - static void doPchInfoUpdateFuzzy(QFutureInterface &future, const UpdateParams ¶ms); - static void doPchInfoUpdateExact(QFutureInterface &future, const UpdateParams ¶ms); - static void doPchInfoUpdateCustom(QFutureInterface &future, const UpdateParams ¶ms); + static void doPchInfoUpdateNone(QFutureInterface &future, const UpdateParams params); + static void doPchInfoUpdateFuzzy(QFutureInterface &future, const UpdateParams params); + static void doPchInfoUpdateExact(QFutureInterface &future, const UpdateParams params); + static void doPchInfoUpdateCustom(QFutureInterface &future, const UpdateParams params); void setPCHInfo(const QList &projectParts, const PchInfo::Ptr &pchInfo,