diff options
-rw-r--r-- | CMakeLists.txt | 6 | ||||
-rw-r--r-- | src/app/main.cpp | 5 | ||||
-rw-r--r-- | src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp | 7 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtidyclazyrunner.cpp | 10 | ||||
-rw-r--r-- | src/plugins/cmakeprojectmanager/fileapidataextractor.cpp | 2 | ||||
-rw-r--r-- | src/plugins/cpptools/compileroptionsbuilder.cpp | 12 | ||||
-rw-r--r-- | src/plugins/cpptools/compileroptionsbuilder.h | 1 | ||||
-rw-r--r-- | src/plugins/cpptools/cpptoolsreuse.cpp | 1 | ||||
-rw-r--r-- | src/plugins/cpptools/headerpathfilter.cpp | 13 | ||||
-rw-r--r-- | tests/unit/unittest/compileroptionsbuilder-test.cpp | 20 | ||||
-rw-r--r-- | tests/unit/unittest/headerpathfilter-test.cpp | 6 |
11 files changed, 67 insertions, 16 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 5f42e82315..7587105c1d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -100,6 +100,12 @@ endif() install(TARGETS OptionalSvg EXPORT QtCreator) find_package(Clang COMPONENTS libclang QUIET) +# silence a lot of warnings from building against llvm +# this would better fit inside a central libclang detection/include cmake file, but since we do not +# have one put it temporary here +if(MSVC AND TARGET libclang) + target_compile_options(libclang INTERFACE /wd4100 /wd4141 /wd4146 /wd4244 /wd4267 /wd4291) +endif() find_package(LLVM QUIET) if (APPLE) diff --git a/src/app/main.cpp b/src/app/main.cpp index 4b74be64dc..e0c9cd72bd 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -335,6 +335,11 @@ static void setHighDpiEnvironmentVariable() && !qEnvironmentVariableIsSet("QT_SCALE_FACTOR") && !qEnvironmentVariableIsSet("QT_SCREEN_SCALE_FACTORS")) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); +#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) + // work around QTBUG-80934 + QGuiApplication::setHighDpiScaleFactorRoundingPolicy( + Qt::HighDpiScaleFactorRoundingPolicy::Round); +#endif } } diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp index 51acd3a5a6..718b0dad28 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp @@ -441,6 +441,7 @@ public: { // Determine the driver mode from toolchain and flags. m_builder.evaluateCompilerFlags(); + m_isClMode = m_builder.isClStyle(); addLanguageOptions(); addGlobalDiagnosticOptions(); // Before addDiagnosticOptions() so users still can overwrite. @@ -498,7 +499,10 @@ private: ? CppTools::UseBuildSystemWarnings::Yes : CppTools::UseBuildSystemWarnings::No; - m_options.append(diagnosticConfig.clangOptions()); + const QStringList options = m_isClMode + ? CppTools::clangArgsForCl(diagnosticConfig.clangOptions()) + : diagnosticConfig.clangOptions(); + m_options.append(options); } void addGlobalDiagnosticOptions() @@ -537,6 +541,7 @@ private: Core::Id m_diagnosticConfigId; CppTools::UseBuildSystemWarnings m_useBuildSystemWarnings = CppTools::UseBuildSystemWarnings::No; CppTools::CompilerOptionsBuilder m_builder; + bool m_isClMode = false; QStringList m_options; }; } // namespace diff --git a/src/plugins/clangtools/clangtidyclazyrunner.cpp b/src/plugins/clangtools/clangtidyclazyrunner.cpp index 08bb13b478..166d1c94e0 100644 --- a/src/plugins/clangtools/clangtidyclazyrunner.cpp +++ b/src/plugins/clangtools/clangtidyclazyrunner.cpp @@ -48,11 +48,16 @@ using namespace CppTools; namespace ClangTools { namespace Internal { +static bool isClMode(const QStringList &options) +{ + return options.contains("--driver-mode=cl"); +} + static QStringList serializeDiagnosticsArguments(const QStringList &baseOptions, const QString &outputFilePath) { const QStringList serializeArgs{"-serialize-diagnostics", outputFilePath}; - if (baseOptions.contains("--driver-mode=cl")) + if (isClMode(baseOptions)) return clangArgsForCl(serializeArgs); return serializeArgs; } @@ -102,7 +107,8 @@ static QStringList clangArguments(const ClangDiagnosticConfig &diagnosticConfig, { QStringList arguments; arguments << ClangDiagnosticConfigsModel::globalDiagnosticOptions() - << diagnosticConfig.clangOptions() + << (isClMode(baseOptions) ? CppTools::clangArgsForCl(diagnosticConfig.clangOptions()) + : diagnosticConfig.clangOptions()) << baseOptions; if (LOG().isDebugEnabled()) diff --git a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp index 877b3111d1..f1a55a5031 100644 --- a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp +++ b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp @@ -467,7 +467,7 @@ void addCompileGroups(ProjectNode *targetRoot, if (sourcePath.isChildOf(buildDirectory) && !inSourceBuild) { buildFileNodes.emplace_back(std::move(node)); } else if (sourcePath.isChildOf(sourceDirectory)) { - sourceGroupNodes[si.sourceGroup]->addNode(std::move(node)); + sourceGroupNodes[si.sourceGroup]->addNestedNode(std::move(node)); } else { otherFileNodes.emplace_back(std::move(node)); } diff --git a/src/plugins/cpptools/compileroptionsbuilder.cpp b/src/plugins/cpptools/compileroptionsbuilder.cpp index 1f15ebddda..fcce3d6cc5 100644 --- a/src/plugins/cpptools/compileroptionsbuilder.cpp +++ b/src/plugins/cpptools/compileroptionsbuilder.cpp @@ -138,6 +138,7 @@ QStringList CompilerOptionsBuilder::build(ProjectFile::Kind fileKind, addTargetTriple(); updateFileLanguage(fileKind); addLanguageVersionAndExtensions(); + enableExceptions(); addPrecompiledHeaderOptions(usePrecompiledHeaders); addProjectConfigFileInclude(); @@ -272,6 +273,17 @@ void CompilerOptionsBuilder::addCompilerFlags() add(m_compilerFlags.flags); } +void CompilerOptionsBuilder::enableExceptions() +{ + // With "--driver-mode=cl" exceptions are disabled (clang 8). + // This is most likely due to incomplete exception support of clang. + // However, as we need exception support only in the frontend, + // enabling them explicitly should be fine. + if (m_projectPart.languageVersion > ::Utils::LanguageVersion::LatestC) + add("-fcxx-exceptions"); + add("-fexceptions"); +} + static QString creatorResourcePath() { #ifndef UNIT_TESTS diff --git a/src/plugins/cpptools/compileroptionsbuilder.h b/src/plugins/cpptools/compileroptionsbuilder.h index 5b7c682407..b2c8313771 100644 --- a/src/plugins/cpptools/compileroptionsbuilder.h +++ b/src/plugins/cpptools/compileroptionsbuilder.h @@ -69,6 +69,7 @@ public: void addExtraCodeModelFlags(); void addPicIfCompilerFlagsContainsIt(); void addCompilerFlags(); + void enableExceptions(); void insertWrappedQtHeaders(); void addLanguageVersionAndExtensions(); void updateFileLanguage(ProjectFile::Kind fileKind); diff --git a/src/plugins/cpptools/cpptoolsreuse.cpp b/src/plugins/cpptools/cpptoolsreuse.cpp index 4753053cde..4769260d54 100644 --- a/src/plugins/cpptools/cpptoolsreuse.cpp +++ b/src/plugins/cpptools/cpptoolsreuse.cpp @@ -355,7 +355,6 @@ static void addBuiltinConfigs(ClangDiagnosticConfigsModel &model) config.setClangOptions({ "-Wall", "-Wextra", - "-Wno-c++98-compat" }); model.appendOrUpdate(config); diff --git a/src/plugins/cpptools/headerpathfilter.cpp b/src/plugins/cpptools/headerpathfilter.cpp index b656f8e136..c7265e4044 100644 --- a/src/plugins/cpptools/headerpathfilter.cpp +++ b/src/plugins/cpptools/headerpathfilter.cpp @@ -71,15 +71,10 @@ void HeaderPathFilter::removeGccInternalIncludePaths() return; const Utils::FilePath gccInstallDir = projectPart.toolChainInstallDir; - auto isGccInternalInclude = [gccInstallDir](const HeaderPath &headerPath){ - const auto includePath = Utils::FilePath::fromString(headerPath.path); - if (includePath.isChildOf(gccInstallDir)) { - const QString remainingPath = headerPath.path.mid(gccInstallDir.toString().size()); - // MinGW ships the standard library headers in "<installdir>/include/c++". - // Ensure that we do not remove include paths pointing there. - return !remainingPath.startsWith("/include/c++"); - } - return false; + auto isGccInternalInclude = [gccInstallDir](const HeaderPath &headerPath) { + const auto filePath = Utils::FilePath::fromString(headerPath.path); + return filePath == gccInstallDir.pathAppended("include") + || filePath == gccInstallDir.pathAppended("include-fixed"); }; Utils::erase(builtInHeaderPaths, isGccInternalInclude); diff --git a/tests/unit/unittest/compileroptionsbuilder-test.cpp b/tests/unit/unittest/compileroptionsbuilder-test.cpp index df11072707..2a6bfd8462 100644 --- a/tests/unit/unittest/compileroptionsbuilder-test.cpp +++ b/tests/unit/unittest/compileroptionsbuilder-test.cpp @@ -444,6 +444,22 @@ TEST_F(CompilerOptionsBuilder, AddTargetTriple) ASSERT_THAT(compilerOptionsBuilder.options(), ElementsAre("--target=x86_64-apple-darwin10")); } +TEST_F(CompilerOptionsBuilder, EnableCExceptions) +{ + projectPart.languageVersion = Utils::LanguageVersion::C99; + + compilerOptionsBuilder.enableExceptions(); + + ASSERT_THAT(compilerOptionsBuilder.options(), ElementsAre("-fexceptions")); +} + +TEST_F(CompilerOptionsBuilder, EnableCXXExceptions) +{ + compilerOptionsBuilder.enableExceptions(); + + ASSERT_THAT(compilerOptionsBuilder.options(), ElementsAre("-fcxx-exceptions", "-fexceptions")); +} + TEST_F(CompilerOptionsBuilder, InsertWrappedQtHeaders) { CppTools::CompilerOptionsBuilder compilerOptionsBuilder{projectPart, @@ -601,6 +617,8 @@ TEST_F(CompilerOptionsBuilder, BuildAllOptions) "-x", "c++", "-std=c++17", + "-fcxx-exceptions", + "-fexceptions", "-DprojectFoo=projectBar", "-I", IsPartOfHeader("wrappedQtHeaders"), "-I", IsPartOfHeader(toNative("wrappedQtHeaders/QtCore").toStdString()), @@ -632,6 +650,8 @@ TEST_F(CompilerOptionsBuilder, BuildAllOptionsCl) "--target=x86_64-apple-darwin10", "/TP", "/std:c++17", + "-fcxx-exceptions", + "-fexceptions", "-fms-compatibility-version=19.00", "-DprojectFoo=projectBar", "-D__FUNCSIG__=\"\"", diff --git a/tests/unit/unittest/headerpathfilter-test.cpp b/tests/unit/unittest/headerpathfilter-test.cpp index da9d735f49..b5589e8ec3 100644 --- a/tests/unit/unittest/headerpathfilter-test.cpp +++ b/tests/unit/unittest/headerpathfilter-test.cpp @@ -245,7 +245,8 @@ TEST_F(HeaderPathFilter, ClangHeadersAndCppIncludesPathsOrderLinux) HasBuiltIn("/builtin_path"))); } -// Include paths below the installation dir should be removed as they confuse clang. +// GCC-internal include paths like <installdir>/include and <installdir/include-next> might confuse +// clang and should be filtered out. clang on the command line filters them out, too. TEST_F(HeaderPathFilter, RemoveGccInternalPaths) { projectPart.toolChainInstallDir = Utils::FilePath::fromUtf8("/usr/lib/gcc/x86_64-linux-gnu/7"); @@ -264,7 +265,8 @@ TEST_F(HeaderPathFilter, RemoveGccInternalPaths) ASSERT_THAT(filter.builtInHeaderPaths, ElementsAre(HasBuiltIn(CLANG_RESOURCE_DIR))); } -// MinGW ships the standard library headers in "<installdir>/include/c++". +// Some distributions ship the standard library headers in "<installdir>/include/c++" (MinGW) +// or e.g. "<installdir>/include/g++-v8" (Gentoo). // Ensure that we do not remove include paths pointing there. TEST_F(HeaderPathFilter, RemoveGccInternalPathsExceptForStandardPaths) { |