aboutsummaryrefslogtreecommitdiff
path: root/libcpp
diff options
context:
space:
mode:
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;