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