summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools/compileroptionsbuilder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/cpptools/compileroptionsbuilder.cpp')
-rw-r--r--src/plugins/cpptools/compileroptionsbuilder.cpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/plugins/cpptools/compileroptionsbuilder.cpp b/src/plugins/cpptools/compileroptionsbuilder.cpp
index 6de6a44d5d..5b17628682 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 &macroName, languageFeatureMacros())
+ m_options.append(QLatin1String("/U") + macroName);
+ }
+}
+
QString CompilerOptionsBuilder::includeOption() const
{
return QLatin1String("-I");