summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools/compileroptionsbuilder.cpp
diff options
context:
space:
mode:
authorCristian Adam <cristian.adam@qt.io>2021-08-19 16:27:54 +0200
committerCristian Adam <cristian.adam@qt.io>2021-08-20 15:28:57 +0000
commit54c53223228539e3ca4126657ae52bc2fc705c71 (patch)
tree4ca70fd317f54e73a376ee9a41b81b82f47dd871 /src/plugins/cpptools/compileroptionsbuilder.cpp
parentdc8801e495ecabc4b126dda3c56212dc253b75b0 (diff)
downloadqt-creator-54c53223228539e3ca4126657ae52bc2fc705c71.tar.gz
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>
Diffstat (limited to 'src/plugins/cpptools/compileroptionsbuilder.cpp')
-rw-r--r--src/plugins/cpptools/compileroptionsbuilder.cpp20
1 files changed, 17 insertions, 3 deletions
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);
}