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:
Cristian Adam
2021-08-19 16:27:54 +02:00
parent dc8801e495
commit 54c5322322
5 changed files with 28 additions and 9 deletions

View File

@@ -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 {

View File

@@ -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:

View File

@@ -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);
} }

View File

@@ -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

View File

@@ -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: