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: 94.2 % 622 586
Test Date: 2026-08-22 16:33:35 Functions: 95.6 % 113 108
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        15947 : PointerVisitor::visit (AST::Crate &crate)
      28              : {
      29        15947 :   visit_inner_attrs (crate);
      30        86541 :   for (auto &item : crate.items)
      31        70594 :     reseat (item);
      32        15947 : }
      33              : 
      34              : void
      35         6415 : 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        13490 :   for (auto &item : input.get_items ())
      41         7075 :     visit (item);
      42         6415 : }
      43              : 
      44              : void
      45      4168887 : PointerVisitor::visit (AST::IdentifierExpr &ident_expr)
      46              : {
      47      4168887 :   visit_outer_attrs (ident_expr);
      48      4168887 : }
      49              : 
      50              : void
      51        41814 : PointerVisitor::visit (AST::LifetimeParam &lifetime_param)
      52              : {
      53        41814 :   visit_outer_attrs (lifetime_param);
      54              : 
      55              :   // Nothing to do for lifetimes right?
      56        41814 : }
      57              : 
      58              : void
      59         3014 : PointerVisitor::visit (AST::ConstGenericParam &const_param)
      60              : {
      61         3014 :   visit_outer_attrs (const_param);
      62         3014 :   if (const_param.has_type ())
      63         3014 :     reseat (const_param.get_type_ptr ());
      64              : 
      65         3014 :   if (const_param.has_default_value ())
      66           54 :     visit (const_param.get_default_value_unchecked ());
      67         3014 : }
      68              : 
      69              : void
      70      2602741 : PointerVisitor::visit (AST::PathInExpression &path)
      71              : {
      72      2602741 :   visit_outer_attrs (path);
      73              : 
      74      2602741 :   if (!path.is_lang_item ())
      75      5586669 :     for (auto &segment : path.get_segments ())
      76      2991900 :       visit (segment);
      77      2602741 : }
      78              : 
      79              : void
      80         9352 : PointerVisitor::visit (GenericArgsBinding &binding)
      81              : {
      82         9352 :   reseat (binding.get_type_ptr ());
      83         9352 : }
      84              : 
      85              : void
      86       495484 : PointerVisitor::visit (AST::TypePathSegmentGeneric &segment)
      87              : {
      88       495484 :   if (segment.has_generic_args ())
      89       495481 :     visit (segment.get_generic_args ());
      90       495484 : }
      91              : 
      92              : void
      93        18205 : PointerVisitor::visit (AST::TypePathFunction &tpf)
      94              : {
      95        43501 :   for (auto &input : tpf.get_params ())
      96        25296 :     reseat (input);
      97        18205 :   if (tpf.has_return_type ())
      98        17589 :     reseat (tpf.get_return_type_ptr ());
      99        18205 : }
     100              : 
     101              : void
     102        18205 : PointerVisitor::visit (AST::TypePathSegmentFunction &segment)
     103              : {
     104              :   // FIXME: No reseating here correct? No macros possible or desugar?
     105        18205 :   visit (segment.get_type_path_function ());
     106        18205 :   visit (segment.get_ident_segment ());
     107        18205 : }
     108              : 
     109              : void
     110       515053 : 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      1021088 :   for (auto &generic : args.get_generic_args ())
     119       506035 :     visit (generic);
     120              : 
     121       524405 :   for (auto &binding : args.get_binding_args ())
     122         9352 :     visit (binding);
     123       515053 : }
     124              : 
     125              : void
     126      4790595 : PointerVisitor::visit (AST::PathExprSegment &segment)
     127              : {
     128      4790595 :   visit (segment.get_ident_segment ());
     129      4790595 :   if (segment.has_generic_args ())
     130        19572 :     visit (segment.get_generic_args ());
     131      4790595 : }
     132              : void
     133      4757867 : PointerVisitor::visit (AST::TypePath &path)
     134              : {
     135      9847263 :   for (auto &segment : path.get_segments ())
     136      5089396 :     visit (segment);
     137      4757867 : }
     138              : 
     139              : void
     140         3833 : PointerVisitor::visit (AST::QualifiedPathInExpression &path)
     141              : {
     142         3833 :   visit_outer_attrs (path);
     143         3833 :   visit (path.get_qualified_path_type ());
     144              : 
     145         7666 :   for (auto &segment : path.get_segments ())
     146         3833 :     visit (segment);
     147         3833 : }
     148              : 
     149              : void
     150       110435 : PointerVisitor::visit (AST::QualifiedPathType &path)
     151              : {
     152       110435 :   reseat (path.get_type_ptr ());
     153       110435 :   if (path.has_as_clause ())
     154       107693 :     visit (path.get_as_type_path ());
     155       110435 : }
     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       208505 : PointerVisitor::visit (AST::BorrowExpr &expr)
     166              : {
     167       208505 :   visit_outer_attrs (expr);
     168       208505 :   reseat (expr.get_borrowed_expr_ptr ());
     169       208505 : }
     170              : 
     171              : void
     172       375216 : PointerVisitor::visit (AST::DereferenceExpr &expr)
     173              : {
     174       375216 :   visit_outer_attrs (expr);
     175       375216 :   reseat (expr.get_dereferenced_expr_ptr ());
     176       375216 : }
     177              : 
     178              : void
     179        13482 : PointerVisitor::visit (AST::ErrorPropagationExpr &expr)
     180              : {
     181        13482 :   visit_outer_attrs (expr);
     182        13482 :   reseat (expr.get_propagating_expr_ptr ());
     183        13482 : }
     184              : 
     185              : void
     186        63039 : PointerVisitor::visit (AST::NegationExpr &expr)
     187              : {
     188        63039 :   visit_outer_attrs (expr);
     189        63039 :   reseat (expr.get_negated_expr_ptr ());
     190        63039 : }
     191              : 
     192              : void
     193      2410366 : PointerVisitor::visit (AST::ArithmeticOrLogicalExpr &expr)
     194              : {
     195      2410366 :   visit_outer_attrs (expr);
     196      2410366 :   reseat (expr.get_left_expr_ptr ());
     197      2410366 :   reseat (expr.get_right_expr_ptr ());
     198      2410366 : }
     199              : 
     200              : void
     201       192380 : PointerVisitor::visit (AST::ComparisonExpr &expr)
     202              : {
     203       192380 :   visit_outer_attrs (expr);
     204       192380 :   reseat (expr.get_left_expr_ptr ());
     205       192380 :   reseat (expr.get_right_expr_ptr ());
     206       192380 : }
     207              : 
     208              : void
     209        51295 : PointerVisitor::visit (AST::LazyBooleanExpr &expr)
     210              : {
     211        51295 :   visit_outer_attrs (expr);
     212        51295 :   reseat (expr.get_left_expr_ptr ());
     213        51295 :   reseat (expr.get_right_expr_ptr ());
     214        51295 : }
     215              : 
     216              : void
     217       265235 : PointerVisitor::visit (AST::TypeCastExpr &expr)
     218              : {
     219       265235 :   visit_outer_attrs (expr);
     220       265235 :   reseat (expr.get_casted_expr_ptr ());
     221       265235 :   reseat (expr.get_type_to_cast_to_ptr ());
     222       265235 : }
     223              : 
     224              : void
     225        82490 : PointerVisitor::visit (AST::AssignmentExpr &expr)
     226              : {
     227        82490 :   visit_outer_attrs (expr);
     228        82490 :   reseat (expr.get_left_expr_ptr ());
     229        82490 :   reseat (expr.get_right_expr_ptr ());
     230        82490 : }
     231              : 
     232              : void
     233        59620 : PointerVisitor::visit (AST::CompoundAssignmentExpr &expr)
     234              : {
     235        59620 :   visit_outer_attrs (expr);
     236        59620 :   reseat (expr.get_left_expr_ptr ());
     237        59620 :   reseat (expr.get_right_expr_ptr ());
     238        59620 : }
     239              : 
     240              : void
     241       430571 : PointerVisitor::visit (AST::GroupedExpr &expr)
     242              : {
     243       430571 :   visit_outer_attrs (expr);
     244       430571 :   visit_inner_attrs (expr);
     245       430571 :   reseat (expr.get_expr_in_parens_ptr ());
     246       430571 : }
     247              : 
     248              : void
     249       823244 : PointerVisitor::visit (AST::ArrayElemsValues &elems)
     250              : {
     251      8649663 :   for (auto &value : elems.get_values ())
     252      7826419 :     reseat (value);
     253       823244 : }
     254              : 
     255              : void
     256         3286 : PointerVisitor::visit (AST::ArrayElemsCopied &elems)
     257              : {
     258         3286 :   reseat (elems.get_elem_to_copy_ptr ());
     259         3286 :   reseat (elems.get_num_copies_ptr ());
     260         3286 : }
     261              : 
     262              : void
     263       826530 : PointerVisitor::visit (AST::ArrayExpr &expr)
     264              : {
     265       826530 :   visit_outer_attrs (expr);
     266       826530 :   visit_inner_attrs (expr);
     267       826530 :   visit (expr.get_array_elems ());
     268       826530 : }
     269              : 
     270              : void
     271        32664 : PointerVisitor::visit (AST::ArrayIndexExpr &expr)
     272              : {
     273        32664 :   visit_outer_attrs (expr);
     274        32664 :   reseat (expr.get_array_expr_ptr ());
     275        32664 :   reseat (expr.get_index_expr_ptr ());
     276        32664 : }
     277              : 
     278              : void
     279       282699 : PointerVisitor::visit (AST::TupleExpr &expr)
     280              : {
     281       282699 :   visit_outer_attrs (expr);
     282       282699 :   visit_inner_attrs (expr);
     283       809215 :   for (auto &elem : expr.get_tuple_elems ())
     284       526516 :     reseat (elem);
     285       282699 : }
     286              : 
     287              : void
     288       243052 : PointerVisitor::visit (AST::TupleIndexExpr &expr)
     289              : {
     290       243052 :   visit_outer_attrs (expr);
     291       243052 :   reseat (expr.get_tuple_expr_ptr ());
     292       243052 : }
     293              : 
     294              : void
     295        53507 : PointerVisitor::visit (AST::StructExprFieldIdentifierValue &field)
     296              : {
     297        53507 :   reseat (field.get_value_ptr ());
     298        53507 : }
     299              : 
     300              : void
     301          220 : PointerVisitor::visit (AST::StructExprFieldIndexValue &field)
     302              : {
     303          220 :   reseat (field.get_value_ptr ());
     304          220 : }
     305              : 
     306              : void
     307          524 : PointerVisitor::visit (AST::StructBase &base)
     308              : {
     309          524 :   reseat (base.get_base_struct_ptr ());
     310          524 : }
     311              : 
     312              : void
     313      4120386 : PointerVisitor::visit (AST::CallExpr &expr)
     314              : {
     315      4120386 :   visit_outer_attrs (expr);
     316      4120386 :   reseat (expr.get_function_expr_ptr ());
     317     14922100 :   for (auto &param : expr.get_params ())
     318     10801714 :     reseat (param);
     319      4120386 : }
     320              : 
     321              : void
     322      1794862 : PointerVisitor::visit (AST::MethodCallExpr &expr)
     323              : {
     324      1794862 :   visit_outer_attrs (expr);
     325      1794862 :   reseat (expr.get_receiver_expr_ptr ());
     326      1794862 :   visit (expr.get_method_name ());
     327      2076153 :   for (auto &param : expr.get_params ())
     328       281291 :     reseat (param);
     329      1794862 : }
     330              : 
     331              : void
     332       236791 : PointerVisitor::visit (AST::FieldAccessExpr &expr)
     333              : {
     334       236791 :   visit_outer_attrs (expr);
     335       236791 :   reseat (expr.get_receiver_expr_ptr ());
     336       236791 : }
     337              : 
     338              : void
     339        10701 : PointerVisitor::visit (AST::ClosureExprInner &expr)
     340              : {
     341        10701 :   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        23493 :   for (auto &param : expr.get_params ())
     346        12792 :     visit (param);
     347              : 
     348        10701 :   reseat (expr.get_definition_expr_ptr ());
     349        10701 : }
     350              : 
     351              : void
     352       652224 : PointerVisitor::visit (AST::BlockExpr &expr)
     353              : {
     354       652224 :   visit_outer_attrs (expr);
     355       652224 :   visit_inner_attrs (expr);
     356              : 
     357       652224 :   if (expr.has_label ())
     358            9 :     visit (expr.get_label ());
     359              : 
     360      1030177 :   for (auto &stmt : expr.get_statements ())
     361       377953 :     reseat (stmt);
     362              : 
     363       652224 :   if (expr.has_tail_expr ())
     364       564119 :     reseat (expr.get_tail_expr_ptr ());
     365       652224 : }
     366              : 
     367              : void
     368        23829 : PointerVisitor::visit (AST::AnonConst &expr)
     369              : {
     370        23829 :   if (!expr.is_deferred ())
     371        23778 :     reseat (expr.get_inner_expr_ptr ());
     372        23829 : }
     373              : 
     374              : void
     375          126 : PointerVisitor::visit (AST::ClosureExprInnerTyped &expr)
     376              : {
     377          126 :   visit_outer_attrs (expr);
     378              : 
     379              :   // TODO: Same as ClosureExprInner
     380          273 :   for (auto &param : expr.get_params ())
     381          147 :     visit (param);
     382              : 
     383          126 :   reseat (expr.get_return_type_ptr ());
     384              : 
     385          126 :   reseat (expr.get_definition_expr_ptr ());
     386          126 : }
     387              : 
     388              : void
     389        12939 : PointerVisitor::visit (AST::ClosureParam &param)
     390              : {
     391        12939 :   visit_outer_attrs (param);
     392        12939 :   reseat (param.get_pattern_ptr ());
     393        12939 :   if (param.has_type_given ())
     394          786 :     reseat (param.get_type_ptr ());
     395        12939 : }
     396              : 
     397              : void
     398         1120 : PointerVisitor::visit (AST::ContinueExpr &expr)
     399              : {
     400         1120 :   visit_outer_attrs (expr);
     401         1120 :   if (expr.has_label ())
     402          461 :     visit (expr.get_label_unchecked ());
     403         1120 : }
     404              : 
     405              : void
     406         2640 : PointerVisitor::visit (AST::BreakExpr &expr)
     407              : {
     408         2640 :   visit_outer_attrs (expr);
     409         2640 :   if (expr.has_label ())
     410          185 :     visit (expr.get_label_unchecked ());
     411              : 
     412         2640 :   if (expr.has_break_expr ())
     413          130 :     reseat (expr.get_break_expr_ptr_unchecked ());
     414         2640 : }
     415              : 
     416              : void
     417         8963 : PointerVisitor::visit (AST::RangeFromToExpr &expr)
     418              : {
     419         8963 :   reseat (expr.get_from_expr_ptr ());
     420         8963 :   reseat (expr.get_to_expr_ptr ());
     421         8963 : }
     422              : 
     423              : void
     424         3997 : PointerVisitor::visit (AST::RangeFromExpr &expr)
     425              : {
     426         3997 :   reseat (expr.get_from_expr_ptr ());
     427         3997 : }
     428              : 
     429              : void
     430         7872 : PointerVisitor::visit (AST::RangeToExpr &expr)
     431              : {
     432         7872 :   reseat (expr.get_to_expr_ptr ());
     433         7872 : }
     434              : 
     435              : void
     436          461 : PointerVisitor::visit (AST::RangeFromToInclExpr &expr)
     437              : {
     438          461 :   reseat (expr.get_from_expr_ptr ());
     439          461 :   reseat (expr.get_to_expr_ptr ());
     440          461 : }
     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        27772 : PointerVisitor::visit (AST::ReturnExpr &expr)
     450              : {
     451        27772 :   visit_outer_attrs (expr);
     452        27772 :   if (expr.has_returned_expr ())
     453        26665 :     reseat (expr.get_returned_expr_ptr ());
     454        27772 : }
     455              : 
     456              : void
     457         2104 : PointerVisitor::visit (AST::TryExpr &expr)
     458              : {
     459         2104 :   visit_outer_attrs (expr);
     460         2104 :   reseat (expr.get_block_expr_ptr ());
     461         2104 : }
     462              : 
     463              : void
     464           20 : PointerVisitor::visit (AST::BoxExpr &expr)
     465              : {
     466           20 :   visit_outer_attrs (expr);
     467           20 :   reseat (expr.get_boxed_expr_ptr ());
     468           20 : }
     469              : 
     470              : void
     471        91973 : PointerVisitor::visit (AST::UnsafeBlockExpr &expr)
     472              : {
     473        91973 :   visit_outer_attrs (expr);
     474        91973 :   reseat (expr.get_block_expr_ptr ());
     475        91973 : }
     476              : 
     477              : void
     478         3434 : PointerVisitor::visit (AST::LoopExpr &expr)
     479              : {
     480         3434 :   visit_outer_attrs (expr);
     481         3434 :   if (expr.has_loop_label ())
     482          377 :     visit (expr.get_loop_label ());
     483         3434 :   reseat (expr.get_loop_block_ptr ());
     484         3434 : }
     485              : 
     486              : void
     487         7573 : PointerVisitor::visit (AST::WhileLoopExpr &expr)
     488              : {
     489         7573 :   visit_outer_attrs (expr);
     490         7573 :   if (expr.has_loop_label ())
     491           35 :     visit (expr.get_loop_label ());
     492         7573 :   reseat (expr.get_predicate_expr_ptr ());
     493         7573 :   reseat (expr.get_loop_block_ptr ());
     494         7573 : }
     495              : 
     496              : void
     497         1594 : PointerVisitor::visit (AST::WhileLetLoopExpr &expr)
     498              : {
     499         1594 :   visit_outer_attrs (expr);
     500         1594 :   reseat (expr.get_pattern ());
     501              : 
     502         1594 :   if (expr.has_loop_label ())
     503            4 :     visit (expr.get_loop_label ());
     504              : 
     505         1594 :   reseat (expr.get_scrutinee_expr_ptr ());
     506         1594 :   reseat (expr.get_loop_block_ptr ());
     507         1594 : }
     508              : 
     509              : void
     510         7208 : PointerVisitor::visit (AST::ForLoopExpr &expr)
     511              : {
     512         7208 :   visit_outer_attrs (expr);
     513         7208 :   reseat (expr.get_pattern_ptr ());
     514         7208 :   reseat (expr.get_iterator_expr_ptr ());
     515         7208 :   if (expr.has_loop_label ())
     516            0 :     visit (expr.get_loop_label ());
     517         7208 :   reseat (expr.get_loop_block_ptr ());
     518         7208 : }
     519              : 
     520              : void
     521        68259 : PointerVisitor::visit (AST::IfExpr &expr)
     522              : {
     523        68259 :   visit_outer_attrs (expr);
     524        68259 :   reseat (expr.get_condition_expr_ptr ());
     525        68259 :   visit (expr.get_if_block ());
     526        68259 : }
     527              : 
     528              : void
     529         3364 : PointerVisitor::visit (AST::IfLetExpr &expr)
     530              : {
     531         3364 :   visit_outer_attrs (expr);
     532         3364 :   reseat (expr.get_pattern ());
     533         3364 :   reseat (expr.get_value_expr_ptr ());
     534         3364 :   visit (expr.get_if_block ());
     535         3364 : }
     536              : 
     537              : void
     538      3261585 : PointerVisitor::visit (AST::MatchArm &arm)
     539              : {
     540      3261585 :   visit_outer_attrs (arm);
     541      3261585 :   reseat (arm.get_pattern ());
     542      3261585 :   if (arm.has_match_arm_guard ())
     543         2298 :     reseat (arm.get_guard_expr_ptr ());
     544      3261585 : }
     545              : 
     546              : void
     547      3261585 : PointerVisitor::visit (AST::MatchCase &arm)
     548              : {
     549      3261585 :   visit (arm.get_arm ());
     550      3261585 :   reseat (arm.get_expr_ptr ());
     551      3261585 : }
     552              : 
     553              : void
     554       312099 : PointerVisitor::visit (AST::MatchExpr &expr)
     555              : {
     556       312099 :   visit_outer_attrs (expr);
     557       312099 :   visit_inner_attrs (expr);
     558       312099 :   reseat (expr.get_scrutinee_expr_ptr ());
     559      3573684 :   for (auto &arm : expr.get_match_cases ())
     560      3261585 :     visit (arm);
     561       312099 : }
     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          834 : PointerVisitor::visit (AST::LlvmInlineAsm &expr)
     629              : {
     630         2007 :   for (auto &output : expr.get_outputs ())
     631         1173 :     reseat (output.expr);
     632              : 
     633         1737 :   for (auto &input : expr.get_inputs ())
     634          903 :     reseat (input.expr);
     635          834 : }
     636              : 
     637              : void
     638       293197 : PointerVisitor::visit (AST::TypeParam &param)
     639              : {
     640       293197 :   visit_outer_attrs (param);
     641              :   // FIXME: Can we do macro expansion here?
     642       372850 :   for (auto &bound : param.get_type_param_bounds ())
     643        79653 :     visit (bound);
     644       293197 :   if (param.has_type ())
     645         2435 :     reseat (param.get_type_ptr ());
     646       293197 : }
     647              : 
     648              : void
     649        39265 : PointerVisitor::visit (AST::TypeBoundWhereClauseItem &item)
     650              : {
     651        39328 :   for (auto &lifetime : item.get_for_lifetimes ())
     652           63 :     visit (lifetime);
     653        39265 :   reseat (item.get_type_ptr ());
     654              :   // FIXME: Likewise?
     655        80326 :   for (auto &param : item.get_type_param_bounds ())
     656        41061 :     visit (param);
     657        39265 : }
     658              : 
     659              : void
     660       553027 : PointerVisitor::visit (AST::FunctionParam &param)
     661              : {
     662       553027 :   visit_outer_attrs (param);
     663       553027 :   if (param.has_name ())
     664       553027 :     reseat (param.get_pattern_ptr ());
     665              : 
     666       553027 :   reseat (param.get_type_ptr ());
     667       553027 : }
     668              : 
     669              : void
     670       309016 : PointerVisitor::visit (AST::SelfParam &param)
     671              : {
     672       309016 :   visit_outer_attrs (param);
     673              : 
     674       309016 :   if (param.has_lifetime ())
     675       143706 :     visit (param.get_lifetime ());
     676              : 
     677       309016 :   if (param.has_type ())
     678          471 :     reseat (param.get_type_ptr ());
     679       309016 : }
     680              : 
     681              : void
     682        12929 : PointerVisitor::visit (AST::Module &module)
     683              : {
     684        12929 :   visit_outer_attrs (module);
     685        12929 :   visit (module.get_visibility ());
     686        12929 :   visit_inner_attrs (module);
     687       416620 :   for (auto &item : module.get_items ())
     688       403691 :     reseat (item);
     689        12929 : }
     690              : 
     691              : void
     692       490167 : PointerVisitor::visit_function_params (AST::Function &function)
     693              : {
     694      1354953 :   for (auto &param : function.get_function_params ())
     695       864786 :     visit (param);
     696       490167 : }
     697              : 
     698              : void
     699       490167 : PointerVisitor::visit (AST::Function &function)
     700              : {
     701       490167 :   visit_outer_attrs (function);
     702       490167 :   visit (function.get_visibility ());
     703       490167 :   visit (function.get_qualifiers ());
     704       549524 :   for (auto &generic : function.get_generic_params ())
     705        59357 :     visit (generic);
     706              : 
     707       490167 :   visit_function_params (function);
     708              : 
     709       490167 :   if (function.has_return_type ())
     710       417496 :     reseat (function.get_return_type_ptr ());
     711       490167 :   if (function.has_where_clause ())
     712        15739 :     visit (function.get_where_clause ());
     713       490167 :   if (function.has_body ())
     714       440039 :     reseat (*function.get_definition ());
     715       490167 : }
     716              : 
     717              : void
     718       182958 : PointerVisitor::visit (AST::TypeAlias &type_alias)
     719              : {
     720       182958 :   visit_outer_attrs (type_alias);
     721       182958 :   visit (type_alias.get_visibility ());
     722       183098 :   for (auto &generic : type_alias.get_generic_params ())
     723          140 :     visit (generic);
     724       182958 :   if (type_alias.has_where_clause ())
     725            0 :     visit (type_alias.get_where_clause ());
     726       182958 :   reseat (type_alias.get_type_aliased_ptr ());
     727       182958 : }
     728              : 
     729              : void
     730        21404 : PointerVisitor::visit (AST::StructField &field)
     731              : {
     732        21404 :   visit_outer_attrs (field);
     733        21404 :   visit (field.get_visibility ());
     734        21404 :   reseat (field.get_field_type_ptr ());
     735        21404 : }
     736              : 
     737              : void
     738        24174 : PointerVisitor::visit (AST::TupleField &field)
     739              : {
     740        24174 :   visit_outer_attrs (field);
     741        24174 :   visit (field.get_visibility ());
     742        24174 :   reseat (field.get_field_type_ptr ());
     743        24174 : }
     744              : 
     745              : void
     746         1079 : PointerVisitor::visit (AST::EnumItemDiscriminant &item)
     747              : {
     748         1079 :   PointerVisitor::visit (static_cast<EnumItem &> (item));
     749         1079 :   reseat (item.get_expr_ptr ());
     750         1079 : }
     751              : 
     752              : void
     753        52533 : PointerVisitor::visit (AST::ConstantItem &const_item)
     754              : {
     755        52533 :   visit_outer_attrs (const_item);
     756        52533 :   visit (const_item.get_visibility ());
     757        52533 :   reseat (const_item.get_type_ptr ());
     758        52533 :   if (const_item.has_expr ())
     759        51010 :     reseat (const_item.get_expr_ptr ());
     760        52533 : }
     761              : 
     762              : void
     763         2809 : PointerVisitor::visit (AST::StaticItem &static_item)
     764              : {
     765         2809 :   visit_outer_attrs (static_item);
     766         2809 :   visit (static_item.get_visibility ());
     767         2809 :   reseat (static_item.get_type_ptr ());
     768         2809 :   reseat (static_item.get_expr_ptr ());
     769         2809 : }
     770              : 
     771              : void
     772        17978 : PointerVisitor::visit (AST::Trait &trait)
     773              : {
     774        17978 :   visit_outer_attrs (trait);
     775        17978 :   visit (trait.get_visibility ());
     776              : 
     777        17978 :   visit_inner_attrs (trait);
     778              : 
     779        17978 :   visit (trait.get_implicit_self ());
     780              : 
     781        22401 :   for (auto &generic : trait.get_generic_params ())
     782         4423 :     visit (generic);
     783              : 
     784        17978 :   if (trait.has_where_clause ())
     785           28 :     visit (trait.get_where_clause ());
     786              : 
     787        22834 :   for (auto &bound : trait.get_type_param_bounds ())
     788         4856 :     visit (bound);
     789              : 
     790        43354 :   for (auto &item : trait.get_trait_items ())
     791        25376 :     reseat (item);
     792        17978 : }
     793              : 
     794              : void
     795        13642 : PointerVisitor::visit (AST::InherentImpl &impl)
     796              : {
     797        13642 :   visit_outer_attrs (impl);
     798        13642 :   visit (impl.get_visibility ());
     799              : 
     800        24225 :   for (auto &generic : impl.get_generic_params ())
     801        10583 :     visit (generic);
     802        13642 :   if (impl.has_where_clause ())
     803          111 :     visit (impl.get_where_clause ());
     804        13642 :   reseat (impl.get_type_ptr ());
     805        13642 :   visit_inner_attrs (impl);
     806       100654 :   for (auto &item : impl.get_impl_items ())
     807        87012 :     reseat (item);
     808        13642 : }
     809              : 
     810              : void
     811       245173 : PointerVisitor::visit (AST::TraitImpl &impl)
     812              : {
     813       245173 :   visit_outer_attrs (impl);
     814       245173 :   visit (impl.get_visibility ());
     815              : 
     816       475415 :   for (auto &generic : impl.get_generic_params ())
     817       230242 :     visit (generic);
     818       245173 :   if (impl.has_where_clause ())
     819        12866 :     visit (impl.get_where_clause ());
     820       245173 :   reseat (impl.get_type_ptr ());
     821       245173 :   visit (impl.get_trait_path ());
     822       245173 :   visit_inner_attrs (impl);
     823       592350 :   for (auto &item : impl.get_impl_items ())
     824       347177 :     reseat (item);
     825       245173 : }
     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         6973 : PointerVisitor::visit (AST::ExternBlock &block)
     837              : {
     838         6973 :   visit_outer_attrs (block);
     839         6973 :   visit (block.get_visibility ());
     840         6973 :   visit_inner_attrs (block);
     841        45025 :   for (auto &item : block.get_extern_items ())
     842        38052 :     reseat (item);
     843         6973 : }
     844              : 
     845              : void
     846      1515027 : PointerVisitor::visit (AST::IdentifierPattern &pattern)
     847              : {
     848      1515027 :   if (pattern.has_subpattern ())
     849         1033 :     reseat (pattern.get_subpattern_ptr ());
     850      1515027 : }
     851              : 
     852              : void
     853         5408 : 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         5408 :   if (pattern.get_has_lower_bound ())
     858         5408 :     visit (pattern.get_lower_bound ());
     859         5408 :   if (pattern.get_has_upper_bound ())
     860         5408 :     visit (pattern.get_upper_bound ());
     861         5408 : }
     862              : 
     863              : void
     864        14857 : PointerVisitor::visit (AST::ReferencePattern &pattern)
     865              : {
     866        14857 :   reseat (pattern.get_referenced_pattern_ptr ());
     867        14857 : }
     868              : 
     869              : void
     870          120 : PointerVisitor::visit (AST::StructPatternFieldTuplePat &field)
     871              : {
     872          120 :   visit_outer_attrs (field);
     873          120 :   reseat (field.get_index_pattern_ptr ());
     874          120 : }
     875              : 
     876              : void
     877         3707 : PointerVisitor::visit (AST::StructPatternFieldIdentPat &field)
     878              : {
     879         3707 :   visit_outer_attrs (field);
     880         3707 :   reseat (field.get_ident_pattern_ptr ());
     881         3707 : }
     882              : 
     883              : void
     884        58385 : PointerVisitor::visit (AST::TupleStructItemsNoRest &tuple_items)
     885              : {
     886       119329 :   for (auto &pattern : tuple_items.get_patterns ())
     887        60944 :     reseat (pattern);
     888        58385 : }
     889              : 
     890              : void
     891          722 : PointerVisitor::visit (AST::TupleStructItemsHasRest &tuple_items)
     892              : {
     893          907 :   for (auto &lower : tuple_items.get_lower_patterns ())
     894          185 :     reseat (lower);
     895          837 :   for (auto &upper : tuple_items.get_upper_patterns ())
     896          115 :     reseat (upper);
     897          722 : }
     898              : 
     899              : void
     900       175060 : PointerVisitor::visit (AST::TuplePatternItemsNoRest &tuple_items)
     901              : {
     902       581479 :   for (auto &pattern : tuple_items.get_patterns ())
     903       406419 :     reseat (pattern);
     904       175060 : }
     905              : 
     906              : void
     907          190 : PointerVisitor::visit (AST::TuplePatternItemsHasRest &tuple_items)
     908              : {
     909          355 :   for (auto &lower : tuple_items.get_lower_patterns ())
     910          165 :     reseat (lower);
     911          370 :   for (auto &upper : tuple_items.get_upper_patterns ())
     912          180 :     reseat (upper);
     913          190 : }
     914              : 
     915              : void
     916          240 : PointerVisitor::visit (AST::GroupedPattern &pattern)
     917              : {
     918          240 :   reseat (pattern.get_pattern_in_parens_ptr ());
     919          240 : }
     920              : 
     921              : void
     922         1275 : PointerVisitor::visit (AST::SlicePattern &pattern)
     923              : {
     924         3985 :   for (auto &pat : pattern.get_patterns ())
     925         2710 :     reseat (pat);
     926         1275 : }
     927              : 
     928              : void
     929         3569 : PointerVisitor::visit (AST::AltPattern &pattern)
     930              : {
     931        12408 :   for (auto &alt : pattern.get_alts ())
     932         8839 :     reseat (alt);
     933         3569 : }
     934              : 
     935              : void
     936       321275 : PointerVisitor::visit (AST::LetStmt &stmt)
     937              : {
     938       321275 :   visit_outer_attrs (stmt);
     939       321275 :   reseat (stmt.get_pattern_ptr ());
     940       321275 :   if (stmt.has_type ())
     941        39481 :     reseat (stmt.get_type_ptr ());
     942       321275 :   if (stmt.has_init_expr ())
     943       307881 :     reseat (stmt.get_init_expr_ptr ());
     944       321275 : }
     945              : 
     946              : void
     947       322079 : PointerVisitor::visit (AST::ExprStmt &stmt)
     948              : {
     949       322079 :   reseat (stmt.get_expr_ptr ());
     950       322079 : }
     951              : 
     952              : void
     953          677 : PointerVisitor::visit (AST::ParenthesisedType &type)
     954              : {
     955          677 :   reseat (type.get_type_in_parens ());
     956          677 : }
     957              : 
     958              : void
     959         9172 : PointerVisitor::visit (AST::ImplTraitTypeOneBound &type)
     960              : {
     961              :   // FIXME: Do we need to reseat here?
     962         9172 :   visit (type.get_trait_bound ());
     963         9172 : }
     964              : 
     965              : void
     966         2663 : PointerVisitor::visit (AST::TraitObjectTypeOneBound &type)
     967              : {
     968              :   // FIXME: Do we need to reseat here?
     969         2663 :   visit (type.get_trait_bound ());
     970         2663 : }
     971              : 
     972              : void
     973        66411 : PointerVisitor::visit (AST::TupleType &type)
     974              : {
     975       218994 :   for (auto &elem : type.get_elems ())
     976       152583 :     reseat (elem);
     977        66411 : }
     978              : 
     979              : void
     980       117656 : PointerVisitor::visit (AST::RawPointerType &type)
     981              : {
     982       117656 :   reseat (type.get_type_pointed_to_ptr ());
     983       117656 : }
     984              : 
     985              : void
     986       538996 : PointerVisitor::visit (AST::ReferenceType &type)
     987              : {
     988       538996 :   visit (type.get_lifetime ());
     989       538996 :   reseat (type.get_type_ptr ());
     990       538996 : }
     991              : 
     992              : void
     993        23768 : PointerVisitor::visit (AST::ArrayType &type)
     994              : {
     995        23768 :   reseat (type.get_elem_type_ptr ());
     996        23768 :   visit (type.get_size_expr ());
     997        23768 : }
     998              : 
     999              : void
    1000        45113 : PointerVisitor::visit (AST::SliceType &type)
    1001              : {
    1002        45113 :   reseat (type.get_elem_type_ptr ());
    1003        45113 : }
    1004              : 
    1005              : void
    1006       112190 : PointerVisitor::visit (AST::MaybeNamedParam &param)
    1007              : {
    1008       112190 :   visit_outer_attrs (param);
    1009       112190 :   reseat (param.get_type_ptr ());
    1010       112190 : }
    1011              : 
    1012              : void
    1013        18829 : PointerVisitor::visit (AST::BareFunctionType &type)
    1014              : {
    1015        37670 :   for (auto &lifetime : type.get_for_lifetimes ())
    1016           12 :     visit (lifetime);
    1017        18829 :   visit (type.get_function_qualifiers ());
    1018       131019 :   for (auto &param : type.get_function_params ())
    1019       112190 :     visit (param);
    1020        18829 :   if (type.is_variadic ())
    1021         5712 :     for (auto attr : type.get_variadic_attr ())
    1022            0 :       visit (attr);
    1023        18829 :   if (type.has_return_type ())
    1024        18485 :     reseat (type.get_return_type_ptr ());
    1025        18829 : }
    1026              : 
    1027              : void
    1028            0 : PointerVisitor::visit (AST::FormatArgs &)
    1029              : {
    1030              :   // FIXME: Do we have anything to do? any subnodes to visit? Probably, right?
    1031            0 : }
    1032              : 
    1033              : void
    1034           45 : PointerVisitor::visit (AST::OffsetOf &offset_of)
    1035              : {
    1036           45 :   reseat (offset_of.get_type_ptr ());
    1037           45 : }
    1038              : 
    1039              : void
    1040         2743 : PointerVisitor::visit (AST::VariadicParam &param)
    1041              : {
    1042         2743 :   if (param.has_pattern ())
    1043           33 :     reseat (param.get_pattern_ptr ());
    1044         2743 : }
    1045              : 
    1046              : } // namespace AST
    1047              : } // 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.