aboutsummaryrefslogtreecommitdiff
path: root/libcpp/expr.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libcpp/expr.cc')
-rw-r--r--libcpp/expr.cc37
1 files changed, 35 insertions, 2 deletions
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)
{