https://gcc.gnu.org/g:bdba3fae4c02e483810e4acfa2b5d62f66d94c11

commit bdba3fae4c02e483810e4acfa2b5d62f66d94c11
Author: Arthur Cohen <arthur.co...@embecosm.com>
Date:   Tue Jan 30 16:16:36 2024 +0100

    format_args: Parse format string properly
    
    gcc/rust/ChangeLog:
    
            * expand/rust-macro-builtins.cc (MacroBuiltin::format_args_handler):
            Construct string to parser properly.

Diff:
---
 gcc/rust/expand/rust-macro-builtins.cc | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/gcc/rust/expand/rust-macro-builtins.cc 
b/gcc/rust/expand/rust-macro-builtins.cc
index 0e57406f10f8..19ea91094539 100644
--- a/gcc/rust/expand/rust-macro-builtins.cc
+++ b/gcc/rust/expand/rust-macro-builtins.cc
@@ -947,7 +947,24 @@ tl::optional<AST::Fragment>
 MacroBuiltin::format_args_handler (location_t invoc_locus,
                                   AST::MacroInvocData &invoc)
 {
-  Fmt::Pieces::collect ("heyo this {is} what I {} want to {3}, {parse}");
+  auto fmt_expr
+    = parse_single_string_literal (BuiltinMacro::FormatArgs,
+                                  invoc.get_delim_tok_tree (), invoc_locus,
+                                  invoc.get_expander ());
+
+  if (!fmt_expr)
+    return AST::Fragment::create_error ();
+
+  // if it is not a literal, it's an eager macro invocation - return it
+  if (!fmt_expr->is_literal ())
+    {
+      auto token_tree = invoc.get_delim_tok_tree ();
+      return AST::Fragment ({AST::SingleASTNode (std::move (fmt_expr))},
+                           token_tree.to_token_stream ());
+    }
+
+  auto format_string = fmt_expr->as_string ();
+  auto pieces = Fmt::Pieces::collect (format_string);
 
   return AST::Fragment::create_empty ();
 }

Reply via email to