LCOV - code coverage report
Current view: top level - gcc/rust/hir - rust-ast-lower-expr.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 91.2 % 657 599
Test Date: 2025-08-30 13:27:53 Functions: 88.5 % 61 54
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: - 0 0

             Branch data     Line data    Source code
       1                 :             : // Copyright (C) 2020-2025 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-lower-expr.h"
      20                 :             : #include "optional.h"
      21                 :             : #include "rust-ast-lower-base.h"
      22                 :             : #include "rust-ast-lower-block.h"
      23                 :             : #include "rust-ast-lower-struct-field-expr.h"
      24                 :             : #include "rust-ast-lower-pattern.h"
      25                 :             : #include "rust-ast-lower-type.h"
      26                 :             : #include "rust-ast.h"
      27                 :             : #include "rust-builtin-ast-nodes.h"
      28                 :             : #include "rust-diagnostics.h"
      29                 :             : #include "rust-hir-map.h"
      30                 :             : #include "rust-system.h"
      31                 :             : #include "tree/rust-hir-expr.h"
      32                 :             : 
      33                 :             : namespace Rust {
      34                 :             : namespace HIR {
      35                 :             : 
      36                 :      113746 : ASTLoweringExpr::ASTLoweringExpr ()
      37                 :      113746 :   : ASTLoweringBase (), translated (nullptr), translated_array_elems (nullptr),
      38                 :      113746 :     terminated (false)
      39                 :      113746 : {}
      40                 :             : 
      41                 :             : HIR::Expr *
      42                 :      113746 : ASTLoweringExpr::translate (AST::Expr &expr, bool *terminated)
      43                 :             : {
      44                 :      113746 :   ASTLoweringExpr resolver;
      45                 :      113746 :   expr.accept_vis (resolver);
      46                 :      113746 :   if (resolver.translated == nullptr)
      47                 :             :     {
      48                 :           0 :       rust_fatal_error (expr.get_locus (), "Failed to lower expr: [%s]",
      49                 :           0 :                         expr.as_string ().c_str ());
      50                 :             :       return nullptr;
      51                 :             :     }
      52                 :             : 
      53                 :      113746 :   resolver.mappings.insert_hir_expr (resolver.translated);
      54                 :      113746 :   resolver.mappings.insert_location (
      55                 :      113746 :     resolver.translated->get_mappings ().get_hirid (), expr.get_locus ());
      56                 :             : 
      57                 :      113746 :   if (terminated != nullptr)
      58                 :       26015 :     *terminated = resolver.terminated;
      59                 :             : 
      60                 :      113746 :   return resolver.translated;
      61                 :      113746 : }
      62                 :             : 
      63                 :             : void
      64                 :         895 : ASTLoweringExpr::visit (AST::TupleIndexExpr &expr)
      65                 :             : {
      66                 :         895 :   HIR::Expr *tuple_expr
      67                 :         895 :     = ASTLoweringExpr::translate (expr.get_tuple_expr (), &terminated);
      68                 :             : 
      69                 :         895 :   auto crate_num = mappings.get_current_crate ();
      70                 :        1790 :   Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
      71                 :         895 :                                  mappings.get_next_hir_id (crate_num),
      72                 :         895 :                                  UNKNOWN_LOCAL_DEFID);
      73                 :             : 
      74                 :         895 :   translated
      75                 :         895 :     = new HIR::TupleIndexExpr (mapping, std::unique_ptr<HIR::Expr> (tuple_expr),
      76                 :         895 :                                expr.get_tuple_index (), expr.get_outer_attrs (),
      77                 :        1790 :                                expr.get_locus ());
      78                 :         895 : }
      79                 :             : 
      80                 :             : void
      81                 :         532 : ASTLoweringExpr::visit (AST::TupleExpr &expr)
      82                 :             : {
      83                 :         532 :   std::vector<std::unique_ptr<HIR::Expr>> tuple_elements;
      84                 :        1463 :   for (auto &e : expr.get_tuple_elems ())
      85                 :             :     {
      86                 :         931 :       HIR::Expr *t = ASTLoweringExpr::translate (*e);
      87                 :         931 :       tuple_elements.push_back (std::unique_ptr<HIR::Expr> (t));
      88                 :             :     }
      89                 :             : 
      90                 :         532 :   auto crate_num = mappings.get_current_crate ();
      91                 :        1064 :   Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
      92                 :         532 :                                  mappings.get_next_hir_id (crate_num),
      93                 :         532 :                                  UNKNOWN_LOCAL_DEFID);
      94                 :             : 
      95                 :         532 :   translated
      96                 :         532 :     = new HIR::TupleExpr (std::move (mapping), std::move (tuple_elements),
      97                 :        1064 :                           expr.get_inner_attrs (), expr.get_outer_attrs (),
      98                 :         532 :                           expr.get_locus ());
      99                 :         532 : }
     100                 :             : 
     101                 :             : void
     102                 :         432 : ASTLoweringExpr::visit (AST::IfExpr &expr)
     103                 :             : {
     104                 :         432 :   translated = ASTLoweringIfBlock::translate (expr, &terminated);
     105                 :         432 : }
     106                 :             : 
     107                 :             : void
     108                 :         891 : ASTLoweringExpr::visit (AST::IfExprConseqElse &expr)
     109                 :             : {
     110                 :         891 :   translated = ASTLoweringIfBlock::translate (expr, &terminated);
     111                 :         891 : }
     112                 :             : 
     113                 :             : void
     114                 :          17 : ASTLoweringExpr::visit (AST::IfLetExpr &expr)
     115                 :             : {
     116                 :          17 :   translated = ASTLoweringIfLetBlock::translate (expr);
     117                 :          17 : }
     118                 :             : 
     119                 :             : void
     120                 :          11 : ASTLoweringExpr::visit (AST::IfLetExprConseqElse &expr)
     121                 :             : {
     122                 :          11 :   translated = ASTLoweringIfLetBlock::translate (expr);
     123                 :          11 : }
     124                 :             : 
     125                 :             : void
     126                 :        1400 : ASTLoweringExpr::visit (AST::BlockExpr &expr)
     127                 :             : {
     128                 :        1400 :   translated = ASTLoweringBlock::translate (expr, &terminated);
     129                 :        1400 : }
     130                 :             : 
     131                 :             : void
     132                 :         603 : ASTLoweringExpr::visit (AST::AnonConst &expr)
     133                 :             : {
     134                 :         603 :   auto &mappings = Analysis::Mappings::get ();
     135                 :         603 :   auto crate_num = mappings.get_current_crate ();
     136                 :        1206 :   auto mapping = Analysis::NodeMapping (crate_num, expr.get_node_id (),
     137                 :             :                                         mappings.get_next_hir_id (crate_num),
     138                 :         603 :                                         UNKNOWN_LOCAL_DEFID);
     139                 :             : 
     140                 :         603 :   if (expr.is_deferred ())
     141                 :             :     {
     142                 :           4 :       translated = new HIR::AnonConst (std::move (mapping), expr.get_locus ());
     143                 :             :     }
     144                 :             :   else
     145                 :             :     {
     146                 :         599 :       auto inner_expr = ASTLoweringExpr::translate (expr.get_inner_expr ());
     147                 :             : 
     148                 :        1198 :       translated = new HIR::AnonConst (std::move (mapping),
     149                 :         599 :                                        std::unique_ptr<Expr> (inner_expr),
     150                 :         599 :                                        expr.get_locus ());
     151                 :             :     }
     152                 :         603 : }
     153                 :             : 
     154                 :             : void
     155                 :           7 : ASTLoweringExpr::visit (AST::ConstBlock &expr)
     156                 :             : {
     157                 :           7 :   auto inner_expr = ASTLoweringExpr::translate (expr.get_const_expr ());
     158                 :             : 
     159                 :             :   // we know this will always be an `AnonConst`, or we have an issue. Let's
     160                 :             :   // assert just to be sure.
     161                 :           7 :   rust_assert (inner_expr->get_expression_type () == Expr::ExprType::AnonConst);
     162                 :           7 :   auto anon_const = static_cast<AnonConst *> (inner_expr);
     163                 :             : 
     164                 :           7 :   auto &mappings = Analysis::Mappings::get ();
     165                 :           7 :   auto crate_num = mappings.get_current_crate ();
     166                 :          14 :   auto mapping = Analysis::NodeMapping (crate_num, expr.get_node_id (),
     167                 :             :                                         mappings.get_next_hir_id (crate_num),
     168                 :           7 :                                         UNKNOWN_LOCAL_DEFID);
     169                 :             : 
     170                 :           7 :   translated
     171                 :           7 :     = new HIR::ConstBlock (std::move (mapping), std::move (*anon_const),
     172                 :           7 :                            expr.get_locus (), expr.get_outer_attrs ());
     173                 :           7 : }
     174                 :             : 
     175                 :             : void
     176                 :        3429 : ASTLoweringExpr::visit (AST::UnsafeBlockExpr &expr)
     177                 :             : {
     178                 :        3429 :   translated = ASTLoweringBlock::translate (expr, &terminated);
     179                 :        3429 : }
     180                 :             : 
     181                 :             : void
     182                 :       20194 : ASTLoweringExpr::visit (AST::PathInExpression &expr)
     183                 :             : {
     184                 :       20194 :   translated = ASTLowerPathInExpression::translate (expr);
     185                 :       20194 : }
     186                 :             : 
     187                 :             : void
     188                 :         114 : ASTLoweringExpr::visit (AST::QualifiedPathInExpression &expr)
     189                 :             : {
     190                 :         114 :   translated = ASTLowerQualPathInExpression::translate (expr);
     191                 :         114 : }
     192                 :             : 
     193                 :             : void
     194                 :           0 : ASTLoweringExpr::visit (AST::BoxExpr &expr)
     195                 :             : {
     196                 :             :   // Not implemented
     197                 :           0 :   rust_unreachable ();
     198                 :             : }
     199                 :             : 
     200                 :             : void
     201                 :         495 : ASTLoweringExpr::visit (AST::ReturnExpr &expr)
     202                 :             : {
     203                 :         495 :   terminated = true;
     204                 :         495 :   HIR::Expr *return_expr
     205                 :         495 :     = expr.has_returned_expr ()
     206                 :         495 :         ? ASTLoweringExpr::translate (expr.get_returned_expr ())
     207                 :             :         : nullptr;
     208                 :             : 
     209                 :         495 :   auto crate_num = mappings.get_current_crate ();
     210                 :         990 :   Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
     211                 :         495 :                                  mappings.get_next_hir_id (crate_num),
     212                 :         495 :                                  UNKNOWN_LOCAL_DEFID);
     213                 :             : 
     214                 :         990 :   translated = new HIR::ReturnExpr (mapping, expr.get_locus (),
     215                 :         495 :                                     std::unique_ptr<HIR::Expr> (return_expr));
     216                 :         495 : }
     217                 :             : 
     218                 :             : void
     219                 :       10880 : ASTLoweringExpr::visit (AST::CallExpr &expr)
     220                 :             : {
     221                 :       10880 :   HIR::Expr *func = ASTLoweringExpr::translate (expr.get_function_expr ());
     222                 :             : 
     223                 :       10880 :   auto const &in_params = expr.get_params ();
     224                 :       10880 :   std::vector<std::unique_ptr<HIR::Expr>> params;
     225                 :       23765 :   for (auto &param : in_params)
     226                 :             :     {
     227                 :       12885 :       auto trans = ASTLoweringExpr::translate (*param);
     228                 :       12885 :       params.push_back (std::unique_ptr<HIR::Expr> (trans));
     229                 :             :     }
     230                 :             : 
     231                 :       10880 :   auto crate_num = mappings.get_current_crate ();
     232                 :       10880 :   Analysis::NodeMapping mapping (
     233                 :             :     crate_num, UNKNOWN_NODEID /* this can map back to the AST*/,
     234                 :       10880 :     mappings.get_next_hir_id (crate_num), UNKNOWN_LOCAL_DEFID);
     235                 :             : 
     236                 :       10880 :   translated = new HIR::CallExpr (mapping, std::unique_ptr<HIR::Expr> (func),
     237                 :       10880 :                                   std::move (params), expr.get_outer_attrs (),
     238                 :       21760 :                                   expr.get_locus ());
     239                 :       10880 : }
     240                 :             : 
     241                 :             : void
     242                 :        2963 : ASTLoweringExpr::visit (AST::MethodCallExpr &expr)
     243                 :             : {
     244                 :        2963 :   HIR::PathExprSegment method_path
     245                 :        2963 :     = lower_path_expr_seg (expr.get_method_name ());
     246                 :             : 
     247                 :        2963 :   HIR::Expr *receiver = ASTLoweringExpr::translate (expr.get_receiver_expr ());
     248                 :             : 
     249                 :        2963 :   auto const &in_params = expr.get_params ();
     250                 :        2963 :   std::vector<std::unique_ptr<HIR::Expr>> params;
     251                 :        4995 :   for (auto &param : in_params)
     252                 :             :     {
     253                 :        2032 :       auto trans = ASTLoweringExpr::translate (*param);
     254                 :        2032 :       params.push_back (std::unique_ptr<HIR::Expr> (trans));
     255                 :             :     }
     256                 :             : 
     257                 :        2963 :   auto crate_num = mappings.get_current_crate ();
     258                 :        5926 :   Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
     259                 :        2963 :                                  mappings.get_next_hir_id (crate_num),
     260                 :        2963 :                                  UNKNOWN_LOCAL_DEFID);
     261                 :             : 
     262                 :        2963 :   translated
     263                 :        2963 :     = new HIR::MethodCallExpr (mapping, std::unique_ptr<HIR::Expr> (receiver),
     264                 :             :                                method_path, std::move (params),
     265                 :        5926 :                                expr.get_outer_attrs (), expr.get_locus ());
     266                 :        2963 : }
     267                 :             : 
     268                 :             : void
     269                 :        2473 : ASTLoweringExpr::visit (AST::AssignmentExpr &expr)
     270                 :             : {
     271                 :        2473 :   HIR::Expr *lhs = ASTLoweringExpr::translate (expr.get_left_expr ());
     272                 :        2473 :   HIR::Expr *rhs = ASTLoweringExpr::translate (expr.get_right_expr ());
     273                 :             : 
     274                 :        2473 :   auto crate_num = mappings.get_current_crate ();
     275                 :        4946 :   Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
     276                 :        2473 :                                  mappings.get_next_hir_id (crate_num),
     277                 :        2473 :                                  UNKNOWN_LOCAL_DEFID);
     278                 :             : 
     279                 :        2473 :   translated
     280                 :        2473 :     = new HIR::AssignmentExpr (mapping, std::unique_ptr<HIR::Expr> (lhs),
     281                 :        4946 :                                std::unique_ptr<HIR::Expr> (rhs),
     282                 :        2473 :                                expr.get_locus ());
     283                 :        2473 : }
     284                 :             : 
     285                 :             : void
     286                 :       23809 : ASTLoweringExpr::visit (AST::IdentifierExpr &expr)
     287                 :             : {
     288                 :       23809 :   auto crate_num = mappings.get_current_crate ();
     289                 :       47618 :   Analysis::NodeMapping mapping1 (crate_num, expr.get_node_id (),
     290                 :       23809 :                                   mappings.get_next_hir_id (crate_num),
     291                 :       23809 :                                   UNKNOWN_LOCAL_DEFID);
     292                 :       23809 :   Analysis::NodeMapping mapping2 (mapping1);
     293                 :             : 
     294                 :       47618 :   HIR::PathIdentSegment ident_seg (expr.get_ident ().as_string ());
     295                 :       23809 :   HIR::PathExprSegment seg (mapping1, ident_seg, expr.get_locus (),
     296                 :       47618 :                             HIR::GenericArgs::create_empty ());
     297                 :       47618 :   translated = new HIR::PathInExpression (mapping2, {seg}, expr.get_locus (),
     298                 :       47618 :                                           false, expr.get_outer_attrs ());
     299                 :       23809 : }
     300                 :             : 
     301                 :             : void
     302                 :         375 : ASTLoweringExpr::visit (AST::ArrayExpr &expr)
     303                 :             : {
     304                 :         375 :   expr.get_array_elems ()->accept_vis (*this);
     305                 :         375 :   rust_assert (translated_array_elems != nullptr);
     306                 :         375 :   HIR::ArrayElems *elems = translated_array_elems;
     307                 :             : 
     308                 :         375 :   auto crate_num = mappings.get_current_crate ();
     309                 :         750 :   Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
     310                 :         375 :                                  mappings.get_next_hir_id (crate_num),
     311                 :         375 :                                  UNKNOWN_LOCAL_DEFID);
     312                 :             : 
     313                 :         375 :   translated
     314                 :         375 :     = new HIR::ArrayExpr (mapping, std::unique_ptr<HIR::ArrayElems> (elems),
     315                 :         750 :                           expr.get_inner_attrs (), expr.get_outer_attrs (),
     316                 :         750 :                           expr.get_locus ());
     317                 :         375 : }
     318                 :             : 
     319                 :             : void
     320                 :         213 : ASTLoweringExpr::visit (AST::ArrayIndexExpr &expr)
     321                 :             : {
     322                 :         213 :   HIR::Expr *array_expr = ASTLoweringExpr::translate (expr.get_array_expr ());
     323                 :         213 :   HIR::Expr *array_index_expr
     324                 :         213 :     = ASTLoweringExpr::translate (expr.get_index_expr ());
     325                 :             : 
     326                 :         213 :   auto crate_num = mappings.get_current_crate ();
     327                 :         426 :   Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
     328                 :         213 :                                  mappings.get_next_hir_id (crate_num),
     329                 :         213 :                                  UNKNOWN_LOCAL_DEFID);
     330                 :             : 
     331                 :         213 :   translated
     332                 :         213 :     = new HIR::ArrayIndexExpr (mapping, std::unique_ptr<HIR::Expr> (array_expr),
     333                 :         426 :                                std::unique_ptr<HIR::Expr> (array_index_expr),
     334                 :         426 :                                expr.get_outer_attrs (), expr.get_locus ());
     335                 :         213 : }
     336                 :             : 
     337                 :             : void
     338                 :         259 : ASTLoweringExpr::visit (AST::ArrayElemsValues &elems)
     339                 :             : {
     340                 :         259 :   std::vector<std::unique_ptr<HIR::Expr>> elements;
     341                 :        1535 :   for (auto &elem : elems.get_values ())
     342                 :             :     {
     343                 :        1276 :       HIR::Expr *translated_elem = ASTLoweringExpr::translate (*elem);
     344                 :        1276 :       elements.push_back (std::unique_ptr<HIR::Expr> (translated_elem));
     345                 :             :     }
     346                 :             : 
     347                 :         259 :   auto crate_num = mappings.get_current_crate ();
     348                 :         259 :   Analysis::NodeMapping mapping (mappings.get_current_crate (),
     349                 :             :                                  elems.get_node_id (),
     350                 :         259 :                                  mappings.get_next_hir_id (crate_num),
     351                 :         259 :                                  UNKNOWN_LOCAL_DEFID);
     352                 :             : 
     353                 :         259 :   translated_array_elems
     354                 :         259 :     = new HIR::ArrayElemsValues (mapping, std::move (elements));
     355                 :         259 : }
     356                 :             : 
     357                 :             : void
     358                 :         116 : ASTLoweringExpr::visit (AST::ArrayElemsCopied &elems)
     359                 :             : {
     360                 :         116 :   HIR::Expr *element = ASTLoweringExpr::translate (elems.get_elem_to_copy ());
     361                 :         116 :   HIR::Expr *num_copies = ASTLoweringExpr::translate (elems.get_num_copies ());
     362                 :             : 
     363                 :         116 :   auto crate_num = mappings.get_current_crate ();
     364                 :         116 :   Analysis::NodeMapping mapping (mappings.get_current_crate (),
     365                 :             :                                  elems.get_node_id (),
     366                 :         116 :                                  mappings.get_next_hir_id (crate_num),
     367                 :         116 :                                  UNKNOWN_LOCAL_DEFID);
     368                 :             : 
     369                 :         116 :   translated_array_elems
     370                 :         116 :     = new HIR::ArrayElemsCopied (mapping, std::unique_ptr<HIR::Expr> (element),
     371                 :         232 :                                  std::unique_ptr<HIR::Expr> (num_copies));
     372                 :         116 : }
     373                 :             : 
     374                 :             : void
     375                 :       17757 : ASTLoweringExpr::visit (AST::LiteralExpr &expr)
     376                 :             : {
     377                 :       17757 :   auto crate_num = mappings.get_current_crate ();
     378                 :       35514 :   Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
     379                 :       17757 :                                  mappings.get_next_hir_id (crate_num),
     380                 :       17757 :                                  UNKNOWN_LOCAL_DEFID);
     381                 :             : 
     382                 :       17757 :   HIR::Literal l = lower_literal (expr.get_literal ());
     383                 :       17757 :   translated = new HIR::LiteralExpr (mapping, std::move (l), expr.get_locus (),
     384                 :       35514 :                                      expr.get_outer_attrs ());
     385                 :       17757 : }
     386                 :             : 
     387                 :             : void
     388                 :        3301 : ASTLoweringExpr::visit (AST::ArithmeticOrLogicalExpr &expr)
     389                 :             : {
     390                 :        3301 :   HIR::Expr *lhs = ASTLoweringExpr::translate (expr.get_left_expr ());
     391                 :        3301 :   rust_assert (lhs != nullptr);
     392                 :        3301 :   HIR::Expr *rhs = ASTLoweringExpr::translate (expr.get_right_expr ());
     393                 :        3301 :   rust_assert (rhs != nullptr);
     394                 :             : 
     395                 :        3301 :   auto crate_num = mappings.get_current_crate ();
     396                 :        6602 :   Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
     397                 :        3301 :                                  mappings.get_next_hir_id (crate_num),
     398                 :        3301 :                                  UNKNOWN_LOCAL_DEFID);
     399                 :             : 
     400                 :        6602 :   translated = new HIR::ArithmeticOrLogicalExpr (
     401                 :        3301 :     mapping, std::unique_ptr<HIR::Expr> (lhs), std::unique_ptr<HIR::Expr> (rhs),
     402                 :        3301 :     expr.get_expr_type (), expr.get_locus ());
     403                 :        3301 : }
     404                 :             : 
     405                 :             : void
     406                 :        2667 : ASTLoweringExpr::visit (AST::ComparisonExpr &expr)
     407                 :             : {
     408                 :        2667 :   HIR::Expr *lhs = ASTLoweringExpr::translate (expr.get_left_expr ());
     409                 :        2667 :   rust_assert (lhs != nullptr);
     410                 :        2667 :   HIR::Expr *rhs = ASTLoweringExpr::translate (expr.get_right_expr ());
     411                 :        2667 :   rust_assert (rhs != nullptr);
     412                 :             : 
     413                 :        2667 :   auto crate_num = mappings.get_current_crate ();
     414                 :        5334 :   Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
     415                 :        2667 :                                  mappings.get_next_hir_id (crate_num),
     416                 :        2667 :                                  UNKNOWN_LOCAL_DEFID);
     417                 :             : 
     418                 :        2667 :   translated
     419                 :        2667 :     = new HIR::ComparisonExpr (mapping, std::unique_ptr<HIR::Expr> (lhs),
     420                 :        5334 :                                std::unique_ptr<HIR::Expr> (rhs),
     421                 :        2667 :                                expr.get_expr_type (), expr.get_locus ());
     422                 :        2667 : }
     423                 :             : 
     424                 :             : void
     425                 :         384 : ASTLoweringExpr::visit (AST::LazyBooleanExpr &expr)
     426                 :             : {
     427                 :         384 :   HIR::Expr *lhs = ASTLoweringExpr::translate (expr.get_left_expr ());
     428                 :         384 :   rust_assert (lhs != nullptr);
     429                 :         384 :   HIR::Expr *rhs = ASTLoweringExpr::translate (expr.get_right_expr ());
     430                 :         384 :   rust_assert (rhs != nullptr);
     431                 :             : 
     432                 :         384 :   auto crate_num = mappings.get_current_crate ();
     433                 :         768 :   Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
     434                 :         384 :                                  mappings.get_next_hir_id (crate_num),
     435                 :         384 :                                  UNKNOWN_LOCAL_DEFID);
     436                 :             : 
     437                 :         384 :   translated
     438                 :         384 :     = new HIR::LazyBooleanExpr (mapping, std::unique_ptr<HIR::Expr> (lhs),
     439                 :         768 :                                 std::unique_ptr<HIR::Expr> (rhs),
     440                 :         384 :                                 expr.get_expr_type (), expr.get_locus ());
     441                 :         384 : }
     442                 :             : 
     443                 :             : void
     444                 :         512 : ASTLoweringExpr::visit (AST::NegationExpr &expr)
     445                 :             : {
     446                 :         512 :   HIR::Expr *negated_value
     447                 :         512 :     = ASTLoweringExpr::translate (expr.get_negated_expr ());
     448                 :             : 
     449                 :         512 :   auto crate_num = mappings.get_current_crate ();
     450                 :        1024 :   Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
     451                 :         512 :                                  mappings.get_next_hir_id (crate_num),
     452                 :         512 :                                  UNKNOWN_LOCAL_DEFID);
     453                 :         512 :   translated
     454                 :         512 :     = new HIR::NegationExpr (mapping,
     455                 :         512 :                              std::unique_ptr<HIR::Expr> (negated_value),
     456                 :         512 :                              expr.get_expr_type (), expr.get_outer_attrs (),
     457                 :        1024 :                              expr.get_locus ());
     458                 :         512 : }
     459                 :             : 
     460                 :             : void
     461                 :        4876 : ASTLoweringExpr::visit (AST::TypeCastExpr &expr)
     462                 :             : {
     463                 :        4876 :   HIR::Expr *expr_to_cast_to
     464                 :        4876 :     = ASTLoweringExpr::translate (expr.get_casted_expr ());
     465                 :        4876 :   HIR::Type *type_to_cast_to
     466                 :        4876 :     = lower_type_no_bounds (expr.get_type_to_cast_to ());
     467                 :             : 
     468                 :        4876 :   auto crate_num = mappings.get_current_crate ();
     469                 :        9752 :   Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
     470                 :        4876 :                                  mappings.get_next_hir_id (crate_num),
     471                 :        4876 :                                  UNKNOWN_LOCAL_DEFID);
     472                 :             : 
     473                 :        4876 :   translated
     474                 :        4876 :     = new HIR::TypeCastExpr (mapping,
     475                 :        4876 :                              std::unique_ptr<HIR::Expr> (expr_to_cast_to),
     476                 :        9752 :                              std::unique_ptr<HIR::Type> (type_to_cast_to),
     477                 :        4876 :                              expr.get_locus ());
     478                 :        4876 : }
     479                 :             : 
     480                 :             : void
     481                 :         639 : ASTLoweringExpr::visit (AST::CompoundAssignmentExpr &expr)
     482                 :             : {
     483                 :         639 :   ArithmeticOrLogicalOperator op;
     484                 :         639 :   switch (expr.get_expr_type ())
     485                 :             :     {
     486                 :             :     case CompoundAssignmentOperator::ADD:
     487                 :             :       op = ArithmeticOrLogicalOperator::ADD;
     488                 :             :       break;
     489                 :             :     case CompoundAssignmentOperator::SUBTRACT:
     490                 :             :       op = ArithmeticOrLogicalOperator::SUBTRACT;
     491                 :             :       break;
     492                 :             :     case CompoundAssignmentOperator::MULTIPLY:
     493                 :             :       op = ArithmeticOrLogicalOperator::MULTIPLY;
     494                 :             :       break;
     495                 :             :     case CompoundAssignmentOperator::DIVIDE:
     496                 :             :       op = ArithmeticOrLogicalOperator::DIVIDE;
     497                 :             :       break;
     498                 :             :     case CompoundAssignmentOperator::MODULUS:
     499                 :             :       op = ArithmeticOrLogicalOperator::MODULUS;
     500                 :             :       break;
     501                 :             :     case CompoundAssignmentOperator::BITWISE_AND:
     502                 :             :       op = ArithmeticOrLogicalOperator::BITWISE_AND;
     503                 :             :       break;
     504                 :             :     case CompoundAssignmentOperator::BITWISE_OR:
     505                 :             :       op = ArithmeticOrLogicalOperator::BITWISE_OR;
     506                 :             :       break;
     507                 :             :     case CompoundAssignmentOperator::BITWISE_XOR:
     508                 :             :       op = ArithmeticOrLogicalOperator::BITWISE_XOR;
     509                 :             :       break;
     510                 :             :     case CompoundAssignmentOperator::LEFT_SHIFT:
     511                 :             :       op = ArithmeticOrLogicalOperator::LEFT_SHIFT;
     512                 :             :       break;
     513                 :             :     case CompoundAssignmentOperator::RIGHT_SHIFT:
     514                 :             :       op = ArithmeticOrLogicalOperator::RIGHT_SHIFT;
     515                 :             :       break;
     516                 :           0 :     default:
     517                 :           0 :       rust_unreachable ();
     518                 :             :     }
     519                 :             : 
     520                 :         639 :   HIR::Expr *asignee_expr = ASTLoweringExpr::translate (expr.get_left_expr ());
     521                 :         639 :   HIR::Expr *value = ASTLoweringExpr::translate (expr.get_right_expr ());
     522                 :             : 
     523                 :         639 :   auto crate_num = mappings.get_current_crate ();
     524                 :        1278 :   Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
     525                 :         639 :                                  mappings.get_next_hir_id (crate_num),
     526                 :         639 :                                  UNKNOWN_LOCAL_DEFID);
     527                 :             : 
     528                 :        1278 :   translated = new HIR::CompoundAssignmentExpr (
     529                 :         639 :     mapping, std::unique_ptr<HIR::Expr> (asignee_expr),
     530                 :        1278 :     std::unique_ptr<HIR::Expr> (value), op, expr.get_locus ());
     531                 :         639 : }
     532                 :             : 
     533                 :             : void
     534                 :          68 : ASTLoweringExpr::visit (AST::StructExprStruct &struct_expr)
     535                 :             : {
     536                 :          68 :   HIR::PathInExpression *path
     537                 :          68 :     = ASTLowerPathInExpression::translate (struct_expr.get_struct_name ());
     538                 :          68 :   HIR::PathInExpression copied_path (*path);
     539                 :          68 :   delete path;
     540                 :             : 
     541                 :          68 :   auto crate_num = mappings.get_current_crate ();
     542                 :         136 :   Analysis::NodeMapping mapping (crate_num, struct_expr.get_node_id (),
     543                 :          68 :                                  mappings.get_next_hir_id (crate_num),
     544                 :          68 :                                  UNKNOWN_LOCAL_DEFID);
     545                 :             : 
     546                 :         136 :   translated = new HIR::StructExprStruct (mapping, copied_path,
     547                 :          68 :                                           struct_expr.get_inner_attrs (),
     548                 :          68 :                                           struct_expr.get_outer_attrs (),
     549                 :          68 :                                           struct_expr.get_locus ());
     550                 :          68 : }
     551                 :             : 
     552                 :             : void
     553                 :        1322 : ASTLoweringExpr::visit (AST::StructExprStructFields &struct_expr)
     554                 :             : {
     555                 :             :   // bit of a hack for now
     556                 :        1322 :   HIR::PathInExpression *path
     557                 :        1322 :     = ASTLowerPathInExpression::translate (struct_expr.get_struct_name ());
     558                 :        1322 :   HIR::PathInExpression copied_path (*path);
     559                 :        1322 :   delete path;
     560                 :             : 
     561                 :        1322 :   tl::optional<std::unique_ptr<HIR::StructBase>> base = tl::nullopt;
     562                 :        1322 :   if (struct_expr.has_struct_base ())
     563                 :             :     {
     564                 :          63 :       HIR::Expr *translated_base = ASTLoweringExpr::translate (
     565                 :          63 :         struct_expr.get_struct_base ().get_base_struct ());
     566                 :          63 :       base = tl::optional<std::unique_ptr<HIR::StructBase>> (
     567                 :         126 :         std::make_unique<StructBase> (
     568                 :         126 :           std::unique_ptr<HIR::Expr> (translated_base)));
     569                 :             :     }
     570                 :             : 
     571                 :        1322 :   auto const &in_fields = struct_expr.get_fields ();
     572                 :        1322 :   std::vector<std::unique_ptr<HIR::StructExprField>> fields;
     573                 :        3601 :   for (auto &field : in_fields)
     574                 :             :     {
     575                 :        2279 :       HIR::StructExprField *translated
     576                 :        2279 :         = ASTLowerStructExprField::translate (*field);
     577                 :        2279 :       fields.push_back (std::unique_ptr<HIR::StructExprField> (translated));
     578                 :             :     }
     579                 :             : 
     580                 :        1322 :   auto crate_num = mappings.get_current_crate ();
     581                 :        2644 :   Analysis::NodeMapping mapping (crate_num, struct_expr.get_node_id (),
     582                 :        1322 :                                  mappings.get_next_hir_id (crate_num),
     583                 :        1322 :                                  UNKNOWN_LOCAL_DEFID);
     584                 :             : 
     585                 :        1322 :   translated
     586                 :        1322 :     = new HIR::StructExprStructFields (mapping, copied_path, std::move (fields),
     587                 :             :                                        struct_expr.get_locus (),
     588                 :             :                                        std::move (base),
     589                 :        1322 :                                        struct_expr.get_inner_attrs (),
     590                 :        2707 :                                        struct_expr.get_outer_attrs ());
     591                 :        1385 : }
     592                 :             : 
     593                 :             : void
     594                 :         290 : ASTLoweringExpr::visit (AST::GroupedExpr &expr)
     595                 :             : {
     596                 :         290 :   HIR::Expr *paren_expr
     597                 :         290 :     = ASTLoweringExpr::translate (expr.get_expr_in_parens ());
     598                 :             : 
     599                 :         290 :   auto crate_num = mappings.get_current_crate ();
     600                 :         580 :   Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
     601                 :         290 :                                  mappings.get_next_hir_id (crate_num),
     602                 :         290 :                                  UNKNOWN_LOCAL_DEFID);
     603                 :             : 
     604                 :         290 :   translated
     605                 :         290 :     = new HIR::GroupedExpr (mapping, std::unique_ptr<HIR::Expr> (paren_expr),
     606                 :         580 :                             expr.get_inner_attrs (), expr.get_outer_attrs (),
     607                 :         580 :                             expr.get_locus ());
     608                 :         290 : }
     609                 :             : 
     610                 :             : void
     611                 :        4932 : ASTLoweringExpr::visit (AST::FieldAccessExpr &expr)
     612                 :             : {
     613                 :        4932 :   HIR::Expr *receiver = ASTLoweringExpr::translate (expr.get_receiver_expr ());
     614                 :             : 
     615                 :        4932 :   auto crate_num = mappings.get_current_crate ();
     616                 :        9864 :   Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
     617                 :        4932 :                                  mappings.get_next_hir_id (crate_num),
     618                 :        4932 :                                  UNKNOWN_LOCAL_DEFID);
     619                 :        4932 :   translated
     620                 :        4932 :     = new HIR::FieldAccessExpr (mapping, std::unique_ptr<HIR::Expr> (receiver),
     621                 :        9864 :                                 expr.get_field_name (), expr.get_outer_attrs (),
     622                 :        9864 :                                 expr.get_locus ());
     623                 :        4932 : }
     624                 :             : 
     625                 :             : void
     626                 :         110 : ASTLoweringExpr::visit (AST::LoopExpr &expr)
     627                 :             : {
     628                 :         110 :   translated = ASTLoweringExprWithBlock::translate (expr, &terminated);
     629                 :         110 : }
     630                 :             : 
     631                 :             : void
     632                 :          66 : ASTLoweringExpr::visit (AST::WhileLoopExpr &expr)
     633                 :             : {
     634                 :          66 :   translated = ASTLoweringExprWithBlock::translate (expr, &terminated);
     635                 :          66 : }
     636                 :             : 
     637                 :             : void
     638                 :          77 : ASTLoweringExpr::visit (AST::BreakExpr &expr)
     639                 :             : {
     640                 :          77 :   tl::optional<HIR::Lifetime> break_label = tl::nullopt;
     641                 :          77 :   if (expr.has_label ())
     642                 :          16 :     break_label = lower_lifetime (expr.get_label_unchecked ().get_lifetime ());
     643                 :             : 
     644                 :          77 :   HIR::Expr *break_expr
     645                 :          77 :     = expr.has_break_expr ()
     646                 :          77 :         ? ASTLoweringExpr::translate (expr.get_break_expr ())
     647                 :             :         : nullptr;
     648                 :             : 
     649                 :          77 :   auto crate_num = mappings.get_current_crate ();
     650                 :         154 :   Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
     651                 :          77 :                                  mappings.get_next_hir_id (crate_num),
     652                 :          77 :                                  UNKNOWN_LOCAL_DEFID);
     653                 :             : 
     654                 :          77 :   translated
     655                 :          77 :     = new HIR::BreakExpr (mapping, expr.get_locus (), std ::move (break_label),
     656                 :          77 :                           std::unique_ptr<HIR::Expr> (break_expr),
     657                 :         154 :                           expr.get_outer_attrs ());
     658                 :          77 : }
     659                 :             : 
     660                 :             : void
     661                 :           9 : ASTLoweringExpr::visit (AST::ContinueExpr &expr)
     662                 :             : {
     663                 :           9 :   tl::optional<HIR::Lifetime> break_label;
     664                 :           9 :   if (expr.has_label ())
     665                 :           0 :     break_label = lower_lifetime (expr.get_label_unchecked ());
     666                 :             : 
     667                 :           9 :   auto crate_num = mappings.get_current_crate ();
     668                 :          18 :   Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
     669                 :           9 :                                  mappings.get_next_hir_id (crate_num),
     670                 :           9 :                                  UNKNOWN_LOCAL_DEFID);
     671                 :             : 
     672                 :           9 :   translated
     673                 :           9 :     = new HIR::ContinueExpr (mapping, expr.get_locus (),
     674                 :          18 :                              std ::move (break_label), expr.get_outer_attrs ());
     675                 :           9 : }
     676                 :             : 
     677                 :             : void
     678                 :        1925 : ASTLoweringExpr::visit (AST::BorrowExpr &expr)
     679                 :             : {
     680                 :        1925 :   HIR::Expr *borrow_lvalue
     681                 :        1925 :     = ASTLoweringExpr::translate (expr.get_borrowed_expr ());
     682                 :             : 
     683                 :        1925 :   auto crate_num = mappings.get_current_crate ();
     684                 :        3850 :   Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
     685                 :        1925 :                                  mappings.get_next_hir_id (crate_num),
     686                 :        1925 :                                  UNKNOWN_LOCAL_DEFID);
     687                 :             : 
     688                 :        1925 :   auto *borrow_expr
     689                 :        1925 :     = new HIR::BorrowExpr (mapping, std::unique_ptr<HIR::Expr> (borrow_lvalue),
     690                 :        1925 :                            expr.get_mutability (), expr.is_raw_borrow (),
     691                 :        1925 :                            expr.get_outer_attrs (), expr.get_locus ());
     692                 :             : 
     693                 :        1925 :   if (expr.get_is_double_borrow ())
     694                 :             :     {
     695                 :          23 :       NodeId artificial_double_borrow_id = mappings.get_next_node_id ();
     696                 :          23 :       Analysis::NodeMapping mapping (crate_num, artificial_double_borrow_id,
     697                 :          23 :                                      mappings.get_next_hir_id (crate_num),
     698                 :          23 :                                      UNKNOWN_LOCAL_DEFID);
     699                 :             : 
     700                 :          23 :       borrow_expr
     701                 :          23 :         = new HIR::BorrowExpr (mapping,
     702                 :          23 :                                std::unique_ptr<HIR::Expr> (borrow_expr),
     703                 :          23 :                                expr.get_mutability (), expr.is_raw_borrow (),
     704                 :          46 :                                expr.get_outer_attrs (), expr.get_locus ());
     705                 :             :     }
     706                 :             : 
     707                 :        1925 :   translated = borrow_expr;
     708                 :        1925 : }
     709                 :             : 
     710                 :             : void
     711                 :        3893 : ASTLoweringExpr::visit (AST::DereferenceExpr &expr)
     712                 :             : {
     713                 :        3893 :   HIR::Expr *dref_lvalue
     714                 :        3893 :     = ASTLoweringExpr::translate (expr.get_dereferenced_expr ());
     715                 :             : 
     716                 :        3893 :   auto crate_num = mappings.get_current_crate ();
     717                 :        7786 :   Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
     718                 :        3893 :                                  mappings.get_next_hir_id (crate_num),
     719                 :        3893 :                                  UNKNOWN_LOCAL_DEFID);
     720                 :             : 
     721                 :        3893 :   translated
     722                 :        3893 :     = new HIR::DereferenceExpr (mapping,
     723                 :        3893 :                                 std::unique_ptr<HIR::Expr> (dref_lvalue),
     724                 :        7786 :                                 expr.get_outer_attrs (), expr.get_locus ());
     725                 :        3893 : }
     726                 :             : 
     727                 :             : void
     728                 :         991 : ASTLoweringExpr::visit (AST::MatchExpr &expr)
     729                 :             : {
     730                 :         991 :   translated = ASTLoweringExprWithBlock::translate (expr, &terminated);
     731                 :         991 : }
     732                 :             : 
     733                 :             : void
     734                 :          66 : ASTLoweringExpr::visit (AST::RangeFromToExpr &expr)
     735                 :             : {
     736                 :          66 :   auto crate_num = mappings.get_current_crate ();
     737                 :         132 :   Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
     738                 :          66 :                                  mappings.get_next_hir_id (crate_num),
     739                 :          66 :                                  UNKNOWN_LOCAL_DEFID);
     740                 :             : 
     741                 :          66 :   HIR::Expr *range_from = ASTLoweringExpr::translate (expr.get_from_expr ());
     742                 :          66 :   HIR::Expr *range_to = ASTLoweringExpr::translate (expr.get_to_expr ());
     743                 :             : 
     744                 :          66 :   translated
     745                 :          66 :     = new HIR::RangeFromToExpr (mapping,
     746                 :          66 :                                 std::unique_ptr<HIR::Expr> (range_from),
     747                 :         132 :                                 std::unique_ptr<HIR::Expr> (range_to),
     748                 :          66 :                                 expr.get_locus ());
     749                 :          66 : }
     750                 :             : 
     751                 :             : void
     752                 :           7 : ASTLoweringExpr::visit (AST::RangeFromExpr &expr)
     753                 :             : {
     754                 :           7 :   auto crate_num = mappings.get_current_crate ();
     755                 :          14 :   Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
     756                 :           7 :                                  mappings.get_next_hir_id (crate_num),
     757                 :           7 :                                  UNKNOWN_LOCAL_DEFID);
     758                 :             : 
     759                 :           7 :   HIR::Expr *range_from = ASTLoweringExpr::translate (expr.get_from_expr ());
     760                 :             : 
     761                 :           7 :   translated
     762                 :           7 :     = new HIR::RangeFromExpr (mapping, std::unique_ptr<HIR::Expr> (range_from),
     763                 :           7 :                               expr.get_locus ());
     764                 :           7 : }
     765                 :             : 
     766                 :             : void
     767                 :           7 : ASTLoweringExpr::visit (AST::RangeToExpr &expr)
     768                 :             : {
     769                 :           7 :   auto crate_num = mappings.get_current_crate ();
     770                 :          14 :   Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
     771                 :           7 :                                  mappings.get_next_hir_id (crate_num),
     772                 :           7 :                                  UNKNOWN_LOCAL_DEFID);
     773                 :             : 
     774                 :           7 :   HIR::Expr *range_to = ASTLoweringExpr::translate (expr.get_to_expr ());
     775                 :             : 
     776                 :           7 :   translated
     777                 :           7 :     = new HIR::RangeToExpr (mapping, std::unique_ptr<HIR::Expr> (range_to),
     778                 :           7 :                             expr.get_locus ());
     779                 :           7 : }
     780                 :             : 
     781                 :             : void
     782                 :           0 : ASTLoweringExpr::visit (AST::RangeFullExpr &expr)
     783                 :             : {
     784                 :           0 :   auto crate_num = mappings.get_current_crate ();
     785                 :           0 :   Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
     786                 :           0 :                                  mappings.get_next_hir_id (crate_num),
     787                 :           0 :                                  UNKNOWN_LOCAL_DEFID);
     788                 :             : 
     789                 :           0 :   translated = new HIR::RangeFullExpr (mapping, expr.get_locus ());
     790                 :           0 : }
     791                 :             : 
     792                 :             : void
     793                 :           7 : ASTLoweringExpr::visit (AST::RangeFromToInclExpr &expr)
     794                 :             : {
     795                 :           7 :   auto crate_num = mappings.get_current_crate ();
     796                 :          14 :   Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
     797                 :           7 :                                  mappings.get_next_hir_id (crate_num),
     798                 :           7 :                                  UNKNOWN_LOCAL_DEFID);
     799                 :             : 
     800                 :           7 :   HIR::Expr *range_from = ASTLoweringExpr::translate (expr.get_from_expr ());
     801                 :           7 :   HIR::Expr *range_to = ASTLoweringExpr::translate (expr.get_to_expr ());
     802                 :             : 
     803                 :           7 :   translated
     804                 :           7 :     = new HIR::RangeFromToInclExpr (mapping,
     805                 :           7 :                                     std::unique_ptr<HIR::Expr> (range_from),
     806                 :          14 :                                     std::unique_ptr<HIR::Expr> (range_to),
     807                 :           7 :                                     expr.get_locus ());
     808                 :           7 : }
     809                 :             : 
     810                 :             : void
     811                 :          33 : ASTLoweringExpr::visit (AST::ClosureExprInner &expr)
     812                 :             : {
     813                 :          33 :   HIR::Expr *closure_expr
     814                 :          33 :     = ASTLoweringExpr::translate (expr.get_definition_expr ());
     815                 :             : 
     816                 :          33 :   std::vector<HIR::ClosureParam> closure_params;
     817                 :          56 :   for (auto &param : expr.get_params ())
     818                 :             :     {
     819                 :          23 :       HIR::ClosureParam p = lower_closure_param (param);
     820                 :          23 :       closure_params.push_back (std::move (p));
     821                 :          23 :     }
     822                 :             : 
     823                 :          33 :   auto crate_num = mappings.get_current_crate ();
     824                 :          66 :   Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
     825                 :          33 :                                  mappings.get_next_hir_id (crate_num),
     826                 :          33 :                                  mappings.get_next_localdef_id (crate_num));
     827                 :             : 
     828                 :          33 :   translated
     829                 :          33 :     = new HIR::ClosureExpr (mapping, std::move (closure_params),
     830                 :             :                             nullptr /* closure_return_type */,
     831                 :          33 :                             std::unique_ptr<HIR::Expr> (closure_expr),
     832                 :          66 :                             expr.get_has_move (), expr.get_outer_attrs (),
     833                 :          33 :                             expr.get_locus ());
     834                 :          33 : }
     835                 :             : 
     836                 :             : void
     837                 :          30 : ASTLoweringExpr::visit (AST::ClosureExprInnerTyped &expr)
     838                 :             : {
     839                 :          30 :   HIR::Type *closure_return_type = nullptr;
     840                 :          30 :   HIR::Expr *closure_expr
     841                 :          30 :     = ASTLoweringExpr::translate (expr.get_definition_expr ());
     842                 :             : 
     843                 :          30 :   std::vector<HIR::ClosureParam> closure_params;
     844                 :          67 :   for (auto &param : expr.get_params ())
     845                 :             :     {
     846                 :          37 :       HIR::ClosureParam p = lower_closure_param (param);
     847                 :          37 :       closure_params.push_back (std::move (p));
     848                 :          37 :     }
     849                 :             : 
     850                 :          30 :   auto crate_num = mappings.get_current_crate ();
     851                 :          60 :   Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
     852                 :          30 :                                  mappings.get_next_hir_id (crate_num),
     853                 :          30 :                                  mappings.get_next_localdef_id (crate_num));
     854                 :             : 
     855                 :          30 :   translated
     856                 :          30 :     = new HIR::ClosureExpr (mapping, std::move (closure_params),
     857                 :          90 :                             std::unique_ptr<HIR::Type> (closure_return_type),
     858                 :          60 :                             std::unique_ptr<HIR::Expr> (closure_expr),
     859                 :          60 :                             expr.get_has_move (), expr.get_outer_attrs (),
     860                 :          60 :                             expr.get_locus ());
     861                 :          30 : }
     862                 :             : 
     863                 :             : HIR::InlineAsmOperand
     864                 :          10 : translate_operand_in (const AST::InlineAsmOperand &operand)
     865                 :             : {
     866                 :          10 :   auto in_value = operand.get_in ();
     867                 :             : 
     868                 :          10 :   struct HIR::InlineAsmOperand::In in (
     869                 :             :     in_value.reg,
     870                 :          10 :     std::unique_ptr<Expr> (ASTLoweringExpr::translate (*in_value.expr.get ())));
     871                 :          10 :   return in;
     872                 :          10 : }
     873                 :             : 
     874                 :             : HIR::InlineAsmOperand
     875                 :          17 : translate_operand_out (const AST::InlineAsmOperand &operand)
     876                 :             : {
     877                 :          17 :   auto out_value = operand.get_out ();
     878                 :          17 :   struct HIR::InlineAsmOperand::Out out (out_value.reg, out_value.late,
     879                 :          17 :                                          std::unique_ptr<Expr> (
     880                 :             :                                            ASTLoweringExpr::translate (
     881                 :          17 :                                              *out_value.expr.get ())));
     882                 :          17 :   return out;
     883                 :          17 : }
     884                 :             : 
     885                 :             : HIR::InlineAsmOperand
     886                 :           0 : translate_operand_inout (const AST::InlineAsmOperand &operand)
     887                 :             : {
     888                 :           0 :   auto inout_value = operand.get_in_out ();
     889                 :           0 :   struct HIR::InlineAsmOperand::InOut inout (inout_value.reg, inout_value.late,
     890                 :           0 :                                              std::unique_ptr<Expr> (
     891                 :             :                                                ASTLoweringExpr::translate (
     892                 :           0 :                                                  *inout_value.expr.get ())));
     893                 :           0 :   return inout;
     894                 :           0 : }
     895                 :             : 
     896                 :             : HIR::InlineAsmOperand
     897                 :           2 : translate_operand_split_in_out (const AST::InlineAsmOperand &operand)
     898                 :             : {
     899                 :           2 :   auto split_in_out_value = operand.get_split_in_out ();
     900                 :           2 :   struct HIR::InlineAsmOperand::SplitInOut split_in_out (
     901                 :           2 :     split_in_out_value.reg, split_in_out_value.late,
     902                 :           2 :     std::unique_ptr<Expr> (
     903                 :           2 :       ASTLoweringExpr::translate (*split_in_out_value.in_expr.get ())),
     904                 :           2 :     std::unique_ptr<Expr> (
     905                 :           2 :       ASTLoweringExpr::translate (*split_in_out_value.out_expr.get ())));
     906                 :           2 :   return split_in_out;
     907                 :           2 : }
     908                 :             : 
     909                 :             : HIR::InlineAsmOperand
     910                 :           0 : translate_operand_const (const AST::InlineAsmOperand &operand)
     911                 :             : {
     912                 :           0 :   auto const_value = operand.get_const ();
     913                 :             : 
     914                 :           0 :   auto inner_expr = ASTLoweringExpr::translate (const_value.anon_const);
     915                 :             : 
     916                 :             :   // Like `ConstBlock`, we know this should only be an `AnonConst` - let's
     917                 :             :   // assert to make sure and static cast
     918                 :           0 :   rust_assert (inner_expr->get_expression_type () == Expr::ExprType::AnonConst);
     919                 :             : 
     920                 :           0 :   auto anon_const = static_cast<AnonConst *> (inner_expr);
     921                 :             : 
     922                 :           0 :   return HIR::InlineAsmOperand::Const{*anon_const};
     923                 :           0 : }
     924                 :             : 
     925                 :             : HIR::InlineAsmOperand
     926                 :           0 : translate_operand_sym (const AST::InlineAsmOperand &operand)
     927                 :             : {
     928                 :           0 :   auto sym_value = operand.get_sym ();
     929                 :           0 :   struct HIR::InlineAsmOperand::Sym sym (std::unique_ptr<Expr> (
     930                 :           0 :     ASTLoweringExpr::translate (*sym_value.expr.get ())));
     931                 :           0 :   return sym;
     932                 :           0 : }
     933                 :             : HIR::InlineAsmOperand
     934                 :           0 : translate_operand_label (const AST::InlineAsmOperand &operand)
     935                 :             : {
     936                 :           0 :   auto label_value = operand.get_label ();
     937                 :           0 :   struct HIR::InlineAsmOperand::Label label (label_value.label_name,
     938                 :           0 :                                              std::unique_ptr<Expr> (
     939                 :             :                                                ASTLoweringExpr::translate (
     940                 :           0 :                                                  *label_value.expr.get ())));
     941                 :           0 :   return label;
     942                 :           0 : }
     943                 :             : HIR::InlineAsmOperand
     944                 :          29 : from_operand (const AST::InlineAsmOperand &operand)
     945                 :             : {
     946                 :          29 :   using RegisterType = AST::InlineAsmOperand::RegisterType;
     947                 :          29 :   auto type = operand.get_register_type ();
     948                 :             : 
     949                 :             :   /*In,*/
     950                 :             :   /*Out,*/
     951                 :             :   /*InOut,*/
     952                 :             :   /*SplitInOut,*/
     953                 :             :   /*Const,*/
     954                 :             :   /*Sym,*/
     955                 :             :   /*Label,*/
     956                 :          29 :   switch (type)
     957                 :             :     {
     958                 :          10 :     case RegisterType::In:
     959                 :          10 :       return translate_operand_in (operand);
     960                 :          17 :     case RegisterType::Out:
     961                 :          17 :       return translate_operand_out (operand);
     962                 :           0 :     case RegisterType::InOut:
     963                 :           0 :       return translate_operand_inout (operand);
     964                 :           2 :     case RegisterType::SplitInOut:
     965                 :           2 :       return translate_operand_split_in_out (operand);
     966                 :           0 :     case RegisterType::Const:
     967                 :           0 :       return translate_operand_const (operand);
     968                 :           0 :     case RegisterType::Sym:
     969                 :           0 :       return translate_operand_sym (operand);
     970                 :           0 :     case RegisterType::Label:
     971                 :           0 :       return translate_operand_label (operand);
     972                 :           0 :     default:
     973                 :           0 :       rust_unreachable ();
     974                 :             :     }
     975                 :             : }
     976                 :             : void
     977                 :          27 : ASTLoweringExpr::visit (AST::InlineAsm &expr)
     978                 :             : {
     979                 :          27 :   auto crate_num = mappings.get_current_crate ();
     980                 :          54 :   Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
     981                 :          27 :                                  mappings.get_next_hir_id (crate_num),
     982                 :          27 :                                  mappings.get_next_localdef_id (crate_num));
     983                 :             : 
     984                 :          27 :   std::vector<HIR::InlineAsmOperand> hir_operands;
     985                 :          27 :   const std::vector<AST::InlineAsmOperand> &ast_operands = expr.get_operands ();
     986                 :             :   /*int ast_operands_size = ast_operands.size ();*/
     987                 :          56 :   for (auto &operand : ast_operands)
     988                 :             :     {
     989                 :          29 :       hir_operands.push_back (from_operand (operand));
     990                 :             :     }
     991                 :             :   /*int hir_operands_size = hir_operands.size ();*/
     992                 :             : 
     993                 :             :   /*rust_debug ("{bdbt} : There are %d ast operands prelowering and %d hir "*/
     994                 :             :   /*     "operands after lowering\n",*/
     995                 :             :   /*     ast_operands_size, hir_operands_size);*/
     996                 :          27 :   translated
     997                 :          54 :     = new HIR::InlineAsm (expr.get_locus (), expr.is_global_asm,
     998                 :          54 :                           expr.get_template_ (), expr.get_template_strs (),
     999                 :          27 :                           hir_operands, expr.get_clobber_abi (),
    1000                 :         108 :                           expr.get_options (), mapping);
    1001                 :          27 : }
    1002                 :             : 
    1003                 :             : void
    1004                 :           2 : ASTLoweringExpr::visit (AST::LlvmInlineAsm &expr)
    1005                 :             : {
    1006                 :           2 :   auto crate_num = mappings.get_current_crate ();
    1007                 :           4 :   Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
    1008                 :           2 :                                  mappings.get_next_hir_id (crate_num),
    1009                 :           2 :                                  mappings.get_next_localdef_id (crate_num));
    1010                 :             : 
    1011                 :           2 :   std::vector<LlvmOperand> inputs;
    1012                 :           2 :   std::vector<LlvmOperand> outputs;
    1013                 :             : 
    1014                 :           4 :   for (auto i : expr.get_inputs ())
    1015                 :             :     {
    1016                 :           2 :       std::unique_ptr<Expr> inner_expr
    1017                 :           2 :         = std::unique_ptr<Expr> (translate (*i.expr.get ()));
    1018                 :           2 :       inputs.emplace_back (i.constraint, std::move (inner_expr));
    1019                 :           4 :     }
    1020                 :             : 
    1021                 :           2 :   for (auto o : expr.get_outputs ())
    1022                 :             :     {
    1023                 :           0 :       std::unique_ptr<Expr> inner_expr
    1024                 :           0 :         = std::unique_ptr<Expr> (translate (*o.expr.get ()));
    1025                 :           0 :       outputs.emplace_back (o.constraint, std::move (inner_expr));
    1026                 :           0 :     }
    1027                 :             : 
    1028                 :           2 :   HIR::LlvmInlineAsm::Options options{expr.is_volatile (),
    1029                 :           2 :                                       expr.is_stack_aligned (),
    1030                 :           2 :                                       expr.get_dialect ()};
    1031                 :             : 
    1032                 :             :   // We're not really supporting llvm_asm, only the bare minimum
    1033                 :             :   // we're quite conservative here as the current code support more usecase.
    1034                 :           2 :   rust_assert (outputs.size () == 0);
    1035                 :           2 :   rust_assert (inputs.size () <= 1);
    1036                 :           2 :   rust_assert (expr.get_clobbers ().size () <= 1);
    1037                 :           2 :   rust_assert (expr.get_templates ().size () == 1);
    1038                 :           2 :   rust_assert (expr.get_templates ()[0].symbol == "");
    1039                 :             : 
    1040                 :           2 :   translated
    1041                 :           4 :     = new HIR::LlvmInlineAsm (expr.get_locus (), inputs, outputs,
    1042                 :           2 :                               expr.get_templates (), expr.get_clobbers (),
    1043                 :           2 :                               options, expr.get_outer_attrs (), mapping);
    1044                 :           2 : }
    1045                 :             : 
    1046                 :             : void
    1047                 :           0 : ASTLoweringExpr::visit (AST::FormatArgs &fmt)
    1048                 :             : {
    1049                 :           0 :   rust_sorry_at (fmt.get_locus (),
    1050                 :             :                  "FormatArgs lowering is not implemented yet");
    1051                 :           0 : }
    1052                 :             : 
    1053                 :             : void
    1054                 :          15 : ASTLoweringExpr::visit (AST::OffsetOf &offset_of)
    1055                 :             : {
    1056                 :          15 :   auto type = std::unique_ptr<Type> (
    1057                 :          15 :     ASTLoweringType::translate (offset_of.get_type ()));
    1058                 :             : 
    1059                 :          15 :   auto crate_num = mappings.get_current_crate ();
    1060                 :          30 :   Analysis::NodeMapping mapping (crate_num, offset_of.get_node_id (),
    1061                 :          15 :                                  mappings.get_next_hir_id (crate_num),
    1062                 :          15 :                                  mappings.get_next_localdef_id (crate_num));
    1063                 :             : 
    1064                 :          15 :   translated = new HIR::OffsetOf (std::move (type), offset_of.get_field (),
    1065                 :          15 :                                   mapping, offset_of.get_locus ());
    1066                 :          15 : }
    1067                 :             : 
    1068                 :             : } // namespace HIR
    1069                 :             : } // namespace Rust
        

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