diff options
author | Paul Fee <paul.f.fee@gmail.com> | 2021-01-25 01:18:30 +0000 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2021-01-26 17:11:34 -0500 |
commit | 78739c2df788ee5c868d998a6333d453317d8711 (patch) | |
tree | 8b2912606a50618a4c05b01ed1712f18f2a6f1e1 /libcpp/init.c | |
parent | 96253f069ead0736536de803b06a8053a85039a6 (diff) | |
download | gcc-78739c2df788ee5c868d998a6333d453317d8711.zip gcc-78739c2df788ee5c868d998a6333d453317d8711.tar.gz gcc-78739c2df788ee5c868d998a6333d453317d8711.tar.bz2 |
c++: Add support for -std=c++23
Derived from the changes that added C++2a support in 2017.
r8-3237-g026a79f70cf33f836ea5275eda72d4870a3041e5
No C++23 features are added here.
Use of -std=c++23 sets __cplusplus to 202100L.
$ g++ -std=c++23 -dM -E -x c++ - < /dev/null | grep cplusplus
#define __cplusplus 202100L
gcc/
* doc/cpp.texi (__cplusplus): Document value for -std=c++23
or -std=gnu++23.
* doc/invoke.texi: Document -std=c++23 and -std=gnu++23.
* dwarf2out.c (highest_c_language): Recognise C++20 and C++23.
(gen_compile_unit_die): Recognise C++23.
gcc/c-family/
* c-common.h (cxx_dialect): Add cxx23 as a dialect.
* c.opt: Add options for -std=c++23, std=c++2b, -std=gnu++23
and -std=gnu++2b
* c-opts.c (set_std_cxx23): New.
(c_common_handle_option): Set options when -std=c++23 is enabled.
(c_common_post_options): Adjust comments.
(set_std_cxx20): Likewise.
gcc/testsuite/
* lib/target-supports.exp (check_effective_target_c++2a):
Check for C++2a or C++23.
(check_effective_target_c++20_down): New.
(check_effective_target_c++23_only): New.
(check_effective_target_c++23): New.
* g++.dg/cpp23/cplusplus.C: New.
libcpp/
* include/cpplib.h (c_lang): Add CXX23 and GNUCXX23.
* init.c (lang_defaults): Add rows for CXX23 and GNUCXX23.
(cpp_init_builtins): Set __cplusplus to 202100L for C++23.
Diffstat (limited to 'libcpp/init.c')
-rw-r--r-- | libcpp/init.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/libcpp/init.c b/libcpp/init.c index a5103c4..ecd3d5b 100644 --- a/libcpp/init.c +++ b/libcpp/init.c @@ -119,6 +119,8 @@ static const struct lang_flags lang_defaults[] = /* CXX17 */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0 }, /* GNUCXX20 */ { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0 }, /* CXX20 */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0 }, + /* GNUCXX23 */ { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0 }, + /* CXX23 */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0 }, /* ASM */ { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; @@ -540,7 +542,12 @@ cpp_init_builtins (cpp_reader *pfile, int hosted) if (CPP_OPTION (pfile, cplusplus)) { - if (CPP_OPTION (pfile, lang) == CLK_CXX20 + /* C++23 is not yet a standard. For now, use an invalid + * year/month, 202100L, which is larger than 202002L. */ + if (CPP_OPTION (pfile, lang) == CLK_CXX23 + || CPP_OPTION (pfile, lang) == CLK_GNUCXX23) + _cpp_define_builtin (pfile, "__cplusplus 202100L"); + else if (CPP_OPTION (pfile, lang) == CLK_CXX20 || CPP_OPTION (pfile, lang) == CLK_GNUCXX20) _cpp_define_builtin (pfile, "__cplusplus 202002L"); else if (CPP_OPTION (pfile, lang) == CLK_CXX17 |