ProjectExplorer/MSVC: Fix thread-unsafe call

The runner created in
AbstractMsvcToolChain::createMacroInspectionRunner() called indirectly
back into the not thread-safe ToolChain::language(). This call is not
needed as we already have the language at hand.

Change-Id: I2d55bdfa19f1c05447b6dd12afde5b5fa006d9e2
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Nikolai Kosjar
2018-11-16 09:08:07 +01:00
parent 8bb4305bb2
commit d582cc3328
4 changed files with 14 additions and 10 deletions

View File

@@ -129,7 +129,7 @@ ToolChain::MacroInspectionRunner AbstractMsvcToolChain::createMacroInspectionRun
const Macros macros = msvcPredefinedMacros(filteredFlags, env);
const auto report = MacroInspectionReport{macros, languageVersion(macros)};
const auto report = MacroInspectionReport{macros, msvcLanguageVersion(lang, macros)};
macroCache->insert(filteredFlags, report);
return report;

View File

@@ -98,7 +98,8 @@ protected:
// Function must be thread-safe!
virtual Macros msvcPredefinedMacros(const QStringList cxxflags,
const Utils::Environment& env) const = 0;
virtual LanguageVersion languageVersion(const Macros &macros) const = 0;
virtual LanguageVersion msvcLanguageVersion(const Core::Id &language,
const Macros &macros) const = 0;
Utils::FileName m_debuggerCommand;

View File

@@ -525,9 +525,9 @@ Macros MsvcToolChain::msvcPredefinedMacros(const QStringList cxxflags,
//
// For _MSV_VER values, see https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=vs-2017.
//
LanguageVersion MsvcToolChain::languageVersion(const Macros &macros) const
LanguageVersion MsvcToolChain::msvcLanguageVersion(const Core::Id &language,
const Macros &macros) const
{
const Core::Id lang = language();
int mscVer = -1;
QByteArray msvcLang;
for (const ProjectExplorer::Macro &macro : macros) {
@@ -538,7 +538,7 @@ LanguageVersion MsvcToolChain::languageVersion(const Macros &macros) const
}
QTC_CHECK(mscVer > 0);
if (lang == Constants::CXX_LANGUAGE_ID) {
if (language == Constants::CXX_LANGUAGE_ID) {
if (!msvcLang.isEmpty()) // >= Visual Studio 2015 Update 3
return ToolChain::cxxLanguageVersion(msvcLang);
if (mscVer >= 1800) // >= Visual Studio 2013 (12.0)
@@ -546,7 +546,7 @@ LanguageVersion MsvcToolChain::languageVersion(const Macros &macros) const
if (mscVer >= 1600) // >= Visual Studio 2010 (10.0)
return LanguageVersion::CXX11;
return LanguageVersion::CXX98;
} else if (lang == Constants::C_LANGUAGE_ID) {
} else if (language == Constants::C_LANGUAGE_ID) {
if (mscVer >= 1910) // >= Visual Studio 2017 RTW (15.0)
return LanguageVersion::C11;
return LanguageVersion::C99;
@@ -1134,9 +1134,10 @@ Macros ClangClToolChain::msvcPredefinedMacros(const QStringList cxxflags,
return Macro::toMacros(response.allRawOutput());
}
LanguageVersion ClangClToolChain::languageVersion(const Macros &macros) const
LanguageVersion ClangClToolChain::msvcLanguageVersion(const Core::Id &language,
const Macros &macros) const
{
return ToolChain::languageVersion(language(), macros);
return ToolChain::languageVersion(language, macros);
}
// --------------------------------------------------------------------------

View File

@@ -94,7 +94,8 @@ protected:
// Function must be thread-safe!
Macros msvcPredefinedMacros(const QStringList cxxflags,
const Utils::Environment &env) const override;
LanguageVersion languageVersion(const Macros &macros) const override;
LanguageVersion msvcLanguageVersion(const Core::Id &language,
const Macros &macros) const override;
private:
struct GenerateEnvResult
@@ -139,7 +140,8 @@ public:
void resetMsvcToolChain(const MsvcToolChain *base = nullptr);
Macros msvcPredefinedMacros(const QStringList cxxflags,
const Utils::Environment &env) const override;
LanguageVersion languageVersion(const Macros &macros) const override;
LanguageVersion msvcLanguageVersion(const Core::Id &language,
const Macros &macros) const override;
bool operator ==(const ToolChain &) const override;
private: