aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorIvan Donchevskii <ivan.donchevskii@qt.io>2018-04-30 10:20:22 +0200
committerIvan Donchevskii <ivan.donchevskii@qt.io>2018-05-03 08:25:31 +0000
commit0a7d24c730bca165f95e85d94a2c1d13fa586a65 (patch)
treef609c64f08f0f47913397db8b9f1aee909a31131 /src
parenteecbfc214eeb3c0e5433123ca62d5359023ba696 (diff)
CppTools: Fix MSVC toolchain flags for C-files
In case of C-header or C-source files the MSVC language version was not switched to C. Fixes static analyzer runs for C files. Task-number: QTCREATORBUG-20198 Change-Id: I1da31a1048b7c258642cf00f5084681f5d384ee6 Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/cpptools/compileroptionsbuilder.cpp14
-rw-r--r--src/plugins/cpptools/compileroptionsbuilder.h1
-rw-r--r--src/plugins/projectexplorer/abstractmsvctoolchain.cpp18
3 files changed, 25 insertions, 8 deletions
diff --git a/src/plugins/cpptools/compileroptionsbuilder.cpp b/src/plugins/cpptools/compileroptionsbuilder.cpp
index 9c6c7d1841..83bc89ab49 100644
--- a/src/plugins/cpptools/compileroptionsbuilder.cpp
+++ b/src/plugins/cpptools/compileroptionsbuilder.cpp
@@ -47,6 +47,7 @@ CompilerOptionsBuilder::CompilerOptionsBuilder(const ProjectPart &projectPart,
: m_projectPart(projectPart)
, m_clangVersion(clangVersion)
, m_clangResourceDirectory(clangResourceDirectory)
+ , m_languageVersion(m_projectPart.languageVersion)
{
}
@@ -54,6 +55,9 @@ QStringList CompilerOptionsBuilder::build(CppTools::ProjectFile::Kind fileKind,
{
m_options.clear();
+ if (fileKind == ProjectFile::CHeader || fileKind == ProjectFile::CSource)
+ QTC_ASSERT(m_languageVersion <= ProjectPart::LatestCVersion, return QStringList(););
+
addWordWidth();
addTargetTriple();
addExtraCodeModelFlags();
@@ -119,7 +123,8 @@ void CompilerOptionsBuilder::addExtraCodeModelFlags()
void CompilerOptionsBuilder::enableExceptions()
{
- add(QLatin1String("-fcxx-exceptions"));
+ if (m_languageVersion > ProjectPart::LatestCVersion)
+ add(QLatin1String("-fcxx-exceptions"));
add(QLatin1String("-fexceptions"));
}
@@ -287,7 +292,8 @@ void CompilerOptionsBuilder::addOptionsForLanguage(bool checkForBorlandExtension
QStringList opts;
const ProjectPart::LanguageExtensions languageExtensions = m_projectPart.languageExtensions;
const bool gnuExtensions = languageExtensions & ProjectPart::GnuExtensions;
- switch (m_projectPart.languageVersion) {
+
+ switch (m_languageVersion) {
case ProjectPart::C89:
opts << (gnuExtensions ? QLatin1String("-std=gnu89") : QLatin1String("-std=c89"));
break;
@@ -472,9 +478,7 @@ QString CompilerOptionsBuilder::includeOption() const
bool CompilerOptionsBuilder::excludeDefineDirective(const ProjectExplorer::Macro &macro) const
{
- // This is a quick fix for QTCREATORBUG-11501.
- // TODO: do a proper fix, see QTCREATORBUG-11709.
- if (macro.key == "__cplusplus")
+ if (macro.key == "__cplusplus" && m_languageVersion <= ProjectPart::LatestCVersion)
return true;
// Ignore for all compiler toolchains since LLVM has it's own implementation for
diff --git a/src/plugins/cpptools/compileroptionsbuilder.h b/src/plugins/cpptools/compileroptionsbuilder.h
index 2f860e510b..6a0db7cb2b 100644
--- a/src/plugins/cpptools/compileroptionsbuilder.h
+++ b/src/plugins/cpptools/compileroptionsbuilder.h
@@ -96,6 +96,7 @@ private:
QStringList m_options;
QString m_clangVersion;
QString m_clangResourceDirectory;
+ ProjectPart::LanguageVersion m_languageVersion;
};
template<class T>
diff --git a/src/plugins/projectexplorer/abstractmsvctoolchain.cpp b/src/plugins/projectexplorer/abstractmsvctoolchain.cpp
index 12c5a15316..fd2948c458 100644
--- a/src/plugins/projectexplorer/abstractmsvctoolchain.cpp
+++ b/src/plugins/projectexplorer/abstractmsvctoolchain.cpp
@@ -133,15 +133,27 @@ ToolChain::CompilerFlags AbstractMsvcToolChain::compilerFlags(const QStringList
if (cxxflags.contains(QLatin1String("/Za")))
flags &= ~MicrosoftExtensions;
+ bool cLanguage = (language() == ProjectExplorer::Constants::C_LANGUAGE_ID);
+
switch (m_abi.osFlavor()) {
case Abi::WindowsMsvc2010Flavor:
- case Abi::WindowsMsvc2012Flavor: flags |= StandardCxx11;
+ case Abi::WindowsMsvc2012Flavor:
+ if (cLanguage)
+ flags |= StandardC99;
+ else
+ flags |= StandardCxx11;
break;
case Abi::WindowsMsvc2013Flavor:
- case Abi::WindowsMsvc2015Flavor: flags |= StandardCxx14;
+ case Abi::WindowsMsvc2015Flavor:
+ if (cLanguage)
+ flags |= StandardC99;
+ else
+ flags |= StandardCxx14;
break;
case Abi::WindowsMsvc2017Flavor:
- if (cxxflags.contains("/std:c++17") || cxxflags.contains("/std:c++latest"))
+ if (cLanguage)
+ flags |= StandardC11;
+ else if (cxxflags.contains("/std:c++17") || cxxflags.contains("/std:c++latest"))
flags |= StandardCxx17;
else
flags |= StandardCxx14;