diff --git a/src/plugins/clangcodemodel/clangutils.cpp b/src/plugins/clangcodemodel/clangutils.cpp index 7c5c5494935..dcd704b22f1 100644 --- a/src/plugins/clangcodemodel/clangutils.cpp +++ b/src/plugins/clangcodemodel/clangutils.cpp @@ -93,6 +93,7 @@ public: optionsBuilder.addOptionsForLanguage(/*checkForBorlandExtensions*/ true); optionsBuilder.addToolchainAndProjectDefines(); + optionsBuilder.undefineCppLanguageFeatureMacrosForMsvc2015(); optionsBuilder.addPredefinedMacrosAndHeaderPathsOptions(); optionsBuilder.addWrappedQtHeadersIncludePath(); diff --git a/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp b/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp index 1b2ace47379..2ad3cdf9f18 100644 --- a/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp +++ b/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp @@ -82,9 +82,7 @@ ClangStaticAnalyzerRunControl::ClangStaticAnalyzerRunControl( ToolChain *toolChain = ToolChainKitInformation::toolChain(target->kit()); QTC_ASSERT(toolChain, return); - Abi abi = runConfiguration->abi(); - m_extraToolChainInfo.wordWidth = abi.wordWidth(); - m_extraToolChainInfo.isMsvc2015 = abi.osFlavor() == Abi::WindowsMsvc2015Flavor; + m_extraToolChainInfo.wordWidth = runConfiguration->abi().wordWidth(); m_extraToolChainInfo.targetTriple = toolChain->originalTargetTriple(); } @@ -142,54 +140,6 @@ QStringList inputAndOutputArgumentsRemoved(const QString &inputFile, const QStri return newArguments; } -static QStringList languageFeatureMacros() -{ - // Collected with: - // $ CALL "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86 - // $ D:\usr\llvm-3.8.0\bin\clang++.exe -fms-compatibility-version=19 -std=c++1y -dM -E D:\empty.cpp | grep __cpp_ - static QStringList macros { - QLatin1String("__cpp_aggregate_nsdmi"), - QLatin1String("__cpp_alias_templates"), - QLatin1String("__cpp_attributes"), - QLatin1String("__cpp_binary_literals"), - QLatin1String("__cpp_constexpr"), - QLatin1String("__cpp_decltype"), - QLatin1String("__cpp_decltype_auto"), - QLatin1String("__cpp_delegating_constructors"), - QLatin1String("__cpp_digit_separators"), - QLatin1String("__cpp_generic_lambdas"), - QLatin1String("__cpp_inheriting_constructors"), - QLatin1String("__cpp_init_captures"), - QLatin1String("__cpp_initializer_lists"), - QLatin1String("__cpp_lambdas"), - QLatin1String("__cpp_nsdmi"), - QLatin1String("__cpp_range_based_for"), - QLatin1String("__cpp_raw_strings"), - QLatin1String("__cpp_ref_qualifiers"), - QLatin1String("__cpp_return_type_deduction"), - QLatin1String("__cpp_rtti"), - QLatin1String("__cpp_rvalue_references"), - QLatin1String("__cpp_static_assert"), - QLatin1String("__cpp_unicode_characters"), - QLatin1String("__cpp_unicode_literals"), - QLatin1String("__cpp_user_defined_literals"), - QLatin1String("__cpp_variable_templates"), - QLatin1String("__cpp_variadic_templates"), - }; - - return macros; -} - -static void undefineCppLanguageFeatureMacrosForMsvc2015(QStringList *arguments, bool isMsvc2015) -{ - QTC_ASSERT(arguments, return); - - if (isMsvc2015) { - foreach (const QString ¯oName, languageFeatureMacros()) - arguments->append(QLatin1String("/U") + macroName); - } -} - static QString createLanguageOptionMsvc(ProjectFile::Kind fileKind) { switch (fileKind) { @@ -230,6 +180,7 @@ public: optionsBuilder.addDefine("#define _X86INTRIN_H_INCLUDED\n"); optionsBuilder.addToolchainAndProjectDefines(); + optionsBuilder.undefineCppLanguageFeatureMacrosForMsvc2015(); optionsBuilder.addHeaderPathOptions(); optionsBuilder.addMsvcCompatibilityVersion(); @@ -240,7 +191,6 @@ public: QStringList options = optionsBuilder.options(); prependWordWidthArgumentIfNotIncluded(&options, extraParams.wordWidth); - undefineCppLanguageFeatureMacrosForMsvc2015(&options, extraParams.isMsvc2015); return options; } @@ -303,6 +253,15 @@ static QStringList createMsCompatibilityVersionOption(const ProjectPart &project return option; } +static QStringList createOptionsToUndefineCppLanguageFeatureMacrosForMsvc2015( + const ProjectPart &projectPart) +{ + ClangStaticAnalyzerOptionsBuilder optionsBuilder(projectPart); + optionsBuilder.undefineCppLanguageFeatureMacrosForMsvc2015(); + + return optionsBuilder.options(); +} + static QStringList tweakedArguments(const ProjectPart &projectPart, const QString &filePath, const QStringList &arguments, @@ -312,7 +271,7 @@ static QStringList tweakedArguments(const ProjectPart &projectPart, prependWordWidthArgumentIfNotIncluded(&newArguments, extraParams.wordWidth); prependTargetTripleIfNotIncludedAndNotEmpty(&newArguments, extraParams.targetTriple); newArguments.append(createMsCompatibilityVersionOption(projectPart)); - undefineCppLanguageFeatureMacrosForMsvc2015(&newArguments, extraParams.isMsvc2015); + newArguments.append(createOptionsToUndefineCppLanguageFeatureMacrosForMsvc2015(projectPart)); return newArguments; } diff --git a/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h b/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h index c05a5714fd3..525b2a351d2 100644 --- a/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h +++ b/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h @@ -51,7 +51,6 @@ typedef QList AnalyzeUnits; struct ExtraToolChainInfo { unsigned char wordWidth = 0; QString targetTriple; - bool isMsvc2015 = false; }; class ClangStaticAnalyzerRunControl : public Debugger::AnalyzerRunControl diff --git a/src/plugins/cpptools/compileroptionsbuilder.cpp b/src/plugins/cpptools/compileroptionsbuilder.cpp index 6de6a44d5dc..5b176286826 100644 --- a/src/plugins/cpptools/compileroptionsbuilder.cpp +++ b/src/plugins/cpptools/compileroptionsbuilder.cpp @@ -283,6 +283,55 @@ void CompilerOptionsBuilder::addMsvcCompatibilityVersion() } } +static QStringList languageFeatureMacros() +{ + // Collected with: + // $ CALL "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86 + // $ D:\usr\llvm-3.8.0\bin\clang++.exe -fms-compatibility-version=19 -std=c++1y -dM -E D:\empty.cpp | grep __cpp_ + static QStringList macros { + QLatin1String("__cpp_aggregate_nsdmi"), + QLatin1String("__cpp_alias_templates"), + QLatin1String("__cpp_attributes"), + QLatin1String("__cpp_binary_literals"), + QLatin1String("__cpp_constexpr"), + QLatin1String("__cpp_decltype"), + QLatin1String("__cpp_decltype_auto"), + QLatin1String("__cpp_delegating_constructors"), + QLatin1String("__cpp_digit_separators"), + QLatin1String("__cpp_generic_lambdas"), + QLatin1String("__cpp_inheriting_constructors"), + QLatin1String("__cpp_init_captures"), + QLatin1String("__cpp_initializer_lists"), + QLatin1String("__cpp_lambdas"), + QLatin1String("__cpp_nsdmi"), + QLatin1String("__cpp_range_based_for"), + QLatin1String("__cpp_raw_strings"), + QLatin1String("__cpp_ref_qualifiers"), + QLatin1String("__cpp_return_type_deduction"), + QLatin1String("__cpp_rtti"), + QLatin1String("__cpp_rvalue_references"), + QLatin1String("__cpp_static_assert"), + QLatin1String("__cpp_unicode_characters"), + QLatin1String("__cpp_unicode_literals"), + QLatin1String("__cpp_user_defined_literals"), + QLatin1String("__cpp_variable_templates"), + QLatin1String("__cpp_variadic_templates"), + }; + + return macros; +} + +void CompilerOptionsBuilder::undefineCppLanguageFeatureMacrosForMsvc2015() +{ + if (m_projectPart.toolchainType == ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID + && m_projectPart.isMsvc2015Toolchain) { + // Undefine the language feature macros that are pre-defined in clang-cl 3.8.0, + // but not in MSVC2015's cl.exe. + foreach (const QString ¯oName, languageFeatureMacros()) + m_options.append(QLatin1String("/U") + macroName); + } +} + QString CompilerOptionsBuilder::includeOption() const { return QLatin1String("-I"); diff --git a/src/plugins/cpptools/compileroptionsbuilder.h b/src/plugins/cpptools/compileroptionsbuilder.h index e2c38f02258..93fba1ef09f 100644 --- a/src/plugins/cpptools/compileroptionsbuilder.h +++ b/src/plugins/cpptools/compileroptionsbuilder.h @@ -52,6 +52,7 @@ public: virtual void addOptionsForLanguage(bool checkForBorlandExtensions = true); void addMsvcCompatibilityVersion(); + void undefineCppLanguageFeatureMacrosForMsvc2015(); protected: virtual bool excludeDefineLine(const QByteArray &defineLine) const; diff --git a/src/plugins/cpptools/projectpart.cpp b/src/plugins/cpptools/projectpart.cpp index 8d714ab91ec..e091c50483e 100644 --- a/src/plugins/cpptools/projectpart.cpp +++ b/src/plugins/cpptools/projectpart.cpp @@ -32,6 +32,7 @@ namespace CppTools { ProjectPart::ProjectPart() : project(0) + , isMsvc2015Toolchain(false) , languageVersion(CXX14) , languageExtensions(NoExtensions) , qtVersion(UnknownQt) diff --git a/src/plugins/cpptools/projectpart.h b/src/plugins/cpptools/projectpart.h index 0f379ccfe3c..897b1ed20bf 100644 --- a/src/plugins/cpptools/projectpart.h +++ b/src/plugins/cpptools/projectpart.h @@ -104,6 +104,7 @@ public: // fields QByteArray projectDefines; QByteArray toolchainDefines; Core::Id toolchainType; + bool isMsvc2015Toolchain; QString targetTriple; ProjectPartHeaderPaths headerPaths; QStringList precompiledHeaders; diff --git a/src/plugins/cpptools/projectpartbuilder.cpp b/src/plugins/cpptools/projectpartbuilder.cpp index 2cc08c7bd5d..51b93a0c38d 100644 --- a/src/plugins/cpptools/projectpartbuilder.cpp +++ b/src/plugins/cpptools/projectpartbuilder.cpp @@ -28,10 +28,12 @@ #include "cppprojectfile.h" #include "cpptoolsconstants.h" +#include #include #include #include #include +#include #include #include @@ -279,6 +281,18 @@ QString targetTriple(ProjectExplorer::Project *project, const Core::Id &toolchai return QString(); } +bool projectHasMsvc2015Toolchain(ProjectExplorer::Project *project) +{ + if (project) { + if (ProjectExplorer::Target *target = project->activeTarget()) { + if (ProjectExplorer::RunConfiguration *runConfig = target->activeRunConfiguration()) + return runConfig->abi().osFlavor() == ProjectExplorer::Abi::WindowsMsvc2015Flavor; + } + } + + return false; +} + } /*! @@ -341,6 +355,7 @@ void ProjectPartBuilder::evaluateProjectPartToolchain( projectPart->toolchainDefines = toolChain->predefinedMacros(commandLineFlags); projectPart->toolchainType = toolChain->typeId(); + projectPart->isMsvc2015Toolchain = projectHasMsvc2015Toolchain(projectPart->project); projectPart->targetTriple = targetTriple(projectPart->project, toolChain->typeId()); projectPart->updateLanguageFeatures(); }