https://gcc.gnu.org/g:2e62553cb02afc77d40c0f55c08bae26cd3a0b32

commit r15-8201-g2e62553cb02afc77d40c0f55c08bae26cd3a0b32
Author: jjasmine <tanghocle...@gmail.com>
Date:   Mon Jun 10 18:08:42 2024 -0700

    gccrs: Scaffolding validation of asm!
    
    gcc/rust/ChangeLog:
    
            * expand/rust-macro-builtins-asm.cc (parse_asm):
            Scaffolding validation of asm!
            (validate): Likewise
            * expand/rust-macro-builtins-asm.h (validate): Likewise

Diff:
---
 gcc/rust/expand/rust-macro-builtins-asm.cc | 31 ++++++++++++++++++++++++------
 gcc/rust/expand/rust-macro-builtins-asm.h  |  3 ++-
 2 files changed, 27 insertions(+), 7 deletions(-)

diff --git a/gcc/rust/expand/rust-macro-builtins-asm.cc 
b/gcc/rust/expand/rust-macro-builtins-asm.cc
index 47a47607cfe0..3073761d5d61 100644
--- a/gcc/rust/expand/rust-macro-builtins-asm.cc
+++ b/gcc/rust/expand/rust-macro-builtins-asm.cc
@@ -703,13 +703,26 @@ parse_asm (location_t invoc_locus, AST::MacroInvocData 
&invoc,
   // operands stream, also handles the optional ","
   parse_asm_arg (parser, last_token_id, inline_asm_ctx);
 
-  AST::SingleASTNode single = AST::SingleASTNode (
-    inline_asm_ctx.inline_asm.clone_expr_without_block ());
-  std::vector<AST::SingleASTNode> single_vec = {single};
+  // TODO: I'm putting the validation here because the rust reference put it
+  // here Per Arthur's advice we would actually do the validation in a 
different
+  // stage. and visit on the InlineAsm AST instead of it's context.
+  auto is_valid = validate (inline_asm_ctx);
 
-  AST::Fragment fragment_ast
-    = AST::Fragment (single_vec, std::vector<std::unique_ptr<AST::Token>> ());
-  return fragment_ast;
+  if (is_valid)
+    {
+      AST::SingleASTNode single = AST::SingleASTNode (
+       inline_asm_ctx.inline_asm.clone_expr_without_block ());
+      std::vector<AST::SingleASTNode> single_vec = {single};
+
+      AST::Fragment fragment_ast
+       = AST::Fragment (single_vec,
+                        std::vector<std::unique_ptr<AST::Token>> ());
+      return fragment_ast;
+    }
+  else
+    {
+      return tl::nullopt;
+    }
 }
 
 tl::optional<std::string>
@@ -749,4 +762,10 @@ parse_label (Parser<MacroInvocLexer> &parser, TokenId 
last_token_id,
       return tl::nullopt;
     }
 }
+
+bool
+validate (InlineAsmContext &inline_asm_ctx)
+{
+  return true;
+}
 } // namespace Rust
diff --git a/gcc/rust/expand/rust-macro-builtins-asm.h 
b/gcc/rust/expand/rust-macro-builtins-asm.h
index 267c1b609d91..293d790ca40c 100644
--- a/gcc/rust/expand/rust-macro-builtins-asm.h
+++ b/gcc/rust/expand/rust-macro-builtins-asm.h
@@ -75,7 +75,8 @@ parse_format_string (Parser<MacroInvocLexer> &parser, TokenId 
last_token_id,
 tl::optional<std::string>
 parse_label (Parser<MacroInvocLexer> &parser, TokenId last_token_id,
             InlineAsmContext &inline_asm_ctx);
-
+bool
+validate (InlineAsmContext &inline_asm_ctx);
 std::set<std::string> potentially_nonpromoted_keywords
   = {"in", "out", "lateout", "inout", "inlateout", "const", "sym", "label"};

Reply via email to