Skip to content

Commit 6627a3c

Browse files
committed
[c++2b] Add option -std=c++2b to enable support for potential C++2b features.
Reviewed By: rsmith Differential Revision: https://reviews.llvm.org/D92547
1 parent 48f7ca1 commit 6627a3c

File tree

8 files changed

+50
-7
lines changed

8 files changed

+50
-7
lines changed

clang/include/clang/Basic/LangOptions.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ LANGOPT(CPlusPlus11 , 1, 0, "C++11")
9292
LANGOPT(CPlusPlus14 , 1, 0, "C++14")
9393
LANGOPT(CPlusPlus17 , 1, 0, "C++17")
9494
LANGOPT(CPlusPlus20 , 1, 0, "C++20")
95+
LANGOPT(CPlusPlus2b , 1, 0, "C++2b")
9596
LANGOPT(ObjC , 1, 0, "Objective-C")
9697
BENIGN_LANGOPT(ObjCDefaultSynthProperties , 1, 0,
9798
"Objective-C auto-synthesized properties")

clang/include/clang/Basic/LangStandard.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,12 @@ enum LangFeatures {
4949
CPlusPlus14 = (1 << 7),
5050
CPlusPlus17 = (1 << 8),
5151
CPlusPlus20 = (1 << 9),
52-
Digraphs = (1 << 10),
53-
GNUMode = (1 << 11),
54-
HexFloat = (1 << 12),
55-
ImplicitInt = (1 << 13),
56-
OpenCL = (1 << 14)
52+
CPlusPlus2b = (1 << 10),
53+
Digraphs = (1 << 11),
54+
GNUMode = (1 << 12),
55+
HexFloat = (1 << 13),
56+
ImplicitInt = (1 << 14),
57+
OpenCL = (1 << 15)
5758
};
5859

5960
/// LangStandard - Information about the properties of a particular language
@@ -111,6 +112,9 @@ struct LangStandard {
111112
/// isCPlusPlus20 - Language is a C++20 variant (or later).
112113
bool isCPlusPlus20() const { return Flags & CPlusPlus20; }
113114

115+
/// isCPlusPlus2b - Language is a post-C++20 variant (or later).
116+
bool isCPlusPlus2b() const { return Flags & CPlusPlus2b; }
117+
114118
/// hasDigraphs - Language supports digraphs.
115119
bool hasDigraphs() const { return Flags & Digraphs; }
116120

clang/include/clang/Basic/LangStandards.def

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,16 @@ LANGSTANDARD(gnucxx20, "gnu++20",
152152
CPlusPlus20 | Digraphs | HexFloat | GNUMode)
153153
LANGSTANDARD_ALIAS_DEPR(gnucxx20, "gnu++2a")
154154

155+
LANGSTANDARD(cxx2b, "c++2b",
156+
CXX, "Working draft for ISO C++ 2023 DIS",
157+
LineComment | CPlusPlus | CPlusPlus11 | CPlusPlus14 | CPlusPlus17 |
158+
CPlusPlus20 | CPlusPlus2b | Digraphs | HexFloat)
159+
160+
LANGSTANDARD(gnucxx2b, "gnu++2b",
161+
CXX, "Working draft for ISO C++ 2023 DIS with GNU extensions",
162+
LineComment | CPlusPlus | CPlusPlus11 | CPlusPlus14 | CPlusPlus17 |
163+
CPlusPlus20 | CPlusPlus2b | Digraphs | HexFloat | GNUMode)
164+
155165
// OpenCL
156166
LANGSTANDARD(opencl10, "cl1.0",
157167
OpenCL, "OpenCL 1.0",

clang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2388,6 +2388,7 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,
23882388
Opts.CPlusPlus14 = Std.isCPlusPlus14();
23892389
Opts.CPlusPlus17 = Std.isCPlusPlus17();
23902390
Opts.CPlusPlus20 = Std.isCPlusPlus20();
2391+
Opts.CPlusPlus2b = Std.isCPlusPlus2b();
23912392
Opts.Digraphs = Std.hasDigraphs();
23922393
Opts.GNUMode = Std.isGNUMode();
23932394
Opts.GNUInline = !Opts.C99 && !Opts.CPlusPlus;

clang/lib/Frontend/InitPreprocessor.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -376,8 +376,11 @@ static void InitializeStandardPredefinedMacros(const TargetInfo &TI,
376376
Builder.defineMacro("__STDC_VERSION__", "199409L");
377377
} else {
378378
// -- __cplusplus
379+
// FIXME: Use correct value for C++23.
380+
if (LangOpts.CPlusPlus2b)
381+
Builder.defineMacro("__cplusplus", "202101L");
379382
// [C++20] The integer literal 202002L.
380-
if (LangOpts.CPlusPlus20)
383+
else if (LangOpts.CPlusPlus20)
381384
Builder.defineMacro("__cplusplus", "202002L");
382385
// [C++17] The integer literal 201703L.
383386
else if (LangOpts.CPlusPlus17)

clang/test/Driver/std.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
// RUN: not %clang -std=gnu++1z %s -fsyntax-only 2>&1 | FileCheck -check-prefix=GNUXX1Z %s
1212
// RUN: not %clang -std=c++2a %s -fsyntax-only 2>&1 | FileCheck -check-prefix=CXX2A %s
1313
// RUN: not %clang -std=gnu++2a %s -fsyntax-only 2>&1 | FileCheck -check-prefix=GNUXX2A %s
14-
14+
// RUN: not %clang -std=c++2b %s -fsyntax-only 2>&1 | FileCheck -check-prefix=CXX2B %s
15+
// RUN: not %clang -std=gnu++2b %s -fsyntax-only 2>&1 | FileCheck -check-prefix=GNUXX2B %s
1516

1617
void f(int n) {
1718
typeof(n)();
@@ -48,3 +49,8 @@ void f(int n) {
4849
// GNUXX2A-NOT: undeclared identifier 'typeof'
4950
// GNUXX2A-NOT: undeclared identifier 'decltype'
5051

52+
// CXX2B: undeclared identifier 'typeof'
53+
// CXX2B-NOT: undeclared identifier 'decltype'
54+
55+
// GNUXX2B-NOT: undeclared identifier 'typeof'
56+
// GNUXX2B-NOT: undeclared identifier 'decltype'

clang/test/Driver/unknown-std.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
// CHECK-NEXT: note: use 'gnu++17' for 'ISO C++ 2017 with amendments and GNU extensions' standard
1818
// CHECK-NEXT: note: use 'c++20' for 'ISO C++ 2020 DIS' standard
1919
// CHECK-NEXT: note: use 'gnu++20' for 'ISO C++ 2020 DIS with GNU extensions' standard
20+
// CHECK-NEXT: note: use 'c++2b' for 'Working draft for ISO C++ 2023 DIS' standard
21+
// CHECK-NEXT: note: use 'gnu++2b' for 'Working draft for ISO C++ 2023 DIS with GNU extensions' standard
2022
// CUDA-NEXT: note: use 'cuda' for 'NVIDIA CUDA(tm)' standard
2123

2224
// Make sure that no other output is present.

clang/test/Preprocessor/init.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,15 @@
99
// BLOCKS:#define __block __attribute__((__blocks__(byref)))
1010
//
1111
//
12+
// RUN: %clang_cc1 -x c++ -fgnuc-version=4.2.1 -std=c++2b -E -dM < /dev/null | FileCheck -match-full-lines -check-prefix CXX2B %s
13+
//
14+
// CXX2B:#define __GNUG__ 4
15+
// CXX2B:#define __GXX_EXPERIMENTAL_CXX0X__ 1
16+
// CXX2B:#define __GXX_RTTI 1
17+
// CXX2B:#define __GXX_WEAK__ 1
18+
// CXX2B:#define __cplusplus 202101L
19+
// CXX2B:#define __private_extern__ extern
20+
//
1221
// RUN: %clang_cc1 -x c++ -fgnuc-version=4.2.1 -std=c++20 -E -dM < /dev/null | FileCheck -match-full-lines -check-prefix CXX2A %s
1322
// RUN: %clang_cc1 -x c++ -fgnuc-version=4.2.1 -std=c++2a -E -dM < /dev/null | FileCheck -match-full-lines -check-prefix CXX2A %s
1423
//
@@ -122,6 +131,13 @@
122131
// RUN: %clang_cc1 -ffreestanding -E -dM < /dev/null | FileCheck -match-full-lines -check-prefix FREESTANDING %s
123132
// FREESTANDING:#define __STDC_HOSTED__ 0
124133
//
134+
// RUN: %clang_cc1 -x c++ -fgnuc-version=4.2.1 -std=gnu++2b -E -dM < /dev/null | FileCheck -match-full-lines -check-prefix GXX2B %s
135+
//
136+
// GXX2B:#define __GNUG__ 4
137+
// GXX2B:#define __GXX_WEAK__ 1
138+
// GXX2B:#define __cplusplus 202101L
139+
// GXX2B:#define __private_extern__ extern
140+
//
125141
// RUN: %clang_cc1 -x c++ -fgnuc-version=4.2.1 -std=gnu++20 -E -dM < /dev/null | FileCheck -match-full-lines -check-prefix GXX2A %s
126142
// RUN: %clang_cc1 -x c++ -fgnuc-version=4.2.1 -std=gnu++2a -E -dM < /dev/null | FileCheck -match-full-lines -check-prefix GXX2A %s
127143
//

0 commit comments

Comments
 (0)