| // Copyright (C) 2021-2025 Free Software Foundation, Inc. | 
 |  | 
 | // This file is part of GCC. | 
 |  | 
 | // GCC is free software; you can redistribute it and/or modify it under | 
 | // the terms of the GNU General Public License as published by the Free | 
 | // Software Foundation; either version 3, or (at your option) any later | 
 | // version. | 
 |  | 
 | // GCC is distributed in the hope that it will be useful, but WITHOUT ANY | 
 | // WARRANTY; without even the implied warranty of MERCHANTABILITY or | 
 | // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License | 
 | // for more details. | 
 |  | 
 | // You should have received a copy of the GNU General Public License | 
 | // along with GCC; see the file COPYING3.  If not see | 
 | // <http://www.gnu.org/licenses/>. | 
 |  | 
 | #include "rust-expr.h" | 
 | #include "rust-hir-full-decls.h" | 
 | #include "rust-hir-visitor.h" | 
 | #include "rust-hir-full.h" | 
 | #include "rust-system.h" | 
 |  | 
 | namespace Rust { | 
 | namespace HIR { | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (Lifetime &) | 
 | {} | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (LifetimeParam &lifetime_param) | 
 | { | 
 |   visit_outer_attrs (lifetime_param); | 
 |   lifetime_param.get_lifetime ().accept_vis (*this); | 
 |   for (Lifetime &lifetime_bound : lifetime_param.get_lifetime_bounds ()) | 
 |     lifetime_bound.accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::visit_generic_args (GenericArgs &generic_args) | 
 | { | 
 |   for (auto &lifetime : generic_args.get_lifetime_args ()) | 
 |     lifetime.accept_vis (*this); | 
 |   for (auto &type : generic_args.get_type_args ()) | 
 |     type->accept_vis (*this); | 
 |   for (auto &binding : generic_args.get_binding_args ()) | 
 |     binding.get_type ().accept_vis (*this); | 
 |   for (auto &const_arg : generic_args.get_const_args ()) | 
 |     const_arg.get_expression ()->accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (PathInExpression &path_in_expr) | 
 | { | 
 |   visit_outer_attrs (path_in_expr); | 
 |   if (!path_in_expr.is_lang_item ()) | 
 |     for (auto &segment : path_in_expr.get_segments ()) | 
 |       visit_path_expr_segment (segment); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (TypePathSegment &) | 
 | {} | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (TypePathSegmentFunction &segment_function) | 
 | { | 
 |   TypePathFunction &function_path = segment_function.get_function_path (); | 
 |   if (function_path.has_inputs ()) | 
 |     for (auto ¶m : function_path.get_params ()) | 
 |       param->accept_vis (*this); | 
 |   if (function_path.has_return_type ()) | 
 |     function_path.get_return_type ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (TypePathSegmentGeneric &segment_generic) | 
 | { | 
 |   if (segment_generic.has_generic_args ()) | 
 |     visit_generic_args (segment_generic.get_generic_args ()); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (TypePath &type_path) | 
 | { | 
 |   for (auto &segment : type_path.get_segments ()) | 
 |     segment->accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::visit_qualified_path_type (QualifiedPathType &path) | 
 | { | 
 |   path.get_type ().accept_vis (*this); | 
 |   if (path.has_as_clause ()) | 
 |     path.get_trait ().accept_vis (*this); | 
 | } | 
 |  | 
 | // TODO: Implement visit_path_expr_segment | 
 | void | 
 | DefaultHIRVisitor::visit_path_expr_segment (PathExprSegment &segment) | 
 | { | 
 |   if (segment.has_generic_args ()) | 
 |     visit_generic_args (segment.get_generic_args ()); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (QualifiedPathInExpression &path_in_expr) | 
 | { | 
 |   visit_outer_attrs (path_in_expr); | 
 |   visit_qualified_path_type (path_in_expr.get_path_type ()); | 
 |   for (auto &segment : path_in_expr.get_segments ()) | 
 |     visit_path_expr_segment (segment); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (QualifiedPathInType &path_in_type) | 
 | { | 
 |   visit_qualified_path_type (path_in_type.get_path_type ()); | 
 |   path_in_type.get_associated_segment ().accept_vis (*this); | 
 |   for (auto &segment : path_in_type.get_segments ()) | 
 |     segment->accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (LiteralExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (BorrowExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   expr.get_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (DereferenceExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   expr.get_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (ErrorPropagationExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   expr.get_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (NegationExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   expr.get_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (ArithmeticOrLogicalExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   expr.get_lhs ().accept_vis (*this); | 
 |   expr.get_rhs ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (ComparisonExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   expr.get_lhs ().accept_vis (*this); | 
 |   expr.get_rhs ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (LazyBooleanExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   expr.get_lhs ().accept_vis (*this); | 
 |   expr.get_rhs ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (TypeCastExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   expr.get_expr ().accept_vis (*this); | 
 |   expr.get_type_to_convert_to ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (AssignmentExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   expr.get_lhs ().accept_vis (*this); | 
 |   expr.get_rhs ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (CompoundAssignmentExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   expr.get_lhs ().accept_vis (*this); | 
 |   expr.get_rhs ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (GroupedExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   visit_inner_attrs (expr); | 
 |   expr.get_expr_in_parens ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (ArrayElemsValues &elems) | 
 | { | 
 |   for (auto &elem : elems.get_values ()) | 
 |     elem->accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (ArrayElemsCopied &elems) | 
 | { | 
 |   elems.get_elem_to_copy ().accept_vis (*this); | 
 |   elems.get_num_copies_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (ArrayExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   visit_inner_attrs (expr); | 
 |   expr.get_internal_elements ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (ArrayIndexExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   expr.get_array_expr ().accept_vis (*this); | 
 |   expr.get_index_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (TupleExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   visit_inner_attrs (expr); | 
 |   for (auto &elem : expr.get_tuple_elems ()) | 
 |     elem->accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (TupleIndexExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   expr.get_tuple_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (StructExprStruct &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   visit_inner_attrs (expr); | 
 |   expr.get_struct_name ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (StructExprFieldIdentifier &) | 
 | {} | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (StructExprFieldIdentifierValue &field) | 
 | { | 
 |   field.get_value ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (StructExprFieldIndexValue &field) | 
 | { | 
 |   field.get_value ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (StructExprStructFields &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   visit_inner_attrs (expr); | 
 |   expr.get_struct_name ().accept_vis (*this); | 
 |   if (expr.has_struct_base ()) | 
 |     { | 
 |       StructBase &base = expr.get_struct_base (); | 
 |       base.get_base ().accept_vis (*this); | 
 |     } | 
 |   for (auto &field : expr.get_fields ()) | 
 |     field->accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (StructExprStructBase &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   visit_inner_attrs (expr); | 
 |   expr.get_struct_name ().accept_vis (*this); | 
 |   StructBase &base = expr.get_struct_base (); | 
 |   base.get_base ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (CallExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   expr.get_fnexpr ().accept_vis (*this); | 
 |   for (auto &arg : expr.get_arguments ()) | 
 |     arg->accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (MethodCallExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   expr.get_receiver ().accept_vis (*this); | 
 |   visit_path_expr_segment (expr.get_method_name ()); | 
 |   for (auto &arg : expr.get_arguments ()) | 
 |     arg->accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (FieldAccessExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   expr.get_receiver_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::visit_closure_param (ClosureParam ¶m) | 
 | { | 
 |   visit_outer_attrs (param); | 
 |   param.get_pattern ().accept_vis (*this); | 
 |   if (param.has_type_given ()) | 
 |     { | 
 |       param.get_type ().accept_vis (*this); | 
 |     } | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (ClosureExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   for (auto ¶m : expr.get_params ()) | 
 |     visit_closure_param (param); | 
 |   if (expr.has_return_type ()) | 
 |     expr.get_return_type ().accept_vis (*this); | 
 |   expr.get_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (BlockExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   visit_inner_attrs (expr); | 
 |   for (auto &stmt : expr.get_statements ()) | 
 |     stmt->accept_vis (*this); | 
 |   if (expr.has_expr ()) | 
 |     expr.get_final_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (AnonConst &expr) | 
 | { | 
 |   if (!expr.is_deferred ()) | 
 |     expr.get_inner_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (ConstBlock &expr) | 
 | { | 
 |   expr.get_const_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (ContinueExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   if (expr.has_label ()) | 
 |     expr.get_label ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (BreakExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   if (expr.has_label ()) | 
 |     expr.get_label ().accept_vis (*this); | 
 |  | 
 |   if (expr.has_break_expr ()) | 
 |     expr.get_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (RangeFromToExpr &expr) | 
 | { | 
 |   expr.get_from_expr ().accept_vis (*this); | 
 |   expr.get_to_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (RangeFromExpr &expr) | 
 | { | 
 |   expr.get_from_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (RangeToExpr &expr) | 
 | { | 
 |   expr.get_to_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (RangeFullExpr &) | 
 | {} | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (RangeFromToInclExpr &expr) | 
 | { | 
 |   expr.get_from_expr ().accept_vis (*this); | 
 |   expr.get_to_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (RangeToInclExpr &expr) | 
 | { | 
 |   expr.get_to_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (ReturnExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   if (expr.has_return_expr ()) | 
 |     expr.get_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (UnsafeBlockExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   expr.get_block_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::visit_loop_label (LoopLabel &label) | 
 | { | 
 |   label.get_lifetime ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (LoopExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   if (expr.has_loop_label ()) | 
 |     visit_loop_label (expr.get_loop_label ()); | 
 |   expr.get_loop_block ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (WhileLoopExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   if (expr.has_loop_label ()) | 
 |     visit_loop_label (expr.get_loop_label ()); | 
 |   expr.get_predicate_expr ().accept_vis (*this); | 
 |   expr.get_loop_block ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (WhileLetLoopExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   for (auto &pattern : expr.get_patterns ()) | 
 |     pattern->accept_vis (*this); | 
 |   if (expr.has_loop_label ()) | 
 |     visit_loop_label (expr.get_loop_label ()); | 
 |   expr.get_cond ().accept_vis (*this); | 
 |   expr.get_loop_block ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (IfExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   expr.get_if_condition ().accept_vis (*this); | 
 |   expr.get_if_block ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (IfExprConseqElse &expr) | 
 | { | 
 |   expr.IfExpr::accept_vis (*this); | 
 |   expr.get_else_block ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::visit_match_arm (MatchArm &arm) | 
 | { | 
 |   // visit_outer_attrs (arm); | 
 |   for (auto &pattern : arm.get_patterns ()) | 
 |     pattern->accept_vis (*this); | 
 |   if (arm.has_match_arm_guard ()) | 
 |     arm.get_guard_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::visit_match_case (MatchCase &arm) | 
 | { | 
 |   visit_match_arm (arm.get_arm ()); | 
 |   arm.get_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (MatchExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   visit_inner_attrs (expr); | 
 |   expr.get_scrutinee_expr ().accept_vis (*this); | 
 |   for (auto &arm : expr.get_match_cases ()) | 
 |     visit_match_case (arm); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (AwaitExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   expr.get_awaited_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (AsyncBlockExpr &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   expr.get_block_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (InlineAsm &expr) | 
 | { | 
 |   visit_outer_attrs (expr); | 
 |   auto &operands = expr.get_operands (); | 
 |   using RegisterType = AST::InlineAsmOperand::RegisterType; | 
 |   for (auto &operand : operands) | 
 |     { | 
 |       switch (operand.get_register_type ()) | 
 | 	{ | 
 | 	case RegisterType::In: | 
 | 	  { | 
 | 	    operand.get_in ().expr->accept_vis (*this); | 
 | 	    break; | 
 | 	  } | 
 | 	case RegisterType::Out: | 
 | 	  { | 
 | 	    operand.get_out ().expr->accept_vis (*this); | 
 | 	    break; | 
 | 	  } | 
 | 	case RegisterType::InOut: | 
 | 	  { | 
 | 	    operand.get_in_out ().expr->accept_vis (*this); | 
 | 	    break; | 
 | 	  } | 
 | 	case RegisterType::SplitInOut: | 
 | 	  { | 
 | 	    operand.get_split_in_out ().in_expr->accept_vis (*this); | 
 | 	    operand.get_split_in_out ().out_expr->accept_vis (*this); | 
 | 	    break; | 
 | 	  } | 
 | 	case RegisterType::Const: | 
 | 	  { | 
 | 	    operand.get_const ().anon_const.get_inner_expr ().accept_vis ( | 
 | 	      *this); | 
 | 	    break; | 
 | 	  } | 
 | 	case RegisterType::Sym: | 
 | 	  { | 
 | 	    operand.get_sym ().expr->accept_vis (*this); | 
 | 	    break; | 
 | 	  } | 
 | 	case RegisterType::Label: | 
 | 	  { | 
 | 	    operand.get_label ().expr->accept_vis (*this); | 
 | 	    break; | 
 | 	  } | 
 | 	} | 
 |     } | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (LlvmInlineAsm &expr) | 
 | { | 
 |   for (auto &output : expr.outputs) | 
 |     output.expr->accept_vis (*this); | 
 |   for (auto &input : expr.inputs) | 
 |     input.expr->accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (OffsetOf &expr) | 
 | { | 
 |   expr.get_type ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (TypeParam ¶m) | 
 | { | 
 |   visit_outer_attrs (param); | 
 |   for (auto &bounds : param.get_type_param_bounds ()) | 
 |     bounds->accept_vis (*this); | 
 |   if (param.has_type ()) | 
 |     param.get_type ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (ConstGenericParam &const_param) | 
 | { | 
 |   visit_outer_attrs (const_param); | 
 |   const_param.get_type ().accept_vis (*this); | 
 |   if (const_param.has_default_expression ()) | 
 |     const_param.get_default_expression ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (LifetimeWhereClauseItem &item) | 
 | { | 
 |   item.get_lifetime ().accept_vis (*this); | 
 |   for (auto &bound : item.get_lifetime_bounds ()) | 
 |     bound.accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (TypeBoundWhereClauseItem &item) | 
 | { | 
 |   for (auto &lifetime : item.get_for_lifetimes ()) | 
 |     lifetime.accept_vis (*this); | 
 |   item.get_bound_type ().accept_vis (*this); | 
 |   for (auto ¶m : item.get_type_param_bounds ()) | 
 |     param->accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (Module &module) | 
 | { | 
 |   visit_outer_attrs (module); | 
 |   visit_inner_attrs (module); | 
 |   for (auto &item : module.get_items ()) | 
 |     item->accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (ExternCrate &crate) | 
 | { | 
 |   visit_outer_attrs (crate); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (UseTreeGlob &) | 
 | {} | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (UseTreeList &) | 
 | {} | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (UseTreeRebind &) | 
 | {} | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (UseDeclaration &) | 
 | {} | 
 |  | 
 | void | 
 | DefaultHIRVisitor::visit_function_param (FunctionParam ¶m) | 
 | { | 
 |   param.get_param_name ().accept_vis (*this); | 
 |   param.get_type ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (Function &function) | 
 | { | 
 |   visit_outer_attrs (function); | 
 |   for (auto &generic : function.get_generic_params ()) | 
 |     generic->accept_vis (*this); | 
 |   for (auto ¶m : function.get_function_params ()) | 
 |     visit_function_param (param); | 
 |   if (function.has_return_type ()) | 
 |     function.get_return_type ().accept_vis (*this); | 
 |   if (function.has_where_clause ()) | 
 |     visit_where_clause (function.get_where_clause ()); | 
 |   function.get_definition ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (TypeAlias &type_alias) | 
 | { | 
 |   visit_outer_attrs (type_alias); | 
 |   for (auto &generic : type_alias.get_generic_params ()) | 
 |     generic->accept_vis (*this); | 
 |   if (type_alias.has_where_clause ()) | 
 |     visit_where_clause (type_alias.get_where_clause ()); | 
 |   type_alias.get_type_aliased ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::visit_struct_field (StructField &field) | 
 | { | 
 |   field.get_field_type ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (StructStruct &struct_item) | 
 | { | 
 |   visit_outer_attrs (struct_item); | 
 |   for (auto &generic : struct_item.get_generic_params ()) | 
 |     generic->accept_vis (*this); | 
 |   if (struct_item.has_where_clause ()) | 
 |     visit_where_clause (struct_item.get_where_clause ()); | 
 |   for (auto &field : struct_item.get_fields ()) | 
 |     visit_struct_field (field); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (TupleStruct &tuple_struct) | 
 | { | 
 |   visit_outer_attrs (tuple_struct); | 
 |   for (auto &generic : tuple_struct.get_generic_params ()) | 
 |     generic->accept_vis (*this); | 
 |   if (tuple_struct.has_where_clause ()) | 
 |     visit_where_clause (tuple_struct.get_where_clause ()); | 
 |   for (auto &field : tuple_struct.get_fields ()) | 
 |     field.get_field_type ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (EnumItem &item) | 
 | { | 
 |   visit_outer_attrs (item); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (EnumItemTuple &item_tuple) | 
 | { | 
 |   item_tuple.EnumItem::accept_vis (*this); | 
 |   for (auto &field : item_tuple.get_tuple_fields ()) | 
 |     field.get_field_type ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (EnumItemStruct &item_struct) | 
 | { | 
 |   item_struct.EnumItem::accept_vis (*this); | 
 |   for (auto &field : item_struct.get_struct_fields ()) | 
 |     field.get_field_type ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (EnumItemDiscriminant &item) | 
 | { | 
 |   item.EnumItem::accept_vis (*this); | 
 |   item.get_discriminant_expression ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (Enum &enum_item) | 
 | { | 
 |   visit_outer_attrs (enum_item); | 
 |   for (auto &generic : enum_item.get_generic_params ()) | 
 |     generic->accept_vis (*this); | 
 |   if (enum_item.has_where_clause ()) | 
 |     visit_where_clause (enum_item.get_where_clause ()); | 
 |   for (auto &item : enum_item.get_variants ()) | 
 |     item->accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (Union &union_item) | 
 | { | 
 |   visit_outer_attrs (union_item); | 
 |   for (auto &generic : union_item.get_generic_params ()) | 
 |     generic->accept_vis (*this); | 
 |   if (union_item.has_where_clause ()) | 
 |     visit_where_clause (union_item.get_where_clause ()); | 
 |   for (auto &variant : union_item.get_variants ()) | 
 |     visit_struct_field (variant); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (ConstantItem &const_item) | 
 | { | 
 |   visit_outer_attrs (const_item); | 
 |   const_item.get_type ().accept_vis (*this); | 
 |   const_item.get_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (StaticItem &static_item) | 
 | { | 
 |   visit_outer_attrs (static_item); | 
 |   static_item.get_type ().accept_vis (*this); | 
 |   static_item.get_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::visit_self_param (SelfParam &self_param) | 
 | { | 
 |   if (self_param.has_lifetime ()) | 
 |     { | 
 |       Lifetime lifetime = self_param.get_lifetime (); | 
 |       lifetime.accept_vis (*this); | 
 |     } | 
 |   if (self_param.has_type ()) | 
 |     self_param.get_type ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (TraitItemFunc &item) | 
 | { | 
 |   visit_outer_attrs (item); | 
 |   TraitFunctionDecl &decl = item.get_decl (); | 
 |   for (auto &generic : decl.get_generic_params ()) | 
 |     generic->accept_vis (*this); | 
 |   if (decl.get_self ().has_value ()) | 
 |     visit_self_param (decl.get_self ().value ()); | 
 |   for (auto ¶m : decl.get_function_params ()) | 
 |     visit_function_param (param); | 
 |   if (decl.has_return_type ()) | 
 |     decl.get_return_type ().accept_vis (*this); | 
 |   if (decl.has_where_clause ()) | 
 |     visit_where_clause (decl.get_where_clause ()); | 
 |   if (item.has_definition ()) | 
 |     item.get_block_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (TraitItemConst &item) | 
 | { | 
 |   visit_outer_attrs (item); | 
 |   item.get_type ().accept_vis (*this); | 
 |   if (item.has_expr ()) | 
 |     item.get_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (TraitItemType &item) | 
 | { | 
 |   visit_outer_attrs (item); | 
 |   for (auto &bound : item.get_type_param_bounds ()) | 
 |     bound->accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::visit_where_clause (const WhereClause &where_clause) | 
 | { | 
 |   for (auto &item : where_clause.get_items ()) | 
 |     item->accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::visit_where_clause (WhereClause &where_clause) | 
 | { | 
 |   for (auto &item : where_clause.get_items ()) | 
 |     { | 
 |       item->accept_vis (*this); | 
 |     } | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (WhereClauseItem &node) | 
 | {} | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (Trait &trait) | 
 | { | 
 |   visit_outer_attrs (trait); | 
 |   for (auto &generic : trait.get_generic_params ()) | 
 |     generic->accept_vis (*this); | 
 |   if (trait.has_where_clause ()) | 
 |     visit_where_clause (trait.get_where_clause ()); | 
 |   for (auto &bound : trait.get_type_param_bounds ()) | 
 |     bound->accept_vis (*this); | 
 |   for (auto &item : trait.get_trait_items ()) | 
 |     item->accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (ImplBlock &impl) | 
 | { | 
 |   visit_outer_attrs (impl); | 
 |   for (auto &generic : impl.get_generic_params ()) | 
 |     generic->accept_vis (*this); | 
 |   if (impl.has_trait_ref ()) | 
 |     impl.get_trait_ref ().accept_vis (*this); | 
 |   impl.get_type ().accept_vis (*this); | 
 |   if (impl.has_where_clause ()) | 
 |     visit_where_clause (impl.get_where_clause ()); | 
 |   visit_inner_attrs (impl); | 
 |   for (auto &item : impl.get_impl_items ()) | 
 |     item->accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (ExternalStaticItem &item) | 
 | { | 
 |   visit_outer_attrs (item); | 
 |   item.get_item_type ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::visit_named_function_param (NamedFunctionParam ¶m) | 
 | { | 
 |   param.get_type ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (ExternalFunctionItem &item) | 
 | { | 
 |   visit_outer_attrs (item); | 
 |   for (auto &generic : item.get_generic_params ()) | 
 |     generic->accept_vis (*this); | 
 |   for (auto ¶m : item.get_function_params ()) | 
 |     visit_named_function_param (param); | 
 |   if (item.has_return_type ()) | 
 |     item.get_return_type ().accept_vis (*this); | 
 |   if (item.has_where_clause ()) | 
 |     visit_where_clause (item.get_where_clause ()); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (ExternalTypeItem &item) | 
 | { | 
 |   visit_outer_attrs (item); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (ExternBlock &block) | 
 | { | 
 |   visit_outer_attrs (block); | 
 |   visit_inner_attrs (block); | 
 |   for (auto &item : block.get_extern_items ()) | 
 |     item->accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (LiteralPattern &) | 
 | {} | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (IdentifierPattern &pattern) | 
 | { | 
 |   if (pattern.has_subpattern ()) | 
 |     pattern.get_subpattern ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (WildcardPattern &) | 
 | {} | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (RangePatternBoundLiteral &) | 
 | {} | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (RangePatternBoundPath &bound) | 
 | { | 
 |   bound.get_path ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (RangePatternBoundQualPath &bound) | 
 | { | 
 |   bound.get_qualified_path ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (RangePattern &pattern) | 
 | { | 
 |   pattern.get_lower_bound ().accept_vis (*this); | 
 |   pattern.get_upper_bound ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (ReferencePattern &pattern) | 
 | { | 
 |   pattern.get_referenced_pattern ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (StructPatternFieldTuplePat &field) | 
 | { | 
 |   visit_outer_attrs (field); | 
 |   field.get_tuple_pattern ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (StructPatternFieldIdentPat &field) | 
 | { | 
 |   visit_outer_attrs (field); | 
 |   field.get_pattern ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (StructPatternFieldIdent &field) | 
 | { | 
 |   visit_outer_attrs (field); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (StructPattern &pattern) | 
 | { | 
 |   pattern.get_path ().accept_vis (*this); | 
 |   StructPatternElements &elements = pattern.get_struct_pattern_elems (); | 
 |   for (auto &field : elements.get_struct_pattern_fields ()) | 
 |     field->accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (TupleStructItemsNoRange &tuple_items) | 
 | { | 
 |   for (auto &item : tuple_items.get_patterns ()) | 
 |     item->accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (TupleStructItemsRange &tuple_items) | 
 | { | 
 |   for (auto &lower : tuple_items.get_lower_patterns ()) | 
 |     lower->accept_vis (*this); | 
 |   for (auto &upper : tuple_items.get_upper_patterns ()) | 
 |     upper->accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (TupleStructPattern &pattern) | 
 | { | 
 |   pattern.get_path ().accept_vis (*this); | 
 |   pattern.get_items ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (TuplePatternItemsMultiple &tuple_items) | 
 | { | 
 |   for (auto &pattern : tuple_items.get_patterns ()) | 
 |     pattern->accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (TuplePatternItemsRanged &tuple_items) | 
 | { | 
 |   for (auto &lower : tuple_items.get_lower_patterns ()) | 
 |     lower->accept_vis (*this); | 
 |   for (auto &upper : tuple_items.get_upper_patterns ()) | 
 |     upper->accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (TuplePattern &pattern) | 
 | { | 
 |   pattern.get_items ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (SlicePattern &pattern) | 
 | { | 
 |   for (auto &item : pattern.get_items ()) | 
 |     item->accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (AltPattern &pattern) | 
 | { | 
 |   for (auto &item : pattern.get_alts ()) | 
 |     item->accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (EmptyStmt &stmt) | 
 | {} | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (LetStmt &stmt) | 
 | { | 
 |   visit_outer_attrs (stmt); | 
 |   stmt.get_pattern ().accept_vis (*this); | 
 |   if (stmt.has_type ()) | 
 |     stmt.get_type ().accept_vis (*this); | 
 |   if (stmt.has_init_expr ()) | 
 |     stmt.get_init_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (ExprStmt &stmt) | 
 | { | 
 |   stmt.get_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (TraitBound &bound) | 
 | { | 
 |   for (auto &lifetime : bound.get_for_lifetimes ()) | 
 |     lifetime.accept_vis (*this); | 
 |   bound.get_path ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (ImplTraitType &type) | 
 | { | 
 |   for (auto &bound : type.get_type_param_bounds ()) | 
 |     bound->accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (TraitObjectType &type) | 
 | { | 
 |   for (auto &bound : type.get_type_param_bounds ()) | 
 |     bound->accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (ParenthesisedType &type) | 
 | { | 
 |   type.get_type_in_parens ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (TupleType &type) | 
 | { | 
 |   for (auto &elem : type.get_elems ()) | 
 |     elem->accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (NeverType &type) | 
 | {} | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (RawPointerType &type) | 
 | { | 
 |   type.get_type ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (ReferenceType &type) | 
 | { | 
 |   if (type.has_lifetime ()) | 
 |     type.get_lifetime ().accept_vis (*this); | 
 |   type.get_base_type ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (ArrayType &type) | 
 | { | 
 |   type.get_element_type ().accept_vis (*this); | 
 |   type.get_size_expr ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (SliceType &type) | 
 | { | 
 |   type.get_element_type ().accept_vis (*this); | 
 | } | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (InferredType &type) | 
 | {} | 
 |  | 
 | void | 
 | DefaultHIRVisitor::walk (BareFunctionType &type) | 
 | { | 
 |   for (auto &lifetime : type.get_for_lifetimes ()) | 
 |     lifetime.accept_vis (*this); | 
 |   for (auto ¶m : type.get_function_params ()) | 
 |     param.get_type ().accept_vis (*this); | 
 |   if (type.has_return_type ()) | 
 |     type.get_return_type ().accept_vis (*this); | 
 | } | 
 |  | 
 | } // namespace HIR | 
 | } // namespace Rust |