https://github.com/Sirraide updated 
https://github.com/llvm/llvm-project/pull/203992

>From f490b0f3019d6f9838f085716254ac3771be2a8b Mon Sep 17 00:00:00 2001
From: Sirraide <[email protected]>
Date: Mon, 15 Jun 2026 23:02:34 +0200
Subject: [PATCH 1/4] [Clang] Add flags and lang option for C++2d

---
 clang/docs/CommandGuide/clang.rst              |  8 ++++++++
 clang/docs/ReleaseNotes.rst                    |  5 +++++
 clang/docs/ReleaseNotesTemplate.txt            |  3 +++
 clang/docs/UsersManual.rst                     |  2 +-
 clang/include/clang/Basic/Diagnostic.td        |  1 +
 clang/include/clang/Basic/DiagnosticGroups.td  | 10 ++++++++++
 clang/include/clang/Basic/LangOptions.def      |  1 +
 clang/include/clang/Basic/LangStandard.h       | 14 +++++++++-----
 clang/include/clang/Basic/LangStandards.def    | 13 +++++++++++++
 clang/include/clang/Testing/TestLanguage.def   |  1 +
 clang/lib/Basic/LangOptions.cpp                |  5 ++++-
 clang/lib/CrossTU/CrossTranslationUnit.cpp     |  2 ++
 clang/lib/Driver/Driver.cpp                    |  1 +
 clang/lib/Driver/ToolChains/Clang.cpp          |  9 ++++++---
 .../InterpolatingCompilationDatabase.cpp       |  4 ++--
 clang/test/Driver/cl-options.c                 |  2 +-
 clang/test/Driver/unknown-std.cpp              |  2 ++
 clang/test/Preprocessor/init.c                 | 18 ++++++++++++++++++
 clang/www/OpenProjects.html                    |  2 +-
 19 files changed, 89 insertions(+), 14 deletions(-)

diff --git a/clang/docs/CommandGuide/clang.rst 
b/clang/docs/CommandGuide/clang.rst
index d8c70bdc43b18..c4dcca3d093fd 100644
--- a/clang/docs/CommandGuide/clang.rst
+++ b/clang/docs/CommandGuide/clang.rst
@@ -226,6 +226,14 @@ Language Selection and Mode Options
 
    Working draft for C++2c with GNU extensions
 
+  | ``c++2d``
+
+   Working draft for C++2d
+
+  | ``gnu++2d``
+
+   Working draft for C++2d with GNU extensions
+
  The default C++ language standard is ``gnu++17``.
 
  Supported values for the OpenCL language are:
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 7828135a6edbc..ca81b67c1be66 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -193,6 +193,11 @@ C++ Language Changes
 - ``__is_trivially_equality_comparable`` no longer returns false for all enum 
types. (#GH132672)
 - ``auto`` parameters are now available in all C++ language modes as an 
extension.
 
+C++2d Feature Support
+^^^^^^^^^^^^^^^^^^^^^
+
+- Added compiler flags ``-std=c++2d`` and ``-std=gnu++2d`` for experimental 
C++2d implementation work.
+
 C++2c Feature Support
 ^^^^^^^^^^^^^^^^^^^^^
 
diff --git a/clang/docs/ReleaseNotesTemplate.txt 
b/clang/docs/ReleaseNotesTemplate.txt
index b5664dcf3b212..0c588c3b4f43a 100644
--- a/clang/docs/ReleaseNotesTemplate.txt
+++ b/clang/docs/ReleaseNotesTemplate.txt
@@ -61,6 +61,9 @@ What's New in Clang |release|?
 C++ Language Changes
 --------------------
 
+C++2d Feature Support
+^^^^^^^^^^^^^^^^^^^^^
+
 C++2c Feature Support
 ^^^^^^^^^^^^^^^^^^^^^
 
diff --git a/clang/docs/UsersManual.rst b/clang/docs/UsersManual.rst
index 3f4b1585e5935..b715caed5bd4c 100644
--- a/clang/docs/UsersManual.rst
+++ b/clang/docs/UsersManual.rst
@@ -40,7 +40,7 @@ specific section:
 -  :ref:`Objective-C Language <objc>`: ObjC 1, ObjC 2, ObjC 2.1, plus
    variants depending on base language.
 -  :ref:`C++ Language <cxx>`: C++98, C++03, C++11, C++14, C++17, C++20, C++23,
-   and C++26.
+   C++26, and C++29.
 -  :ref:`Objective C++ Language <objcxx>`
 -  :ref:`OpenCL Kernel Language <opencl>`: OpenCL C 1.0, 1.1, 1.2, 2.0, 3.0,
    and C++ for OpenCL 1.0 and 2021.
diff --git a/clang/include/clang/Basic/Diagnostic.td 
b/clang/include/clang/Basic/Diagnostic.td
index d56fb22b2f539..693984d8241f0 100644
--- a/clang/include/clang/Basic/Diagnostic.td
+++ b/clang/include/clang/Basic/Diagnostic.td
@@ -244,6 +244,7 @@ multiclass CXX17Compat<string message, bit ext_warn = true> 
: CXXCompat<message,
 multiclass CXX20Compat<string message, bit ext_warn = true> : 
CXXCompat<message, 20, ext_warn>;
 multiclass CXX23Compat<string message, bit ext_warn = true> : 
CXXCompat<message, 23, ext_warn>;
 multiclass CXX26Compat<string message, bit ext_warn = true> : 
CXXCompat<message, 26, ext_warn, "2c">;
+multiclass CXX29Compat<string message, bit ext_warn = true> : 
CXXCompat<message, 29, ext_warn, "2d">;
 
 // Definitions for Diagnostics.
 include "DiagnosticASTKinds.td"
diff --git a/clang/include/clang/Basic/DiagnosticGroups.td 
b/clang/include/clang/Basic/DiagnosticGroups.td
index 244cd3630bb11..f49ad84751761 100644
--- a/clang/include/clang/Basic/DiagnosticGroups.td
+++ b/clang/include/clang/Basic/DiagnosticGroups.td
@@ -412,6 +412,11 @@ def CXXPre26CompatPedantic :
   DiagGroup<"pre-c++26-compat-pedantic", [CXXPre26Compat]>;
 def : DiagGroup<"pre-c++2c-compat", [CXXPre26Compat]>;
 def : DiagGroup<"pre-c++2c-compat-pedantic", [CXXPre26CompatPedantic]>;
+def CXXPre29Compat : DiagGroup<"pre-c++29-compat">;
+def CXXPre29CompatPedantic :
+  DiagGroup<"pre-c++29-compat-pedantic", [CXXPre29Compat]>;
+def : DiagGroup<"pre-c++2d-compat", [CXXPre29Compat]>;
+def : DiagGroup<"pre-c++2d-compat-pedantic", [CXXPre29CompatPedantic]>;
 
 def CXX98CompatBindToTemporaryCopy :
   DiagGroup<"c++98-compat-bind-to-temporary-copy">;
@@ -1572,12 +1577,17 @@ def CXX23 : DiagGroup<"c++23-extensions", 
[CXX23AttrsOnLambda]>;
 // earlier C++ versions.
 def CXX26 : DiagGroup<"c++26-extensions">;
 
+// A warning group for warnings about using C++29 features as extensions in
+// earlier C++ versions.
+def CXX29 : DiagGroup<"c++29-extensions">;
+
 def : DiagGroup<"c++0x-extensions", [CXX11]>;
 def : DiagGroup<"c++1y-extensions", [CXX14]>;
 def : DiagGroup<"c++1z-extensions", [CXX17]>;
 def : DiagGroup<"c++2a-extensions", [CXX20]>;
 def : DiagGroup<"c++2b-extensions", [CXX23]>;
 def : DiagGroup<"c++2c-extensions", [CXX26]>;
+def : DiagGroup<"c++2d-extensions", [CXX29]>;
 
 def DelegatingCtorCycles :
   DiagGroup<"delegating-ctor-cycles">;
diff --git a/clang/include/clang/Basic/LangOptions.def 
b/clang/include/clang/Basic/LangOptions.def
index 4a3e3b7c04822..21079dbe870cb 100644
--- a/clang/include/clang/Basic/LangOptions.def
+++ b/clang/include/clang/Basic/LangOptions.def
@@ -57,6 +57,7 @@ LANGOPT(CPlusPlus17       , 1, 0, NotCompatible, "C++17")
 LANGOPT(CPlusPlus20       , 1, 0, NotCompatible, "C++20")
 LANGOPT(CPlusPlus23       , 1, 0, NotCompatible, "C++23")
 LANGOPT(CPlusPlus26       , 1, 0, NotCompatible, "C++26")
+LANGOPT(CPlusPlus29       , 1, 0, NotCompatible, "C++29")
 LANGOPT(ObjC              , 1, 0, NotCompatible, "Objective-C")
 LANGOPT(ObjCDefaultSynthProperties , 1, 0, Benign,
         "Objective-C auto-synthesized properties")
diff --git a/clang/include/clang/Basic/LangStandard.h 
b/clang/include/clang/Basic/LangStandard.h
index 1eef3a6339299..8f42cc1566dd9 100644
--- a/clang/include/clang/Basic/LangStandard.h
+++ b/clang/include/clang/Basic/LangStandard.h
@@ -59,11 +59,12 @@ enum LangFeatures {
   CPlusPlus20 = (1 << 10),
   CPlusPlus23 = (1 << 11),
   CPlusPlus26 = (1 << 12),
-  Digraphs = (1 << 13),
-  GNUMode = (1 << 14),
-  HexFloat = (1 << 15),
-  OpenCL = (1 << 16),
-  HLSL = (1 << 17)
+  CPlusPlus29 = (1 << 13),
+  Digraphs = (1 << 14),
+  GNUMode = (1 << 15),
+  HexFloat = (1 << 16),
+  OpenCL = (1 << 17),
+  HLSL = (1 << 18)
 };
 
 /// LangStandard - Information about the properties of a particular language
@@ -133,6 +134,9 @@ struct LangStandard {
   /// isCPlusPlus26 - Language is a post-C++26 variant (or later).
   bool isCPlusPlus26() const { return Flags & CPlusPlus26; }
 
+  /// isCPlusPlus29 - Language is a post-C++29 variant (or later).
+  bool isCPlusPlus29() const { return Flags & CPlusPlus29; }
+
   /// hasDigraphs - Language supports digraphs.
   bool hasDigraphs() const { return Flags & Digraphs; }
 
diff --git a/clang/include/clang/Basic/LangStandards.def 
b/clang/include/clang/Basic/LangStandards.def
index 4edc93503cdf5..19a5a932e2ef1 100644
--- a/clang/include/clang/Basic/LangStandards.def
+++ b/clang/include/clang/Basic/LangStandards.def
@@ -191,6 +191,19 @@ LANGSTANDARD(gnucxx26, "gnu++2c",
              CPlusPlus20 | CPlusPlus23 | CPlusPlus26 | Digraphs | HexFloat | 
GNUMode, 202400)
 LANGSTANDARD_ALIAS(gnucxx26, "gnu++26")
 
+// FIXME: Use correct version code for C++29 once published.
+LANGSTANDARD(cxx29, "c++2d",
+             CXX, "Working draft for C++2d",
+             LineComment | CPlusPlus | CPlusPlus11 | CPlusPlus14 | CPlusPlus17 
|
+             CPlusPlus20 | CPlusPlus23 | CPlusPlus26 | CPlusPlus29 | Digraphs 
| HexFloat, 202700)
+LANGSTANDARD_ALIAS(cxx29, "c++29")
+
+LANGSTANDARD(gnucxx29, "gnu++2d",
+             CXX, "Working draft for C++2d with GNU extensions",
+             LineComment | CPlusPlus | CPlusPlus11 | CPlusPlus14 | CPlusPlus17 
|
+             CPlusPlus20 | CPlusPlus23 | CPlusPlus26 | CPlusPlus29 | Digraphs 
| HexFloat | GNUMode, 202700)
+LANGSTANDARD_ALIAS(gnucxx29, "gnu++29")
+
 // OpenCL
 LANGSTANDARD(opencl10, "cl1.0",
              OpenCL, "OpenCL 1.0",
diff --git a/clang/include/clang/Testing/TestLanguage.def 
b/clang/include/clang/Testing/TestLanguage.def
index ac62b176a0b87..5fe3a5f04d755 100644
--- a/clang/include/clang/Testing/TestLanguage.def
+++ b/clang/include/clang/Testing/TestLanguage.def
@@ -41,6 +41,7 @@ TESTLANGUAGE_CXX(CXX, 17, c++17, 4)
 TESTLANGUAGE_CXX(CXX, 20, c++20, 5)
 TESTLANGUAGE_CXX(CXX, 23, c++23, 6)
 TESTLANGUAGE_CXX(CXX, 26, c++26, 7)
+TESTLANGUAGE_CXX(CXX, 29, c++29, 8)
 
 #undef TESTLANGUAGE_CXX
 #undef TESTLANGUAGE_C
diff --git a/clang/lib/Basic/LangOptions.cpp b/clang/lib/Basic/LangOptions.cpp
index 7e75bf1221eb7..ea5bfa09b4df2 100644
--- a/clang/lib/Basic/LangOptions.cpp
+++ b/clang/lib/Basic/LangOptions.cpp
@@ -124,6 +124,7 @@ void LangOptions::setLangDefaults(LangOptions &Opts, 
Language Lang,
   Opts.CPlusPlus20 = Std.isCPlusPlus20();
   Opts.CPlusPlus23 = Std.isCPlusPlus23();
   Opts.CPlusPlus26 = Std.isCPlusPlus26();
+  Opts.CPlusPlus29 = Std.isCPlusPlus29();
   Opts.GNUMode = Std.isGNUMode();
   Opts.GNUCVersion = 0;
   Opts.HexFloats = Std.hasHexFloats();
@@ -256,7 +257,9 @@ std::optional<uint32_t> LangOptions::getCPlusPlusLangStd() 
const {
     return std::nullopt;
 
   LangStandard::Kind Std;
-  if (CPlusPlus26)
+  if (CPlusPlus29)
+    Std = LangStandard::lang_cxx29;
+  else if (CPlusPlus26)
     Std = LangStandard::lang_cxx26;
   else if (CPlusPlus23)
     Std = LangStandard::lang_cxx23;
diff --git a/clang/lib/CrossTU/CrossTranslationUnit.cpp 
b/clang/lib/CrossTU/CrossTranslationUnit.cpp
index f5c3e27698bd0..2239d54d591bf 100644
--- a/clang/lib/CrossTU/CrossTranslationUnit.cpp
+++ b/clang/lib/CrossTU/CrossTranslationUnit.cpp
@@ -150,6 +150,8 @@ static llvm::ManagedStatic<IndexErrorCategory> Category;
 static std::string getLangDescription(const LangOptions &LO) {
   if (!LO.CPlusPlus)
     return "non-C++";
+  if (LO.CPlusPlus29)
+    return "C++29";
   if (LO.CPlusPlus26)
     return "C++26";
   if (LO.CPlusPlus23)
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 8f189ea189408..1dd55397f2e05 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -1668,6 +1668,7 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char 
*> ArgList) {
       (Std->containsValue("c++20") || Std->containsValue("c++2a") ||
        Std->containsValue("c++23") || Std->containsValue("c++2b") ||
        Std->containsValue("c++26") || Std->containsValue("c++2c") ||
+       Std->containsValue("c++29") || Std->containsValue("c++2d") ||
        Std->containsValue("c++latest"));
 
   // Process -fmodule-header{=} flags.
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp 
b/clang/lib/Driver/ToolChains/Clang.cpp
index 312e8f8c69f0a..9ce2fd1ddcf56 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -7533,9 +7533,10 @@ void Clang::ConstructJob(Compilation &C, const JobAction 
&JA,
                              // TransferableCommand::tryParseStdArg() in
                              // 
lib/Tooling/InterpolatingCompilationDatabase.cpp
                              // to match.
-                             // TODO add c++23 and c++26 when MSVC supports it.
+                             // TODO add c++23, c++26, c++29 when MSVC supports
+                             // it.
                              .Case("c++23preview", "-std=c++23")
-                             .Case("c++latest", "-std=c++26")
+                             .Case("c++latest", "-std=c++29")
                              .Default("");
       if (IsSYCL) {
         const LangStandard *LangStd =
@@ -7625,7 +7626,9 @@ void Clang::ConstructJob(Compilation &C, const JobAction 
&JA,
        Std->containsValue("c++23") || Std->containsValue("gnu++23") ||
        Std->containsValue("c++23preview") || Std->containsValue("c++2c") ||
        Std->containsValue("gnu++2c") || Std->containsValue("c++26") ||
-       Std->containsValue("gnu++26") || Std->containsValue("c++latest") ||
+       Std->containsValue("gnu++26") || Std->containsValue("c++2d") ||
+       Std->containsValue("gnu++2d") || Std->containsValue("c++29") ||
+       Std->containsValue("gnu++29") || Std->containsValue("c++latest") ||
        Std->containsValue("gnu++latest"));
   bool HaveModules =
       RenderModulesOptions(C, D, Args, Input, Output, HaveCxx20, CmdArgs);
diff --git a/clang/lib/Tooling/InterpolatingCompilationDatabase.cpp 
b/clang/lib/Tooling/InterpolatingCompilationDatabase.cpp
index 36d0775a80708..e228ef6512611 100644
--- a/clang/lib/Tooling/InterpolatingCompilationDatabase.cpp
+++ b/clang/lib/Tooling/InterpolatingCompilationDatabase.cpp
@@ -148,9 +148,9 @@ static LangStandard::Kind latestLangStandardC() {
 // flag in clang-CL mode.
 static LangStandard::Kind latestLangStandardCXX() {
   // FIXME: Have a single source of truth for the mapping from
-  // c++latest --> c++26 that's shared by the driver code
+  // c++latest --> c++29 that's shared by the driver code
   // (clang/lib/Driver/ToolChains/Clang.cpp) and this file.
-  return LangStandard::lang_cxx26;
+  return LangStandard::lang_cxx29;
 }
 
 // A CompileCommand that can be applied to another file.
diff --git a/clang/test/Driver/cl-options.c b/clang/test/Driver/cl-options.c
index 63a423f5b3114..cad42dda9e992 100644
--- a/clang/test/Driver/cl-options.c
+++ b/clang/test/Driver/cl-options.c
@@ -625,7 +625,7 @@
 // STDCXX23PREVIEW: -std=c++23
 
 // RUN: %clang_cl -fmsc-version=1900 -TP -std:c++latest -### -- %s 2>&1 | 
FileCheck -check-prefix=STDCXXLATEST %s
-// STDCXXLATEST: -std=c++26
+// STDCXXLATEST: -std=c++29
 
 // RUN: env CL="/Gy" %clang_cl -### -- %s 2>&1 | FileCheck 
-check-prefix=ENV-CL %s
 // ENV-CL: "-ffunction-sections"
diff --git a/clang/test/Driver/unknown-std.cpp 
b/clang/test/Driver/unknown-std.cpp
index 5c58042a0a2c7..0d230fad1aa0b 100644
--- a/clang/test/Driver/unknown-std.cpp
+++ b/clang/test/Driver/unknown-std.cpp
@@ -24,6 +24,8 @@
 // CHECK-NEXT: note: use 'gnu++23' for 'ISO C++ 2023 DIS with GNU extensions' 
standard
 // CHECK-NEXT: note: use 'c++2c' or 'c++26' for 'Working draft for C++2c' 
standard
 // CHECK-NEXT: note: use 'gnu++2c' or 'gnu++26' for 'Working draft for C++2c 
with GNU extensions' standard
+// CHECK-NEXT: note: use 'c++2d' or 'c++29' for 'Working draft for C++2d' 
standard
+// CHECK-NEXT: note: use 'gnu++2d' or 'gnu++29' for 'Working draft for C++2d 
with GNU extensions' standard
 
 // Make sure that no other output is present.
 // CHECK-NOT: {{^.+$}}
diff --git a/clang/test/Preprocessor/init.c b/clang/test/Preprocessor/init.c
index 80b7a6399e5f4..7e6b854719287 100644
--- a/clang/test/Preprocessor/init.c
+++ b/clang/test/Preprocessor/init.c
@@ -15,6 +15,16 @@
 // BLOCKS:#define __BLOCKS__ 1
 // BLOCKS:#define __block __attribute__((__blocks__(byref)))
 //
+// RUN: %clang_cc1 -x c++ -fgnuc-version=4.2.1 -std=c++2d -E -dM < /dev/null | 
FileCheck -match-full-lines -check-prefix CXX29 %s
+// RUN: %clang_cc1 -x c++ -fgnuc-version=4.2.1 -std=c++29 -E -dM < /dev/null | 
FileCheck -match-full-lines -check-prefix CXX29 %s
+//
+// CXX29:#define __GNUG__ 4
+// CXX29:#define __GXX_EXPERIMENTAL_CXX0X__ 1
+// CXX29:#define __GXX_RTTI 1
+// CXX29:#define __GXX_WEAK__ 1
+// CXX29:#define __cplusplus 202700L
+// CXX29:#define __private_extern__ extern
+//
 // RUN: %clang_cc1 -x c++ -fgnuc-version=4.2.1 -std=c++26 -E -dM < /dev/null | 
FileCheck -match-full-lines -check-prefix CXX26 %s
 // RUN: %clang_cc1 -x c++ -fgnuc-version=4.2.1 -std=c++2c -E -dM < /dev/null | 
FileCheck -match-full-lines -check-prefix CXX26 %s
 //
@@ -214,6 +224,14 @@
 // RUN: %clang_cc1 -ffreestanding -E -dM < /dev/null | FileCheck 
-match-full-lines -check-prefix FREESTANDING %s
 // FREESTANDING:#define __STDC_HOSTED__ 0
 //
+// RUN: %clang_cc1 -x c++ -fgnuc-version=4.2.1 -std=gnu++29 -E -dM < /dev/null 
| FileCheck -match-full-lines -check-prefix GXX26 %s
+// RUN: %clang_cc1 -x c++ -fgnuc-version=4.2.1 -std=gnu++2d -E -dM < /dev/null 
| FileCheck -match-full-lines -check-prefix GXX26 %s
+//
+// GXX26:#define __GNUG__ 4
+// GXX26:#define __GXX_WEAK__ 1
+// GXX26:#define __cplusplus 202700L
+// GXX26:#define __private_extern__ extern
+//
 // RUN: %clang_cc1 -x c++ -fgnuc-version=4.2.1 -std=gnu++26 -E -dM < /dev/null 
| FileCheck -match-full-lines -check-prefix GXX26 %s
 // RUN: %clang_cc1 -x c++ -fgnuc-version=4.2.1 -std=gnu++2c -E -dM < /dev/null 
| FileCheck -match-full-lines -check-prefix GXX26 %s
 //
diff --git a/clang/www/OpenProjects.html b/clang/www/OpenProjects.html
index 3e5e84b5b2ed4..71ce7ecf416d8 100755
--- a/clang/www/OpenProjects.html
+++ b/clang/www/OpenProjects.html
@@ -112,7 +112,7 @@ <h1>Open Clang Projects</h1>
 </ul>
 </li>
 
-<li><b>Continue work on C++20, C++23, C++2c, and C23 support</b>:
+<li><b>Continue work on C++20, C++23, C++2c, C++2d, and C23 support</b>:
   There are still several C++20 features to complete, and work has begun on
   supporting the latest language standards. Please see the
   <a href="cxx_status.html">C++ status report page</a> to find out what is

>From a69daed075b078f1e4bb490c51b42c9b6dd5c8c7 Mon Sep 17 00:00:00 2001
From: Sirraide <[email protected]>
Date: Mon, 15 Jun 2026 23:10:59 +0200
Subject: [PATCH 2/4] Update some more instances of CPlusPlus26 that I missed

---
 clang/include/clang/Options/Options.td    | 1 +
 clang/lib/Basic/DiagnosticIDs.cpp         | 2 ++
 clang/lib/Basic/Module.cpp                | 1 +
 clang/lib/Basic/Targets/OSTargets.cpp     | 5 ++++-
 clang/unittests/Basic/LangOptionsTest.cpp | 2 ++
 5 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Options/Options.td 
b/clang/include/clang/Options/Options.td
index a4b9cb802af4d..48074ae7e52bb 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -632,6 +632,7 @@ defvar cpp17 = LangOpts<"CPlusPlus17">;
 defvar cpp20 = LangOpts<"CPlusPlus20">;
 defvar cpp23 = LangOpts<"CPlusPlus23">;
 defvar cpp26 = LangOpts<"CPlusPlus26">;
+defvar cpp29 = LangOpts<"CPlusPlus29">;
 defvar c99 = LangOpts<"C99">;
 defvar c23 = LangOpts<"C23">;
 defvar lang_std = LangOpts<"LangStd">;
diff --git a/clang/lib/Basic/DiagnosticIDs.cpp 
b/clang/lib/Basic/DiagnosticIDs.cpp
index d9c5e4082c1a7..6445aa6f4ecb1 100644
--- a/clang/lib/Basic/DiagnosticIDs.cpp
+++ b/clang/lib/Basic/DiagnosticIDs.cpp
@@ -902,6 +902,8 @@ unsigned DiagnosticIDs::getCXXCompatDiagId(const 
LangOptions &LangOpts,
   assert(CompatDiagId < std::size(Diags) && "Invalid compat diag id");
 
   unsigned StdVer = [&] {
+    if (LangOpts.CPlusPlus29)
+      return 2029;
     if (LangOpts.CPlusPlus26)
       return 2026;
     if (LangOpts.CPlusPlus23)
diff --git a/clang/lib/Basic/Module.cpp b/clang/lib/Basic/Module.cpp
index d27abb1153c72..3e2f66f27a518 100644
--- a/clang/lib/Basic/Module.cpp
+++ b/clang/lib/Basic/Module.cpp
@@ -105,6 +105,7 @@ static bool hasFeature(StringRef Feature, const LangOptions 
&LangOpts,
                         .Case("cplusplus20", LangOpts.CPlusPlus20)
                         .Case("cplusplus23", LangOpts.CPlusPlus23)
                         .Case("cplusplus26", LangOpts.CPlusPlus26)
+                        .Case("cplusplus29", LangOpts.CPlusPlus29)
                         .Case("c99", LangOpts.C99)
                         .Case("c11", LangOpts.C11)
                         .Case("c17", LangOpts.C17)
diff --git a/clang/lib/Basic/Targets/OSTargets.cpp 
b/clang/lib/Basic/Targets/OSTargets.cpp
index 08f69bdc4b365..915cd566ed6e4 100644
--- a/clang/lib/Basic/Targets/OSTargets.cpp
+++ b/clang/lib/Basic/Targets/OSTargets.cpp
@@ -228,7 +228,10 @@ static void addVisualCDefines(const LangOptions &Opts, 
MacroBuilder &Builder) {
       Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
 
     if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
-      if (Opts.CPlusPlus26)
+      if (Opts.CPlusPlus29)
+        // TODO update to the proper value.
+        Builder.defineMacro("_MSVC_LANG", "202700L");
+      else if (Opts.CPlusPlus26)
         // TODO update to the proper value.
         Builder.defineMacro("_MSVC_LANG", "202400L");
       else if (Opts.CPlusPlus23)
diff --git a/clang/unittests/Basic/LangOptionsTest.cpp 
b/clang/unittests/Basic/LangOptionsTest.cpp
index 0d7d5ec86b0b8..341ec7ba51b6e 100644
--- a/clang/unittests/Basic/LangOptionsTest.cpp
+++ b/clang/unittests/Basic/LangOptionsTest.cpp
@@ -50,6 +50,8 @@ TEST(LangOptsTest, CppStdLang) {
   EXPECT_EQ(opts.getCPlusPlusLangStd(), 202302);
   opts.CPlusPlus26 = 1;
   EXPECT_EQ(opts.getCPlusPlusLangStd(), 202400);
+  opts.CPlusPlus29 = 1;
+  EXPECT_EQ(opts.getCPlusPlusLangStd(), 202700);
 
   EXPECT_FALSE(opts.getCLangStd());
 }

>From 2e2b85bc3f870dffed4e601570e564de5a54d4f1 Mon Sep 17 00:00:00 2001
From: Sirraide <[email protected]>
Date: Mon, 15 Jun 2026 23:52:03 +0200
Subject: [PATCH 3/4] fix copy-paste error

---
 clang/test/Preprocessor/init.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/clang/test/Preprocessor/init.c b/clang/test/Preprocessor/init.c
index 7e6b854719287..2a4760b6ea8fd 100644
--- a/clang/test/Preprocessor/init.c
+++ b/clang/test/Preprocessor/init.c
@@ -224,13 +224,13 @@
 // RUN: %clang_cc1 -ffreestanding -E -dM < /dev/null | FileCheck 
-match-full-lines -check-prefix FREESTANDING %s
 // FREESTANDING:#define __STDC_HOSTED__ 0
 //
-// RUN: %clang_cc1 -x c++ -fgnuc-version=4.2.1 -std=gnu++29 -E -dM < /dev/null 
| FileCheck -match-full-lines -check-prefix GXX26 %s
-// RUN: %clang_cc1 -x c++ -fgnuc-version=4.2.1 -std=gnu++2d -E -dM < /dev/null 
| FileCheck -match-full-lines -check-prefix GXX26 %s
+// RUN: %clang_cc1 -x c++ -fgnuc-version=4.2.1 -std=gnu++29 -E -dM < /dev/null 
| FileCheck -match-full-lines -check-prefix GXX29 %s
+// RUN: %clang_cc1 -x c++ -fgnuc-version=4.2.1 -std=gnu++2d -E -dM < /dev/null 
| FileCheck -match-full-lines -check-prefix GXX29 %s
 //
-// GXX26:#define __GNUG__ 4
-// GXX26:#define __GXX_WEAK__ 1
-// GXX26:#define __cplusplus 202700L
-// GXX26:#define __private_extern__ extern
+// GXX29:#define __GNUG__ 4
+// GXX29:#define __GXX_WEAK__ 1
+// GXX29:#define __cplusplus 202700L
+// GXX29:#define __private_extern__ extern
 //
 // RUN: %clang_cc1 -x c++ -fgnuc-version=4.2.1 -std=gnu++26 -E -dM < /dev/null 
| FileCheck -match-full-lines -check-prefix GXX26 %s
 // RUN: %clang_cc1 -x c++ -fgnuc-version=4.2.1 -std=gnu++2c -E -dM < /dev/null 
| FileCheck -match-full-lines -check-prefix GXX26 %s

>From 8f8aeb1d4f26efc2da712df9ba41c6ec007a9421 Mon Sep 17 00:00:00 2001
From: Sirraide <[email protected]>
Date: Mon, 15 Jun 2026 23:52:43 +0200
Subject: [PATCH 4/4] update make_cxx_dr_status.py

---
 clang/www/make_cxx_dr_status | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/clang/www/make_cxx_dr_status b/clang/www/make_cxx_dr_status
index 3ba12e13a7354..439f3d879771d 100755
--- a/clang/www/make_cxx_dr_status
+++ b/clang/www/make_cxx_dr_status
@@ -186,6 +186,9 @@ def availability(issue):
   elif status.endswith(' c++26'):
     status = status[:-6]
     avail_suffix = ' (C++26 onwards)'
+  elif status.endswith(' c++29'):
+    status = status[:-6]
+    avail_suffix = ' (C++29 onwards)'
   if status == 'unknown':
     avail = 'Unknown'
     avail_style = 'unknown'

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to