[clang] b67d557 - [C2y] Add -std=c2y and -std=gnu2y
Aaron Ballman via cfe-commits
cfe-commits at lists.llvm.org
Tue Jul 2 04:00:44 PDT 2024
Author: Aaron Ballman
Date: 2024-07-02T07:00:19-04:00
New Revision: b67d557bd3627a428d5041edec129587d6d3972c
URL: https://github.com/llvm/llvm-project/commit/b67d557bd3627a428d5041edec129587d6d3972c
DIFF: https://github.com/llvm/llvm-project/commit/b67d557bd3627a428d5041edec129587d6d3972c.diff
LOG: [C2y] Add -std=c2y and -std=gnu2y
This adds a language standard mode for the latest C standard. While
WG14 is hoping for a three-year cycle, it is not clear that the next
revision of C will be in 2026 and so a flag was not created for c26
specifically.
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/docs/UsersManual.rst
clang/include/clang/Basic/LangOptions.def
clang/include/clang/Basic/LangStandard.h
clang/include/clang/Basic/LangStandards.def
clang/lib/Basic/LangOptions.cpp
clang/lib/Frontend/InitPreprocessor.cpp
clang/test/Driver/unknown-std.c
clang/www/c_status.html
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index fd8d9ad34fb10..e4707bf15bb6c 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -320,6 +320,12 @@ Resolutions to C++ Defect Reports
C Language Changes
------------------
+C2y Feature Support
+^^^^^^^^^^^^^^^^^^^
+- Clang now enables C2y mode with ``-std=c2y``. This sets ``__STDC_VERSION__``
+ to ``202400L`` so that it's greater than the value for C23. The value of this
+ macro is subject to change in the future.
+
C23 Feature Support
^^^^^^^^^^^^^^^^^^^
- No longer diagnose use of binary literals as an extension in C23 mode. Fixes
diff --git a/clang/docs/UsersManual.rst b/clang/docs/UsersManual.rst
index d273102fe9000..087c75bc39a16 100644
--- a/clang/docs/UsersManual.rst
+++ b/clang/docs/UsersManual.rst
@@ -3458,9 +3458,9 @@ Differences between various standard modes
clang supports the -std option, which changes what language mode clang uses.
The supported modes for C are c89, gnu89, c94, c99, gnu99, c11, gnu11, c17,
-gnu17, c23, gnu23, and various aliases for those modes. If no -std option is
-specified, clang defaults to gnu17 mode. Many C99 and C11 features are
-supported in earlier modes as a conforming extension, with a warning. Use
+gnu17, c23, gnu23, c2y, gnu2y, and various aliases for those modes. If no -std
+option is specified, clang defaults to gnu17 mode. Many C99 and C11 features
+are supported in earlier modes as a conforming extension, with a warning. Use
``-pedantic-errors`` to request an error if a feature from a later standard
revision is used in an earlier mode.
@@ -3523,6 +3523,10 @@ Differences between ``*17`` and ``*23`` modes:
- ``[[]]`` attributes are supported by default in ``*23`` mode, and as an
extension in ``*17`` and earlier modes.
+Differences between ``*23`` and ``*2y`` modes:
+
+- ``__STDC_VERSION__`` is defined to ``202400L`` rather than ``202311L``.
+
GCC extensions not implemented yet
----------------------------------
diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def
index 6dd6b5614f44c..491759e2fcdbb 100644
--- a/clang/include/clang/Basic/LangOptions.def
+++ b/clang/include/clang/Basic/LangOptions.def
@@ -87,6 +87,7 @@ LANGOPT(C99 , 1, 0, "C99")
LANGOPT(C11 , 1, 0, "C11")
LANGOPT(C17 , 1, 0, "C17")
LANGOPT(C23 , 1, 0, "C23")
+LANGOPT(C2y , 1, 0, "C2y")
LANGOPT(MSVCCompat , 1, 0, "Microsoft Visual C++ full compatibility mode")
LANGOPT(Kernel , 1, 0, "Kernel mode")
LANGOPT(MicrosoftExt , 1, 0, "Microsoft C++ extensions")
diff --git a/clang/include/clang/Basic/LangStandard.h b/clang/include/clang/Basic/LangStandard.h
index 8e25afc833661..f79b4aafb0b26 100644
--- a/clang/include/clang/Basic/LangStandard.h
+++ b/clang/include/clang/Basic/LangStandard.h
@@ -52,18 +52,19 @@ enum LangFeatures {
C11 = (1 << 2),
C17 = (1 << 3),
C23 = (1 << 4),
- CPlusPlus = (1 << 5),
- CPlusPlus11 = (1 << 6),
- CPlusPlus14 = (1 << 7),
- CPlusPlus17 = (1 << 8),
- CPlusPlus20 = (1 << 9),
- CPlusPlus23 = (1 << 10),
- CPlusPlus26 = (1 << 11),
- Digraphs = (1 << 12),
- GNUMode = (1 << 13),
- HexFloat = (1 << 14),
- OpenCL = (1 << 15),
- HLSL = (1 << 16)
+ C2y = (1 << 5),
+ CPlusPlus = (1 << 6),
+ CPlusPlus11 = (1 << 7),
+ CPlusPlus14 = (1 << 8),
+ CPlusPlus17 = (1 << 9),
+ CPlusPlus20 = (1 << 10),
+ CPlusPlus23 = (1 << 11),
+ CPlusPlus26 = (1 << 12),
+ Digraphs = (1 << 13),
+ GNUMode = (1 << 14),
+ HexFloat = (1 << 15),
+ OpenCL = (1 << 16),
+ HLSL = (1 << 17)
};
/// LangStandard - Information about the properties of a particular language
@@ -106,6 +107,9 @@ struct LangStandard {
/// isC23 - Language is a superset of C23.
bool isC23() const { return Flags & C23; }
+ /// isC2y - Language is a superset of C2y.
+ bool isC2y() const { return Flags & C2y; }
+
/// isCPlusPlus - Language is a C++ variant.
bool isCPlusPlus() const { return Flags & CPlusPlus; }
diff --git a/clang/include/clang/Basic/LangStandards.def b/clang/include/clang/Basic/LangStandards.def
index b6192e48efc11..f0c259307ac4e 100644
--- a/clang/include/clang/Basic/LangStandards.def
+++ b/clang/include/clang/Basic/LangStandards.def
@@ -99,6 +99,15 @@ LANGSTANDARD_ALIAS_DEPR(gnu23, "gnu2x")
// FIXME: Add the alias for iso9899:202* once we know the year ISO publishes
// the document (expected to be 2024).
+// C2y modes
+LANGSTANDARD(c2y, "c2y",
+ C, "Working Draft for ISO C2y",
+ LineComment | C99 | C11 | C17 | C23 | C2y | Digraphs | HexFloat)
+LANGSTANDARD(gnu2y, "gnu2y",
+ C, "Working Draft for ISO C2y with GNU extensions",
+ LineComment | C99 | C11 | C17 | C23 | C2y | Digraphs | GNUMode | HexFloat)
+
+
// C++ modes
LANGSTANDARD(cxx98, "c++98",
CXX, "ISO C++ 1998 with amendments",
diff --git a/clang/lib/Basic/LangOptions.cpp b/clang/lib/Basic/LangOptions.cpp
index 2b906463931d3..61072b7b81bff 100644
--- a/clang/lib/Basic/LangOptions.cpp
+++ b/clang/lib/Basic/LangOptions.cpp
@@ -112,6 +112,7 @@ void LangOptions::setLangDefaults(LangOptions &Opts, Language Lang,
Opts.C11 = Std.isC11();
Opts.C17 = Std.isC17();
Opts.C23 = Std.isC23();
+ Opts.C2y = Std.isC2y();
Opts.CPlusPlus = Std.isCPlusPlus();
Opts.CPlusPlus11 = Std.isCPlusPlus11();
Opts.CPlusPlus14 = Std.isCPlusPlus14();
diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp
index 55ec460064830..5e52555c6fee9 100644
--- a/clang/lib/Frontend/InitPreprocessor.cpp
+++ b/clang/lib/Frontend/InitPreprocessor.cpp
@@ -448,7 +448,9 @@ static void InitializeStandardPredefinedMacros(const TargetInfo &TI,
// value is, are implementation-defined.
// (Removed in C++20.)
if (!LangOpts.CPlusPlus) {
- if (LangOpts.C23)
+ if (LangOpts.C2y)
+ Builder.defineMacro("__STDC_VERSION__", "202400L");
+ else if (LangOpts.C23)
Builder.defineMacro("__STDC_VERSION__", "202311L");
else if (LangOpts.C17)
Builder.defineMacro("__STDC_VERSION__", "201710L");
diff --git a/clang/test/Driver/unknown-std.c b/clang/test/Driver/unknown-std.c
index 564c633c09bd9..8f9047b2230ad 100644
--- a/clang/test/Driver/unknown-std.c
+++ b/clang/test/Driver/unknown-std.c
@@ -18,6 +18,8 @@
// CHECK-NEXT: note: use 'gnu17' or 'gnu18' for 'ISO C 2017 with GNU extensions' standard
// CHECK-NEXT: note: use 'c23' for 'Working Draft for ISO C23' standard
// CHECK-NEXT: note: use 'gnu23' for 'Working Draft for ISO C23 with GNU extensions' standard
+// CHECK-NEXT: note: use 'c2y' for 'Working Draft for ISO C2y' standard
+// CHECK-NEXT: note: use 'gnu2y' for 'Working Draft for ISO C2y with GNU extensions' standard
// Make sure that no other output is present.
// CHECK-NOT: {{^.+$}}
diff --git a/clang/www/c_status.html b/clang/www/c_status.html
index 8e42b8138a2b5..ccb39a15b25aa 100644
--- a/clang/www/c_status.html
+++ b/clang/www/c_status.html
@@ -71,7 +71,7 @@ <h1>C Support in Clang</h1>
</tr>
<tr>
<td><a href="#c2y">C2y</a></td>
- <td><tt>(Flag currently unavailable)</tt></td>
+ <td><tt>-std=c2y</tt></td>
<td class="partial" align="center">Partial</td>
</tr>
</table>
@@ -1229,8 +1229,7 @@ <h2 id="c2y">C2y implementation status</h2>
<p>Clang has support for some of the features of the C standard following C23, informally referred to as C2y.</p>
-<p>Clang currently does not expose a language standard mode flag for C2y.
-<!--You can use Clang in C2y mode with the <code>-std=c2y</code> option (available in Clang 19 and later).--></p>
+<p>You can use Clang in C2y mode with the <code>-std=c2y</code> option (available in Clang 19 and later).</p>
<details open>
<summary>List of features and minimum Clang version with support</summary>
More information about the cfe-commits
mailing list