LCOV - code coverage report
Current view: top level - gcc/rust/resolve - rust-default-resolver.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 99.7 % 291 290
Test Date: 2026-10-24 16:24:59 Functions: 100.0 % 62 62
Legend: Lines:     hit not hit

            Line data    Source code
       1              : // Copyright (C) 2020-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-default-resolver.h"
      20              : #include "optional.h"
      21              : #include "rust-ast-full.h"
      22              : #include "rust-ast-visitor.h"
      23              : #include "rust-ast.h"
      24              : #include "rust-attribute-values.h"
      25              : #include "rust-item.h"
      26              : #include "rust-path.h"
      27              : 
      28              : namespace Rust {
      29              : namespace Resolver2_0 {
      30              : 
      31              : void
      32        33304 : DefaultResolver::visit (AST::Crate &crate)
      33              : {
      34              :   // Guard against infinite recursion: `extern crate self;` resolves to the
      35              :   // current crate, causing visit(AST::Crate) to call itself infinitely.
      36        33304 :   if (!visited_crates.insert (crate.get_node_id ()).second)
      37            0 :     return;
      38              : 
      39        66608 :   auto inner_fn = [this, &crate] () {
      40        33304 :     maybe_prelude_import ();
      41        33304 :     AST::DefaultASTVisitor::visit (crate);
      42        66606 :   };
      43              : 
      44        33304 :   auto &crate_mappings = Analysis::Mappings::get ().crate;
      45              : 
      46        33304 :   auto crate_num = crate_mappings.lookup_crate_num (crate.get_node_id ());
      47        33304 :   rust_assert (crate_num.has_value ());
      48        33304 :   auto crate_name = crate_mappings.crate_names.lookup (*crate_num);
      49        33304 :   rust_assert (crate_name.has_value ());
      50              : 
      51        66608 :   ctx.canonical_ctx.scope_crate (crate.get_node_id (), *crate_name, inner_fn);
      52              : }
      53              : 
      54              : void
      55      1351594 : DefaultResolver::visit (AST::BlockExpr &expr)
      56              : {
      57              :   // extracting the lambda from the `scoped` call otherwise the code looks like
      58              :   // a hot turd thanks to our .clang-format
      59              : 
      60      1351594 :   auto inner_fn = [this, &expr] () { AST::DefaultASTVisitor::visit (expr); };
      61              : 
      62      1351594 :   ctx.scoped (Rib::Kind::Normal, expr.get_node_id (), inner_fn);
      63      1351589 : }
      64              : 
      65              : void
      66        27790 : DefaultResolver::visit (AST::Module &module)
      67              : {
      68        55580 :   auto item_fn_1 = [this, &module] () {
      69        27790 :     maybe_prelude_import ();
      70        27790 :     AST::DefaultASTVisitor::visit (module);
      71        55580 :   };
      72              : 
      73        55580 :   auto item_fn_2 = [this, &module, &item_fn_1] () {
      74        27790 :     ctx.canonical_ctx.scope (module.get_node_id (), module.get_name (),
      75              :                              std::move (item_fn_1));
      76        55580 :   };
      77              : 
      78        55580 :   ctx.scoped (Rib::Kind::Module, module.get_node_id (), item_fn_2,
      79        55580 :               module.get_name ());
      80        27790 : }
      81              : 
      82              : void
      83      1011620 : DefaultResolver::visit (AST::Function &function)
      84              : {
      85      1011620 :   auto def_fn_1
      86      1011620 :     = [this, &function] () { AST::DefaultASTVisitor::visit (function); };
      87              : 
      88      2023240 :   auto def_fn_2 = [this, &function, &def_fn_1] () {
      89      1011620 :     ctx.canonical_ctx.scope (function.get_node_id (),
      90      1011620 :                              function.get_function_name (),
      91              :                              std::move (def_fn_1));
      92      2023238 :   };
      93              : 
      94      1011620 :   ctx.scoped (Rib::Kind::Function, function.get_node_id (), def_fn_2);
      95      1011618 : }
      96              : 
      97              : void
      98         5369 : DefaultResolver::visit (AST::LoopExpr &expr)
      99              : {
     100         5369 :   ctx.scoped (Rib::Kind::Normal, expr.get_node_id (),
     101        16106 :               [this, &expr] () { AST::DefaultASTVisitor::visit (expr); });
     102         5368 : }
     103              : 
     104              : void
     105         8074 : DefaultResolver::visit (AST::WhileLoopExpr &expr)
     106              : {
     107         8074 :   ctx.scoped (Rib::Kind::Normal, expr.get_node_id (),
     108        24222 :               [this, &expr] () { AST::DefaultASTVisitor::visit (expr); });
     109         8074 : }
     110              : 
     111              : void
     112         1762 : DefaultResolver::visit (AST::WhileLetLoopExpr &expr)
     113              : {
     114         1762 :   ctx.scoped (Rib::Kind::Normal, expr.get_node_id (),
     115         5286 :               [this, &expr] () { AST::DefaultASTVisitor::visit (expr); });
     116         1762 : }
     117              : void
     118         7588 : DefaultResolver::visit (AST::ForLoopExpr &expr)
     119              : {
     120         7588 :   ctx.scoped (Rib::Kind::Normal, expr.get_node_id (),
     121        22764 :               [this, &expr] () { AST::DefaultASTVisitor::visit (expr); });
     122         7588 : }
     123              : 
     124              : void
     125         7148 : DefaultResolver::visit_if_let_patterns (AST::IfLetExpr &expr)
     126              : {
     127         7148 :   visit (expr.get_pattern ());
     128         7148 : }
     129              : 
     130              : void
     131         7148 : DefaultResolver::visit (AST::IfLetExpr &expr)
     132              : {
     133        14296 :   auto inner_vis = [this, &expr] () {
     134         7148 :     visit_if_let_patterns (expr);
     135         7148 :     visit (expr.get_if_block ());
     136        14296 :   };
     137              : 
     138         7148 :   visit_outer_attrs (expr);
     139              : 
     140         7148 :   visit (expr.get_value_expr ());
     141              : 
     142         7148 :   ctx.scoped (Rib::Kind::Normal, expr.get_node_id (), inner_vis);
     143         7148 : }
     144              : 
     145              : void
     146         2562 : DefaultResolver::visit (AST::IfLetExprConseqElse &expr)
     147              : {
     148         2562 :   DefaultResolver::visit (static_cast<AST::IfLetExpr &> (expr));
     149         2562 :   visit (expr.get_else_block ());
     150         2562 : }
     151              : 
     152              : void
     153        39208 : DefaultResolver::visit (AST::Trait &trait)
     154              : {
     155        39208 :   visit_outer_attrs (trait);
     156        39208 :   visit (trait.get_visibility ());
     157        39208 :   visit_inner_attrs (trait);
     158              : 
     159        78416 :   auto inner_fn_1 = [this, &trait] () {
     160        94238 :     for (auto &item : trait.get_trait_items ())
     161        55030 :       visit (item);
     162        78416 :   };
     163              : 
     164        78416 :   auto inner_fn_2 = [this, &trait, &inner_fn_1] () {
     165        39208 :     visit (trait.get_implicit_self ());
     166        49252 :     for (auto &generic : trait.get_generic_params ())
     167        10044 :       visit (generic);
     168        39208 :     if (trait.has_where_clause ())
     169           56 :       visit (trait.get_where_clause ());
     170        49666 :     for (auto &bound : trait.get_type_param_bounds ())
     171        10458 :       visit (bound);
     172              : 
     173        39208 :     ctx.scoped (Rib::Kind::TraitOrImpl, trait.get_node_id (), inner_fn_1);
     174        78416 :   };
     175              : 
     176        78416 :   auto inner_fn_3 = [this, &trait, &inner_fn_2] () {
     177        39208 :     ctx.canonical_ctx.scope (trait.get_node_id (), trait.get_identifier (),
     178              :                              std::move (inner_fn_2));
     179        78416 :   };
     180              : 
     181        78416 :   ctx.scoped (Rib::Kind::Generics, trait.get_node_id (), inner_fn_3,
     182        78416 :               trait.get_identifier () /* FIXME: Is that valid?*/);
     183        39208 : }
     184              : 
     185              : static bool
     186        29590 : is_lang_impl (std::vector<AST::Attribute> &outer_attrs)
     187              : {
     188        33285 :   for (auto &attr : outer_attrs)
     189         6981 :     if (attr.get_path ().as_string () == Values::Attributes::LANG)
     190        29590 :       return true;
     191              : 
     192              :   return false;
     193              : }
     194              : 
     195              : void
     196        29590 : DefaultResolver::visit (AST::InherentImpl &impl)
     197              : {
     198        29590 :   visit_outer_attrs (impl);
     199        29590 :   visit (impl.get_visibility ());
     200        29590 :   visit_inner_attrs (impl);
     201              : 
     202        59180 :   auto inner_fn_1 = [this, &impl] () {
     203       213624 :     for (auto &item : impl.get_impl_items ())
     204       184034 :       visit (item);
     205        59180 :   };
     206              : 
     207        59180 :   auto inner_fn_2 = [this, &impl, &inner_fn_1] () {
     208        29590 :     maybe_insert_big_self (impl);
     209        54549 :     for (auto &generic : impl.get_generic_params ())
     210        24959 :       visit (generic);
     211        29590 :     if (impl.has_where_clause ())
     212          221 :       visit (impl.get_where_clause ());
     213        29590 :     visit_impl_type (impl.get_type ());
     214              : 
     215        29590 :     ctx.scoped (Rib::Kind::TraitOrImpl, impl.get_node_id (), inner_fn_1);
     216        59180 :   };
     217              : 
     218        59180 :   auto inner_fn_3 = [this, &impl, &inner_fn_2] () {
     219        29590 :     ctx.canonical_ctx.scope_impl (impl, std::move (inner_fn_2));
     220        59180 :   };
     221              : 
     222        29590 :   ctx.scoped (Rib::Kind::Generics, impl.get_node_id (), inner_fn_3);
     223              : 
     224        29590 :   if (is_lang_impl (impl.get_outer_attrs ()))
     225              :     {
     226         3286 :       if (impl.get_type ().get_type_kind () == AST::Type::Kind::TypePath)
     227              :         {
     228         1492 :           auto type = static_cast<AST::TypePath &> (impl.get_type ());
     229         1492 :           auto type_name = type.as_string ();
     230              : 
     231         4476 :           ctx.types.insert_lang_prelude (type_name, impl.get_node_id ());
     232         1492 :         }
     233              :     }
     234        29590 : }
     235              : 
     236              : void
     237       504037 : DefaultResolver::visit (AST::TraitImpl &impl)
     238              : {
     239       504037 :   visit_outer_attrs (impl);
     240       504037 :   visit (impl.get_visibility ());
     241       504037 :   visit_inner_attrs (impl);
     242              : 
     243      1008074 :   auto inner_fn_1 = [this, &impl] () {
     244      1214358 :     for (auto &item : impl.get_impl_items ())
     245       710321 :       visit (item);
     246      1008074 :   };
     247              : 
     248      1008074 :   auto inner_fn_2 = [this, &impl, &inner_fn_1] () {
     249       504037 :     maybe_insert_big_self (impl);
     250       975807 :     for (auto &generic : impl.get_generic_params ())
     251       471770 :       visit (generic);
     252       504037 :     if (impl.has_where_clause ())
     253        26514 :       visit (impl.get_where_clause ());
     254       504037 :     visit_impl_type (impl.get_type ());
     255       504037 :     visit (impl.get_trait_path ());
     256              : 
     257       504037 :     ctx.scoped (Rib::Kind::TraitOrImpl, impl.get_node_id (), inner_fn_1);
     258      1008074 :   };
     259              : 
     260      1008074 :   auto inner_fn_3 = [this, &impl, &inner_fn_2] () {
     261       504037 :     ctx.canonical_ctx.scope_impl (impl, std::move (inner_fn_2));
     262      1008074 :   };
     263              : 
     264       504037 :   ctx.scoped (Rib::Kind::Generics, impl.get_node_id (), inner_fn_3);
     265       504037 : }
     266              : 
     267              : void
     268        54921 : DefaultResolver::visit (AST::StructStruct &type)
     269              : {
     270        54921 :   auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
     271              : 
     272       109842 :   auto inner_fn_2 = [this, &type, &inner_fn_1] () {
     273        54921 :     ctx.canonical_ctx.scope (type.get_node_id (), type.get_struct_name (),
     274              :                              std::move (inner_fn_1));
     275       109842 :   };
     276              : 
     277        54921 :   ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
     278       164763 :               inner_fn_2, type.get_struct_name ());
     279        54921 : }
     280              : 
     281              : void
     282        14056 : DefaultResolver::visit (AST::TupleStruct &type)
     283              : {
     284        14056 :   auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
     285              : 
     286        28112 :   auto inner_fn_2 = [this, &type, &inner_fn_1] () {
     287        14056 :     ctx.canonical_ctx.scope (type.get_node_id (), type.get_struct_name (),
     288              :                              std::move (inner_fn_1));
     289        28112 :   };
     290              : 
     291        14056 :   ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
     292        42168 :               inner_fn_2, type.get_struct_name ());
     293        14056 : }
     294              : 
     295              : void
     296         7792 : DefaultResolver::visit (AST::EnumItem &item)
     297              : {
     298         7792 :   auto inner_fn = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
     299              : 
     300         7792 :   ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
     301              :                            inner_fn);
     302         7792 : }
     303              : 
     304              : void
     305         5807 : DefaultResolver::visit (AST::EnumItemTuple &item)
     306              : {
     307         5807 :   auto inner_fn = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
     308              : 
     309         5807 :   ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
     310              :                            inner_fn);
     311         5807 : }
     312              : 
     313              : void
     314          660 : DefaultResolver::visit (AST::EnumItemStruct &item)
     315              : {
     316          660 :   auto inner_fn = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
     317              : 
     318          660 :   ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
     319              :                            inner_fn);
     320          660 : }
     321              : 
     322              : void
     323         2235 : DefaultResolver::visit (AST::EnumItemDiscriminant &item)
     324              : {
     325         2235 :   auto inner_fn = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
     326              : 
     327         2235 :   ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
     328              :                            inner_fn);
     329         2235 : }
     330              : 
     331              : void
     332         6583 : DefaultResolver::visit (AST::Enum &type)
     333              : {
     334         6583 :   auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
     335              : 
     336        13166 :   auto inner_fn_2 = [this, &type, &inner_fn_1] () {
     337         6583 :     ctx.canonical_ctx.scope (type.get_node_id (), type.get_identifier (),
     338              :                              std::move (inner_fn_1));
     339        13166 :   };
     340              : 
     341        13166 :   ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
     342        19749 :               inner_fn_2, type.get_identifier ());
     343         6583 : }
     344              : 
     345              : void
     346          845 : DefaultResolver::visit (AST::Union &type)
     347              : {
     348          845 :   auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
     349              : 
     350         1690 :   auto inner_fn_2 = [this, &type, &inner_fn_1] () {
     351          845 :     ctx.canonical_ctx.scope (type.get_node_id (), type.get_identifier (),
     352              :                              std::move (inner_fn_1));
     353         1690 :   };
     354              : 
     355         1690 :   ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
     356         2535 :               inner_fn_2, type.get_identifier ());
     357          845 : }
     358              : 
     359              : void
     360       189972 : DefaultResolver::visit (AST::TypeAlias &type)
     361              : {
     362       189972 :   auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
     363              : 
     364       379944 :   auto inner_fn_2 = [this, &type, &inner_fn_1] () {
     365       189972 :     ctx.canonical_ctx.scope (type.get_node_id (), type.get_new_type_name (),
     366              :                              std::move (inner_fn_1));
     367       379944 :   };
     368              : 
     369       379944 :   ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
     370       569916 :               inner_fn_2, type.get_new_type_name ());
     371       189972 : }
     372              : 
     373              : void
     374           12 : DefaultResolver::visit (AST::TraitAlias &trait)
     375              : {
     376           12 :   auto inner_fn_1
     377           12 :     = [this, &trait] () { AST::DefaultASTVisitor::visit (trait); };
     378              : 
     379           24 :   auto inner_fn_2 = [this, &trait, &inner_fn_1] () {
     380           12 :     ctx.canonical_ctx.scope (trait.get_node_id (), trait.get_alias_name (),
     381              :                              std::move (inner_fn_1));
     382           24 :   };
     383              : 
     384           24 :   ctx.scoped (Rib::Kind::Item, trait.get_node_id (), inner_fn_2,
     385           12 :               trait.get_alias_name ());
     386           12 : }
     387              : 
     388              : void
     389        23184 : DefaultResolver::visit_closure_params (AST::ClosureExpr &expr)
     390              : {
     391        50596 :   for (auto &param : expr.get_params ())
     392        27412 :     visit (param);
     393        23184 : }
     394              : 
     395              : void
     396        23184 : DefaultResolver::visit (AST::ClosureExpr &expr)
     397              : {
     398        46368 :   auto expr_fn = [this, &expr] () {
     399        23184 :     visit_closure_params (expr);
     400        23184 :     visit (expr.get_definition_expr ());
     401        46368 :   };
     402              : 
     403        23184 :   visit_outer_attrs (expr);
     404              : 
     405        23184 :   ctx.scoped (Rib::Kind::Normal, expr.get_node_id (), expr_fn);
     406        23184 : }
     407              : 
     408              : void
     409        22932 : DefaultResolver::visit (AST::ClosureExprInner &expr)
     410              : {
     411        22932 :   if (expr.is_marked_for_strip ())
     412              :     return;
     413              : 
     414        22932 :   visit (static_cast<AST::ClosureExpr &> (expr));
     415              : }
     416              : 
     417              : void
     418          252 : DefaultResolver::visit (AST::ClosureExprInnerTyped &expr)
     419              : {
     420          252 :   if (expr.is_marked_for_strip ())
     421              :     return;
     422              : 
     423          252 :   visit (static_cast<AST::ClosureExpr &> (expr));
     424          252 :   visit (expr.get_return_type ());
     425              : }
     426              : 
     427              : void
     428       320700 : DefaultResolver::visit (AST::MatchExpr &expr)
     429              : {
     430       320700 :   if (expr.is_marked_for_strip ())
     431              :     return;
     432              : 
     433       320700 :   AST::DefaultASTVisitor::visit (expr);
     434              : }
     435              : 
     436              : void
     437      3318400 : DefaultResolver::visit (AST::MatchCase &cas)
     438              : {
     439      3318400 :   auto vis = [this, &cas] () { AST::DefaultASTVisitor::visit (cas); };
     440              : 
     441      3318400 :   ctx.scoped (Rib::Kind::Normal, cas.get_node_id (), vis);
     442      3318399 : }
     443              : 
     444              : void
     445        54230 : DefaultResolver::visit (AST::ConstantItem &item)
     446              : {
     447        54230 :   auto expr_vis_1 = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
     448              : 
     449       108460 :   auto expr_vis_2 = [this, &item, &expr_vis_1] () {
     450        54230 :     ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
     451              :                              std::move (expr_vis_1));
     452       108460 :   };
     453              : 
     454              :   // FIXME: Why do we need a Rib here?
     455        54230 :   ctx.scoped (Rib::Kind::ConstantItem, item.get_node_id (), expr_vis_2);
     456        54230 : }
     457              : 
     458              : void
     459         3089 : DefaultResolver::visit (AST::StaticItem &item)
     460              : {
     461         3089 :   auto expr_vis_1 = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
     462              : 
     463         6178 :   auto expr_vis_2 = [this, &item, &expr_vis_1] () {
     464         3089 :     ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
     465              :                              std::move (expr_vis_1));
     466         6178 :   };
     467              : 
     468              :   // FIXME: Why do we need a Rib here?
     469         3089 :   ctx.scoped (Rib::Kind::ConstantItem, item.get_node_id (), expr_vis_2);
     470         3089 : }
     471              : 
     472              : void
     473       611567 : DefaultResolver::visit (AST::TypeParam &param)
     474              : {
     475      1223134 :   auto param_ban_vis = [this, &param] () {
     476       611567 :     visit_outer_attrs (param);
     477       611567 :     if (param.has_type ())
     478         5047 :       visit (param.get_type ());
     479      1223134 :   };
     480              : 
     481       611567 :   ctx.scoped (Rib::Kind::ForwardTypeParamBan, param.get_node_id (),
     482      1223134 :               param_ban_vis);
     483              : 
     484       782049 :   for (auto &bound : param.get_type_param_bounds ())
     485       170482 :     visit (bound);
     486       611567 : }
     487              : 
     488              : void
     489          195 : DefaultResolver::visit_extern_crate (AST::ExternCrate &extern_crate,
     490              :                                      AST::Crate &crate, CrateNum num)
     491              : {
     492              :   // We do *NOT* visit the crate because loaded crates are resolved
     493              :   // independently.
     494          195 : }
     495              : 
     496              : void
     497          375 : DefaultResolver::visit (AST::ExternCrate &crate)
     498              : {
     499          375 :   auto &mappings = Analysis::Mappings::get ();
     500          375 :   auto &crate_mappings = mappings.crate;
     501          375 :   tl::optional<CrateNum> num_opt;
     502          375 :   if (crate.get_referenced_crate () == "self")
     503            6 :     num_opt = crate_mappings.get_current_crate ();
     504              :   else
     505          369 :     num_opt = crate_mappings.lookup_crate_name (crate.get_referenced_crate ());
     506              : 
     507          375 :   if (!num_opt)
     508              :     {
     509            9 :       rust_error_at (crate.get_locus (), "unknown crate %qs",
     510            9 :                      crate.get_referenced_crate ().c_str ());
     511            9 :       return;
     512              :     }
     513              : 
     514          366 :   CrateNum num = *num_opt;
     515              : 
     516          366 :   AST::Crate &referenced_crate = mappings.crate.get_ast_crate (num);
     517              : 
     518          366 :   auto sub_visitor_1
     519          366 :     = [&, this] () { visit_extern_crate (crate, referenced_crate, num); };
     520              : 
     521          732 :   auto sub_visitor_2 = [&] () {
     522          366 :     ctx.canonical_ctx.scope_crate (referenced_crate.get_node_id (),
     523          366 :                                    crate.get_referenced_crate () == "self"
     524            6 :                                      ? crate_mappings.get_current_crate_name ()
     525              :                                      : crate.get_referenced_crate (),
     526              :                                    std::move (sub_visitor_1));
     527          732 :   };
     528              : 
     529          366 :   if (crate.has_as_clause ())
     530          108 :     ctx.scoped (Rib::Kind::Module, referenced_crate.get_node_id (),
     531          162 :                 sub_visitor_2, crate.get_as_clause ());
     532              :   else
     533          312 :     ctx.scoped (Rib::Kind::Module, referenced_crate.get_node_id (),
     534          936 :                 sub_visitor_2, crate.get_referenced_crate ());
     535              : }
     536              : 
     537              : } // namespace Resolver2_0
     538              : } // 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.