]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: tokenstream: Add conversion for float literals
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Fri, 28 Apr 2023 13:07:33 +0000 (15:07 +0200)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 17:37:16 +0000 (18:37 +0100)
Add the conversion handler for float/double literal tokens to
tokenstream Literals.

gcc/rust/ChangeLog:

* ast/rust-ast-tokenstream.cc (dispatch_float_literals): Add
dispatch function for floating point literals.
(TokenStream::collect): Add call to dispatcher.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
gcc/rust/ast/rust-ast-tokenstream.cc

index d77c1cf4149238a6418c94684f4b730b0c95d0bf..0a28081e0bda6714025097bc5d153af59143c7c1 100644 (file)
@@ -41,6 +41,32 @@ pop_group (std::vector<ProcMacro::TokenStream> &streams,
   streams.back ().push (tt);
 }
 
+static void
+dispatch_float_literals (ProcMacro::TokenStream &ts, TokenPtr &token)
+{
+  std::string::size_type sz;
+  auto str = token->as_string ();
+  switch (token->get_type_hint ())
+    {
+      case CORETYPE_F32: {
+       auto value = std::stof (str, &sz);
+       bool suffixed = sz == str.length ();
+       ts.push (ProcMacro::TokenTree::make_tokentree (
+         ProcMacro::Literal::make_f32 (value, suffixed)));
+      }
+      break;
+      case CORETYPE_F64: {
+       auto value = std::stod (str, &sz);
+       bool suffixed = sz == str.length ();
+       ts.push (ProcMacro::TokenTree::make_tokentree (
+         ProcMacro::Literal::make_f64 (value, suffixed)));
+      }
+      break;
+    default:
+      gcc_unreachable ();
+    }
+}
+
 static void
 dispatch_integer_literals (ProcMacro::TokenStream &ts, TokenPtr &token)
 {
@@ -134,6 +160,9 @@ TokenStream::collect () const
       switch (token->get_id ())
        {
        // Literals
+       case FLOAT_LITERAL:
+         dispatch_float_literals (trees.back (), token);
+         break;
        case INT_LITERAL:
          dispatch_integer_literals (trees.back (), token);
          break;