diff options
Diffstat (limited to 'libcpp')
-rw-r--r-- | libcpp/charset.cc | 73 | ||||
-rw-r--r-- | libcpp/expr.cc | 37 | ||||
-rw-r--r-- | libcpp/include/cpplib.h | 10 | ||||
-rw-r--r-- | libcpp/init.cc | 75 |
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; |