From 348f028fc2957d13e828030119938b8fccb00fc3 Mon Sep 17 00:00:00 2001 From: Pierre-Emmanuel Patry Date: Tue, 31 Oct 2023 15:23:45 +0100 Subject: [PATCH] gccrs: Fix float lexing and tuple index disambiguation When a float has a floating point but no value after it, a zero was added this lead to errors when trying to disambiguate a float into a tuple index. gcc/rust/ChangeLog: * lex/rust-lex.cc (Lexer::parse_decimal_int_or_float): Remove additional zero after empty floating point. * parse/rust-parse-impl.h (Parser::left_denotation): Handle float with empty floating point. Signed-off-by: Pierre-Emmanuel Patry --- gcc/rust/lex/rust-lex.cc | 3 --- gcc/rust/parse/rust-parse-impl.h | 18 ++++++++++++------ 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/gcc/rust/lex/rust-lex.cc b/gcc/rust/lex/rust-lex.cc index b78565ec3a5..107dbad2ff9 100644 --- a/gcc/rust/lex/rust-lex.cc +++ b/gcc/rust/lex/rust-lex.cc @@ -2351,9 +2351,6 @@ Lexer::parse_decimal_int_or_float (location_t loc) current_char = peek_input (); length++; - // add a '0' after the . to prevent ambiguity - str += '0'; - // type hint not allowed current_column += length; diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h index 0e50c9eb17a..fd648c53e14 100644 --- a/gcc/rust/parse/rust-parse-impl.h +++ b/gcc/rust/parse/rust-parse-impl.h @@ -12892,12 +12892,18 @@ Parser::left_denotation (const_TokenPtr tok, auto dot_pos = str.find ("."); auto prefix = str.substr (0, dot_pos); auto suffix = str.substr (dot_pos + 1); - lexer.split_current_token ( - {Token::make_int (current_loc, std::move (prefix), - CORETYPE_PURE_DECIMAL), - Token::make (DOT, current_loc + 1), - Token::make_int (current_loc + 2, std::move (suffix), - CORETYPE_PURE_DECIMAL)}); + if (dot_pos == str.size () - 1) + lexer.split_current_token ( + {Token::make_int (current_loc, std::move (prefix), + CORETYPE_PURE_DECIMAL), + Token::make (DOT, current_loc + 1)}); + else + lexer.split_current_token ( + {Token::make_int (current_loc, std::move (prefix), + CORETYPE_PURE_DECIMAL), + Token::make (DOT, current_loc + 1), + Token::make_int (current_loc + 2, std::move (suffix), + CORETYPE_PURE_DECIMAL)}); return parse_tuple_index_expr (tok, std::move (left), std::move (outer_attrs), restrictions); -- 2.11.4.GIT