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 % 623 587
Test Date: 2026-10-24 16:24:59 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        16571 : PointerVisitor::visit (AST::Crate &crate)
      28              : {
      29        16571 :   visit_inner_attrs (crate);
      30        92680 :   for (auto &item : crate.items)
      31        76109 :     reseat (item);
      32        16571 : }
      33              : 
      34              : void
      35         6961 : 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        14749 :   for (auto &item : input.get_items ())
      41         7788 :     visit (item);
      42         6961 : }
      43              : 
      44              : void
      45      4199916 : PointerVisitor::visit (AST::IdentifierExpr &ident_expr)
      46              : {
      47      4199916 :   visit_outer_attrs (ident_expr);
      48      4199916 : }
      49              : 
      50              : void
      51        43690 : PointerVisitor::visit (AST::LifetimeParam &lifetime_param)
      52              : {
      53        43690 :   visit_outer_attrs (lifetime_param);
      54              : 
      55              :   // Nothing to do for lifetimes right?
      56        43690 : }
      57              : 
      58              : void
      59         3105 : PointerVisitor::visit (AST::ConstGenericParam &const_param)
      60              : {
      61         3105 :   visit_outer_attrs (const_param);
      62         3105 :   if (const_param.has_type ())
      63         3105 :     reseat (const_param.get_type_ptr ());
      64              : 
      65         3105 :   if (const_param.has_default_value ())
      66           60 :     visit (const_param.get_default_value_unchecked ());
      67         3105 : }
      68              : 
      69              : void
      70      2636081 : PointerVisitor::visit (AST::PathInExpression &path)
      71              : {
      72      2636081 :   visit_outer_attrs (path);
      73              : 
      74      2636081 :   if (!path.is_lang_item ())
      75      5666205 :     for (auto &segment : path.get_segments ())
      76      3038747 :       visit (segment);
      77      2636081 : }
      78              : 
      79              : void
      80        12604 : PointerVisitor::visit (GenericArgsBinding &binding)
      81              : {
      82        12604 :   reseat (binding.get_type_ptr ());
      83        12604 : }
      84              : 
      85              : void
      86       511512 : PointerVisitor::visit (AST::TypePathSegmentGeneric &segment)
      87              : {
      88       511512 :   if (segment.has_generic_args ())
      89       511509 :     visit (segment.get_generic_args ());
      90       511512 : }
      91              : 
      92              : void
      93        18613 : PointerVisitor::visit (AST::TypePathFunction &tpf)
      94              : {
      95        44394 :   for (auto &input : tpf.get_params ())
      96        25781 :     reseat (input);
      97        18613 :   if (tpf.has_return_type ())
      98        17982 :     reseat (tpf.get_return_type_ptr ());
      99        18613 : }
     100              : 
     101              : void
     102        18613 : PointerVisitor::visit (AST::TypePathSegmentFunction &segment)
     103              : {
     104              :   // FIXME: No reseating here correct? No macros possible or desugar?
     105        18613 :   visit (segment.get_type_path_function ());
     106        18613 :   visit (segment.get_ident_segment ());
     107        18613 : }
     108              : 
     109              : void
     110       532039 : 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      1055909 :   for (auto &generic : args.get_generic_args ())
     119       523870 :     visit (generic);
     120              : 
     121       544643 :   for (auto &binding : args.get_binding_args ())
     122        12604 :     visit (binding);
     123       532039 : }
     124              : 
     125              : void
     126      4867464 : PointerVisitor::visit (AST::PathExprSegment &segment)
     127              : {
     128      4867464 :   visit (segment.get_ident_segment ());
     129      4867464 :   if (segment.has_generic_args ())
     130        20530 :     visit (segment.get_generic_args ());
     131      4867464 : }
     132              : void
     133      4876028 : PointerVisitor::visit (AST::TypePath &path)
     134              : {
     135     10098604 :   for (auto &segment : path.get_segments ())
     136      5222576 :     visit (segment);
     137      4876028 : }
     138              : 
     139              : void
     140         3957 : PointerVisitor::visit (AST::QualifiedPathInExpression &path)
     141              : {
     142         3957 :   visit_outer_attrs (path);
     143         3957 :   visit (path.get_qualified_path_type ());
     144              : 
     145         7919 :   for (auto &segment : path.get_segments ())
     146         3962 :     visit (segment);
     147         3957 : }
     148              : 
     149              : void
     150       110660 : PointerVisitor::visit (AST::QualifiedPathType &path)
     151              : {
     152       110660 :   reseat (path.get_type_ptr ());
     153       110660 :   if (path.has_as_clause ())
     154       107876 :     visit (path.get_as_type_path ());
     155       110660 : }
     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       214813 : PointerVisitor::visit (AST::BorrowExpr &expr)
     166              : {
     167       214813 :   visit_outer_attrs (expr);
     168       214813 :   reseat (expr.get_borrowed_expr_ptr ());
     169       214813 : }
     170              : 
     171              : void
     172       381480 : PointerVisitor::visit (AST::DereferenceExpr &expr)
     173              : {
     174       381480 :   visit_outer_attrs (expr);
     175       381480 :   reseat (expr.get_dereferenced_expr_ptr ());
     176       381480 : }
     177              : 
     178              : void
     179        13858 : PointerVisitor::visit (AST::ErrorPropagationExpr &expr)
     180              : {
     181        13858 :   visit_outer_attrs (expr);
     182        13858 :   reseat (expr.get_propagating_expr_ptr ());
     183        13858 : }
     184              : 
     185              : void
     186        63543 : PointerVisitor::visit (AST::NegationExpr &expr)
     187              : {
     188        63543 :   visit_outer_attrs (expr);
     189        63543 :   reseat (expr.get_negated_expr_ptr ());
     190        63543 : }
     191              : 
     192              : void
     193      2415803 : PointerVisitor::visit (AST::ArithmeticOrLogicalExpr &expr)
     194              : {
     195      2415803 :   visit_outer_attrs (expr);
     196      2415803 :   reseat (expr.get_left_expr_ptr ());
     197      2415803 :   reseat (expr.get_right_expr_ptr ());
     198      2415803 : }
     199              : 
     200              : void
     201       197797 : PointerVisitor::visit (AST::ComparisonExpr &expr)
     202              : {
     203       197797 :   visit_outer_attrs (expr);
     204       197797 :   reseat (expr.get_left_expr_ptr ());
     205       197797 :   reseat (expr.get_right_expr_ptr ());
     206       197797 : }
     207              : 
     208              : void
     209        52342 : PointerVisitor::visit (AST::LazyBooleanExpr &expr)
     210              : {
     211        52342 :   visit_outer_attrs (expr);
     212        52342 :   reseat (expr.get_left_expr_ptr ());
     213        52342 :   reseat (expr.get_right_expr_ptr ());
     214        52342 : }
     215              : 
     216              : void
     217       269624 : PointerVisitor::visit (AST::TypeCastExpr &expr)
     218              : {
     219       269624 :   visit_outer_attrs (expr);
     220       269624 :   reseat (expr.get_casted_expr_ptr ());
     221       269624 :   reseat (expr.get_type_to_cast_to_ptr ());
     222       269624 : }
     223              : 
     224              : void
     225        85397 : PointerVisitor::visit (AST::AssignmentExpr &expr)
     226              : {
     227        85397 :   visit_outer_attrs (expr);
     228        85397 :   reseat (expr.get_left_expr_ptr ());
     229        85397 :   reseat (expr.get_right_expr_ptr ());
     230        85397 : }
     231              : 
     232              : void
     233        60532 : PointerVisitor::visit (AST::CompoundAssignmentExpr &expr)
     234              : {
     235        60532 :   visit_outer_attrs (expr);
     236        60532 :   reseat (expr.get_left_expr_ptr ());
     237        60532 :   reseat (expr.get_right_expr_ptr ());
     238        60532 : }
     239              : 
     240              : void
     241       432320 : PointerVisitor::visit (AST::GroupedExpr &expr)
     242              : {
     243       432320 :   visit_outer_attrs (expr);
     244       432320 :   visit_inner_attrs (expr);
     245       432320 :   reseat (expr.get_expr_in_parens_ptr ());
     246       432320 : }
     247              : 
     248              : void
     249       823342 : PointerVisitor::visit (AST::ArrayElemsValues &elems)
     250              : {
     251      8649938 :   for (auto &value : elems.get_values ())
     252      7826596 :     reseat (value);
     253       823342 : }
     254              : 
     255              : void
     256         3382 : PointerVisitor::visit (AST::ArrayElemsCopied &elems)
     257              : {
     258         3382 :   reseat (elems.get_elem_to_copy_ptr ());
     259         3382 :   reseat (elems.get_num_copies_ptr ());
     260         3382 : }
     261              : 
     262              : void
     263       826724 : PointerVisitor::visit (AST::ArrayExpr &expr)
     264              : {
     265       826724 :   visit_outer_attrs (expr);
     266       826724 :   visit_inner_attrs (expr);
     267       826724 :   visit (expr.get_array_elems ());
     268       826724 : }
     269              : 
     270              : void
     271        34183 : PointerVisitor::visit (AST::ArrayIndexExpr &expr)
     272              : {
     273        34183 :   visit_outer_attrs (expr);
     274        34183 :   reseat (expr.get_array_expr_ptr ());
     275        34183 :   reseat (expr.get_index_expr_ptr ());
     276        34183 : }
     277              : 
     278              : void
     279       285081 : PointerVisitor::visit (AST::TupleExpr &expr)
     280              : {
     281       285081 :   visit_outer_attrs (expr);
     282       285081 :   visit_inner_attrs (expr);
     283       815193 :   for (auto &elem : expr.get_tuple_elems ())
     284       530112 :     reseat (elem);
     285       285081 : }
     286              : 
     287              : void
     288       244079 : PointerVisitor::visit (AST::TupleIndexExpr &expr)
     289              : {
     290       244079 :   visit_outer_attrs (expr);
     291       244079 :   reseat (expr.get_tuple_expr_ptr ());
     292       244079 : }
     293              : 
     294              : void
     295        57964 : PointerVisitor::visit (AST::StructExprFieldIdentifierValue &field)
     296              : {
     297        57964 :   reseat (field.get_value_ptr ());
     298        57964 : }
     299              : 
     300              : void
     301          220 : PointerVisitor::visit (AST::StructExprFieldIndexValue &field)
     302              : {
     303          220 :   reseat (field.get_value_ptr ());
     304          220 : }
     305              : 
     306              : void
     307          542 : PointerVisitor::visit (AST::StructBase &base)
     308              : {
     309          542 :   reseat (base.get_base_struct_ptr ());
     310          542 : }
     311              : 
     312              : void
     313      4143058 : PointerVisitor::visit (AST::CallExpr &expr)
     314              : {
     315      4143058 :   visit_outer_attrs (expr);
     316      4143058 :   reseat (expr.get_function_expr_ptr ());
     317     14974494 :   for (auto &param : expr.get_params ())
     318     10831436 :     reseat (param);
     319      4143058 : }
     320              : 
     321              : void
     322      1824755 : PointerVisitor::visit (AST::MethodCallExpr &expr)
     323              : {
     324      1824755 :   visit_outer_attrs (expr);
     325      1824755 :   reseat (expr.get_receiver_expr_ptr ());
     326      1824755 :   visit (expr.get_method_name ());
     327      2119334 :   for (auto &param : expr.get_params ())
     328       294579 :     reseat (param);
     329      1824755 : }
     330              : 
     331              : void
     332       251769 : PointerVisitor::visit (AST::FieldAccessExpr &expr)
     333              : {
     334       251769 :   visit_outer_attrs (expr);
     335       251769 :   reseat (expr.get_receiver_expr_ptr ());
     336       251769 : }
     337              : 
     338              : void
     339        11466 : PointerVisitor::visit (AST::ClosureExprInner &expr)
     340              : {
     341        11466 :   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        25025 :   for (auto &param : expr.get_params ())
     346        13559 :     visit (param);
     347              : 
     348        11466 :   reseat (expr.get_definition_expr_ptr ());
     349        11466 : }
     350              : 
     351              : void
     352       675733 : PointerVisitor::visit (AST::BlockExpr &expr)
     353              : {
     354       675733 :   visit_outer_attrs (expr);
     355       675733 :   visit_inner_attrs (expr);
     356              : 
     357       675733 :   if (expr.has_label ())
     358            9 :     visit (expr.get_label ());
     359              : 
     360      1070493 :   for (auto &stmt : expr.get_statements ())
     361       394760 :     reseat (stmt);
     362              : 
     363       675733 :   if (expr.has_tail_expr ())
     364       582705 :     reseat (expr.get_tail_expr_ptr ());
     365       675733 : }
     366              : 
     367              : void
     368        24920 : PointerVisitor::visit (AST::AnonConst &expr)
     369              : {
     370        24920 :   if (!expr.is_deferred ())
     371        24869 :     reseat (expr.get_inner_expr_ptr ());
     372        24920 : }
     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        13706 : PointerVisitor::visit (AST::ClosureParam &param)
     390              : {
     391        13706 :   visit_outer_attrs (param);
     392        13706 :   reseat (param.get_pattern_ptr ());
     393        13706 :   if (param.has_type_given ())
     394          814 :     reseat (param.get_type_ptr ());
     395        13706 : }
     396              : 
     397              : void
     398         1153 : PointerVisitor::visit (AST::ContinueExpr &expr)
     399              : {
     400         1153 :   visit_outer_attrs (expr);
     401         1153 :   if (expr.has_label ())
     402          461 :     visit (expr.get_label_unchecked ());
     403         1153 : }
     404              : 
     405              : void
     406         2818 : PointerVisitor::visit (AST::BreakExpr &expr)
     407              : {
     408         2818 :   visit_outer_attrs (expr);
     409         2818 :   if (expr.has_label ())
     410          190 :     visit (expr.get_label_unchecked ());
     411              : 
     412         2818 :   if (expr.has_break_expr ())
     413          140 :     reseat (expr.get_break_expr_ptr_unchecked ());
     414         2818 : }
     415              : 
     416              : void
     417         9351 : PointerVisitor::visit (AST::RangeFromToExpr &expr)
     418              : {
     419         9351 :   reseat (expr.get_from_expr_ptr ());
     420         9351 :   reseat (expr.get_to_expr_ptr ());
     421         9351 : }
     422              : 
     423              : void
     424         4042 : PointerVisitor::visit (AST::RangeFromExpr &expr)
     425              : {
     426         4042 :   reseat (expr.get_from_expr_ptr ());
     427         4042 : }
     428              : 
     429              : void
     430         7926 : PointerVisitor::visit (AST::RangeToExpr &expr)
     431              : {
     432         7926 :   reseat (expr.get_to_expr_ptr ());
     433         7926 : }
     434              : 
     435              : void
     436          506 : PointerVisitor::visit (AST::RangeFromToInclExpr &expr)
     437              : {
     438          506 :   reseat (expr.get_from_expr_ptr ());
     439          506 :   reseat (expr.get_to_expr_ptr ());
     440          506 : }
     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        29207 : PointerVisitor::visit (AST::ReturnExpr &expr)
     450              : {
     451        29207 :   visit_outer_attrs (expr);
     452        29207 :   if (expr.has_returned_expr ())
     453        27914 :     reseat (expr.get_returned_expr_ptr ());
     454        29207 : }
     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          143 : PointerVisitor::visit (AST::BoxExpr &expr)
     465              : {
     466          143 :   visit_outer_attrs (expr);
     467          143 :   reseat (expr.get_boxed_expr_ptr ());
     468          143 : }
     469              : 
     470              : void
     471        99079 : PointerVisitor::visit (AST::UnsafeBlockExpr &expr)
     472              : {
     473        99079 :   visit_outer_attrs (expr);
     474        99079 :   reseat (expr.get_block_expr_ptr ());
     475        99079 : }
     476              : 
     477              : void
     478         4809 : PointerVisitor::visit (AST::LoopExpr &expr)
     479              : {
     480         4809 :   visit_outer_attrs (expr);
     481         4809 :   if (expr.has_loop_label ())
     482          382 :     visit (expr.get_loop_label ());
     483         4809 :   reseat (expr.get_loop_block_ptr ());
     484         4809 : }
     485              : 
     486              : void
     487         7854 : PointerVisitor::visit (AST::WhileLoopExpr &expr)
     488              : {
     489         7854 :   visit_outer_attrs (expr);
     490         7854 :   if (expr.has_loop_label ())
     491           35 :     visit (expr.get_loop_label ());
     492         7854 :   reseat (expr.get_predicate_expr_ptr ());
     493         7854 :   reseat (expr.get_loop_block_ptr ());
     494         7854 : }
     495              : 
     496              : void
     497         1762 : PointerVisitor::visit (AST::WhileLetLoopExpr &expr)
     498              : {
     499         1762 :   visit_outer_attrs (expr);
     500         1762 :   reseat (expr.get_pattern ());
     501              : 
     502         1762 :   if (expr.has_loop_label ())
     503            4 :     visit (expr.get_loop_label ());
     504              : 
     505         1762 :   reseat (expr.get_scrutinee_expr_ptr ());
     506         1762 :   reseat (expr.get_loop_block_ptr ());
     507         1762 : }
     508              : 
     509              : void
     510         7588 : PointerVisitor::visit (AST::ForLoopExpr &expr)
     511              : {
     512         7588 :   visit_outer_attrs (expr);
     513         7588 :   reseat (expr.get_pattern_ptr ());
     514         7588 :   reseat (expr.get_iterator_expr_ptr ());
     515         7588 :   if (expr.has_loop_label ())
     516            0 :     visit (expr.get_loop_label ());
     517         7588 :   reseat (expr.get_loop_block_ptr ());
     518         7588 : }
     519              : 
     520              : void
     521        70200 : PointerVisitor::visit (AST::IfExpr &expr)
     522              : {
     523        70200 :   visit_outer_attrs (expr);
     524        70200 :   reseat (expr.get_condition_expr_ptr ());
     525        70200 :   visit (expr.get_if_block ());
     526        70200 : }
     527              : 
     528              : void
     529         3574 : PointerVisitor::visit (AST::IfLetExpr &expr)
     530              : {
     531         3574 :   visit_outer_attrs (expr);
     532         3574 :   reseat (expr.get_pattern ());
     533         3574 :   reseat (expr.get_value_expr_ptr ());
     534         3574 :   visit (expr.get_if_block ());
     535         3574 : }
     536              : 
     537              : void
     538      3266934 : PointerVisitor::visit (AST::MatchArm &arm)
     539              : {
     540      3266934 :   visit_outer_attrs (arm);
     541      3266934 :   reseat (arm.get_pattern ());
     542      3266934 :   if (arm.has_match_arm_guard ())
     543         2684 :     reseat (arm.get_guard_expr_ptr ());
     544      3266934 : }
     545              : 
     546              : void
     547      3266934 : PointerVisitor::visit (AST::MatchCase &arm)
     548              : {
     549      3266934 :   visit (arm.get_arm ());
     550      3266934 :   reseat (arm.get_expr_ptr ());
     551      3266934 : }
     552              : 
     553              : void
     554       314318 : PointerVisitor::visit (AST::MatchExpr &expr)
     555              : {
     556       314318 :   visit_outer_attrs (expr);
     557       314318 :   visit_inner_attrs (expr);
     558       314318 :   reseat (expr.get_scrutinee_expr_ptr ());
     559      3581252 :   for (auto &arm : expr.get_match_cases ())
     560      3266934 :     visit (arm);
     561       314318 : }
     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          834 :   visit_outer_attrs (expr);
     631              : 
     632         2007 :   for (auto &output : expr.get_outputs ())
     633         1173 :     reseat (output.expr);
     634              : 
     635         1737 :   for (auto &input : expr.get_inputs ())
     636          903 :     reseat (input.expr);
     637          834 : }
     638              : 
     639              : void
     640       305580 : PointerVisitor::visit (AST::TypeParam &param)
     641              : {
     642       305580 :   visit_outer_attrs (param);
     643              :   // FIXME: Can we do macro expansion here?
     644       390666 :   for (auto &bound : param.get_type_param_bounds ())
     645        85086 :     visit (bound);
     646       305580 :   if (param.has_type ())
     647         2520 :     reseat (param.get_type_ptr ());
     648       305580 : }
     649              : 
     650              : void
     651        40572 : PointerVisitor::visit (AST::TypeBoundWhereClauseItem &item)
     652              : {
     653        40635 :   for (auto &lifetime : item.get_for_lifetimes ())
     654           63 :     visit (lifetime);
     655        40572 :   reseat (item.get_type_ptr ());
     656              :   // FIXME: Likewise?
     657        83080 :   for (auto &param : item.get_type_param_bounds ())
     658        42508 :     visit (param);
     659        40572 : }
     660              : 
     661              : void
     662       564542 : PointerVisitor::visit (AST::FunctionParam &param)
     663              : {
     664       564542 :   visit_outer_attrs (param);
     665       564542 :   if (param.has_name ())
     666       564542 :     reseat (param.get_pattern_ptr ());
     667              : 
     668       564542 :   reseat (param.get_type_ptr ());
     669       564542 : }
     670              : 
     671              : void
     672       320023 : PointerVisitor::visit (AST::SelfParam &param)
     673              : {
     674       320023 :   visit_outer_attrs (param);
     675              : 
     676       320023 :   if (param.has_lifetime ())
     677       150476 :     visit (param.get_lifetime ());
     678              : 
     679       320023 :   if (param.has_type ())
     680          537 :     reseat (param.get_type_ptr ());
     681       320023 : }
     682              : 
     683              : void
     684        13844 : PointerVisitor::visit (AST::Module &module)
     685              : {
     686        13844 :   visit_outer_attrs (module);
     687        13844 :   visit (module.get_visibility ());
     688        13844 :   visit_inner_attrs (module);
     689       429755 :   for (auto &item : module.get_items ())
     690       415911 :     reseat (item);
     691        13844 : }
     692              : 
     693              : void
     694       505760 : PointerVisitor::visit_function_params (AST::Function &function)
     695              : {
     696      1393123 :   for (auto &param : function.get_function_params ())
     697       887363 :     visit (param);
     698       505760 : }
     699              : 
     700              : void
     701       505760 : PointerVisitor::visit (AST::Function &function)
     702              : {
     703       505760 :   visit_outer_attrs (function);
     704       505760 :   visit (function.get_visibility ());
     705       505760 :   visit (function.get_qualifiers ());
     706       567502 :   for (auto &generic : function.get_generic_params ())
     707        61742 :     visit (generic);
     708              : 
     709       505760 :   visit_function_params (function);
     710              : 
     711       505760 :   if (function.has_return_type ())
     712       430382 :     reseat (function.get_return_type_ptr ());
     713       505760 :   if (function.has_where_clause ())
     714        16244 :     visit (function.get_where_clause ());
     715       505760 :   if (function.has_body ())
     716       453664 :     reseat (*function.get_definition ());
     717       505760 : }
     718              : 
     719              : void
     720       185675 : PointerVisitor::visit (AST::TypeAlias &type_alias)
     721              : {
     722       185675 :   visit_outer_attrs (type_alias);
     723       185675 :   visit (type_alias.get_visibility ());
     724       185820 :   for (auto &generic : type_alias.get_generic_params ())
     725          145 :     visit (generic);
     726       185675 :   if (type_alias.has_where_clause ())
     727            0 :     visit (type_alias.get_where_clause ());
     728       185675 :   reseat (type_alias.get_type_aliased_ptr ());
     729       185675 : }
     730              : 
     731              : void
     732        44248 : PointerVisitor::visit (AST::StructField &field)
     733              : {
     734        44248 :   visit_outer_attrs (field);
     735        44248 :   visit (field.get_visibility ());
     736        44248 :   reseat (field.get_field_type_ptr ());
     737        44248 : }
     738              : 
     739              : void
     740        47849 : PointerVisitor::visit (AST::TupleField &field)
     741              : {
     742        47849 :   visit_outer_attrs (field);
     743        47849 :   visit (field.get_visibility ());
     744        47849 :   reseat (field.get_field_type_ptr ());
     745        47849 : }
     746              : 
     747              : void
     748         1115 : PointerVisitor::visit (AST::EnumItemDiscriminant &item)
     749              : {
     750         1115 :   PointerVisitor::visit (static_cast<EnumItem &> (item));
     751         1115 :   reseat (item.get_expr_ptr ());
     752         1115 : }
     753              : 
     754              : void
     755        52866 : PointerVisitor::visit (AST::ConstantItem &const_item)
     756              : {
     757        52866 :   visit_outer_attrs (const_item);
     758        52866 :   visit (const_item.get_visibility ());
     759        52866 :   reseat (const_item.get_type_ptr ());
     760        52866 :   if (const_item.has_expr ())
     761        51338 :     reseat (const_item.get_expr_ptr ());
     762        52866 : }
     763              : 
     764              : void
     765         2954 : PointerVisitor::visit (AST::StaticItem &static_item)
     766              : {
     767         2954 :   visit_outer_attrs (static_item);
     768         2954 :   visit (static_item.get_visibility ());
     769         2954 :   reseat (static_item.get_type_ptr ());
     770         2954 :   reseat (static_item.get_expr_ptr ());
     771         2954 : }
     772              : 
     773              : void
     774        19586 : PointerVisitor::visit (AST::Trait &trait)
     775              : {
     776        19586 :   visit_outer_attrs (trait);
     777        19586 :   visit (trait.get_visibility ());
     778              : 
     779        19586 :   visit_inner_attrs (trait);
     780              : 
     781        19586 :   visit (trait.get_implicit_self ());
     782              : 
     783        24605 :   for (auto &generic : trait.get_generic_params ())
     784         5019 :     visit (generic);
     785              : 
     786        19586 :   if (trait.has_where_clause ())
     787           28 :     visit (trait.get_where_clause ());
     788              : 
     789        24814 :   for (auto &bound : trait.get_type_param_bounds ())
     790         5228 :     visit (bound);
     791              : 
     792        47094 :   for (auto &item : trait.get_trait_items ())
     793        27508 :     reseat (item);
     794        19586 : }
     795              : 
     796              : void
     797        14788 : PointerVisitor::visit (AST::InherentImpl &impl)
     798              : {
     799        14788 :   visit_outer_attrs (impl);
     800        14788 :   visit (impl.get_visibility ());
     801              : 
     802        27267 :   for (auto &generic : impl.get_generic_params ())
     803        12479 :     visit (generic);
     804        14788 :   if (impl.has_where_clause ())
     805          111 :     visit (impl.get_where_clause ());
     806        14788 :   reseat (impl.get_type_ptr ());
     807        14788 :   visit_inner_attrs (impl);
     808       106792 :   for (auto &item : impl.get_impl_items ())
     809        92004 :     reseat (item);
     810        14788 : }
     811              : 
     812              : void
     813       252046 : PointerVisitor::visit (AST::TraitImpl &impl)
     814              : {
     815       252046 :   visit_outer_attrs (impl);
     816       252046 :   visit (impl.get_visibility ());
     817              : 
     818       487959 :   for (auto &generic : impl.get_generic_params ())
     819       235913 :     visit (generic);
     820       252046 :   if (impl.has_where_clause ())
     821        13257 :     visit (impl.get_where_clause ());
     822       252046 :   reseat (impl.get_type_ptr ());
     823       252046 :   visit (impl.get_trait_path ());
     824       252046 :   visit_inner_attrs (impl);
     825       607265 :   for (auto &item : impl.get_impl_items ())
     826       355219 :     reseat (item);
     827       252046 : }
     828              : 
     829              : void
     830            5 : PointerVisitor::visit (AST::ExternalStaticItem &item)
     831              : {
     832            5 :   visit_outer_attrs (item);
     833            5 :   visit (item.get_visibility ());
     834            5 :   reseat (item.get_type_ptr ());
     835            5 : }
     836              : 
     837              : void
     838         7194 : PointerVisitor::visit (AST::ExternBlock &block)
     839              : {
     840         7194 :   visit_outer_attrs (block);
     841         7194 :   visit (block.get_visibility ());
     842         7194 :   visit_inner_attrs (block);
     843        45966 :   for (auto &item : block.get_extern_items ())
     844        38772 :     reseat (item);
     845         7194 : }
     846              : 
     847              : void
     848      1554997 : PointerVisitor::visit (AST::IdentifierPattern &pattern)
     849              : {
     850      1554997 :   if (pattern.has_subpattern ())
     851         1083 :     reseat (pattern.get_subpattern_ptr ());
     852      1554997 : }
     853              : 
     854              : void
     855         5417 : PointerVisitor::visit (AST::RangePattern &pattern)
     856              : {
     857              :   // FIXME: So should this be reseat() instead? Can we have macro invocations as
     858              :   // patterns in range patterns?
     859         5417 :   if (pattern.get_has_lower_bound ())
     860         5417 :     visit (pattern.get_lower_bound ());
     861         5417 :   if (pattern.get_has_upper_bound ())
     862         5417 :     visit (pattern.get_upper_bound ());
     863         5417 : }
     864              : 
     865              : void
     866        15674 : PointerVisitor::visit (AST::ReferencePattern &pattern)
     867              : {
     868        15674 :   reseat (pattern.get_referenced_pattern_ptr ());
     869        15674 : }
     870              : 
     871              : void
     872          160 : PointerVisitor::visit (AST::StructPatternFieldTuplePat &field)
     873              : {
     874          160 :   visit_outer_attrs (field);
     875          160 :   reseat (field.get_index_pattern_ptr ());
     876          160 : }
     877              : 
     878              : void
     879         3851 : PointerVisitor::visit (AST::StructPatternFieldIdentPat &field)
     880              : {
     881         3851 :   visit_outer_attrs (field);
     882         3851 :   reseat (field.get_ident_pattern_ptr ());
     883         3851 : }
     884              : 
     885              : void
     886        62168 : PointerVisitor::visit (AST::TupleStructItemsNoRest &tuple_items)
     887              : {
     888       127056 :   for (auto &pattern : tuple_items.get_patterns ())
     889        64888 :     reseat (pattern);
     890        62168 : }
     891              : 
     892              : void
     893          740 : PointerVisitor::visit (AST::TupleStructItemsHasRest &tuple_items)
     894              : {
     895          925 :   for (auto &lower : tuple_items.get_lower_patterns ())
     896          185 :     reseat (lower);
     897          855 :   for (auto &upper : tuple_items.get_upper_patterns ())
     898          115 :     reseat (upper);
     899          740 : }
     900              : 
     901              : void
     902       178115 : PointerVisitor::visit (AST::TuplePatternItemsNoRest &tuple_items)
     903              : {
     904       590918 :   for (auto &pattern : tuple_items.get_patterns ())
     905       412803 :     reseat (pattern);
     906       178115 : }
     907              : 
     908              : void
     909          190 : PointerVisitor::visit (AST::TuplePatternItemsHasRest &tuple_items)
     910              : {
     911          355 :   for (auto &lower : tuple_items.get_lower_patterns ())
     912          165 :     reseat (lower);
     913          370 :   for (auto &upper : tuple_items.get_upper_patterns ())
     914          180 :     reseat (upper);
     915          190 : }
     916              : 
     917              : void
     918          250 : PointerVisitor::visit (AST::GroupedPattern &pattern)
     919              : {
     920          250 :   reseat (pattern.get_pattern_in_parens_ptr ());
     921          250 : }
     922              : 
     923              : void
     924         1349 : PointerVisitor::visit (AST::SlicePattern &pattern)
     925              : {
     926         4251 :   for (auto &pat : pattern.get_patterns ())
     927         2902 :     reseat (pat);
     928         1349 : }
     929              : 
     930              : void
     931         3645 : PointerVisitor::visit (AST::AltPattern &pattern)
     932              : {
     933        12636 :   for (auto &alt : pattern.get_alts ())
     934         8991 :     reseat (alt);
     935         3645 : }
     936              : 
     937              : void
     938       334235 : PointerVisitor::visit (AST::LetStmt &stmt)
     939              : {
     940       334235 :   visit_outer_attrs (stmt);
     941       334235 :   reseat (stmt.get_pattern_ptr ());
     942       334235 :   if (stmt.has_type ())
     943        40585 :     reseat (stmt.get_type_ptr ());
     944       334235 :   if (stmt.has_init_expr ())
     945       320368 :     reseat (stmt.get_init_expr_ptr ());
     946       334235 : }
     947              : 
     948              : void
     949       337697 : PointerVisitor::visit (AST::ExprStmt &stmt)
     950              : {
     951       337697 :   reseat (stmt.get_expr_ptr ());
     952       337697 : }
     953              : 
     954              : void
     955          695 : PointerVisitor::visit (AST::ParenthesisedType &type)
     956              : {
     957          695 :   reseat (type.get_type_in_parens ());
     958          695 : }
     959              : 
     960              : void
     961         9299 : PointerVisitor::visit (AST::ImplTraitTypeOneBound &type)
     962              : {
     963              :   // FIXME: Do we need to reseat here?
     964         9299 :   visit (type.get_trait_bound ());
     965         9299 : }
     966              : 
     967              : void
     968         2758 : PointerVisitor::visit (AST::TraitObjectTypeOneBound &type)
     969              : {
     970              :   // FIXME: Do we need to reseat here?
     971         2758 :   visit (type.get_trait_bound ());
     972         2758 : }
     973              : 
     974              : void
     975        68574 : PointerVisitor::visit (AST::TupleType &type)
     976              : {
     977       225140 :   for (auto &elem : type.get_elems ())
     978       156566 :     reseat (elem);
     979        68574 : }
     980              : 
     981              : void
     982       122733 : PointerVisitor::visit (AST::RawPointerType &type)
     983              : {
     984       122733 :   reseat (type.get_type_pointed_to_ptr ());
     985       122733 : }
     986              : 
     987              : void
     988       550790 : PointerVisitor::visit (AST::ReferenceType &type)
     989              : {
     990       550790 :   visit (type.get_lifetime ());
     991       550790 :   reseat (type.get_type_ptr ());
     992       550790 : }
     993              : 
     994              : void
     995        24859 : PointerVisitor::visit (AST::ArrayType &type)
     996              : {
     997        24859 :   reseat (type.get_elem_type_ptr ());
     998        24859 :   visit (type.get_size_expr ());
     999        24859 : }
    1000              : 
    1001              : void
    1002        47939 : PointerVisitor::visit (AST::SliceType &type)
    1003              : {
    1004        47939 :   reseat (type.get_elem_type_ptr ());
    1005        47939 : }
    1006              : 
    1007              : void
    1008       112234 : PointerVisitor::visit (AST::MaybeNamedParam &param)
    1009              : {
    1010       112234 :   visit_outer_attrs (param);
    1011       112234 :   reseat (param.get_type_ptr ());
    1012       112234 : }
    1013              : 
    1014              : void
    1015        18868 : PointerVisitor::visit (AST::BareFunctionType &type)
    1016              : {
    1017        18880 :   for (auto &lifetime : type.get_for_lifetimes ())
    1018           12 :     visit (lifetime);
    1019        18868 :   visit (type.get_function_qualifiers ());
    1020       131102 :   for (auto &param : type.get_function_params ())
    1021       112234 :     visit (param);
    1022        18868 :   if (type.is_variadic ())
    1023         5712 :     for (auto attr : type.get_variadic_attr ())
    1024            0 :       visit (attr);
    1025        18868 :   if (type.has_return_type ())
    1026        18503 :     reseat (type.get_return_type_ptr ());
    1027        18868 : }
    1028              : 
    1029              : void
    1030            0 : PointerVisitor::visit (AST::FormatArgs &)
    1031              : {
    1032              :   // FIXME: Do we have anything to do? any subnodes to visit? Probably, right?
    1033            0 : }
    1034              : 
    1035              : void
    1036           45 : PointerVisitor::visit (AST::OffsetOf &offset_of)
    1037              : {
    1038           45 :   reseat (offset_of.get_type_ptr ());
    1039           45 : }
    1040              : 
    1041              : void
    1042         2798 : PointerVisitor::visit (AST::VariadicParam &param)
    1043              : {
    1044         2798 :   if (param.has_pattern ())
    1045           33 :     reseat (param.get_pattern_ptr ());
    1046         2798 : }
    1047              : 
    1048              : } // namespace AST
    1049              : } // namespace Rust
        

Generated by: LCOV version 2.5.0-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.