From 14a9133abb8b15c8feb9be04d39e31d5a527fad4 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Mon, 4 Jun 2018 15:09:38 +0200 Subject: [PATCH 01/19] Core: Make preview work when FOO is both a variable and a prefix Make the preview of variable "FOO" work in the variable chooser when the macroexpander also has a prefix "FOO:" defined. The MacroExpander::isPrefixVariable method is broken in this case: It will append ':' to the variable name if it is not there already and will thus return true for both "FOO" and "FOO:". So avoid calling it. In this case this does not even lead to more look-ups: As the variable chooser uses the description of the variable as a key, it contains "FOO:" for the variable name and uses that checks whether "FOO::" is a prefix variable or not. That is always false. Task-number: QTCREATORBUG-20504 Change-Id: I3ea83a4df6d72aac157fa6777106966cc9e9976d Reviewed-by: Eike Ziller --- src/plugins/coreplugin/variablechooser.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/plugins/coreplugin/variablechooser.cpp b/src/plugins/coreplugin/variablechooser.cpp index 5f675de7a37..186a74d6a38 100644 --- a/src/plugins/coreplugin/variablechooser.cpp +++ b/src/plugins/coreplugin/variablechooser.cpp @@ -203,9 +203,7 @@ public: if (role == Qt::ToolTipRole) { QString description = m_expander->variableDescription(m_variable); - QString value; - if (!m_expander->isPrefixVariable(m_variable)) - value = m_expander->value(m_variable).toHtmlEscaped(); + const QString value = m_expander->value(m_variable).toHtmlEscaped(); if (!value.isEmpty()) description += QLatin1String("

") + VariableChooser::tr("Current Value: %1").arg(value); return description; From 89d6a36bc64b0e95136c925f4ed37f4520f9cb3a Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 9 Feb 2018 11:11:22 +0100 Subject: [PATCH 02/19] Clang: Disable internal threads in libclang We already run all operations in threads to avoid blocking, there is no need to start more threads within libclang. Before this change, a reparse would trigger 3 threads to start: 1. clangbackend: Utils::runAsync() for the job 2. libclang-internal: thread for reparse 3. libclang-internal: thread for annotating tokens (highlighting) Ensure that we use the same stack size for our threads as libclang was doing internally. C++ parsers usually have higher stack size requirements. Change-Id: I2f67602ddfbf77ea2c69144b56acf64ba08041f6 Reviewed-by: Ivan Donchevskii --- src/libs/clangsupport/clangcodemodelconnectionclient.cpp | 5 +++++ src/libs/clangsupport/processcreator.cpp | 9 +++++++++ src/libs/clangsupport/processcreator.h | 3 +++ src/tools/clangbackend/source/clangasyncjob.h | 4 +++- 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/libs/clangsupport/clangcodemodelconnectionclient.cpp b/src/libs/clangsupport/clangcodemodelconnectionclient.cpp index 1938d063537..33d89870249 100644 --- a/src/libs/clangsupport/clangcodemodelconnectionclient.cpp +++ b/src/libs/clangsupport/clangcodemodelconnectionclient.cpp @@ -25,6 +25,7 @@ #include "clangcodemodelconnectionclient.h" +#include #include #include @@ -50,6 +51,10 @@ ClangCodeModelConnectionClient::ClangCodeModelConnectionClient( m_processCreator.setTemporaryDirectoryPattern("clangbackend-XXXXXX"); m_processCreator.setArguments({connectionName()}); + Utils::Environment environment; + environment.set(QStringLiteral("LIBCLANG_NOTHREADS"), QString()); + m_processCreator.setEnvironment(environment); + stdErrPrefixer().setPrefix("clangbackend.stderr: "); stdOutPrefixer().setPrefix("clangbackend.stdout: "); } diff --git a/src/libs/clangsupport/processcreator.cpp b/src/libs/clangsupport/processcreator.cpp index dfc7f56d9fd..22b52793e30 100644 --- a/src/libs/clangsupport/processcreator.cpp +++ b/src/libs/clangsupport/processcreator.cpp @@ -56,6 +56,11 @@ void ProcessCreator::setArguments(const QStringList &arguments) m_arguments = arguments; } +void ProcessCreator::setEnvironment(const Utils::Environment &environment) +{ + m_environment = environment; +} + std::future ProcessCreator::createProcess() const { return std::async(std::launch::async, [&] { @@ -167,6 +172,10 @@ QProcessEnvironment ProcessCreator::processEnvironment() const processEnvironment.insert("TEMP", temporaryDirectoryPath); } + const Utils::Environment &env = m_environment; + for (auto it = env.constBegin(); it != env.constEnd(); ++it) + processEnvironment.insert(it.key(), it.value()); + return processEnvironment; } diff --git a/src/libs/clangsupport/processcreator.h b/src/libs/clangsupport/processcreator.h index 97429921751..928857319b7 100644 --- a/src/libs/clangsupport/processcreator.h +++ b/src/libs/clangsupport/processcreator.h @@ -29,6 +29,7 @@ #include "processhandle.h" +#include #include #include @@ -51,6 +52,7 @@ public: void setTemporaryDirectoryPattern(const QString &temporaryDirectoryPattern); void setProcessPath(const QString &m_processPath); void setArguments(const QStringList &m_arguments); + void setEnvironment(const Utils::Environment &environment); void setObserver(QObject *m_observer); std::future createProcess() const; @@ -72,6 +74,7 @@ private: QString m_processPath; QString m_temporaryDirectoryPattern; QStringList m_arguments; + Utils::Environment m_environment; QObject *m_observer = nullptr; }; diff --git a/src/tools/clangbackend/source/clangasyncjob.h b/src/tools/clangbackend/source/clangasyncjob.h index 58b6a1f8455..69befdcdac7 100644 --- a/src/tools/clangbackend/source/clangasyncjob.h +++ b/src/tools/clangbackend/source/clangasyncjob.h @@ -58,7 +58,9 @@ public: &QFutureWatcher::finished, onFinished); - const QFuture future = Utils::runAsync(m_runner); + // Use 16MB stack size as clang_annotateTokens() would with an internal thread. + const Utils::StackSizeInBytes stackSize = 1024 * 1024 * 16; + const QFuture future = Utils::runAsync(stackSize, m_runner); m_futureWatcher.setFuture(future); return future; From fdd695c35c271bd467fd9da8a67589d733443c67 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 2 Feb 2018 15:18:40 +0100 Subject: [PATCH 03/19] Clang: Disable crash recovery in libclang ...because 1. We already run in a separate process. 2. It's not entirely clear in which state we end up after a crash, except for: 3. A "crashed" translation unit won't be freed, even when calling clang_disposeTranslationUnit(). This avoids undefined behavior within clangbackend and accumulated leaking memory in the long run. On the other side, crashes within libclang will crash clangbackend now, too. Change-Id: I0789c52db08ace2f7e181e3b7bdfc9f595f75e8d Reviewed-by: Ivan Donchevskii --- src/libs/clangsupport/clangcodemodelconnectionclient.cpp | 1 + src/tools/clangbackend/clangbackendmain.cpp | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/clangsupport/clangcodemodelconnectionclient.cpp b/src/libs/clangsupport/clangcodemodelconnectionclient.cpp index 33d89870249..56186e24dc6 100644 --- a/src/libs/clangsupport/clangcodemodelconnectionclient.cpp +++ b/src/libs/clangsupport/clangcodemodelconnectionclient.cpp @@ -53,6 +53,7 @@ ClangCodeModelConnectionClient::ClangCodeModelConnectionClient( Utils::Environment environment; environment.set(QStringLiteral("LIBCLANG_NOTHREADS"), QString()); + environment.set(QStringLiteral("LIBCLANG_DISABLE_CRASH_RECOVERY"), QString()); m_processCreator.setEnvironment(environment); stdErrPrefixer().setPrefix("clangbackend.stderr: "); diff --git a/src/tools/clangbackend/clangbackendmain.cpp b/src/tools/clangbackend/clangbackendmain.cpp index 28b7f251b6d..338fec79822 100644 --- a/src/tools/clangbackend/clangbackendmain.cpp +++ b/src/tools/clangbackend/clangbackendmain.cpp @@ -82,7 +82,6 @@ int main(int argc, char *argv[]) const QString connection = processArguments(application); - clang_toggleCrashRecovery(true); clang_enableStackTraces(); ClangCodeModelServer clangCodeModelServer; From 87678e9a074e86bfb996b736ead1b285311f6efb Mon Sep 17 00:00:00 2001 From: Ivan Donchevskii Date: Thu, 31 May 2018 15:20:35 +0200 Subject: [PATCH 04/19] ClangTools: Remove huge "log files" after we've read them Serialized diagnostics consume quite a lot of space. Remove these files after they are read by QtC. Change-Id: I4b257e44ee182484726ebd808069198443992016 Reviewed-by: Ivan Donchevskii Reviewed-by: Nikolai Kosjar --- src/plugins/clangtools/clangtoolruncontrol.cpp | 9 +++++++-- src/plugins/clangtools/clangtoolruncontrol.h | 2 +- src/plugins/clangtools/clangtoolrunner.cpp | 2 +- src/plugins/clangtools/clangtoolrunner.h | 4 ++-- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/plugins/clangtools/clangtoolruncontrol.cpp b/src/plugins/clangtools/clangtoolruncontrol.cpp index 7e53fe3818a..444f149e508 100644 --- a/src/plugins/clangtools/clangtoolruncontrol.cpp +++ b/src/plugins/clangtools/clangtoolruncontrol.cpp @@ -388,13 +388,15 @@ void ClangToolRunControl::analyzeNextFile() Utils::StdOutFormat); } -void ClangToolRunControl::onRunnerFinishedWithSuccess(const QString &filePath, - const QString &logFilePath) +void ClangToolRunControl::onRunnerFinishedWithSuccess(const QString &filePath) { + const QString logFilePath = qobject_cast(sender())->actualLogFile(); qCDebug(LOG) << "onRunnerFinishedWithSuccess:" << logFilePath; QString errorMessage; const QList diagnostics = tool()->read(filePath, logFilePath, &errorMessage); + QFile::remove(logFilePath); // Clean-up. + if (!errorMessage.isEmpty()) { qCDebug(LOG) << "onRunnerFinishedWithSuccess: Error reading log file:" << errorMessage; const QString filePath = qobject_cast(sender())->filePath(); @@ -415,6 +417,9 @@ void ClangToolRunControl::onRunnerFinishedWithFailure(const QString &errorMessag qCDebug(LOG).noquote() << "onRunnerFinishedWithFailure:" << errorMessage << '\n' << errorDetails; + // Even in the error case the log file was created, so clean it up here, too. + QFile::remove(qobject_cast(sender())->actualLogFile()); + ++m_filesNotAnalyzed; m_success = false; const QString filePath = qobject_cast(sender())->filePath(); diff --git a/src/plugins/clangtools/clangtoolruncontrol.h b/src/plugins/clangtools/clangtoolruncontrol.h index dae3521bc1a..614b02fb2f4 100644 --- a/src/plugins/clangtools/clangtoolruncontrol.h +++ b/src/plugins/clangtools/clangtoolruncontrol.h @@ -69,7 +69,7 @@ protected: virtual ClangToolRunner *createRunner() = 0; - void onRunnerFinishedWithSuccess(const QString &filePath, const QString &logFilePath); + void onRunnerFinishedWithSuccess(const QString &filePath); void onRunnerFinishedWithFailure(const QString &errorMessage, const QString &errorDetails); private: diff --git a/src/plugins/clangtools/clangtoolrunner.cpp b/src/plugins/clangtools/clangtoolrunner.cpp index 79b027a9303..59f3329f822 100644 --- a/src/plugins/clangtools/clangtoolrunner.cpp +++ b/src/plugins/clangtools/clangtoolrunner.cpp @@ -121,7 +121,7 @@ void ClangToolRunner::onProcessFinished(int exitCode, QProcess::ExitStatus exitS if (exitCode == 0) { qCDebug(LOG).noquote() << "Output:\n" << Utils::SynchronousProcess::normalizeNewlines( QString::fromLocal8Bit(m_processOutput)); - emit finishedWithSuccess(m_filePath, actualLogFile()); + emit finishedWithSuccess(m_filePath); } else emit finishedWithFailure(finishedWithBadExitCode(m_name, exitCode), processCommandlineAndOutput()); diff --git a/src/plugins/clangtools/clangtoolrunner.h b/src/plugins/clangtools/clangtoolrunner.h index 5473890dd8c..04865dc3465 100644 --- a/src/plugins/clangtools/clangtoolrunner.h +++ b/src/plugins/clangtools/clangtoolrunner.h @@ -53,10 +53,11 @@ public: bool run(const QString &filePath, const QStringList &compilerOptions = QStringList()); QString filePath() const; + QString actualLogFile() const; signals: void started(); - void finishedWithSuccess(const QString &filePath, const QString &logFilePath); + void finishedWithSuccess(const QString &filePath); void finishedWithFailure(const QString &errorMessage, const QString &errorDetails); protected: @@ -71,7 +72,6 @@ private: QString createLogFile(const QString &filePath) const; QString processCommandlineAndOutput() const; - QString actualLogFile() const; protected: QString m_logFile; From 35eabd7d40128875d290d8076ca9a79c22b64405 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Mon, 4 Jun 2018 18:56:35 +0200 Subject: [PATCH 05/19] Squish: Explicitly disable ClangCodeModel for testing built-in The ClangCodeModel is the default now. Change-Id: Id432cc9d27dcf7327c0b7efeba7004521d25fee5 Reviewed-by: Christian Stenger --- tests/system/shared/clang.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/system/shared/clang.py b/tests/system/shared/clang.py index dc07789740a..d1a5660828d 100644 --- a/tests/system/shared/clang.py +++ b/tests/system/shared/clang.py @@ -50,7 +50,7 @@ def startCreator(useClang): if not startCreatorTryingClang(): return False else: - startApplication("qtcreator" + SettingsPath) + startApplication("qtcreator -noload ClangCodeModel" + SettingsPath) finally: overrideStartApplication() return startedWithoutPluginError() From 43fa0dfe6f5a930be7281a070674aa531a4e58ba Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Tue, 5 Jun 2018 08:01:03 +0200 Subject: [PATCH 06/19] Debugger: Avoid triggering Qt internal warning Passing an empty string to QFile::exists() results in 'Empty filename passed to function' to be printed on the commandline. Change-Id: I028f0ec18447642b30be1a51f4c70b6ae18d45b1 Reviewed-by: hjk --- src/plugins/debugger/gdb/gdbengine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index ee2fe1de9ee..263211a5988 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -4034,7 +4034,7 @@ void GdbEngine::handleDebugInfoLocation(const DebuggerResponse &response) { if (response.resultClass == ResultDone) { const QString debugInfoLocation = runParameters().debugInfoLocation; - if (QFile::exists(debugInfoLocation)) { + if (!debugInfoLocation.isEmpty() && QFile::exists(debugInfoLocation)) { const QString curDebugInfoLocations = response.consoleStreamOutput.split('"').value(1); QString cmd = "set debug-file-directory " + debugInfoLocation; if (!curDebugInfoLocations.isEmpty()) From 9cb170099390b2ea620ec8f5daf6bc79f0f9cb73 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Mon, 4 Jun 2018 19:20:23 +0200 Subject: [PATCH 07/19] Squish: Use built-in code model in tst_APTW01 The warnings from ClangCodeModel confuse our build check. Change-Id: Ic6b82bb304387f447bdf8eb0b2fd02dd2f250fb2 Reviewed-by: Christian Stenger --- tests/system/suite_APTW/tst_APTW01/test.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/system/suite_APTW/tst_APTW01/test.py b/tests/system/suite_APTW/tst_APTW01/test.py index 10b3facf20f..e6fcc937c12 100644 --- a/tests/system/suite_APTW/tst_APTW01/test.py +++ b/tests/system/suite_APTW/tst_APTW01/test.py @@ -27,7 +27,9 @@ source("../../shared/qtcreator.py") # test New Qt Gui Application build and run for release and debug option def main(): - startApplication("qtcreator" + SettingsPath) + # Start Creator with built-in code model, to avoid having + # warnings from the clang code model in "issues" view + startCreator(False) if not startedWithoutPluginError(): return checkedTargets = createProject_Qt_GUI(tempDir(), "SampleApp") From e9a7ae21fa1f14097a03d17edf93497d765470d7 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Tue, 5 Jun 2018 09:47:25 +0200 Subject: [PATCH 08/19] QuickDesigner: Avoid triggering Qt internal message Passing an empty string to File::exists() results in a warning coming from inside Qt. Change-Id: Ia115c53cc748c3ad446544a8ac85f9951182f50c Reviewed-by: Tim Jenssen --- .../components/propertyeditor/propertyeditorqmlbackend.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp index 6ac07433a4b..16c2e5f1b28 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp @@ -508,7 +508,8 @@ QString PropertyEditorQmlBackend::fileFromUrl(const QUrl &url) bool PropertyEditorQmlBackend::checkIfUrlExists(const QUrl &url) { - return QFileInfo::exists(fileFromUrl(url)); + const QString &file = fileFromUrl(url); + return !file.isEmpty() && QFileInfo::exists(file); } void PropertyEditorQmlBackend::emitSelectionToBeChanged() From 71f02417e70db893e6b934f7e543a47aa044848f Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Mon, 4 Jun 2018 16:53:11 +0200 Subject: [PATCH 09/19] Doc: Describe new file synchronization options ... in the Projects and File System views in the sidebar. Change-Id: I38c77d8e5c19a1adb934c5b8d4777889467392c6 Reviewed-by: Tobias Hunger --- doc/images/qtcreator-filesystem-view.png | Bin 18128 -> 19139 bytes doc/src/howto/creator-ui.qdoc | 11 +++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/doc/images/qtcreator-filesystem-view.png b/doc/images/qtcreator-filesystem-view.png index cd730fc925b3292a951cb43e72e718567b1229e9..407f39a2b24e50b7b5f9656d5a7c658ad4c6c54f 100644 GIT binary patch literal 19139 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 literal 18128 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 U*@fyE7#J8lUHx3vIVCg!0D0o`&Hw-a diff --git a/doc/src/howto/creator-ui.qdoc b/doc/src/howto/creator-ui.qdoc index f436ae54eb7..268a5d75a6b 100644 --- a/doc/src/howto/creator-ui.qdoc +++ b/doc/src/howto/creator-ui.qdoc @@ -219,7 +219,11 @@ \li To stop synchronizing the position in the project tree with the file currently opened in the editor, deselect \inlineimage linkicon.png - (\uicontrol {Synchronize with Editor}). + (\uicontrol {Synchronize with Editor}). You can specify a keyboard + shortcut to use when synchronization is needed. Select + \uicontrol Tools > \uicontrol Options > \uicontrol Environment > + \uicontrol Keyboard, and then search for + \uicontrol {Show in Explorer}. \li To see the absolute path of a file, move the mouse pointer over the file name. @@ -263,7 +267,10 @@ \image qtcreator-filesystem-view.png By default, the contents of the directory that contains the file currently - active in the editor are displayed. The path to the active file is displayed + active in the editor are displayed. To stop the synchronization, delesect + the \uicontrol {Synchronize Root Directory with Editor} button. + + The path to the active file is displayed as bread crumbs. You can move to any directory along the path by clicking it. To hide the bread crumbs, select \inlineimage filtericon.png (\uicontrol Options) and then deselect the \uicontrol {Show Bread Crumbs} From b81e5cb3b2e1a2891acc683e7c09796e16866375 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Tue, 5 Jun 2018 10:37:42 +0200 Subject: [PATCH 10/19] ClangTools: Remove temporary dirs ...when a new run is triggered instead of on Qt Creator shutdown. There is no reason to keep them around for longer than needed. Change-Id: Ida7698843cc2f8822ffd662679cf5da2c4ece05c Reviewed-by: Ivan Donchevskii --- src/plugins/clangtools/clangtidyclazyruncontrol.cpp | 3 +-- src/plugins/clangtools/clangtoolruncontrol.cpp | 7 ++----- src/plugins/clangtools/clangtoolruncontrol.h | 3 ++- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/plugins/clangtools/clangtidyclazyruncontrol.cpp b/src/plugins/clangtools/clangtidyclazyruncontrol.cpp index 12f158ae68c..42a0af5cdf5 100644 --- a/src/plugins/clangtools/clangtidyclazyruncontrol.cpp +++ b/src/plugins/clangtools/clangtidyclazyruncontrol.cpp @@ -48,11 +48,10 @@ ClangTidyClazyRunControl::ClangTidyClazyRunControl( ClangToolRunner *ClangTidyClazyRunControl::createRunner() { QTC_ASSERT(!m_clangExecutable.isEmpty(), return 0); - QTC_ASSERT(!m_clangLogFileDir.isEmpty(), return 0); auto runner = new ClangTidyClazyRunner(m_diagnosticConfig, m_clangExecutable, - m_clangLogFileDir, + m_temporaryDir.path(), m_environment, this); connect(runner, &ClangTidyClazyRunner::finishedWithSuccess, diff --git a/src/plugins/clangtools/clangtoolruncontrol.cpp b/src/plugins/clangtools/clangtoolruncontrol.cpp index 444f149e508..38d5494f887 100644 --- a/src/plugins/clangtools/clangtoolruncontrol.cpp +++ b/src/plugins/clangtools/clangtoolruncontrol.cpp @@ -60,7 +60,6 @@ #include #include #include -#include #include #include @@ -232,6 +231,7 @@ ClangToolRunControl::ClangToolRunControl(RunControl *runControl, : RunWorker(runControl) , m_projectBuilder(new ProjectBuilder(runControl, target->project(), this)) , m_clangExecutable(CppTools::clangExecutable(CLANG_BINDIR)) + , m_temporaryDir("clangtools-XXXXXX") , m_target(target) , m_fileInfos(fileInfos) { @@ -299,9 +299,7 @@ void ClangToolRunControl::start() Utils::NormalMessageFormat); // Create log dir - Utils::TemporaryDirectory temporaryDir("qtc-clangtools-XXXXXX"); - temporaryDir.setAutoRemove(false); - if (!temporaryDir.isValid()) { + if (!m_temporaryDir.isValid()) { const QString errorMessage = toolName + tr(": Failed to create temporary dir, stop."); appendMessage(errorMessage, Utils::ErrorMessageFormat); @@ -310,7 +308,6 @@ void ClangToolRunControl::start() reportFailure(errorMessage); return; } - m_clangLogFileDir = temporaryDir.path(); // Collect files const AnalyzeUnits unitsToProcess = unitsToAnalyze(CLANG_VERSION); diff --git a/src/plugins/clangtools/clangtoolruncontrol.h b/src/plugins/clangtools/clangtoolruncontrol.h index 614b02fb2f4..65f4bf35d0d 100644 --- a/src/plugins/clangtools/clangtoolruncontrol.h +++ b/src/plugins/clangtools/clangtoolruncontrol.h @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -90,7 +91,7 @@ protected: ProjectBuilder *m_projectBuilder; Utils::Environment m_environment; QString m_clangExecutable; - QString m_clangLogFileDir; + Utils::TemporaryDirectory m_temporaryDir; private: QPointer m_target; From f19e28d95c95a75d89dc719a4073e6b0b2a51a32 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Tue, 5 Jun 2018 10:41:30 +0200 Subject: [PATCH 11/19] ClangTools: Fix minor coding style issue Change-Id: I18e36b82060923fb2271eb46298170c540fd943f Reviewed-by: Ivan Donchevskii --- src/plugins/clangtools/clangtoolrunner.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/plugins/clangtools/clangtoolrunner.cpp b/src/plugins/clangtools/clangtoolrunner.cpp index 59f3329f822..61646d18722 100644 --- a/src/plugins/clangtools/clangtoolrunner.cpp +++ b/src/plugins/clangtools/clangtoolrunner.cpp @@ -122,9 +122,10 @@ void ClangToolRunner::onProcessFinished(int exitCode, QProcess::ExitStatus exitS qCDebug(LOG).noquote() << "Output:\n" << Utils::SynchronousProcess::normalizeNewlines( QString::fromLocal8Bit(m_processOutput)); emit finishedWithSuccess(m_filePath); + } else { + emit finishedWithFailure(finishedWithBadExitCode(m_name, exitCode), + processCommandlineAndOutput()); } - else - emit finishedWithFailure(finishedWithBadExitCode(m_name, exitCode), processCommandlineAndOutput()); } else { // == QProcess::CrashExit emit finishedWithFailure(finishedDueToCrash(m_name), processCommandlineAndOutput()); } From bb6c02a4438d1708f0db831aef04f4adc8e9a26c Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Tue, 5 Jun 2018 10:48:56 +0200 Subject: [PATCH 12/19] ClangTools: Remove dead code Change-Id: I5db111402902e81099489dc5ab4b0b929c574969 Reviewed-by: Ivan Donchevskii --- src/plugins/clangtools/clangtoolruncontrol.cpp | 4 ++-- src/plugins/clangtools/clangtoolrunner.cpp | 15 --------------- src/plugins/clangtools/clangtoolrunner.h | 4 ++-- 3 files changed, 4 insertions(+), 19 deletions(-) diff --git a/src/plugins/clangtools/clangtoolruncontrol.cpp b/src/plugins/clangtools/clangtoolruncontrol.cpp index 38d5494f887..707ccccfa3e 100644 --- a/src/plugins/clangtools/clangtoolruncontrol.cpp +++ b/src/plugins/clangtools/clangtoolruncontrol.cpp @@ -387,7 +387,7 @@ void ClangToolRunControl::analyzeNextFile() void ClangToolRunControl::onRunnerFinishedWithSuccess(const QString &filePath) { - const QString logFilePath = qobject_cast(sender())->actualLogFile(); + const QString logFilePath = qobject_cast(sender())->logFilePath(); qCDebug(LOG) << "onRunnerFinishedWithSuccess:" << logFilePath; QString errorMessage; @@ -415,7 +415,7 @@ void ClangToolRunControl::onRunnerFinishedWithFailure(const QString &errorMessag << errorMessage << '\n' << errorDetails; // Even in the error case the log file was created, so clean it up here, too. - QFile::remove(qobject_cast(sender())->actualLogFile()); + QFile::remove(qobject_cast(sender())->logFilePath()); ++m_filesNotAnalyzed; m_success = false; diff --git a/src/plugins/clangtools/clangtoolrunner.cpp b/src/plugins/clangtools/clangtoolrunner.cpp index 61646d18722..f66f14a23e7 100644 --- a/src/plugins/clangtools/clangtoolrunner.cpp +++ b/src/plugins/clangtools/clangtoolrunner.cpp @@ -105,11 +105,6 @@ bool ClangToolRunner::run(const QString &filePath, const QStringList &compilerOp return true; } -QString ClangToolRunner::filePath() const -{ - return m_filePath; -} - void ClangToolRunner::onProcessStarted() { emit started(); @@ -171,15 +166,5 @@ QString ClangToolRunner::processCommandlineAndOutput() const QString::fromLocal8Bit(m_processOutput))); } -QString ClangToolRunner::actualLogFile() const -{ - if (QFileInfo(m_logFile).size() == 0) { - // Current clang-cl ignores -o, always putting the log file into the working directory. - return m_clangLogFileDir + QLatin1Char('/') + QFileInfo(m_filePath).completeBaseName() - + QLatin1String(".plist"); - } - return m_logFile; -} - } // namespace Internal } // namespace ClangTools diff --git a/src/plugins/clangtools/clangtoolrunner.h b/src/plugins/clangtools/clangtoolrunner.h index 04865dc3465..01585a8ca77 100644 --- a/src/plugins/clangtools/clangtoolrunner.h +++ b/src/plugins/clangtools/clangtoolrunner.h @@ -52,8 +52,8 @@ public: // (2) -o output-file bool run(const QString &filePath, const QStringList &compilerOptions = QStringList()); - QString filePath() const; - QString actualLogFile() const; + QString filePath() const { return m_filePath; } + QString logFilePath() const { return m_logFile; } signals: void started(); From c93515dde19bddfb0bd5542b77d29c92e281c17e Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Tue, 5 Jun 2018 10:50:40 +0200 Subject: [PATCH 13/19] ClangTools: Remove outdated suffix for temporary file Change-Id: I05b523f1c33462913a2f1fec986e74eab8120eda Reviewed-by: Ivan Donchevskii --- src/plugins/clangtools/clangtoolrunner.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/clangtools/clangtoolrunner.cpp b/src/plugins/clangtools/clangtoolrunner.cpp index f66f14a23e7..f7b48a1d6a5 100644 --- a/src/plugins/clangtools/clangtoolrunner.cpp +++ b/src/plugins/clangtools/clangtoolrunner.cpp @@ -143,7 +143,7 @@ QString ClangToolRunner::createLogFile(const QString &filePath) const { const QString fileName = QFileInfo(filePath).fileName(); const QString fileTemplate = m_clangLogFileDir - + QLatin1String("/report-") + fileName + QLatin1String("-XXXXXX.plist"); + + QLatin1String("/report-") + fileName + QLatin1String("-XXXXXX"); Utils::TemporaryFile temporaryFile("clangtools"); temporaryFile.setAutoRemove(false); From 5585d97522d34387a5a521ca6bbf59e7ad3488c6 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Tue, 5 Jun 2018 08:49:32 +0200 Subject: [PATCH 14/19] ClangTools: Fix checking log file path Change-Id: I3598ab0b0b512798417b8885f562ee7978b9cf3b Reviewed-by: Ivan Donchevskii --- src/plugins/clangtools/clangtoolslogfilereader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/clangtools/clangtoolslogfilereader.cpp b/src/plugins/clangtools/clangtoolslogfilereader.cpp index f0885c22fc1..ecf4b8fbec1 100644 --- a/src/plugins/clangtools/clangtoolslogfilereader.cpp +++ b/src/plugins/clangtools/clangtoolslogfilereader.cpp @@ -67,7 +67,7 @@ static bool checkFilePath(const QString &filePath, QString *errorMessage) QList LogFileReader::readSerialized(const QString &filePath, const QString &logFilePath, QString *errorMessage) { - if (!checkFilePath(filePath, errorMessage)) + if (!checkFilePath(logFilePath, errorMessage)) return QList(); ClangSerializedDiagnosticsReader reader; From 8798990fb1fad04dca8337479e22d17c1fcbfebd Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Tue, 5 Jun 2018 13:38:29 +0200 Subject: [PATCH 15/19] Doc: Add troubleshooting entry for globally disabled perf events Change-Id: Ia37b26cc83566b1ae802471c17ef8d309a5d2fa1 Task-number: QTCREATORBUG-20154 Reviewed-by: Leena Miettinen --- doc/src/analyze/cpu-usage-analyzer.qdoc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/src/analyze/cpu-usage-analyzer.qdoc b/doc/src/analyze/cpu-usage-analyzer.qdoc index a43d8ac1dc5..3a6019295dd 100644 --- a/doc/src/analyze/cpu-usage-analyzer.qdoc +++ b/doc/src/analyze/cpu-usage-analyzer.qdoc @@ -405,6 +405,13 @@ The CPU Usage Analyzer might fail to record data for the following reasons: \list 1 + \li Perf events may be globally disabled on your system. The + preconfigured Boot to Qt images come with perf events enabled. For + a custom configuration you need to make sure that the file + \c {/proc/sys/kernel/perf_event_paranoid} contains a value smaller + than \c {2}. For maximum flexibility in recording traces you can + set the value to \c {-1}. This allows any user to record any kind + of trace, even using raw kernel trace points. \li The connection between the target device and the host may not be fast enough to transfer the data produced by Perf. Try modifying the values of the \uicontrol {Stack snapshot size} or From f8e88e8ce45a462f27d274c654e31a67032da757 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 31 May 2018 11:31:59 +0200 Subject: [PATCH 16/19] Fix compilation issues with C++17 Testable on Linux/macOS by changing c++14 to c++1z in qtcreator.pri. Testable with latest MSVC2017 by setting _CL_=/std:c++17. unary_function, binary_function, and a few other things that were deprecated are removed in C++17. std::string got a non-const overload for its "data" member function, so we cannot create a function pointer on it without specifying its type. Use std::declval instead (though it requires a default constructor for the type). MSVC seems to have an issue with Utils::transform for std::vector (used in Nim plugin), but that looks like a compiler issue. Change-Id: I94f9a93d591d55b610f86fabfc618158927d6221 Reviewed-by: Tobias Hunger --- src/libs/3rdparty/botan/botan.cpp | 2 +- src/libs/3rdparty/cplusplus/Name.h | 2 +- src/libs/3rdparty/cplusplus/Names.h | 2 +- src/libs/glsl/glslengine.h | 2 +- src/libs/qtcreatorcdbext/containers.cpp | 2 +- src/libs/qtcreatorcdbext/stringutils.h | 2 +- src/libs/qtcreatorcdbext/symbolgroup.cpp | 2 +- src/libs/utils/smallstringview.h | 4 +--- src/plugins/cpptools/cppfindreferences.cpp | 14 +++++++++++--- .../qmljseditor/qmljsfindreferences.cpp | 19 ++++++++++++++++--- .../texteditor/behaviorsettingswidget.cpp | 2 +- .../texteditor/generichighlighter/rule.cpp | 8 ++++++-- 12 files changed, 42 insertions(+), 19 deletions(-) diff --git a/src/libs/3rdparty/botan/botan.cpp b/src/libs/3rdparty/botan/botan.cpp index 87736d5fe3b..0d912062b32 100644 --- a/src/libs/3rdparty/botan/botan.cpp +++ b/src/libs/3rdparty/botan/botan.cpp @@ -465,7 +465,7 @@ inline V search_map(const std::map& mapping, * Function adaptor for delete operation */ template -class del_fun : public std::unary_function +class del_fun { public: void operator()(T* ptr) { delete ptr; } diff --git a/src/libs/3rdparty/cplusplus/Name.h b/src/libs/3rdparty/cplusplus/Name.h index 200ccac75d4..460f0bca11b 100644 --- a/src/libs/3rdparty/cplusplus/Name.h +++ b/src/libs/3rdparty/cplusplus/Name.h @@ -59,7 +59,7 @@ public: bool match(const Name *other, Matcher *matcher = 0) const; public: - struct Compare: std::binary_function { + struct Compare { bool operator()(const Name *name, const Name *other) const; }; diff --git a/src/libs/3rdparty/cplusplus/Names.h b/src/libs/3rdparty/cplusplus/Names.h index 41f3e761b41..b8d090da2fe 100644 --- a/src/libs/3rdparty/cplusplus/Names.h +++ b/src/libs/3rdparty/cplusplus/Names.h @@ -101,7 +101,7 @@ public: bool isSpecialization() const { return _isSpecialization; } // Comparator needed to distinguish between two different TemplateNameId(e.g.:used in std::map) - struct Compare: std::binary_function { + struct Compare { bool operator()(const TemplateNameId *name, const TemplateNameId *other) const; }; diff --git a/src/libs/glsl/glslengine.h b/src/libs/glsl/glslengine.h index 6b126111f66..7cf6e2d1644 100644 --- a/src/libs/glsl/glslengine.h +++ b/src/libs/glsl/glslengine.h @@ -71,7 +71,7 @@ template class TypeTable { public: - struct Compare: std::binary_function { + struct Compare { bool operator()(const Type &value, const Type &other) const { return value.isLessThan(&other); } diff --git a/src/libs/qtcreatorcdbext/containers.cpp b/src/libs/qtcreatorcdbext/containers.cpp index 1248fca175c..128f450cafa 100644 --- a/src/libs/qtcreatorcdbext/containers.cpp +++ b/src/libs/qtcreatorcdbext/containers.cpp @@ -245,7 +245,7 @@ AbstractSymbolGroupNodePtrVector linkedListChildList(SymbolGroupValue headNode, } // Helper function for linkedListChildList that returns a member by name -class MemberByName : public std::unary_function +class MemberByName { public: explicit MemberByName(const char *name) : m_name(name) {} diff --git a/src/libs/qtcreatorcdbext/stringutils.h b/src/libs/qtcreatorcdbext/stringutils.h index 89316d7e9ad..e8297d44a44 100644 --- a/src/libs/qtcreatorcdbext/stringutils.h +++ b/src/libs/qtcreatorcdbext/stringutils.h @@ -52,7 +52,7 @@ void split(const std::string &s, char sep, Iterator it) // A boolean predicate that can be used for grepping sequences // of strings for a 'needle' substring. -class SubStringPredicate : public std::unary_function +class SubStringPredicate { public: explicit SubStringPredicate(const char *needle) : m_needle(needle) {} diff --git a/src/libs/qtcreatorcdbext/symbolgroup.cpp b/src/libs/qtcreatorcdbext/symbolgroup.cpp index 5ea3e8930e1..52cf5d1645f 100644 --- a/src/libs/qtcreatorcdbext/symbolgroup.cpp +++ b/src/libs/qtcreatorcdbext/symbolgroup.cpp @@ -251,7 +251,7 @@ std::string SymbolGroup::debug(const std::string &iname, typedef std::pair InamePathEntry; -struct InamePathEntryLessThan : public std::binary_function { +struct InamePathEntryLessThan bool operator()(const InamePathEntry &i1, const InamePathEntry& i2) const { if (i1.first < i2.first) diff --git a/src/libs/utils/smallstringview.h b/src/libs/utils/smallstringview.h index 0d8600e5dee..7881500ce68 100644 --- a/src/libs/utils/smallstringview.h +++ b/src/libs/utils/smallstringview.h @@ -39,9 +39,7 @@ using enable_if_has_char_data_pointer = typename std::enable_if_t< std::is_same< std::remove_const_t< std::remove_pointer_t< - std::result_of_t< - decltype(&String::data)(String) - > + decltype(std::declval().data()) > >, char>::value , int>; diff --git a/src/plugins/cpptools/cppfindreferences.cpp b/src/plugins/cpptools/cppfindreferences.cpp index d2ae4e9f43b..b017cb7e8fc 100644 --- a/src/plugins/cpptools/cppfindreferences.cpp +++ b/src/plugins/cpptools/cppfindreferences.cpp @@ -168,7 +168,7 @@ static QList fullIdForSymbol(CPlusPlus::Symbol *symbol) namespace { -class ProcessFile: public std::unary_function > +class ProcessFile { const WorkingCopy workingCopy; const CPlusPlus::Snapshot snapshot; @@ -177,6 +177,10 @@ class ProcessFile: public std::unary_function > QFutureInterface *future; public: + // needed by QtConcurrent + using argument_type = const Utils::FileName &; + using result_type = QList; + ProcessFile(const WorkingCopy &workingCopy, const CPlusPlus::Snapshot snapshot, CPlusPlus::Document::Ptr symbolDocument, @@ -230,7 +234,7 @@ public: } }; -class UpdateUI: public std::binary_function &, QList, void> +class UpdateUI { QFutureInterface *future; @@ -596,7 +600,7 @@ static void searchFinished(SearchResult *search, QFutureWatcher > +class FindMacroUsesInFile { const WorkingCopy workingCopy; const CPlusPlus::Snapshot snapshot; @@ -604,6 +608,10 @@ class FindMacroUsesInFile: public std::unary_function *future; public: + // needed by QtConcurrent + using argument_type = const Utils::FileName &; + using result_type = QList; + FindMacroUsesInFile(const WorkingCopy &workingCopy, const CPlusPlus::Snapshot snapshot, const CPlusPlus::Macro ¯o, diff --git a/src/plugins/qmljseditor/qmljsfindreferences.cpp b/src/plugins/qmljseditor/qmljsfindreferences.cpp index 7806d9c385e..af2750de0ce 100644 --- a/src/plugins/qmljseditor/qmljsfindreferences.cpp +++ b/src/plugins/qmljseditor/qmljsfindreferences.cpp @@ -683,7 +683,7 @@ static QString matchingLine(unsigned position, const QString &source) return source.mid(start, end - start); } -class ProcessFile: public std::unary_function > +class ProcessFile { ContextPtr context; typedef FindReferences::Usage Usage; @@ -692,6 +692,10 @@ class ProcessFile: public std::unary_function *future; public: + // needed by QtConcurrent + using argument_type = const QString &; + using result_type = QList; + ProcessFile(const ContextPtr &context, QString name, const ObjectValue *scope, @@ -721,7 +725,7 @@ public: } }; -class SearchFileForType: public std::unary_function > +class SearchFileForType { ContextPtr context; typedef FindReferences::Usage Usage; @@ -730,6 +734,10 @@ class SearchFileForType: public std::unary_function *future; public: + // needed by QtConcurrent + using argument_type = const QString &; + using result_type = QList; + SearchFileForType(const ContextPtr &context, QString name, const ObjectValue *scope, @@ -759,12 +767,17 @@ public: } }; -class UpdateUI: public std::binary_function &, QList, void> +class UpdateUI { typedef FindReferences::Usage Usage; QFutureInterface *future; public: + // needed by QtConcurrent + using first_argument_type = QList &; + using second_argument_type = const QList &; + using result_type = void; + UpdateUI(QFutureInterface *future): future(future) {} void operator()(QList &, const QList &usages) diff --git a/src/plugins/texteditor/behaviorsettingswidget.cpp b/src/plugins/texteditor/behaviorsettingswidget.cpp index 718ea5e6e94..65bb8d5717b 100644 --- a/src/plugins/texteditor/behaviorsettingswidget.cpp +++ b/src/plugins/texteditor/behaviorsettingswidget.cpp @@ -59,7 +59,7 @@ BehaviorSettingsWidget::BehaviorSettingsWidget(QWidget *parent) QList mibs = QTextCodec::availableMibs(); Utils::sort(mibs); QList::iterator firstNonNegative = - std::find_if(mibs.begin(), mibs.end(), std::bind2nd(std::greater_equal(), 0)); + std::find_if(mibs.begin(), mibs.end(), [](int n) { return n >=0; }); if (firstNonNegative != mibs.end()) std::rotate(mibs.begin(), firstNonNegative, mibs.end()); foreach (int mib, mibs) { diff --git a/src/plugins/texteditor/generichighlighter/rule.cpp b/src/plugins/texteditor/generichighlighter/rule.cpp index 29be2fe6a39..701c6ac4598 100644 --- a/src/plugins/texteditor/generichighlighter/rule.cpp +++ b/src/plugins/texteditor/generichighlighter/rule.cpp @@ -144,7 +144,9 @@ bool Rule::charPredicateMatchSucceed(const QString &text, ProgressData *progress, bool (QChar::* predicate)() const) const { - return predicateMatchSucceed(text, length, progress, std::mem_fun_ref(predicate)); + return predicateMatchSucceed(text, length, progress, [predicate](const QChar &c) { + return (c.*predicate)(); + }); } bool Rule::charPredicateMatchSucceed(const QString &text, @@ -152,7 +154,9 @@ bool Rule::charPredicateMatchSucceed(const QString &text, ProgressData *progress, bool (*predicate)(const QChar &)) const { - return predicateMatchSucceed(text, length, progress, std::ptr_fun(predicate)); + return predicateMatchSucceed(text, length, progress, [predicate](const QChar &c) { + return predicate(c); + }); } bool Rule::matchSucceed(const QString &text, const int length, ProgressData *progress) From 85ffe78e9642f553b5e3eb6298eabb9cd4c651b7 Mon Sep 17 00:00:00 2001 From: Andre Hartmann Date: Tue, 5 Jun 2018 14:22:26 +0200 Subject: [PATCH 17/19] Utils: Properly name withNtfsPermissions() Change-Id: I759e702b63f8bed9384ccbfae6345f858e50830b Reviewed-by: Eike Ziller --- src/libs/utils/fileutils.cpp | 2 +- src/libs/utils/fileutils.h | 8 ++++---- src/plugins/coreplugin/dialogs/filepropertiesdialog.cpp | 4 ++-- src/plugins/qtsupport/gettingstartedwelcomepage.cpp | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index 776d7aa66fd..001dd70a05d 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -801,7 +801,7 @@ QTextStream &operator<<(QTextStream &s, const FileName &fn) #ifdef Q_OS_WIN template <> -void withNTFSPermissions(const std::function &task) +void withNtfsPermissions(const std::function &task) { qt_ntfs_permission_lookup++; task(); diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index b0068f43418..011069e1180 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -51,7 +51,7 @@ class QWidget; QTCREATOR_UTILS_EXPORT QDebug operator<<(QDebug dbg, const Utils::FileName &c); -// for withNTFSPermissions +// for withNtfsPermissions #ifdef Q_OS_WIN extern Q_CORE_EXPORT int qt_ntfs_permission_lookup; #endif @@ -135,7 +135,7 @@ public: #ifdef Q_OS_WIN template -T withNTFSPermissions(const std::function &task) +T withNtfsPermissions(const std::function &task) { qt_ntfs_permission_lookup++; T result = task(); @@ -144,12 +144,12 @@ T withNTFSPermissions(const std::function &task) } template <> -QTCREATOR_UTILS_EXPORT void withNTFSPermissions(const std::function &task); +QTCREATOR_UTILS_EXPORT void withNtfsPermissions(const std::function &task); #else // Q_OS_WIN template -T withNTFSPermissions(const std::function &task) +T withNtfsPermissions(const std::function &task) { return task(); } diff --git a/src/plugins/coreplugin/dialogs/filepropertiesdialog.cpp b/src/plugins/coreplugin/dialogs/filepropertiesdialog.cpp index 45dd3eea407..e2fc4f1c6a5 100644 --- a/src/plugins/coreplugin/dialogs/filepropertiesdialog.cpp +++ b/src/plugins/coreplugin/dialogs/filepropertiesdialog.cpp @@ -63,7 +63,7 @@ FilePropertiesDialog::~FilePropertiesDialog() void FilePropertiesDialog::refresh() { - Utils::withNTFSPermissions([this] { + Utils::withNtfsPermissions([this] { const QFileInfo fileInfo(m_fileName); QLocale locale; @@ -94,7 +94,7 @@ void FilePropertiesDialog::refresh() void FilePropertiesDialog::setPermission(QFile::Permissions newPermissions, bool set) { - Utils::withNTFSPermissions([this, newPermissions, set] { + Utils::withNtfsPermissions([this, newPermissions, set] { QFile::Permissions permissions = QFile::permissions(m_fileName); if (set) permissions |= newPermissions; diff --git a/src/plugins/qtsupport/gettingstartedwelcomepage.cpp b/src/plugins/qtsupport/gettingstartedwelcomepage.cpp index 0a71aca1e37..5e9b3dc0765 100644 --- a/src/plugins/qtsupport/gettingstartedwelcomepage.cpp +++ b/src/plugins/qtsupport/gettingstartedwelcomepage.cpp @@ -201,7 +201,7 @@ void ExamplesWelcomePage::openProject(const ExampleItem &item) // If the Qt is a distro Qt on Linux, it will not be writable, hence compilation will fail // Same if it is installed in non-writable location for other reasons - const bool needsCopy = withNTFSPermissions([proFileInfo] { + const bool needsCopy = withNtfsPermissions([proFileInfo] { QFileInfo pathInfo(proFileInfo.path()); return !proFileInfo.isWritable() || !pathInfo.isWritable() /* path of .pro file */ From 97fadb5c7fae1afec11d019371d55ab8972e8062 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Tue, 5 Jun 2018 23:18:16 +0300 Subject: [PATCH 18/19] CDB: Fix compilation This amends commit f8e88e8ce45a462f27d274c654e31a67032da757. Change-Id: Iec2e553c1e63fa6e25301d04eba0c7ad42f14d66 Reviewed-by: Christian Stenger --- src/libs/qtcreatorcdbext/symbolgroup.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/qtcreatorcdbext/symbolgroup.cpp b/src/libs/qtcreatorcdbext/symbolgroup.cpp index 52cf5d1645f..8404f0d77c0 100644 --- a/src/libs/qtcreatorcdbext/symbolgroup.cpp +++ b/src/libs/qtcreatorcdbext/symbolgroup.cpp @@ -251,7 +251,7 @@ std::string SymbolGroup::debug(const std::string &iname, typedef std::pair InamePathEntry; -struct InamePathEntryLessThan +struct InamePathEntryLessThan { bool operator()(const InamePathEntry &i1, const InamePathEntry& i2) const { if (i1.first < i2.first) From 5921376573bf57b09fa89fa788b94f2a5a1fdda9 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 6 Jun 2018 09:51:01 +0200 Subject: [PATCH 19/19] Bump version to 4.7.0-rc1 Change-Id: I8be1dbdc726ec2b5520dbceb19973337afb71583 Reviewed-by: Eike Ziller --- qbs/modules/qtc/qtc.qbs | 6 +++--- qtcreator.pri | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/qbs/modules/qtc/qtc.qbs b/qbs/modules/qtc/qtc.qbs index f3f3bf78271..49be0d86970 100644 --- a/qbs/modules/qtc/qtc.qbs +++ b/qbs/modules/qtc/qtc.qbs @@ -4,16 +4,16 @@ import qbs.FileInfo import "qtc.js" as HelperFunctions Module { - property string qtcreator_display_version: '4.7.0-beta1' + property string qtcreator_display_version: '4.7.0-rc1' property string ide_version_major: '4' property string ide_version_minor: '6' - property string ide_version_release: '82' + property string ide_version_release: '83' property string qtcreator_version: ide_version_major + '.' + ide_version_minor + '.' + ide_version_release property string ide_compat_version_major: '4' property string ide_compat_version_minor: '6' - property string ide_compat_version_release: '82' + property string ide_compat_version_release: '83' property string qtcreator_compat_version: ide_compat_version_major + '.' + ide_compat_version_minor + '.' + ide_compat_version_release diff --git a/qtcreator.pri b/qtcreator.pri index d7600b4c32e..6dfad0081d7 100644 --- a/qtcreator.pri +++ b/qtcreator.pri @@ -1,10 +1,10 @@ !isEmpty(QTCREATOR_PRI_INCLUDED):error("qtcreator.pri already included") QTCREATOR_PRI_INCLUDED = 1 -QTCREATOR_VERSION = 4.6.82 -QTCREATOR_COMPAT_VERSION = 4.6.82 +QTCREATOR_VERSION = 4.6.83 +QTCREATOR_COMPAT_VERSION = 4.6.83 VERSION = $$QTCREATOR_VERSION -QTCREATOR_DISPLAY_VERSION = 4.7.0-beta1 +QTCREATOR_DISPLAY_VERSION = 4.7.0-rc1 QTCREATOR_COPYRIGHT_YEAR = 2018 BINARY_ARTIFACTS_BRANCH = 4.6