forked from qt-creator/qt-creator
Clang: Properly generate macros with clang-cl
Clang-cl can work with different command line styles but it seems that it's a bad idea to mix them. So let's use gcc toolchain methods only when --driver-mode=g++ is specified and ones from msvc toolchain in other cases. Change-Id: I071a124a07b31bce2a0a5594ff8ca79d9ed84716 Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
This commit is contained in:
@@ -129,7 +129,8 @@ ToolChain::MacroInspectionRunner AbstractMsvcToolChain::createMacroInspectionRun
|
||||
|
||||
const Macros macros = msvcPredefinedMacros(filteredFlags, env);
|
||||
|
||||
const auto report = MacroInspectionReport{macros, msvcLanguageVersion(lang, macros)};
|
||||
const auto report = MacroInspectionReport{macros,
|
||||
msvcLanguageVersion(filteredFlags, lang, macros)};
|
||||
macroCache->insert(filteredFlags, report);
|
||||
|
||||
return report;
|
||||
|
@@ -98,7 +98,8 @@ protected:
|
||||
// Function must be thread-safe!
|
||||
virtual Macros msvcPredefinedMacros(const QStringList cxxflags,
|
||||
const Utils::Environment& env) const = 0;
|
||||
virtual LanguageVersion msvcLanguageVersion(const Core::Id &language,
|
||||
virtual LanguageVersion msvcLanguageVersion(const QStringList cxxflags,
|
||||
const Core::Id &language,
|
||||
const Macros ¯os) const = 0;
|
||||
|
||||
Utils::FileName m_debuggerCommand;
|
||||
|
@@ -525,7 +525,8 @@ 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::msvcLanguageVersion(const Core::Id &language,
|
||||
LanguageVersion MsvcToolChain::msvcLanguageVersion(const QStringList /*cxxflags*/,
|
||||
const Core::Id &language,
|
||||
const Macros ¯os) const
|
||||
{
|
||||
int mscVer = -1;
|
||||
@@ -1120,6 +1121,9 @@ bool ClangClToolChain::operator ==(const ToolChain &other) const
|
||||
Macros ClangClToolChain::msvcPredefinedMacros(const QStringList cxxflags,
|
||||
const Utils::Environment &env) const
|
||||
{
|
||||
if (!cxxflags.contains("--driver-mode=g++"))
|
||||
return MsvcToolChain::msvcPredefinedMacros(cxxflags, env);
|
||||
|
||||
Utils::SynchronousProcess cpp;
|
||||
cpp.setEnvironment(env.toStringList());
|
||||
cpp.setWorkingDirectory(Utils::TemporaryDirectory::masterDirectoryPath());
|
||||
@@ -1138,10 +1142,13 @@ Macros ClangClToolChain::msvcPredefinedMacros(const QStringList cxxflags,
|
||||
return Macro::toMacros(response.allRawOutput());
|
||||
}
|
||||
|
||||
LanguageVersion ClangClToolChain::msvcLanguageVersion(const Core::Id &language,
|
||||
LanguageVersion ClangClToolChain::msvcLanguageVersion(const QStringList cxxflags,
|
||||
const Core::Id &language,
|
||||
const Macros ¯os) const
|
||||
{
|
||||
return ToolChain::languageVersion(language, macros);
|
||||
if (cxxflags.contains("--driver-mode=g++"))
|
||||
return ToolChain::languageVersion(language, macros);
|
||||
return MsvcToolChain::msvcLanguageVersion(cxxflags, language, macros);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
@@ -94,7 +94,8 @@ protected:
|
||||
// Function must be thread-safe!
|
||||
Macros msvcPredefinedMacros(const QStringList cxxflags,
|
||||
const Utils::Environment &env) const override;
|
||||
LanguageVersion msvcLanguageVersion(const Core::Id &language,
|
||||
LanguageVersion msvcLanguageVersion(const QStringList cxxflags,
|
||||
const Core::Id &language,
|
||||
const Macros ¯os) const override;
|
||||
|
||||
struct GenerateEnvResult
|
||||
@@ -141,7 +142,8 @@ public:
|
||||
void resetMsvcToolChain(const MsvcToolChain *base = nullptr);
|
||||
Macros msvcPredefinedMacros(const QStringList cxxflags,
|
||||
const Utils::Environment &env) const override;
|
||||
LanguageVersion msvcLanguageVersion(const Core::Id &language,
|
||||
LanguageVersion msvcLanguageVersion(const QStringList cxxflags,
|
||||
const Core::Id &language,
|
||||
const Macros ¯os) const override;
|
||||
|
||||
bool operator ==(const ToolChain &) const override;
|
||||
|
Reference in New Issue
Block a user