forked from qt-creator/qt-creator
CppTools: Code model fix for C++20, MSVC, and newer CMake versions
Starting with version 3.20 CMake adds -std:c++20, which breaks the code model when using MSVC. Clang-cl 12 doesn't know about -std:c++20, but clang driver knows about -std=c++20. Fixes: QTCREATORBUG-26146 Change-Id: I696842e11b0a9ba8849455d2f81f8dde6dd95a27 Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
@@ -43,8 +43,9 @@ enum class LanguageVersion : unsigned char {
|
|||||||
CXX11,
|
CXX11,
|
||||||
CXX14,
|
CXX14,
|
||||||
CXX17,
|
CXX17,
|
||||||
CXX2a,
|
CXX20,
|
||||||
LatestCxx = CXX2a,
|
CXX2b,
|
||||||
|
LatestCxx = CXX2b,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class LanguageExtension : unsigned char {
|
enum class LanguageExtension : unsigned char {
|
||||||
|
|||||||
@@ -164,7 +164,8 @@ QStringList CppcheckTool::additionalArguments(const CppTools::ProjectPart &part)
|
|||||||
break;
|
break;
|
||||||
case Version::CXX98:
|
case Version::CXX98:
|
||||||
case Version::CXX17:
|
case Version::CXX17:
|
||||||
case Version::CXX2a:
|
case Version::CXX20:
|
||||||
|
case Version::CXX2b:
|
||||||
result.push_back("--language=c++");
|
result.push_back("--language=c++");
|
||||||
break;
|
break;
|
||||||
case Version::None:
|
case Version::None:
|
||||||
|
|||||||
@@ -478,7 +478,10 @@ void CompilerOptionsBuilder::addLanguageVersionAndExtensions()
|
|||||||
case LanguageVersion::CXX17:
|
case LanguageVersion::CXX17:
|
||||||
option = "/std:c++17";
|
option = "/std:c++17";
|
||||||
break;
|
break;
|
||||||
case LanguageVersion::CXX2a:
|
case LanguageVersion::CXX20:
|
||||||
|
option = "/std:c++20";
|
||||||
|
break;
|
||||||
|
case LanguageVersion::CXX2b:
|
||||||
option = "/std:c++latest";
|
option = "/std:c++latest";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -523,8 +526,11 @@ void CompilerOptionsBuilder::addLanguageVersionAndExtensions()
|
|||||||
case LanguageVersion::CXX17:
|
case LanguageVersion::CXX17:
|
||||||
option = (gnuExtensions ? QLatin1String("-std=gnu++17") : QLatin1String("-std=c++17"));
|
option = (gnuExtensions ? QLatin1String("-std=gnu++17") : QLatin1String("-std=c++17"));
|
||||||
break;
|
break;
|
||||||
case LanguageVersion::CXX2a:
|
case LanguageVersion::CXX20:
|
||||||
option = (gnuExtensions ? QLatin1String("-std=gnu++2a") : QLatin1String("-std=c++2a"));
|
option = (gnuExtensions ? QLatin1String("-std=gnu++20") : QLatin1String("-std=c++20"));
|
||||||
|
break;
|
||||||
|
case LanguageVersion::CXX2b:
|
||||||
|
option = (gnuExtensions ? QLatin1String("-std=gnu++2b") : QLatin1String("-std=c++2b"));
|
||||||
break;
|
break;
|
||||||
case LanguageVersion::None:
|
case LanguageVersion::None:
|
||||||
break;
|
break;
|
||||||
@@ -874,6 +880,14 @@ void CompilerOptionsBuilder::evaluateCompilerFlags()
|
|||||||
theOption[0] = '-';
|
theOption[0] = '-';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Clang-cl (as of Clang 12) frontend doesn't know about -std:c++20
|
||||||
|
// but the clang front end knows about -std=c++20
|
||||||
|
// https://github.com/llvm/llvm-project/blob/release/12.x/clang/lib/Driver/ToolChains/Clang.cpp#L5855
|
||||||
|
if (toolChain == ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID ||
|
||||||
|
toolChain == ProjectExplorer::Constants::CLANG_CL_TOOLCHAIN_TYPEID) {
|
||||||
|
theOption.replace("-std:c++20", "-clang:-std=c++20");
|
||||||
|
}
|
||||||
|
|
||||||
m_compilerFlags.flags.append(theOption);
|
m_compilerFlags.flags.append(theOption);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -122,7 +122,8 @@ QString Utils::toString(::Utils::LanguageVersion languageVersion)
|
|||||||
CASE_LANGUAGEVERSION(CXX11);
|
CASE_LANGUAGEVERSION(CXX11);
|
||||||
CASE_LANGUAGEVERSION(CXX14);
|
CASE_LANGUAGEVERSION(CXX14);
|
||||||
CASE_LANGUAGEVERSION(CXX17);
|
CASE_LANGUAGEVERSION(CXX17);
|
||||||
CASE_LANGUAGEVERSION(CXX2a);
|
CASE_LANGUAGEVERSION(CXX20);
|
||||||
|
CASE_LANGUAGEVERSION(CXX2b);
|
||||||
// no default to get a compiler warning if anything is added
|
// no default to get a compiler warning if anything is added
|
||||||
}
|
}
|
||||||
#undef CASE_LANGUAGEVERSION
|
#undef CASE_LANGUAGEVERSION
|
||||||
|
|||||||
@@ -104,8 +104,10 @@ const char * toText(Utils::LanguageVersion languageVersion)
|
|||||||
return "CXX14";
|
return "CXX14";
|
||||||
case LanguageVersion::CXX17:
|
case LanguageVersion::CXX17:
|
||||||
return "CXX17";
|
return "CXX17";
|
||||||
case LanguageVersion::CXX2a:
|
case LanguageVersion::CXX20:
|
||||||
return "CXX2a";
|
return "CXX20";
|
||||||
|
case LanguageVersion::CXX2b:
|
||||||
|
return "CXX2b";
|
||||||
case LanguageVersion::CXX98:
|
case LanguageVersion::CXX98:
|
||||||
return "CXX98";
|
return "CXX98";
|
||||||
case LanguageVersion::None:
|
case LanguageVersion::None:
|
||||||
|
|||||||
Reference in New Issue
Block a user