aboutsummaryrefslogtreecommitdiff
path: root/libcpp
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2024-10-17 07:01:44 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2024-10-17 07:01:44 +0200
commite020116db056352d9a7495e85d37e66c36f6ea32 (patch)
tree868b56e1cc8c6be01c4dadd38d9640b09907704b /libcpp
parent96ba5e5663d4390a7e69735ce3c9de657fc543fc (diff)
downloadgcc-e020116db056352d9a7495e85d37e66c36f6ea32.zip
gcc-e020116db056352d9a7495e85d37e66c36f6ea32.tar.gz
gcc-e020116db056352d9a7495e85d37e66c36f6ea32.tar.bz2
c, libcpp: Partially implement C2Y N3353 paper [PR117028]
The following patch partially implements the N3353 paper. In particular, it adds support for the delimited escape sequences (\u{123}, \x{123}, \o{123}) which were added already for C++23, all I had to do is split the delimited escape sequence guarding from named universal character escape sequence guards (\N{LATIN CAPITAL LETTER C WITH CARON}), which C++23 has but C2Y doesn't and emit different diagnostics for C from C++ for the delimited escape sequences. And it adds support for the new style of octal literals, 0o137 or 0O1777. I have so far added that just for C and not C++, because I have no idea whether C++ will want to handle it similarly. What the patch doesn't do is any kind of diagnostics for obsoletion of \137 or 0137, as discussed in the PR, I think it is way too early for that. Perhaps some non-default warning later on. 2024-10-17 Jakub Jelinek <jakub@redhat.com> PR c/117028 libcpp/ * include/cpplib.h (struct cpp_options): Add named_uc_escape_seqs, octal_constants and cpp_warn_c23_c2y_compat members. (enum cpp_warning_reason): Add CPP_W_C23_C2Y_COMPAT enumerator. * init.cc (struct lang_flags): Add named_uc_escape_seqs and octal_constants bit-fields. (lang_defaults): Add initializers for them into the table. (cpp_set_lang): Initialize named_uc_escape_seqs and octal_constants. (cpp_create_reader): Initialize cpp_warn_c23_c2y_compat to -1. * charset.cc (_cpp_valid_ucn): Test CPP_OPTION (pfile, named_uc_escape_seqs) rather than CPP_OPTION (pfile, delimited_escape_seqs) in \N{} related tests. Change wording of C cpp_pedwarning for \u{} and emit -Wc23-c2y-compat warning for it too if needed. Formatting fixes. (convert_hex): Change wording of C cpp_pedwarning for \u{} and emit -Wc23-c2y-compat warning for it too if needed. (convert_oct): Likewise. * expr.cc (cpp_classify_number): Handle C2Y 0o or 0O prefixed octal constants. (cpp_interpret_integer): Likewise. gcc/c-family/ * c.opt (Wc23-c2y-compat): Add CPP and CppReason parameters. * c-opts.cc (set_std_c2y): Use CLK_STDC2Y or CLK_GNUC2Y rather than CLK_STDC23 and CLK_GNUC23. Formatting fix. * c-lex.cc (interpret_integer): Handle C2Y 0o or 0O prefixed and wb/WB/uwb/UWB suffixed octal constants. gcc/testsuite/ * gcc.dg/bitint-112.c: New test. * gcc.dg/c23-digit-separators-1.c: Add _Static_assert for valid binary constant with digit separator. * gcc.dg/c23-octal-constants-1.c: New test. * gcc.dg/c23-octal-constants-2.c: New test. * gcc.dg/c2y-digit-separators-1.c: New test. * gcc.dg/c2y-digit-separators-2.c: New test. * gcc.dg/c2y-octal-constants-1.c: New test. * gcc.dg/c2y-octal-constants-2.c: New test. * gcc.dg/c2y-octal-constants-3.c: New test. * gcc.dg/cpp/c23-delimited-escape-seq-1.c: New test. * gcc.dg/cpp/c23-delimited-escape-seq-2.c: New test. * gcc.dg/cpp/c2y-delimited-escape-seq-1.c: New test. * gcc.dg/cpp/c2y-delimited-escape-seq-2.c: New test. * gcc.dg/cpp/c2y-delimited-escape-seq-3.c: New test. * gcc.dg/cpp/c2y-delimited-escape-seq-4.c: New test. * gcc.dg/octal-constants-1.c: New test. * gcc.dg/octal-constants-2.c: New test. * gcc.dg/octal-constants-3.c: New test. * gcc.dg/octal-constants-4.c: New test. * gcc.dg/system-octal-constants-1.c: New test. * gcc.dg/system-octal-constants-1.h: New file.
Diffstat (limited to 'libcpp')
-rw-r--r--libcpp/charset.cc73
-rw-r--r--libcpp/expr.cc37
-rw-r--r--libcpp/include/cpplib.h10
-rw-r--r--libcpp/init.cc75
4 files changed, 142 insertions, 53 deletions
diff --git a/libcpp/charset.cc b/libcpp/charset.cc
index bcfc10c..cc38769 100644
--- a/libcpp/charset.cc
+++ b/libcpp/charset.cc
@@ -1579,7 +1579,7 @@ _cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr,
{
length = 4;
if (identifier_pos
- && !CPP_OPTION (pfile, delimited_escape_seqs)
+ && !CPP_OPTION (pfile, named_uc_escape_seqs)
&& CPP_OPTION (pfile, std))
{
*cp = 0;
@@ -1631,7 +1631,7 @@ _cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr,
cpp_error (pfile, CPP_DL_ERROR,
"empty named universal character escape sequence");
else if ((!identifier_pos || strict)
- && !CPP_OPTION (pfile, delimited_escape_seqs)
+ && !CPP_OPTION (pfile, named_uc_escape_seqs)
&& CPP_OPTION (pfile, cpp_pedantic))
cpp_pedwarning (pfile,
CPP_OPTION (pfile, cplusplus)
@@ -1653,7 +1653,7 @@ _cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr,
{
bool ret = true;
if (identifier_pos
- && (!CPP_OPTION (pfile, delimited_escape_seqs)
+ && (!CPP_OPTION (pfile, named_uc_escape_seqs)
|| !strict))
ret = cpp_warning (pfile, CPP_W_UNICODE,
"%<\\N{%.*s}%> is not a valid "
@@ -1676,7 +1676,7 @@ _cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr,
else
result = 0xC0;
if (identifier_pos
- && (!CPP_OPTION (pfile, delimited_escape_seqs)
+ && (!CPP_OPTION (pfile, named_uc_escape_seqs)
|| !strict))
{
*cp = 0;
@@ -1746,6 +1746,7 @@ _cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr,
if (delimited && str < limit && *str == '}')
{
+ bool warned = false;
if (length == 32 && identifier_pos)
{
cpp_warning (pfile, CPP_W_UNICODE,
@@ -1755,13 +1756,28 @@ _cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr,
return false;
}
else if (length == 32)
- cpp_error (pfile, CPP_DL_ERROR,
- "empty delimited escape sequence");
+ {
+ cpp_error (pfile, CPP_DL_ERROR, "empty delimited escape sequence");
+ warned = true;
+ }
else if (!CPP_OPTION (pfile, delimited_escape_seqs)
&& CPP_OPTION (pfile, cpp_pedantic))
- cpp_pedwarning (pfile, (CPP_OPTION (pfile, cplusplus)
- ? CPP_W_CXX23_EXTENSIONS : CPP_W_PEDANTIC),
- "delimited escape sequences are only valid in C++23");
+ {
+ if (CPP_OPTION (pfile, cplusplus))
+ warned
+ = cpp_pedwarning (pfile, CPP_W_CXX23_EXTENSIONS,
+ "delimited escape sequences are only valid "
+ "in C++23");
+ else
+ warned
+ = cpp_pedwarning (pfile, CPP_W_PEDANTIC,
+ "delimited escape sequences are only valid "
+ "in C2Y");
+ }
+ if (!warned && CPP_OPTION (pfile, cpp_warn_c23_c2y_compat) > 0)
+ cpp_warning (pfile, CPP_W_C11_C23_COMPAT,
+ "delimited escape sequences are only valid in C2Y");
+
str++;
length = 0;
delimited = false;
@@ -2125,6 +2141,7 @@ convert_hex (cpp_reader *pfile, const uchar *from, const uchar *limit,
if (delimited && from < limit && *from == '}')
{
+ bool warned = false;
from++;
if (!digits_found)
{
@@ -2134,9 +2151,21 @@ convert_hex (cpp_reader *pfile, const uchar *from, const uchar *limit,
}
else if (!CPP_OPTION (pfile, delimited_escape_seqs)
&& CPP_OPTION (pfile, cpp_pedantic))
- cpp_pedwarning (pfile, (CPP_OPTION (pfile, cplusplus)
- ? CPP_W_CXX23_EXTENSIONS : CPP_W_PEDANTIC),
- "delimited escape sequences are only valid in C++23");
+ {
+ if (CPP_OPTION (pfile, cplusplus))
+ warned
+ = cpp_pedwarning (pfile, CPP_W_CXX23_EXTENSIONS,
+ "delimited escape sequences are only valid "
+ "in C++23");
+ else
+ warned
+ = cpp_pedwarning (pfile, CPP_W_PEDANTIC,
+ "delimited escape sequences are only valid "
+ "in C2Y");
+ }
+ if (!warned && CPP_OPTION (pfile, cpp_warn_c23_c2y_compat) > 0)
+ cpp_warning (pfile, CPP_W_C11_C23_COMPAT,
+ "delimited escape sequences are only valid in C2Y");
delimited = false;
extend_char_range (&char_range, loc_reader);
}
@@ -2229,6 +2258,7 @@ convert_oct (cpp_reader *pfile, const uchar *from, const uchar *limit,
{
if (from < limit && *from == '}')
{
+ bool warned = false;
from++;
if (count == 1)
{
@@ -2238,10 +2268,21 @@ convert_oct (cpp_reader *pfile, const uchar *from, const uchar *limit,
}
else if (!CPP_OPTION (pfile, delimited_escape_seqs)
&& CPP_OPTION (pfile, cpp_pedantic))
- cpp_pedwarning (pfile, (CPP_OPTION (pfile, cplusplus)
- ? CPP_W_CXX23_EXTENSIONS : CPP_W_PEDANTIC),
- "delimited escape sequences are only valid "
- "in C++23");
+ {
+ if (CPP_OPTION (pfile, cplusplus))
+ warned
+ = cpp_pedwarning (pfile, CPP_W_CXX23_EXTENSIONS,
+ "delimited escape sequences are only "
+ "valid in C++23");
+ else
+ warned
+ = cpp_pedwarning (pfile, CPP_W_PEDANTIC,
+ "delimited escape sequences are only "
+ "valid in C2Y");
+ }
+ if (!warned && CPP_OPTION (pfile, cpp_warn_c23_c2y_compat) > 0)
+ cpp_warning (pfile, CPP_W_C11_C23_COMPAT,
+ "delimited escape sequences are only valid in C2Y");
extend_char_range (&char_range, loc_reader);
}
else
diff --git a/libcpp/expr.cc b/libcpp/expr.cc
index 67d021f..2a57dc79d 100644
--- a/libcpp/expr.cc
+++ b/libcpp/expr.cc
@@ -556,6 +556,7 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token,
enum {NOT_FLOAT = 0, AFTER_POINT, AFTER_EXPON} float_flag;
bool seen_digit;
bool seen_digit_sep;
+ bool zero_o_prefix;
if (ud_suffix)
*ud_suffix = NULL;
@@ -571,6 +572,7 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token,
radix = 10;
seen_digit = false;
seen_digit_sep = false;
+ zero_o_prefix = false;
/* First, interpret the radix. */
if (*str == '0')
@@ -601,6 +603,17 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token,
SYNTAX_ERROR_AT (virtual_location,
"digit separator after base indicator");
}
+ else if ((*str == 'o' || *str == 'O') && !CPP_OPTION (pfile, cplusplus))
+ {
+ if (ISDIGIT (str[1]))
+ {
+ zero_o_prefix = true;
+ str++;
+ }
+ else if (DIGIT_SEP (str[1]))
+ SYNTAX_ERROR_AT (virtual_location,
+ "digit separator after base indicator");
+ }
}
/* Now scan for a well-formed integer or float. */
@@ -694,6 +707,12 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token,
"invalid prefix %<0b%> for floating constant");
return CPP_N_INVALID;
}
+ if (zero_o_prefix)
+ {
+ cpp_error_with_line (pfile, CPP_DL_ERROR, virtual_location, 0,
+ "invalid prefix %<0o%> for floating constant");
+ return CPP_N_INVALID;
+ }
if (radix == 16 && !seen_digit)
SYNTAX_ERROR_AT (virtual_location,
@@ -897,8 +916,7 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token,
if (radix == 2)
{
bool warned = false;
- if (!CPP_OPTION (pfile, binary_constants)
- && CPP_PEDANTIC (pfile))
+ if (!CPP_OPTION (pfile, binary_constants) && CPP_PEDANTIC (pfile))
{
if (CPP_OPTION (pfile, cplusplus))
warned
@@ -916,6 +934,19 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token,
virtual_location, 0,
"binary constants are a C23 feature");
}
+ if (zero_o_prefix)
+ {
+ bool warned = false;
+ if (!CPP_OPTION (pfile, octal_constants) && CPP_PEDANTIC (pfile))
+ warned
+ = cpp_pedwarning_with_line (pfile, CPP_W_PEDANTIC, virtual_location,
+ 0, "%<0o%> prefixed constants are a C2Y "
+ "feature or GCC extension");
+ if (!warned && CPP_OPTION (pfile, cpp_warn_c23_c2y_compat) > 0)
+ cpp_warning_with_line (pfile, CPP_W_C23_C2Y_COMPAT,
+ virtual_location, 0,
+ "%<0o%> prefixed constants are a C2Y feature");
+ }
if (radix == 10)
result |= CPP_N_DECIMAL;
@@ -967,6 +998,8 @@ cpp_interpret_integer (cpp_reader *pfile, const cpp_token *token,
{
base = 8;
p++;
+ if (*p == 'o' || *p == 'O')
+ p++;
}
else if ((type & CPP_N_RADIX) == CPP_N_HEX)
{
diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h
index 0d11d07..5441229 100644
--- a/libcpp/include/cpplib.h
+++ b/libcpp/include/cpplib.h
@@ -548,6 +548,12 @@ struct cpp_options
/* Nonzero for C++23 delimited escape sequences. */
unsigned char delimited_escape_seqs;
+ /* Nonzero for C++23 named universal character escape sequences. */
+ unsigned char named_uc_escape_seqs;
+
+ /* Nonzero for C2Y 0o prefixed octal integer constants. */
+ unsigned char octal_constants;
+
/* Nonzero for 'true' and 'false' in #if expressions. */
unsigned char true_false;
@@ -579,6 +585,9 @@ struct cpp_options
/* True if warn about differences between C11 and C23. */
signed char cpp_warn_c11_c23_compat;
+ /* True if warn about differences between C23 and C2Y. */
+ signed char cpp_warn_c23_c2y_compat;
+
/* True if warn about differences between C++98 and C++11. */
bool cpp_warn_cxx11_compat;
@@ -716,6 +725,7 @@ enum cpp_warning_reason {
CPP_W_PEDANTIC,
CPP_W_C90_C99_COMPAT,
CPP_W_C11_C23_COMPAT,
+ CPP_W_C23_C2Y_COMPAT,
CPP_W_CXX11_COMPAT,
CPP_W_CXX20_COMPAT,
CPP_W_CXX14_EXTENSIONS,
diff --git a/libcpp/init.cc b/libcpp/init.cc
index 1cc62a4..4789274 100644
--- a/libcpp/init.cc
+++ b/libcpp/init.cc
@@ -108,46 +108,48 @@ struct lang_flags
unsigned int elifdef : 1;
unsigned int warning_directive : 1;
unsigned int delimited_escape_seqs : 1;
+ unsigned int named_uc_escape_seqs : 1;
+ unsigned int octal_constants : 1;
unsigned int true_false : 1;
unsigned int embed : 1;
};
static const struct lang_flags lang_defaults[] = {
- /* u e w
- b d 8 l a t
- x u i i c v s s i r d r e
- x i d u r d n g t h a c z f n e u m
- c c n x c d s i l l l c s r l o o d l d d l f b
- 9 + u i 1 i t g i i i s e i i p p f i e i i a e
- 9 + m d 1 d d r t t t t p g t t e p t f r m l d */
- /* GNUC89 */ { 0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0 },
- /* GNUC99 */ { 1,0,1,1,0,0,0,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0 },
- /* GNUC11 */ { 1,0,1,1,1,0,0,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0 },
- /* GNUC17 */ { 1,0,1,1,1,0,0,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0 },
- /* GNUC23 */ { 1,0,1,1,1,1,0,1,1,1,0,1,1,0,1,1,1,1,0,1,1,0,1,1 },
- /* GNUC2Y */ { 1,0,1,1,1,1,0,1,1,1,0,1,1,0,1,1,1,1,0,1,1,0,1,1 },
- /* STDC89 */ { 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0 },
- /* STDC94 */ { 0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0 },
- /* STDC99 */ { 1,0,1,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0 },
- /* STDC11 */ { 1,0,1,1,1,0,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0 },
- /* STDC17 */ { 1,0,1,1,1,0,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0 },
- /* STDC23 */ { 1,0,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,1,1,0,1,1 },
- /* STDC2Y */ { 1,0,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,1,1,0,1,1 },
- /* GNUCXX */ { 0,1,1,1,0,1,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0 },
- /* CXX98 */ { 0,1,0,1,0,1,1,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0 },
- /* GNUCXX11 */ { 1,1,1,1,1,1,0,1,1,1,1,0,0,0,0,1,1,0,0,0,0,0,1,0 },
- /* CXX11 */ { 1,1,0,1,1,1,1,1,1,1,1,0,0,1,0,0,1,0,0,0,0,0,1,0 },
- /* GNUCXX14 */ { 1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,1,0,0,0,0,0,1,0 },
- /* CXX14 */ { 1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,0,0,0,1,0 },
- /* GNUCXX17 */ { 1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,1,0 },
- /* CXX17 */ { 1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,0,0,0,0,1,0 },
- /* GNUCXX20 */ { 1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,1,0 },
- /* CXX20 */ { 1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,1,0 },
- /* GNUCXX23 */ { 1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0 },
- /* CXX23 */ { 1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0 },
- /* GNUCXX26 */ { 1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0 },
- /* CXX26 */ { 1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0 },
- /* ASM */ { 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+ /* u e w n
+ b d 8 l a a t
+ x u i i c v s s i r d m o r e
+ x i d u r d n g t h a c z f n e e c u m
+ c c n x c d s i l l l c s r l o o d l d d l d t f b
+ 9 + u i 1 i t g i i i s e i i p p f i e i i u a a e
+ 9 + m d 1 d d r t t t t p g t t e p t f r m c l l d */
+ /* GNUC89 */ { 0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
+ /* GNUC99 */ { 1,0,1,1,0,0,0,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
+ /* GNUC11 */ { 1,0,1,1,1,0,0,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
+ /* GNUC17 */ { 1,0,1,1,1,0,0,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0 },
+ /* GNUC23 */ { 1,0,1,1,1,1,0,1,1,1,0,1,1,0,1,1,1,1,0,1,1,0,0,0,1,1 },
+ /* GNUC2Y */ { 1,0,1,1,1,1,0,1,1,1,0,1,1,0,1,1,1,1,0,1,1,1,0,1,1,1 },
+ /* STDC89 */ { 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 },
+ /* STDC94 */ { 0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 },
+ /* STDC99 */ { 1,0,1,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 },
+ /* STDC11 */ { 1,0,1,1,1,0,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 },
+ /* STDC17 */ { 1,0,1,1,1,0,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 },
+ /* STDC23 */ { 1,0,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,1,1,0,0,0,1,1 },
+ /* STDC2Y */ { 1,0,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,1,1,1,0,1,1,1 },
+ /* GNUCXX */ { 0,1,1,1,0,1,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0 },
+ /* CXX98 */ { 0,1,0,1,0,1,1,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0 },
+ /* GNUCXX11 */ { 1,1,1,1,1,1,0,1,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0 },
+ /* CXX11 */ { 1,1,0,1,1,1,1,1,1,1,1,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0 },
+ /* GNUCXX14 */ { 1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,1,0,0,0,0,0,0,0,1,0 },
+ /* CXX14 */ { 1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,0,0,0,0,0,1,0 },
+ /* GNUCXX17 */ { 1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,1,0 },
+ /* CXX17 */ { 1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,0,0,0,0,0,0,1,0 },
+ /* GNUCXX20 */ { 1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,1,0 },
+ /* CXX20 */ { 1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,1,0 },
+ /* GNUCXX23 */ { 1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0,1,0 },
+ /* CXX23 */ { 1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0,1,0 },
+ /* GNUCXX26 */ { 1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0,1,0 },
+ /* CXX26 */ { 1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0,1,0 },
+ /* ASM */ { 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
};
/* Sets internal flags correctly for a given language. */
@@ -180,6 +182,8 @@ cpp_set_lang (cpp_reader *pfile, enum c_lang lang)
CPP_OPTION (pfile, elifdef) = l->elifdef;
CPP_OPTION (pfile, warning_directive) = l->warning_directive;
CPP_OPTION (pfile, delimited_escape_seqs) = l->delimited_escape_seqs;
+ CPP_OPTION (pfile, named_uc_escape_seqs) = l->named_uc_escape_seqs;
+ CPP_OPTION (pfile, octal_constants) = l->octal_constants;
CPP_OPTION (pfile, true_false) = l->true_false;
CPP_OPTION (pfile, embed) = l->embed;
}
@@ -230,6 +234,7 @@ cpp_create_reader (enum c_lang lang, cpp_hash_table *table,
CPP_OPTION (pfile, warn_endif_labels) = 1;
CPP_OPTION (pfile, cpp_warn_c90_c99_compat) = -1;
CPP_OPTION (pfile, cpp_warn_c11_c23_compat) = -1;
+ CPP_OPTION (pfile, cpp_warn_c23_c2y_compat) = -1;
CPP_OPTION (pfile, cpp_warn_cxx11_compat) = 0;
CPP_OPTION (pfile, cpp_warn_cxx20_compat) = 0;
CPP_OPTION (pfile, cpp_warn_deprecated) = 1;