Skip to content

Commit 4ddea29

Browse files
authored
[clang-cl]: Add /std:c++23preview and update _MSVC_LANG for C++23 (#112378)
As discussed in https://discourse.llvm.org/t/clang-cl-adding-std-c-23preview/82553
1 parent 72a7b47 commit 4ddea29

File tree

6 files changed

+17
-4
lines changed

6 files changed

+17
-4
lines changed

clang/docs/ReleaseNotes.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,8 @@ Android Support
605605
Windows Support
606606
^^^^^^^^^^^^^^^
607607

608+
- clang-cl now supports ``/std:c++23preview`` which enables C++23 features.
609+
608610
- Clang no longer allows references inside a union when emulating MSVC 1900+ even if `fms-extensions` is enabled.
609611
Starting with VS2015, MSVC 1900, this Microsoft extension is no longer allowed and always results in an error.
610612
Clang now follows the MSVC behavior in this scenario.

clang/include/clang/Driver/Options.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8531,7 +8531,7 @@ def _SLASH_execution_charset : CLCompileJoined<"execution-charset:">,
85318531
HelpText<"Set runtime encoding, supports only UTF-8">,
85328532
Alias<fexec_charset_EQ>;
85338533
def _SLASH_std : CLCompileJoined<"std:">,
8534-
HelpText<"Set language version (c++14,c++17,c++20,c++latest,c11,c17)">;
8534+
HelpText<"Set language version (c++14,c++17,c++20,c++23preview,c++latest,c11,c17)">;
85358535
def _SLASH_U : CLJoinedOrSeparate<"U">, HelpText<"Undefine macro">,
85368536
MetaVarName<"<macro>">, Alias<U>;
85378537
def _SLASH_validate_charset : CLFlag<"validate-charset">,

clang/lib/Basic/Targets/OSTargets.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,9 +214,11 @@ static void addVisualCDefines(const LangOptions &Opts, MacroBuilder &Builder) {
214214
Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
215215

216216
if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
217-
if (Opts.CPlusPlus23)
217+
if (Opts.CPlusPlus26)
218218
// TODO update to the proper value.
219-
Builder.defineMacro("_MSVC_LANG", "202004L");
219+
Builder.defineMacro("_MSVC_LANG", "202400L");
220+
else if (Opts.CPlusPlus23)
221+
Builder.defineMacro("_MSVC_LANG", "202302L");
220222
else if (Opts.CPlusPlus20)
221223
Builder.defineMacro("_MSVC_LANG", "202002L");
222224
else if (Opts.CPlusPlus17)

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7225,6 +7225,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
72257225
.Case("c++17", "-std=c++17")
72267226
.Case("c++20", "-std=c++20")
72277227
// TODO add c++23 and c++26 when MSVC supports it.
7228+
.Case("c++23preview", "-std=c++23")
72287229
.Case("c++latest", "-std=c++26")
72297230
.Default("");
72307231
if (LanguageStandard.empty())

clang/test/Driver/cl-options.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,9 @@
605605
// RUN: %clang_cl -fmsc-version=1900 -TP -std:c++20 -### -- %s 2>&1 | FileCheck -check-prefix=STDCXX20 %s
606606
// STDCXX20: -std=c++20
607607

608+
// RUN: %clang_cl -fmsc-version=1900 -TP -std:c++23preview -### -- %s 2>&1 | FileCheck -check-prefix=STDCXX23PREVIEW %s
609+
// STDCXX23PREVIEW: -std=c++23
610+
608611
// RUN: %clang_cl -fmsc-version=1900 -TP -std:c++latest -### -- %s 2>&1 | FileCheck -check-prefix=STDCXXLATEST %s
609612
// STDCXXLATEST: -std=c++26
610613

clang/test/Preprocessor/predefined-win-macros.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,12 @@
5656
// RUN: %clang_cc1 %s -x c++ -E -dM -triple i686-pc-win32 -fms-extensions -fms-compatibility \
5757
// RUN: -fms-compatibility-version=19.00 -std=c++23 -o - | FileCheck -match-full-lines %s --check-prefix=CHECK-MS-CPP2B
5858
// CHECK-MS-CPP2B: #define _MSC_VER 1900
59-
// CHECK-MS-CPP2B: #define _MSVC_LANG 202004L
59+
// CHECK-MS-CPP2B: #define _MSVC_LANG 202302L
60+
61+
// RUN: %clang_cc1 %s -x c++ -E -dM -triple i686-pc-win32 -fms-extensions -fms-compatibility \
62+
// RUN: -fms-compatibility-version=19.00 -std=c++26 -o - | FileCheck -match-full-lines %s --check-prefix=CHECK-MS-CPP2C
63+
// CHECK-MS-CPP2C: #define _MSC_VER 1900
64+
// CHECK-MS-CPP2C: #define _MSVC_LANG 202400L
6065

6166
// RUN: %clang_cc1 -triple i386-windows %s -E -dM -o - \
6267
// RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-X86-WIN

0 commit comments

Comments
 (0)