From 54c53223228539e3ca4126657ae52bc2fc705c71 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Thu, 19 Aug 2021 16:27:54 +0200 Subject: 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 --- src/plugins/cpptools/compileroptionsbuilder.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) (limited to 'src/plugins/cpptools/compileroptionsbuilder.cpp') diff --git a/src/plugins/cpptools/compileroptionsbuilder.cpp b/src/plugins/cpptools/compileroptionsbuilder.cpp index 09291830b3..7ee9b6bdf8 100644 --- a/src/plugins/cpptools/compileroptionsbuilder.cpp +++ b/src/plugins/cpptools/compileroptionsbuilder.cpp @@ -478,7 +478,10 @@ void CompilerOptionsBuilder::addLanguageVersionAndExtensions() case LanguageVersion::CXX17: option = "/std:c++17"; break; - case LanguageVersion::CXX2a: + case LanguageVersion::CXX20: + option = "/std:c++20"; + break; + case LanguageVersion::CXX2b: option = "/std:c++latest"; break; } @@ -523,8 +526,11 @@ void CompilerOptionsBuilder::addLanguageVersionAndExtensions() case LanguageVersion::CXX17: option = (gnuExtensions ? QLatin1String("-std=gnu++17") : QLatin1String("-std=c++17")); break; - case LanguageVersion::CXX2a: - option = (gnuExtensions ? QLatin1String("-std=gnu++2a") : QLatin1String("-std=c++2a")); + case LanguageVersion::CXX20: + 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; case LanguageVersion::None: break; @@ -874,6 +880,14 @@ void CompilerOptionsBuilder::evaluateCompilerFlags() 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); } -- cgit v1.2.1