LCOV - code coverage report
Current view: top level - gcc/rust/checks/errors/privacy - rust-pub-restricted-visitor.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 90.9 % 66 60
Test Date: 2026-02-28 14:20:25 Functions: 88.2 % 17 15
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-pub-restricted-visitor.h"
      20              : #include "rust-hir.h"
      21              : #include "rust-hir-item.h"
      22              : 
      23              : namespace Rust {
      24              : namespace Privacy {
      25              : 
      26              : bool
      27        20930 : PubRestrictedVisitor::is_restriction_valid (NodeId item_id,
      28              :                                             const location_t locus)
      29              : {
      30        20930 :   auto visibility = mappings.lookup_visibility (item_id);
      31              : 
      32              :   // If there is no visibility in the mappings, then the item is private and
      33              :   // does not contain any restriction
      34              :   // FIXME: Is that correct?
      35        20930 :   if (!visibility)
      36              :     return true;
      37              : 
      38        14872 :   for (auto mod = module_stack.rbegin (); mod != module_stack.rend (); mod++)
      39        17078 :     if (*mod == visibility->get_module_id ())
      40        20928 :       return true;
      41              : 
      42            2 :   rust_error_at (locus, "restricted path is not an ancestor of the "
      43              :                         "current module");
      44            2 :   return false;
      45              : }
      46              : 
      47         4121 : PubRestrictedVisitor::PubRestrictedVisitor (Analysis::Mappings &mappings)
      48         4121 :   : mappings (mappings)
      49         4121 : {}
      50              : 
      51              : void
      52         4121 : PubRestrictedVisitor::go (HIR::Crate &crate)
      53              : {
      54              :   // The `crate` module will always be present
      55         4121 :   module_stack.emplace_back (crate.get_mappings ().get_defid ());
      56              : 
      57              :   // FIXME: When do we insert `super`? `self`?
      58              :   // We need wrapper function for these
      59              : 
      60        21141 :   for (auto &item : crate.get_items ())
      61              :     {
      62        17020 :       if (item->get_hir_kind () == HIR::Node::VIS_ITEM)
      63              :         {
      64        17020 :           auto vis_item = static_cast<HIR::VisItem *> (item.get ());
      65        17020 :           vis_item->accept_vis (*this);
      66              :         }
      67              :     }
      68         4121 : }
      69              : 
      70              : void
      71         1189 : PubRestrictedVisitor::visit (HIR::Module &mod)
      72              : {
      73              :   // FIXME: We need to update `super` and `self` here
      74         1189 :   module_stack.push_back (mod.get_mappings ().get_defid ());
      75              : 
      76         1189 :   is_restriction_valid (mod.get_mappings ().get_nodeid (), mod.get_locus ());
      77              : 
      78         5099 :   for (auto &item : mod.get_items ())
      79              :     {
      80         3910 :       if (item->get_hir_kind () == HIR::Node::VIS_ITEM)
      81              :         {
      82         3910 :           auto vis_item = static_cast<HIR::VisItem *> (item.get ());
      83         3910 :           vis_item->accept_vis (*this);
      84              :         }
      85              :     }
      86              : 
      87         1189 :   module_stack.pop_back ();
      88         1189 : }
      89              : 
      90              : void
      91            0 : PubRestrictedVisitor::visit (HIR::ExternCrate &crate)
      92              : {
      93            0 :   is_restriction_valid (crate.get_mappings ().get_nodeid (),
      94              :                         crate.get_locus ());
      95            0 : }
      96              : 
      97              : void
      98            0 : PubRestrictedVisitor::visit (HIR::UseDeclaration &use_decl)
      99              : {
     100            0 :   is_restriction_valid (use_decl.get_mappings ().get_nodeid (),
     101              :                         use_decl.get_locus ());
     102            0 : }
     103              : 
     104              : void
     105         6048 : PubRestrictedVisitor::visit (HIR::Function &func)
     106              : {
     107         6048 :   is_restriction_valid (func.get_mappings ().get_nodeid (), func.get_locus ());
     108         6048 : }
     109              : 
     110              : void
     111           42 : PubRestrictedVisitor::visit (HIR::TypeAlias &type_alias)
     112              : {
     113           42 :   is_restriction_valid (type_alias.get_mappings ().get_nodeid (),
     114              :                         type_alias.get_locus ());
     115           42 : }
     116              : 
     117              : void
     118         1322 : PubRestrictedVisitor::visit (HIR::StructStruct &struct_item)
     119              : {
     120         1322 :   is_restriction_valid (struct_item.get_mappings ().get_nodeid (),
     121              :                         struct_item.get_locus ());
     122              :   // FIXME: Check fields here as well
     123         1322 : }
     124              : 
     125              : void
     126          794 : PubRestrictedVisitor::visit (HIR::TupleStruct &tuple_struct)
     127              : {
     128          794 :   is_restriction_valid (tuple_struct.get_mappings ().get_nodeid (),
     129              :                         tuple_struct.get_locus ());
     130              :   // FIXME: Check fields here as well
     131          794 : }
     132              : 
     133              : void
     134          478 : PubRestrictedVisitor::visit (HIR::Enum &enum_item)
     135              : {
     136          478 :   is_restriction_valid (enum_item.get_mappings ().get_nodeid (),
     137              :                         enum_item.get_locus ());
     138          478 : }
     139              : 
     140              : void
     141           97 : PubRestrictedVisitor::visit (HIR::Union &union_item)
     142              : {
     143           97 :   is_restriction_valid (union_item.get_mappings ().get_nodeid (),
     144              :                         union_item.get_locus ());
     145           97 : }
     146              : 
     147              : void
     148          393 : PubRestrictedVisitor::visit (HIR::ConstantItem &const_item)
     149              : {
     150          393 :   is_restriction_valid (const_item.get_mappings ().get_nodeid (),
     151              :                         const_item.get_locus ());
     152          393 : }
     153              : 
     154              : void
     155           51 : PubRestrictedVisitor::visit (HIR::StaticItem &static_item)
     156              : {
     157           51 :   is_restriction_valid (static_item.get_mappings ().get_nodeid (),
     158              :                         static_item.get_locus ());
     159           51 : }
     160              : 
     161              : void
     162         3536 : PubRestrictedVisitor::visit (HIR::Trait &trait)
     163              : {
     164         3536 :   is_restriction_valid (trait.get_mappings ().get_nodeid (),
     165              :                         trait.get_locus ());
     166         3536 : }
     167              : 
     168              : void
     169         5538 : PubRestrictedVisitor::visit (HIR::ImplBlock &impl)
     170              : {
     171         5538 :   is_restriction_valid (impl.get_mappings ().get_nodeid (), impl.get_locus ());
     172         5538 : }
     173              : 
     174              : void
     175         1442 : PubRestrictedVisitor::visit (HIR::ExternBlock &block)
     176              : {
     177         1442 :   is_restriction_valid (block.get_mappings ().get_nodeid (),
     178              :                         block.get_locus ());
     179         1442 : }
     180              : 
     181              : } // namespace Privacy
     182              : } // 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.