LCOV - code coverage report
Current view: top level - gcc/rust/ast - rust-ast-pointer-visitor.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 93.6 % 628 588
Test Date: 2026-04-20 14:57:17 Functions: 95.6 % 114 109
Legend: Lines:     hit not hit

            Line data    Source code
       1              : // Copyright (C) 2025-2026 Free Software Foundation, Inc.
       2              : 
       3              : // This file is part of GCC.
       4              : 
       5              : // GCC is free software; you can redistribute it and/or modify it under
       6              : // the terms of the GNU General Public License as published by the Free
       7              : // Software Foundation; either version 3, or (at your option) any later
       8              : // version.
       9              : 
      10              : // GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      11              : // WARRANTY; without even the implied warranty of MERCHANTABILITY or
      12              : // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      13              : // for more details.
      14              : 
      15              : // You should have received a copy of the GNU General Public License
      16              : // along with GCC; see the file COPYING3.  If not see
      17              : // <http://www.gnu.org/licenses/>.
      18              : 
      19              : #include "rust-ast-pointer-visitor.h"
      20              : #include "rust-ast-visitor.h"
      21              : #include "rust-ast-full.h"
      22              : 
      23              : namespace Rust {
      24              : namespace AST {
      25              : 
      26              : void
      27        15370 : PointerVisitor::visit (AST::Crate &crate)
      28              : {
      29        15370 :   visit_inner_attrs (crate);
      30        81123 :   for (auto &item : crate.items)
      31        65753 :     reseat (item);
      32        15370 : }
      33              : 
      34              : void
      35         1536 : PointerVisitor::visit (AST::AttrInputMetaItemContainer &input)
      36              : {
      37              :   // FIXME: I think we might actually have to reseat sub-items for macro
      38              :   // invocations within attributes correct?
      39              : 
      40         3208 :   for (auto &item : input.get_items ())
      41         1672 :     visit (item);
      42         1536 : }
      43              : 
      44              : void
      45        78445 : PointerVisitor::visit (AST::IdentifierExpr &ident_expr)
      46              : {
      47        78445 :   visit_outer_attrs (ident_expr);
      48        78445 : }
      49              : 
      50              : void
      51          841 : PointerVisitor::visit (AST::LifetimeParam &lifetime_param)
      52              : {
      53          841 :   visit_outer_attrs (lifetime_param);
      54              : 
      55              :   // Nothing to do for lifetimes right?
      56          841 : }
      57              : 
      58              : void
      59          300 : PointerVisitor::visit (AST::ConstGenericParam &const_param)
      60              : {
      61          300 :   visit_outer_attrs (const_param);
      62          300 :   if (const_param.has_type ())
      63          300 :     reseat (const_param.get_type_ptr ());
      64              : 
      65          300 :   if (const_param.has_default_value ())
      66           54 :     visit (const_param.get_default_value_unchecked ());
      67          300 : }
      68              : 
      69              : void
      70        81835 : PointerVisitor::visit (AST::PathInExpression &path)
      71              : {
      72        81835 :   visit_outer_attrs (path);
      73              : 
      74        81835 :   if (!path.is_lang_item ())
      75       190934 :     for (auto &segment : path.get_segments ())
      76       109272 :       visit (segment);
      77        81835 : }
      78              : 
      79              : void
      80          267 : PointerVisitor::visit (GenericArgsBinding &binding)
      81              : {
      82          267 :   reseat (binding.get_type_ptr ());
      83          267 : }
      84              : 
      85              : void
      86         9739 : PointerVisitor::visit (AST::TypePathSegmentGeneric &segment)
      87              : {
      88         9739 :   if (segment.has_generic_args ())
      89         9736 :     visit (segment.get_generic_args ());
      90         9739 : }
      91              : 
      92              : void
      93           90 : PointerVisitor::visit (AST::TypePathFunction &tpf)
      94              : {
      95          186 :   for (auto &input : tpf.get_params ())
      96           96 :     reseat (input);
      97           90 :   if (tpf.has_return_type ())
      98           84 :     reseat (tpf.get_return_type_ptr ());
      99           90 : }
     100              : 
     101              : void
     102           90 : PointerVisitor::visit (AST::TypePathSegmentFunction &segment)
     103              : {
     104              :   // FIXME: No reseating here correct? No macros possible or desugar?
     105           90 :   visit (segment.get_type_path_function ());
     106           90 :   visit (segment.get_ident_segment ());
     107           90 : }
     108              : 
     109              : void
     110        12875 : PointerVisitor::visit (AST::GenericArgs &args)
     111              : {
     112              :   // Nothing to do for lifetimes?
     113              :   // for (auto &lifetime : args.get_lifetime_args ())
     114              :   //   reseat (lifetime);
     115              : 
     116              :   // FIXME: Actually this can probably be a macro invocation, so we need to
     117              :   // reseat them?
     118        26339 :   for (auto &generic : args.get_generic_args ())
     119        13464 :     visit (generic);
     120              : 
     121        13142 :   for (auto &binding : args.get_binding_args ())
     122          267 :     visit (binding);
     123        12875 : }
     124              : 
     125              : void
     126       124962 : PointerVisitor::visit (AST::PathExprSegment &segment)
     127              : {
     128       124962 :   visit (segment.get_ident_segment ());
     129       124962 :   if (segment.has_generic_args ())
     130         3139 :     visit (segment.get_generic_args ());
     131       124962 : }
     132              : void
     133       307666 : PointerVisitor::visit (AST::TypePath &path)
     134              : {
     135       626057 :   for (auto &segment : path.get_segments ())
     136       318391 :     visit (segment);
     137       307666 : }
     138              : 
     139              : void
     140          372 : PointerVisitor::visit (AST::QualifiedPathInExpression &path)
     141              : {
     142          372 :   visit_outer_attrs (path);
     143          372 :   visit (path.get_qualified_path_type ());
     144              : 
     145          744 :   for (auto &segment : path.get_segments ())
     146          372 :     visit (segment);
     147          372 : }
     148              : 
     149              : void
     150         1410 : PointerVisitor::visit (AST::QualifiedPathType &path)
     151              : {
     152         1410 :   reseat (path.get_type_ptr ());
     153         1410 :   if (path.has_as_clause ())
     154         1281 :     visit (path.get_as_type_path ());
     155         1410 : }
     156              : 
     157              : void
     158            0 : PointerVisitor::visit (AST::MetaItemPathExpr &meta_item)
     159              : {
     160            0 :   visit (meta_item.get_path ());
     161            0 :   reseat (meta_item.get_expr_ptr ());
     162            0 : }
     163              : 
     164              : void
     165        11086 : PointerVisitor::visit (AST::BorrowExpr &expr)
     166              : {
     167        11086 :   visit_outer_attrs (expr);
     168        11086 :   reseat (expr.get_borrowed_expr_ptr ());
     169        11086 : }
     170              : 
     171              : void
     172        23861 : PointerVisitor::visit (AST::DereferenceExpr &expr)
     173              : {
     174        23861 :   visit_outer_attrs (expr);
     175        23861 :   reseat (expr.get_dereferenced_expr_ptr ());
     176        23861 : }
     177              : 
     178              : void
     179            4 : PointerVisitor::visit (AST::ErrorPropagationExpr &expr)
     180              : {
     181            4 :   visit_outer_attrs (expr);
     182            4 :   reseat (expr.get_propagating_expr_ptr ());
     183            4 : }
     184              : 
     185              : void
     186         3661 : PointerVisitor::visit (AST::NegationExpr &expr)
     187              : {
     188         3661 :   visit_outer_attrs (expr);
     189         3661 :   reseat (expr.get_negated_expr_ptr ());
     190         3661 : }
     191              : 
     192              : void
     193      1066751 : PointerVisitor::visit (AST::ArithmeticOrLogicalExpr &expr)
     194              : {
     195      1066751 :   visit_outer_attrs (expr);
     196      1066751 :   reseat (expr.get_left_expr_ptr ());
     197      1066751 :   reseat (expr.get_right_expr_ptr ());
     198      1066751 : }
     199              : 
     200              : void
     201        20108 : PointerVisitor::visit (AST::ComparisonExpr &expr)
     202              : {
     203        20108 :   visit_outer_attrs (expr);
     204        20108 :   reseat (expr.get_left_expr_ptr ());
     205        20108 :   reseat (expr.get_right_expr_ptr ());
     206        20108 : }
     207              : 
     208              : void
     209         2008 : PointerVisitor::visit (AST::LazyBooleanExpr &expr)
     210              : {
     211         2008 :   visit_outer_attrs (expr);
     212         2008 :   reseat (expr.get_left_expr_ptr ());
     213         2008 :   reseat (expr.get_right_expr_ptr ());
     214         2008 : }
     215              : 
     216              : void
     217        28667 : PointerVisitor::visit (AST::TypeCastExpr &expr)
     218              : {
     219        28667 :   visit_outer_attrs (expr);
     220        28667 :   reseat (expr.get_casted_expr_ptr ());
     221        28667 :   reseat (expr.get_type_to_cast_to_ptr ());
     222        28667 : }
     223              : 
     224              : void
     225        11598 : PointerVisitor::visit (AST::AssignmentExpr &expr)
     226              : {
     227        11598 :   visit_outer_attrs (expr);
     228        11598 :   reseat (expr.get_left_expr_ptr ());
     229        11598 :   reseat (expr.get_right_expr_ptr ());
     230        11598 : }
     231              : 
     232              : void
     233         3232 : PointerVisitor::visit (AST::CompoundAssignmentExpr &expr)
     234              : {
     235         3232 :   visit_outer_attrs (expr);
     236         3232 :   reseat (expr.get_left_expr_ptr ());
     237         3232 :   reseat (expr.get_right_expr_ptr ());
     238         3232 : }
     239              : 
     240              : void
     241         1832 : PointerVisitor::visit (AST::GroupedExpr &expr)
     242              : {
     243         1832 :   visit_outer_attrs (expr);
     244         1832 :   visit_inner_attrs (expr);
     245         1832 :   reseat (expr.get_expr_in_parens_ptr ());
     246         1832 : }
     247              : 
     248              : void
     249         1505 : PointerVisitor::visit (AST::ArrayElemsValues &elems)
     250              : {
     251         8601 :   for (auto &value : elems.get_values ())
     252         7096 :     reseat (value);
     253         1505 : }
     254              : 
     255              : void
     256          610 : PointerVisitor::visit (AST::ArrayElemsCopied &elems)
     257              : {
     258          610 :   reseat (elems.get_elem_to_copy_ptr ());
     259          610 :   reseat (elems.get_num_copies_ptr ());
     260          610 : }
     261              : 
     262              : void
     263         2115 : PointerVisitor::visit (AST::ArrayExpr &expr)
     264              : {
     265         2115 :   visit_outer_attrs (expr);
     266         2115 :   visit_inner_attrs (expr);
     267         2115 :   visit (expr.get_array_elems ());
     268         2115 : }
     269              : 
     270              : void
     271         1520 : PointerVisitor::visit (AST::ArrayIndexExpr &expr)
     272              : {
     273         1520 :   visit_outer_attrs (expr);
     274         1520 :   reseat (expr.get_array_expr_ptr ());
     275         1520 :   reseat (expr.get_index_expr_ptr ());
     276         1520 : }
     277              : 
     278              : void
     279         3093 : PointerVisitor::visit (AST::TupleExpr &expr)
     280              : {
     281         3093 :   visit_outer_attrs (expr);
     282         3093 :   visit_inner_attrs (expr);
     283         8525 :   for (auto &elem : expr.get_tuple_elems ())
     284         5432 :     reseat (elem);
     285         3093 : }
     286              : 
     287              : void
     288         4667 : PointerVisitor::visit (AST::TupleIndexExpr &expr)
     289              : {
     290         4667 :   visit_outer_attrs (expr);
     291         4667 :   reseat (expr.get_tuple_expr_ptr ());
     292         4667 : }
     293              : 
     294              : void
     295        11038 : PointerVisitor::visit (AST::StructExprFieldIdentifierValue &field)
     296              : {
     297        11038 :   reseat (field.get_value_ptr ());
     298        11038 : }
     299              : 
     300              : void
     301          220 : PointerVisitor::visit (AST::StructExprFieldIndexValue &field)
     302              : {
     303          220 :   reseat (field.get_value_ptr ());
     304          220 : }
     305              : 
     306              : void
     307          315 : PointerVisitor::visit (AST::StructBase &base)
     308              : {
     309          315 :   reseat (base.get_base_struct_ptr ());
     310          315 : }
     311              : 
     312              : void
     313        70754 : PointerVisitor::visit (AST::CallExpr &expr)
     314              : {
     315        70754 :   visit_outer_attrs (expr);
     316        70754 :   reseat (expr.get_function_expr_ptr ());
     317       151610 :   for (auto &param : expr.get_params ())
     318        80856 :     reseat (param);
     319        70754 : }
     320              : 
     321              : void
     322        15318 : PointerVisitor::visit (AST::MethodCallExpr &expr)
     323              : {
     324        15318 :   visit_outer_attrs (expr);
     325        15318 :   reseat (expr.get_receiver_expr_ptr ());
     326        15318 :   visit (expr.get_method_name ());
     327        25515 :   for (auto &param : expr.get_params ())
     328        10197 :     reseat (param);
     329        15318 : }
     330              : 
     331              : void
     332        22122 : PointerVisitor::visit (AST::FieldAccessExpr &expr)
     333              : {
     334        22122 :   visit_outer_attrs (expr);
     335        22122 :   reseat (expr.get_receiver_expr_ptr ());
     336        22122 : }
     337              : 
     338              : void
     339          111 : PointerVisitor::visit (AST::ClosureExprInner &expr)
     340              : {
     341          111 :   visit_outer_attrs (expr);
     342              : 
     343              :   // TODO: Actually we need to handle macro invocations as closure parameters so
     344              :   // this needs to be a reseat
     345          189 :   for (auto &param : expr.get_params ())
     346           78 :     visit (param);
     347              : 
     348          111 :   reseat (expr.get_definition_expr_ptr ());
     349          111 : }
     350              : 
     351              : void
     352        77832 : PointerVisitor::visit (AST::BlockExpr &expr)
     353              : {
     354        77832 :   visit_outer_attrs (expr);
     355        77832 :   visit_inner_attrs (expr);
     356              : 
     357        77832 :   if (expr.has_label ())
     358            0 :     visit (expr.get_label ());
     359              : 
     360       153262 :   for (auto &stmt : expr.get_statements ())
     361        75430 :     reseat (stmt);
     362              : 
     363        77832 :   if (expr.has_tail_expr ())
     364        56365 :     reseat (expr.get_tail_expr_ptr ());
     365        77832 : }
     366              : 
     367              : void
     368         3914 : PointerVisitor::visit (AST::AnonConst &expr)
     369              : {
     370         3914 :   if (!expr.is_deferred ())
     371         3873 :     reseat (expr.get_inner_expr_ptr ());
     372         3914 : }
     373              : 
     374              : void
     375           90 : PointerVisitor::visit (AST::ClosureExprInnerTyped &expr)
     376              : {
     377           90 :   visit_outer_attrs (expr);
     378              : 
     379              :   // TODO: Same as ClosureExprInner
     380          201 :   for (auto &param : expr.get_params ())
     381          111 :     visit (param);
     382              : 
     383           90 :   reseat (expr.get_return_type_ptr ());
     384              : 
     385           90 :   reseat (expr.get_definition_expr_ptr ());
     386           90 : }
     387              : 
     388              : void
     389          189 : PointerVisitor::visit (AST::ClosureParam &param)
     390              : {
     391          189 :   visit_outer_attrs (param);
     392          189 :   reseat (param.get_pattern_ptr ());
     393          189 :   if (param.has_type_given ())
     394          174 :     reseat (param.get_type_ptr ());
     395          189 : }
     396              : 
     397              : void
     398           85 : PointerVisitor::visit (AST::ContinueExpr &expr)
     399              : {
     400           85 :   visit_outer_attrs (expr);
     401           85 :   if (expr.has_label ())
     402           15 :     visit (expr.get_label_unchecked ());
     403           85 : }
     404              : 
     405              : void
     406          435 : PointerVisitor::visit (AST::BreakExpr &expr)
     407              : {
     408          435 :   visit_outer_attrs (expr);
     409          435 :   if (expr.has_label ())
     410          115 :     visit (expr.get_label_unchecked ());
     411              : 
     412          435 :   if (expr.has_break_expr ())
     413          110 :     reseat (expr.get_break_expr_ptr_unchecked ());
     414          435 : }
     415              : 
     416              : void
     417          426 : PointerVisitor::visit (AST::RangeFromToExpr &expr)
     418              : {
     419          426 :   reseat (expr.get_from_expr_ptr ());
     420          426 :   reseat (expr.get_to_expr_ptr ());
     421          426 : }
     422              : 
     423              : void
     424           35 : PointerVisitor::visit (AST::RangeFromExpr &expr)
     425              : {
     426           35 :   reseat (expr.get_from_expr_ptr ());
     427           35 : }
     428              : 
     429              : void
     430           35 : PointerVisitor::visit (AST::RangeToExpr &expr)
     431              : {
     432           35 :   reseat (expr.get_to_expr_ptr ());
     433           35 : }
     434              : 
     435              : void
     436           35 : PointerVisitor::visit (AST::RangeFromToInclExpr &expr)
     437              : {
     438           35 :   reseat (expr.get_from_expr_ptr ());
     439           35 :   reseat (expr.get_to_expr_ptr ());
     440           35 : }
     441              : 
     442              : void
     443            0 : PointerVisitor::visit (AST::RangeToInclExpr &expr)
     444              : {
     445            0 :   reseat (expr.get_to_expr_ptr ());
     446            0 : }
     447              : 
     448              : void
     449         2725 : PointerVisitor::visit (AST::ReturnExpr &expr)
     450              : {
     451         2725 :   visit_outer_attrs (expr);
     452         2725 :   if (expr.has_returned_expr ())
     453         2551 :     reseat (expr.get_returned_expr_ptr ());
     454         2725 : }
     455              : 
     456              : void
     457            4 : PointerVisitor::visit (AST::TryExpr &expr)
     458              : {
     459            4 :   visit_outer_attrs (expr);
     460            4 :   reseat (expr.get_block_expr_ptr ());
     461            4 : }
     462              : 
     463              : void
     464            5 : PointerVisitor::visit (AST::BoxExpr &expr)
     465              : {
     466            5 :   visit_outer_attrs (expr);
     467            5 :   reseat (expr.get_boxed_expr_ptr ());
     468            5 : }
     469              : 
     470              : void
     471        19969 : PointerVisitor::visit (AST::UnsafeBlockExpr &expr)
     472              : {
     473        19969 :   visit_outer_attrs (expr);
     474        19969 :   reseat (expr.get_block_expr_ptr ());
     475        19969 : }
     476              : 
     477              : void
     478          615 : PointerVisitor::visit (AST::LoopExpr &expr)
     479              : {
     480          615 :   visit_outer_attrs (expr);
     481          615 :   if (expr.has_loop_label ())
     482          190 :     visit (expr.get_loop_label ());
     483          615 :   reseat (expr.get_loop_block_ptr ());
     484          615 : }
     485              : 
     486              : void
     487          518 : PointerVisitor::visit (AST::WhileLoopExpr &expr)
     488              : {
     489          518 :   visit_outer_attrs (expr);
     490          518 :   if (expr.has_loop_label ())
     491           10 :     visit (expr.get_loop_label ());
     492          518 :   reseat (expr.get_predicate_expr_ptr ());
     493          518 :   reseat (expr.get_loop_block_ptr ());
     494          518 : }
     495              : 
     496              : void
     497            8 : PointerVisitor::visit (AST::WhileLetLoopExpr &expr)
     498              : {
     499            8 :   visit_outer_attrs (expr);
     500            8 :   reseat (expr.get_pattern ());
     501              : 
     502            8 :   if (expr.has_loop_label ())
     503            0 :     visit (expr.get_loop_label ());
     504              : 
     505            8 :   reseat (expr.get_scrutinee_expr_ptr ());
     506            8 :   reseat (expr.get_loop_block_ptr ());
     507            8 : }
     508              : 
     509              : void
     510          128 : PointerVisitor::visit (AST::ForLoopExpr &expr)
     511              : {
     512          128 :   visit_outer_attrs (expr);
     513          128 :   reseat (expr.get_pattern_ptr ());
     514          128 :   reseat (expr.get_iterator_expr_ptr ());
     515          128 :   if (expr.has_loop_label ())
     516            0 :     visit (expr.get_loop_label ());
     517          128 :   reseat (expr.get_loop_block_ptr ());
     518          128 : }
     519              : 
     520              : void
     521         8177 : PointerVisitor::visit (AST::IfExpr &expr)
     522              : {
     523         8177 :   visit_outer_attrs (expr);
     524         8177 :   reseat (expr.get_condition_expr_ptr ());
     525         8177 :   visit (expr.get_if_block ());
     526         8177 : }
     527              : 
     528              : void
     529           90 : PointerVisitor::visit (AST::IfLetExpr &expr)
     530              : {
     531           90 :   visit_outer_attrs (expr);
     532           90 :   reseat (expr.get_pattern ());
     533           90 :   reseat (expr.get_value_expr_ptr ());
     534           90 :   visit (expr.get_if_block ());
     535           90 : }
     536              : 
     537              : void
     538        14035 : PointerVisitor::visit (AST::MatchArm &arm)
     539              : {
     540        14035 :   visit_outer_attrs (arm);
     541        14035 :   reseat (arm.get_pattern ());
     542        14035 :   if (arm.has_match_arm_guard ())
     543            5 :     reseat (arm.get_guard_expr_ptr ());
     544        14035 : }
     545              : 
     546              : void
     547        14035 : PointerVisitor::visit (AST::MatchCase &arm)
     548              : {
     549        14035 :   visit (arm.get_arm ());
     550        14035 :   reseat (arm.get_expr_ptr ());
     551        14035 : }
     552              : 
     553              : void
     554         6045 : PointerVisitor::visit (AST::MatchExpr &expr)
     555              : {
     556         6045 :   visit_outer_attrs (expr);
     557         6045 :   visit_inner_attrs (expr);
     558         6045 :   reseat (expr.get_scrutinee_expr_ptr ());
     559        20080 :   for (auto &arm : expr.get_match_cases ())
     560        14035 :     visit (arm);
     561         6045 : }
     562              : 
     563              : void
     564            0 : PointerVisitor::visit (AST::AwaitExpr &expr)
     565              : {
     566            0 :   visit_outer_attrs (expr);
     567            0 :   reseat (expr.get_awaited_expr ());
     568            0 : }
     569              : 
     570              : void
     571            0 : PointerVisitor::visit (AST::AsyncBlockExpr &expr)
     572              : {
     573            0 :   visit_outer_attrs (expr);
     574            0 :   reseat (expr.get_block_expr ());
     575            0 : }
     576              : 
     577              : void
     578           81 : PointerVisitor::visit (AST::InlineAsm &expr)
     579              : {
     580           81 :   visit_outer_attrs (expr);
     581           81 :   using RegisterType = AST::InlineAsmOperand::RegisterType;
     582          168 :   for (auto &operand : expr.get_operands ())
     583              :     {
     584           87 :       switch (operand.get_register_type ())
     585              :         {
     586           30 :         case RegisterType::In:
     587           30 :           {
     588           30 :             reseat (operand.get_in ().expr);
     589           30 :             break;
     590              :           }
     591           51 :         case RegisterType::Out:
     592           51 :           {
     593           51 :             reseat (operand.get_out ().expr);
     594           51 :             break;
     595              :           }
     596            0 :         case RegisterType::InOut:
     597            0 :           {
     598            0 :             reseat (operand.get_in_out ().expr);
     599            0 :             break;
     600              :           }
     601            6 :         case RegisterType::SplitInOut:
     602            6 :           {
     603            6 :             auto split = operand.get_split_in_out ();
     604            6 :             reseat (split.in_expr);
     605            6 :             reseat (split.out_expr);
     606            6 :             break;
     607            6 :           }
     608            0 :         case RegisterType::Const:
     609            0 :           {
     610            0 :             reseat (operand.get_const ().anon_const.get_inner_expr_ptr ());
     611            0 :             break;
     612              :           }
     613            0 :         case RegisterType::Sym:
     614            0 :           {
     615            0 :             reseat (operand.get_sym ().expr);
     616            0 :             break;
     617              :           }
     618            0 :         case RegisterType::Label:
     619            0 :           {
     620            0 :             reseat (operand.get_label ().expr);
     621            0 :             break;
     622              :           }
     623              :         }
     624           81 :     }
     625           81 : }
     626              : 
     627              : void
     628            6 : PointerVisitor::visit (AST::LlvmInlineAsm &expr)
     629              : {
     630            6 :   for (auto &output : expr.get_outputs ())
     631            0 :     reseat (output.expr);
     632              : 
     633           12 :   for (auto &input : expr.get_inputs ())
     634            6 :     reseat (input.expr);
     635            6 : }
     636              : 
     637              : void
     638        28365 : PointerVisitor::visit (AST::TypeParam &param)
     639              : {
     640        28365 :   visit_outer_attrs (param);
     641              :   // FIXME: Can we do macro expansion here?
     642        30986 :   for (auto &bound : param.get_type_param_bounds ())
     643         2621 :     visit (bound);
     644        28365 :   if (param.has_type ())
     645         1277 :     reseat (param.get_type_ptr ());
     646        28365 : }
     647              : 
     648              : void
     649         1073 : PointerVisitor::visit (AST::TypeBoundWhereClauseItem &item)
     650              : {
     651         1100 :   for (auto &lifetime : item.get_for_lifetimes ())
     652           27 :     visit (lifetime);
     653         1073 :   reseat (item.get_type_ptr ());
     654              :   // FIXME: Likewise?
     655         2146 :   for (auto &param : item.get_type_param_bounds ())
     656         1073 :     visit (param);
     657         1073 : }
     658              : 
     659              : void
     660        38382 : PointerVisitor::visit (AST::FunctionParam &param)
     661              : {
     662        38382 :   visit_outer_attrs (param);
     663        38382 :   if (param.has_name ())
     664        38382 :     reseat (param.get_pattern_ptr ());
     665              : 
     666        38382 :   reseat (param.get_type_ptr ());
     667        38382 : }
     668              : 
     669              : void
     670        27846 : PointerVisitor::visit (AST::SelfParam &param)
     671              : {
     672        27846 :   visit_outer_attrs (param);
     673              : 
     674        27846 :   if (param.has_lifetime ())
     675        15914 :     visit (param.get_lifetime ());
     676              : 
     677        27846 :   if (param.has_type ())
     678            3 :     reseat (param.get_type_ptr ());
     679        27846 : }
     680              : 
     681              : void
     682         4479 : PointerVisitor::visit (AST::Module &module)
     683              : {
     684         4479 :   visit_outer_attrs (module);
     685         4479 :   visit (module.get_visibility ());
     686         4479 :   visit_inner_attrs (module);
     687        20512 :   for (auto &item : module.get_items ())
     688        16033 :     reseat (item);
     689         4479 : }
     690              : 
     691              : void
     692        63368 : PointerVisitor::visit_function_params (AST::Function &function)
     693              : {
     694       132184 :   for (auto &param : function.get_function_params ())
     695        68816 :     visit (param);
     696        63368 : }
     697              : 
     698              : void
     699        63368 : PointerVisitor::visit (AST::Function &function)
     700              : {
     701        63368 :   visit_outer_attrs (function);
     702        63368 :   visit (function.get_visibility ());
     703        63368 :   visit (function.get_qualifiers ());
     704        69733 :   for (auto &generic : function.get_generic_params ())
     705         6365 :     visit (generic);
     706              : 
     707        63368 :   visit_function_params (function);
     708              : 
     709        63368 :   if (function.has_return_type ())
     710        46033 :     reseat (function.get_return_type_ptr ());
     711        63368 :   if (function.has_where_clause ())
     712          715 :     visit (function.get_where_clause ());
     713        63368 :   if (function.has_body ())
     714        48913 :     reseat (*function.get_definition ());
     715        63368 : }
     716              : 
     717              : void
     718         7647 : PointerVisitor::visit (AST::TypeAlias &type_alias)
     719              : {
     720         7647 :   visit_outer_attrs (type_alias);
     721         7647 :   visit (type_alias.get_visibility ());
     722         7737 :   for (auto &generic : type_alias.get_generic_params ())
     723           90 :     visit (generic);
     724         7647 :   if (type_alias.has_where_clause ())
     725            0 :     visit (type_alias.get_where_clause ());
     726         7647 :   reseat (type_alias.get_type_aliased_ptr ());
     727         7647 : }
     728              : 
     729              : void
     730         7329 : PointerVisitor::visit (AST::StructField &field)
     731              : {
     732         7329 :   visit_outer_attrs (field);
     733         7329 :   visit (field.get_visibility ());
     734         7329 :   reseat (field.get_field_type_ptr ());
     735         7329 : }
     736              : 
     737              : void
     738         7011 : PointerVisitor::visit (AST::TupleField &field)
     739              : {
     740         7011 :   visit_outer_attrs (field);
     741         7011 :   visit (field.get_visibility ());
     742         7011 :   reseat (field.get_field_type_ptr ());
     743         7011 : }
     744              : 
     745              : void
     746          968 : PointerVisitor::visit (AST::EnumItemDiscriminant &item)
     747              : {
     748          968 :   PointerVisitor::visit (static_cast<EnumItem &> (item));
     749          968 :   reseat (item.get_expr_ptr ());
     750          968 : }
     751              : 
     752              : void
     753         2915 : PointerVisitor::visit (AST::ConstantItem &const_item)
     754              : {
     755         2915 :   visit_outer_attrs (const_item);
     756         2915 :   visit (const_item.get_visibility ());
     757         2915 :   reseat (const_item.get_type_ptr ());
     758         2915 :   if (const_item.has_expr ())
     759         2746 :     reseat (const_item.get_expr_ptr ());
     760         2915 : }
     761              : 
     762              : void
     763          304 : PointerVisitor::visit (AST::StaticItem &static_item)
     764              : {
     765          304 :   visit_outer_attrs (static_item);
     766          304 :   visit (static_item.get_visibility ());
     767          304 :   reseat (static_item.get_type_ptr ());
     768          304 :   reseat (static_item.get_expr_ptr ());
     769          304 : }
     770              : 
     771              : void
     772        12856 : PointerVisitor::visit (AST::Trait &trait)
     773              : {
     774        12856 :   visit_outer_attrs (trait);
     775        12856 :   visit (trait.get_visibility ());
     776              : 
     777        12856 :   visit_inner_attrs (trait);
     778              : 
     779        12856 :   visit (trait.get_implicit_self ());
     780              : 
     781        15156 :   for (auto &generic : trait.get_generic_params ())
     782         2300 :     visit (generic);
     783              : 
     784        12856 :   if (trait.has_where_clause ())
     785           28 :     visit (trait.get_where_clause ());
     786              : 
     787        15141 :   for (auto &bound : trait.get_type_param_bounds ())
     788         2285 :     visit (bound);
     789              : 
     790        24655 :   for (auto &item : trait.get_trait_items ())
     791        11799 :     reseat (item);
     792        12856 : }
     793              : 
     794              : void
     795         3159 : PointerVisitor::visit (AST::InherentImpl &impl)
     796              : {
     797         3159 :   visit_outer_attrs (impl);
     798         3159 :   visit (impl.get_visibility ());
     799              : 
     800         4256 :   for (auto &generic : impl.get_generic_params ())
     801         1097 :     visit (generic);
     802         3159 :   if (impl.has_where_clause ())
     803            3 :     visit (impl.get_where_clause ());
     804         3159 :   reseat (impl.get_type_ptr ());
     805         3159 :   visit_inner_attrs (impl);
     806        12808 :   for (auto &item : impl.get_impl_items ())
     807         9649 :     reseat (item);
     808         3159 : }
     809              : 
     810              : void
     811        15887 : PointerVisitor::visit (AST::TraitImpl &impl)
     812              : {
     813        15887 :   visit_outer_attrs (impl);
     814        15887 :   visit (impl.get_visibility ());
     815              : 
     816        18603 :   for (auto &generic : impl.get_generic_params ())
     817         2716 :     visit (generic);
     818        15887 :   if (impl.has_where_clause ())
     819          297 :     visit (impl.get_where_clause ());
     820        15887 :   reseat (impl.get_type_ptr ());
     821        15887 :   visit (impl.get_trait_path ());
     822        15887 :   visit_inner_attrs (impl);
     823        34641 :   for (auto &item : impl.get_impl_items ())
     824        18754 :     reseat (item);
     825        15887 : }
     826              : 
     827              : void
     828            3 : PointerVisitor::visit (AST::ExternalStaticItem &item)
     829              : {
     830            3 :   visit_outer_attrs (item);
     831            3 :   visit (item.get_visibility ());
     832            3 :   reseat (item.get_type_ptr ());
     833            3 : }
     834              : 
     835              : void
     836         5197 : PointerVisitor::visit (AST::ExternBlock &block)
     837              : {
     838         5197 :   visit_outer_attrs (block);
     839         5197 :   visit (block.get_visibility ());
     840         5197 :   visit_inner_attrs (block);
     841        13627 :   for (auto &item : block.get_extern_items ())
     842         8430 :     reseat (item);
     843         5197 : }
     844              : 
     845              : void
     846        81433 : PointerVisitor::visit (AST::IdentifierPattern &pattern)
     847              : {
     848        81433 :   if (pattern.has_subpattern ())
     849           54 :     reseat (pattern.get_subpattern_ptr ());
     850        81433 : }
     851              : 
     852              : void
     853          163 : PointerVisitor::visit (AST::RangePattern &pattern)
     854              : {
     855              :   // FIXME: So should this be reseat() instead? Can we have macro invocations as
     856              :   // patterns in range patterns?
     857          163 :   if (pattern.get_has_lower_bound ())
     858          163 :     visit (pattern.get_lower_bound ());
     859          163 :   if (pattern.get_has_upper_bound ())
     860          163 :     visit (pattern.get_upper_bound ());
     861          163 : }
     862              : 
     863              : void
     864          736 : PointerVisitor::visit (AST::ReferencePattern &pattern)
     865              : {
     866          736 :   reseat (pattern.get_referenced_pattern_ptr ());
     867          736 : }
     868              : 
     869              : void
     870           72 : PointerVisitor::visit (AST::StructPatternFieldTuplePat &field)
     871              : {
     872           72 :   visit_outer_attrs (field);
     873           72 :   reseat (field.get_index_pattern_ptr ());
     874           72 : }
     875              : 
     876              : void
     877          545 : PointerVisitor::visit (AST::StructPatternFieldIdentPat &field)
     878              : {
     879          545 :   visit_outer_attrs (field);
     880          545 :   reseat (field.get_ident_pattern_ptr ());
     881          545 : }
     882              : 
     883              : void
     884         3614 : PointerVisitor::visit (AST::TupleStructItemsNoRest &tuple_items)
     885              : {
     886         7671 :   for (auto &pattern : tuple_items.get_patterns ())
     887         4057 :     reseat (pattern);
     888         3614 : }
     889              : 
     890              : void
     891          117 : PointerVisitor::visit (AST::TupleStructItemsHasRest &tuple_items)
     892              : {
     893          210 :   for (auto &lower : tuple_items.get_lower_patterns ())
     894           93 :     reseat (lower);
     895          174 :   for (auto &upper : tuple_items.get_upper_patterns ())
     896           57 :     reseat (upper);
     897          117 : }
     898              : 
     899              : void
     900         1599 : PointerVisitor::visit (AST::TuplePatternItemsNoRest &tuple_items)
     901              : {
     902         4851 :   for (auto &pattern : tuple_items.get_patterns ())
     903         3252 :     reseat (pattern);
     904         1599 : }
     905              : 
     906              : void
     907           84 : PointerVisitor::visit (AST::TuplePatternItemsHasRest &tuple_items)
     908              : {
     909          171 :   for (auto &lower : tuple_items.get_lower_patterns ())
     910           87 :     reseat (lower);
     911          180 :   for (auto &upper : tuple_items.get_upper_patterns ())
     912           96 :     reseat (upper);
     913           84 : }
     914              : 
     915              : void
     916          132 : PointerVisitor::visit (AST::GroupedPattern &pattern)
     917              : {
     918          132 :   reseat (pattern.get_pattern_in_parens_ptr ());
     919          132 : }
     920              : 
     921              : void
     922           96 : PointerVisitor::visit (AST::SlicePatternItemsNoRest &items)
     923              : {
     924          288 :   for (auto &item : items.get_patterns ())
     925          192 :     reseat (item);
     926           96 : }
     927              : 
     928              : void
     929          132 : PointerVisitor::visit (AST::SlicePatternItemsHasRest &items)
     930              : {
     931          261 :   for (auto &item : items.get_lower_patterns ())
     932          129 :     reseat (item);
     933          261 :   for (auto &item : items.get_upper_patterns ())
     934          129 :     reseat (item);
     935          132 : }
     936              : 
     937              : void
     938          661 : PointerVisitor::visit (AST::AltPattern &pattern)
     939              : {
     940         2040 :   for (auto &alt : pattern.get_alts ())
     941         1379 :     reseat (alt);
     942          661 : }
     943              : 
     944              : void
     945        67554 : PointerVisitor::visit (AST::LetStmt &stmt)
     946              : {
     947        67554 :   visit_outer_attrs (stmt);
     948        67554 :   reseat (stmt.get_pattern_ptr ());
     949        67554 :   if (stmt.has_type ())
     950        11047 :     reseat (stmt.get_type_ptr ());
     951        67554 :   if (stmt.has_init_expr ())
     952        61640 :     reseat (stmt.get_init_expr_ptr ());
     953        67554 : }
     954              : 
     955              : void
     956        55402 : PointerVisitor::visit (AST::ExprStmt &stmt)
     957              : {
     958        55402 :   reseat (stmt.get_expr_ptr ());
     959        55402 : }
     960              : 
     961              : void
     962           38 : PointerVisitor::visit (AST::ParenthesisedType &type)
     963              : {
     964           38 :   reseat (type.get_type_in_parens ());
     965           38 : }
     966              : 
     967              : void
     968          652 : PointerVisitor::visit (AST::ImplTraitTypeOneBound &type)
     969              : {
     970              :   // FIXME: Do we need to reseat here?
     971          652 :   visit (type.get_trait_bound ());
     972          652 : }
     973              : 
     974              : void
     975          780 : PointerVisitor::visit (AST::TraitObjectTypeOneBound &type)
     976              : {
     977              :   // FIXME: Do we need to reseat here?
     978          780 :   visit (type.get_trait_bound ());
     979          780 : }
     980              : 
     981              : void
     982         2458 : PointerVisitor::visit (AST::TupleType &type)
     983              : {
     984         6289 :   for (auto &elem : type.get_elems ())
     985         3831 :     reseat (elem);
     986         2458 : }
     987              : 
     988              : void
     989        36104 : PointerVisitor::visit (AST::RawPointerType &type)
     990              : {
     991        36104 :   reseat (type.get_type_pointed_to_ptr ());
     992        36104 : }
     993              : 
     994              : void
     995        25777 : PointerVisitor::visit (AST::ReferenceType &type)
     996              : {
     997        25777 :   visit (type.get_lifetime ());
     998        25777 :   reseat (type.get_type_ptr ());
     999        25777 : }
    1000              : 
    1001              : void
    1002         3853 : PointerVisitor::visit (AST::ArrayType &type)
    1003              : {
    1004         3853 :   reseat (type.get_elem_type_ptr ());
    1005         3853 :   visit (type.get_size_expr ());
    1006         3853 : }
    1007              : 
    1008              : void
    1009         4344 : PointerVisitor::visit (AST::SliceType &type)
    1010              : {
    1011         4344 :   reseat (type.get_elem_type_ptr ());
    1012         4344 : }
    1013              : 
    1014              : void
    1015          146 : PointerVisitor::visit (AST::MaybeNamedParam &param)
    1016              : {
    1017          146 :   visit_outer_attrs (param);
    1018          146 :   reseat (param.get_type_ptr ());
    1019          146 : }
    1020              : 
    1021              : void
    1022          192 : PointerVisitor::visit (AST::BareFunctionType &type)
    1023              : {
    1024          201 :   for (auto &lifetime : type.get_for_lifetimes ())
    1025            9 :     visit (lifetime);
    1026          192 :   visit (type.get_function_qualifiers ());
    1027          338 :   for (auto &param : type.get_function_params ())
    1028          146 :     visit (param);
    1029          192 :   if (type.is_variadic ())
    1030            0 :     for (auto attr : type.get_variadic_attr ())
    1031            0 :       visit (attr);
    1032          192 :   if (type.has_return_type ())
    1033          145 :     reseat (type.get_return_type_ptr ());
    1034          192 : }
    1035              : 
    1036              : void
    1037            0 : PointerVisitor::visit (AST::FormatArgs &)
    1038              : {
    1039              :   // FIXME: Do we have anything to do? any subnodes to visit? Probably, right?
    1040            0 : }
    1041              : 
    1042              : void
    1043           45 : PointerVisitor::visit (AST::OffsetOf &offset_of)
    1044              : {
    1045           45 :   reseat (offset_of.get_type_ptr ());
    1046           45 : }
    1047              : 
    1048              : void
    1049         2588 : PointerVisitor::visit (AST::VariadicParam &param)
    1050              : {
    1051         2588 :   if (param.has_pattern ())
    1052           33 :     reseat (param.get_pattern_ptr ());
    1053         2588 : }
    1054              : 
    1055              : } // namespace AST
    1056              : } // namespace Rust
        

Generated by: LCOV version 2.4-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.