diff --git a/dist/changes-4.11.1.md b/dist/changes-4.11.1.md new file mode 100644 index 00000000000..f2718ca6bcb --- /dev/null +++ b/dist/changes-4.11.1.md @@ -0,0 +1,57 @@ +# Qt Creator 4.11.1 + +Qt Creator version 4.11.1 contains bug fixes. + +The most important changes are listed in this document. For a complete +list of changes, see the Git log for the Qt Creator sources that +you can check out from the public Git repository. For example: + + git clone git://code.qt.io/qt-creator/qt-creator.git + git log --cherry-pick --pretty=oneline origin/v4.11.0..v4.11.1 + +## Editing + +* Fixed `Visualize Whitespace` for editors without specialized highlighter definition + (QTCREATORBUG-23040) + +### C++ + +* Fixed wrong warnings about C++98 incompatibility with MSVC (QTCREATORBUG-23118) +* Fixed accidentally added internal include paths from GCC (QTCREATORBUG-23330) + +### FakeVim + +* Fixed goto next and previous split (QTCREATORBUG-22397) +* Fixed indentation of continuation lines (QTCREATORBUG-20876) + +## Projects + +* Fixed crash when closing application output + +### CMake + +* Fixed subdirectory structure in project tree (QTCREATORBUG-23372) + +## Qt Quick Designer + +* Fixed removing single signals from Connection (QDS-1333) + +## Test Integration + +* Fixed stopping tests when debugging (QTCREATORBUG-23298) + +## Platforms + +### Windows + +* Worked around issue with HiDPI in Qt (QTBUG-80934) + +### WebAssembly + +* Fixed missing device in kit (QTCREATORBUG-23360) + +### QNX + +* Fixed deployment of Qt examples (QTCREATORBUG-22592) + +## Credits for these changes go to: diff --git a/doc/src/editors/creator-code-refactoring.qdoc b/doc/src/editors/creator-code-refactoring.qdoc index 8120a0543cd..f333c92bc42 100644 --- a/doc/src/editors/creator-code-refactoring.qdoc +++ b/doc/src/editors/creator-code-refactoring.qdoc @@ -755,7 +755,7 @@ as \code - QByteArray foo = "foo"; + QByteArray foo("foo"); foo.append("bar"); \endcode diff --git a/share/qtcreator/templates/wizards/projects/qtquickapplication/app.qbs b/share/qtcreator/templates/wizards/projects/qtquickapplication/app.qbs index f06fb39824b..b22af44529d 100644 --- a/share/qtcreator/templates/wizards/projects/qtquickapplication/app.qbs +++ b/share/qtcreator/templates/wizards/projects/qtquickapplication/app.qbs @@ -1,6 +1,6 @@ import qbs -Application { +CppApplication { @if "%{UseVirtualKeyboard}" == "true" Depends { name: "Qt"; submodules: ["quick", "virtualkeyboard"] } @else diff --git a/src/plugins/cmakeprojectmanager/configmodelitemdelegate.cpp b/src/plugins/cmakeprojectmanager/configmodelitemdelegate.cpp index 726f532ce6a..9be346a0fda 100644 --- a/src/plugins/cmakeprojectmanager/configmodelitemdelegate.cpp +++ b/src/plugins/cmakeprojectmanager/configmodelitemdelegate.cpp @@ -2,17 +2,25 @@ ** ** Copyright (C) 2016 Alexander Drozdov. ** Contact: adrozdoff@gmail.com +** Contact: https://www.qt.io/licensing/ ** -** This file is part of CMakeProjectManager2 plugin. +** This file is part of Qt Creator. ** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ****************************************************************************/ diff --git a/src/plugins/cmakeprojectmanager/configmodelitemdelegate.h b/src/plugins/cmakeprojectmanager/configmodelitemdelegate.h index d33fb48c7a0..5df8decd113 100644 --- a/src/plugins/cmakeprojectmanager/configmodelitemdelegate.h +++ b/src/plugins/cmakeprojectmanager/configmodelitemdelegate.h @@ -2,17 +2,25 @@ ** ** Copyright (C) 2016 Alexander Drozdov. ** Contact: adrozdoff@gmail.com +** Contact: https://www.qt.io/licensing/ ** -** This file is part of CMakeProjectManager2 plugin. +** This file is part of Qt Creator. ** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ****************************************************************************/ diff --git a/src/plugins/cppeditor/cppquickfix_test.cpp b/src/plugins/cppeditor/cppquickfix_test.cpp index 63f1290b6ac..e75464d2b56 100644 --- a/src/plugins/cppeditor/cppquickfix_test.cpp +++ b/src/plugins/cppeditor/cppquickfix_test.cpp @@ -1578,7 +1578,7 @@ void CppEditorPlugin::test_quickfix_data() " f2(&str);\n" "}\n") << _("void foo() {\n" - " QString *str;\n" + " QString *str = new QString;\n" " if (!str->isEmpty())\n" " str->clear();\n" " f1(*str);\n" @@ -1612,7 +1612,7 @@ void CppEditorPlugin::test_quickfix_data() " str->clear();\n" "}\n") << _("void foo() {\n" - " QString str = QLatin1String(\"schnurz\");\n" + " QString str(QLatin1String(\"schnurz\"));\n" " if (!str.isEmpty())\n" " str.clear();\n" "}\n"); @@ -1731,7 +1731,7 @@ void CppEditorPlugin::test_quickfix_data() " f1(str);\n" "}\n") << _("void foo() {\n" - " QString *str;\n" + " QString *str = new QString;\n" " str->clear();\n" " {\n" " QString str;\n" @@ -1808,6 +1808,45 @@ void CppEditorPlugin::test_quickfix_data() " BAR = *foo;\n" "}\n"); + QString testObjAndFunc = "struct Object\n" + "{\n" + " Object(%1){}\n" + "};\n" + "void func()\n" + "{\n" + " %2\n" + "}\n"; + + QTest::newRow("ConvertToStack1_QTCREATORBUG23181") + << CppQuickFixFactoryPtr(new ConvertFromAndToPointer) + << _(testObjAndFunc.arg("int").arg("Object *@obj = new Object(0);").toUtf8()) + << _(testObjAndFunc.arg("int").arg("Object obj(0);").toUtf8()); + + QTest::newRow("ConvertToStack2_QTCREATORBUG23181") + << CppQuickFixFactoryPtr(new ConvertFromAndToPointer) + << _(testObjAndFunc.arg("int").arg("Object *@obj = new Object{0};").toUtf8()) + << _(testObjAndFunc.arg("int").arg("Object obj{0};").toUtf8()); + + QTest::newRow("ConvertToPointer1_QTCREATORBUG23181") + << CppQuickFixFactoryPtr(new ConvertFromAndToPointer) + << _(testObjAndFunc.arg("").arg("Object @obj;").toUtf8()) + << _(testObjAndFunc.arg("").arg("Object *obj = new Object;").toUtf8()); + + QTest::newRow("ConvertToPointer2_QTCREATORBUG23181") + << CppQuickFixFactoryPtr(new ConvertFromAndToPointer) + << _(testObjAndFunc.arg("").arg("Object @obj();").toUtf8()) + << _(testObjAndFunc.arg("").arg("Object *obj = new Object();").toUtf8()); + + QTest::newRow("ConvertToPointer3_QTCREATORBUG23181") + << CppQuickFixFactoryPtr(new ConvertFromAndToPointer) + << _(testObjAndFunc.arg("").arg("Object @obj{};").toUtf8()) + << _(testObjAndFunc.arg("").arg("Object *obj = new Object{};").toUtf8()); + + QTest::newRow("ConvertToPointer4_QTCREATORBUG23181") + << CppQuickFixFactoryPtr(new ConvertFromAndToPointer) + << _(testObjAndFunc.arg("int").arg("Object @obj(0);").toUtf8()) + << _(testObjAndFunc.arg("int").arg("Object *obj = new Object(0);").toUtf8()); + QTest::newRow("InsertQtPropertyMembers_noTriggerInvalidCode") << CppQuickFixFactoryPtr(new InsertQtPropertyMembers) << _("class C { @Q_PROPERTY(typeid foo READ foo) };\n") diff --git a/src/plugins/cppeditor/cppquickfixes.cpp b/src/plugins/cppeditor/cppquickfixes.cpp index c1bf3c42b43..b9aac32df28 100644 --- a/src/plugins/cppeditor/cppquickfixes.cpp +++ b/src/plugins/cppeditor/cppquickfixes.cpp @@ -4153,20 +4153,21 @@ private: void removeNewExpression(ChangeSet &changes, NewExpressionAST *newExprAST) const { - ExpressionListParenAST *exprlist = newExprAST->new_initializer - ? newExprAST->new_initializer->asExpressionListParen() - : nullptr; + ExpressionListAST *exprlist = nullptr; + if (newExprAST->new_initializer) { + if (ExpressionListParenAST *ast = newExprAST->new_initializer->asExpressionListParen()) + exprlist = ast->expression_list; + else if (BracedInitializerAST *ast = newExprAST->new_initializer->asBracedInitializer()) + exprlist = ast->expression_list; + } - if (exprlist && exprlist->expression_list) { + if (exprlist) { // remove 'new' keyword and type before initializer changes.remove(m_file->startOf(newExprAST->new_token), m_file->startOf(newExprAST->new_initializer)); - // remove parenthesis around initializer - int pos = m_file->startOf(exprlist->lparen_token); - changes.remove(pos, pos + 1); - pos = m_file->startOf(exprlist->rparen_token); - changes.remove(pos, pos + 1); + changes.remove(m_file->endOf(m_declaratorAST->equal_token - 1), + m_file->startOf(m_declaratorAST->equal_token + 1)); } else { // remove the whole new expression changes.remove(m_file->endOf(m_identifierAST->firstToken()), @@ -4272,24 +4273,30 @@ private: return overview.prettyName(namedType->name->name); } - void insertNewExpression(ChangeSet &changes, CallAST *callAST) const + void insertNewExpression(ChangeSet &changes, ExpressionAST *ast) const { const QString typeName = typeNameOfDeclaration(); - if (typeName.isEmpty()) { - changes.insert(m_file->startOf(callAST), QLatin1String("new ")); + if (CallAST *callAST = ast->asCall()) { + if (typeName.isEmpty()) { + changes.insert(m_file->startOf(callAST), QLatin1String("new ")); + } else { + changes.insert(m_file->startOf(callAST), + QLatin1String("new ") + typeName + QLatin1Char('(')); + changes.insert(m_file->startOf(callAST->lastToken()), QLatin1String(")")); + } } else { - changes.insert(m_file->startOf(callAST), - QLatin1String("new ") + typeName + QLatin1Char('(')); - changes.insert(m_file->startOf(callAST->lastToken()), QLatin1String(")")); + if (typeName.isEmpty()) + return; + changes.insert(m_file->startOf(ast), QLatin1String(" = new ") + typeName); } } - void insertNewExpression(ChangeSet &changes, ExpressionListParenAST *exprListAST) const + void insertNewExpression(ChangeSet &changes) const { const QString typeName = typeNameOfDeclaration(); if (typeName.isEmpty()) return; - changes.insert(m_file->startOf(exprListAST), + changes.insert(m_file->endOf(m_identifierAST->firstToken()), QLatin1String(" = new ") + typeName); } @@ -4301,10 +4308,15 @@ private: changes.insert(m_file->startOf(idExprAST), QLatin1String("&")); } else if (CallAST *callAST = m_declaratorAST->initializer->asCall()) { insertNewExpression(changes, callAST); - } else if (ExpressionListParenAST *exprListAST - = m_declaratorAST->initializer->asExpressionListParen()) { + } else if (ExpressionListParenAST *exprListAST = m_declaratorAST->initializer + ->asExpressionListParen()) { insertNewExpression(changes, exprListAST); + } else if (BracedInitializerAST *bracedInitializerAST = m_declaratorAST->initializer + ->asBracedInitializer()) { + insertNewExpression(changes, bracedInitializerAST); } + } else { + insertNewExpression(changes); } // Fix all occurrences of the identifier in this function. diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp index 24a0a364279..1dd1bac5891 100644 --- a/src/plugins/debugger/debuggerengine.cpp +++ b/src/plugins/debugger/debuggerengine.cpp @@ -1826,7 +1826,8 @@ void DebuggerEngine::setState(DebuggerState state, bool forced) if (state == EngineRunRequested) { emit engineStarted(); - d->m_perspective->select(); + if (d->m_perspective) + d->m_perspective->select(); } showMessage(msg, LogDebug); diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp index c13772ed6fe..b8f2fb6d36f 100644 --- a/src/plugins/projectexplorer/gcctoolchain.cpp +++ b/src/plugins/projectexplorer/gcctoolchain.cpp @@ -52,6 +52,7 @@ #include #include #include +#include #include @@ -93,9 +94,11 @@ static QByteArray runGcc(const FilePath &gcc, const QStringList &arguments, cons SynchronousProcessResponse response = cpp.runBlocking(cmdLine); if (response.result != SynchronousProcessResponse::Finished || response.exitCode != 0) { - Core::MessageManager::write("Compiler feature detection failure!"); - Core::MessageManager::write(response.exitMessage(cmdLine.toUserOutput(), 10)); - Core::MessageManager::write(QString::fromUtf8(response.allRawOutput())); + QTimer::singleShot(0, Core::MessageManager::instance(), [cmdLine, response] { + Core::MessageManager::write("Compiler feature detection failure!"); + Core::MessageManager::write(response.exitMessage(cmdLine.toUserOutput(), 10)); + Core::MessageManager::write(QString::fromUtf8(response.allRawOutput())); + }); return QByteArray(); }