(root)/
gcc-13.2.0/
gcc/
rust/
backend/
rust-compile-block.h
       1  // Copyright (C) 2020-2023 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  #ifndef RUST_COMPILE_BLOCK
      20  #define RUST_COMPILE_BLOCK
      21  
      22  #include "rust-compile-base.h"
      23  
      24  namespace Rust {
      25  namespace Compile {
      26  
      27  class CompileBlock : private HIRCompileBase
      28  {
      29  public:
      30    static tree compile (HIR::BlockExpr *expr, Context *ctx, Bvariable *result);
      31  
      32  protected:
      33    void visit (HIR::BlockExpr &expr);
      34  
      35  private:
      36    CompileBlock (Context *ctx, Bvariable *result);
      37  
      38    tree translated;
      39    Bvariable *result;
      40  };
      41  
      42  class CompileConditionalBlocks : public HIRCompileBase,
      43  				 public HIR::HIRExpressionVisitor
      44  {
      45  public:
      46    static tree compile (HIR::IfExpr *expr, Context *ctx, Bvariable *result)
      47    {
      48      CompileConditionalBlocks resolver (ctx, result);
      49      expr->accept_vis (resolver);
      50      return resolver.translated;
      51    }
      52  
      53    void visit (HIR::IfExpr &expr) override;
      54    void visit (HIR::IfExprConseqElse &expr) override;
      55    void visit (HIR::IfExprConseqIf &expr) override;
      56  
      57    // Empty visit for unused Expression HIR nodes.
      58    void visit (HIR::PathInExpression &) override {}
      59    void visit (HIR::QualifiedPathInExpression &) override {}
      60    void visit (HIR::ClosureExpr &) override {}
      61    void visit (HIR::StructExprFieldIdentifier &) override {}
      62    void visit (HIR::StructExprFieldIdentifierValue &) override {}
      63    void visit (HIR::StructExprFieldIndexValue &) override {}
      64    void visit (HIR::StructExprStruct &) override {}
      65    void visit (HIR::StructExprStructFields &) override {}
      66    void visit (HIR::LiteralExpr &) override {}
      67    void visit (HIR::BorrowExpr &) override {}
      68    void visit (HIR::DereferenceExpr &) override {}
      69    void visit (HIR::ErrorPropagationExpr &) override {}
      70    void visit (HIR::NegationExpr &) override {}
      71    void visit (HIR::ArithmeticOrLogicalExpr &) override {}
      72    void visit (HIR::ComparisonExpr &) override {}
      73    void visit (HIR::LazyBooleanExpr &) override {}
      74    void visit (HIR::TypeCastExpr &) override {}
      75    void visit (HIR::AssignmentExpr &) override {}
      76    void visit (HIR::CompoundAssignmentExpr &) override {}
      77    void visit (HIR::GroupedExpr &) override {}
      78    void visit (HIR::ArrayExpr &) override {}
      79    void visit (HIR::ArrayIndexExpr &) override {}
      80    void visit (HIR::TupleExpr &) override {}
      81    void visit (HIR::TupleIndexExpr &) override {}
      82    void visit (HIR::CallExpr &) override {}
      83    void visit (HIR::MethodCallExpr &) override {}
      84    void visit (HIR::FieldAccessExpr &) override {}
      85    void visit (HIR::BlockExpr &) override {}
      86    void visit (HIR::ContinueExpr &) override {}
      87    void visit (HIR::BreakExpr &) override {}
      88    void visit (HIR::RangeFromToExpr &) override {}
      89    void visit (HIR::RangeFromExpr &) override {}
      90    void visit (HIR::RangeToExpr &) override {}
      91    void visit (HIR::RangeFullExpr &) override {}
      92    void visit (HIR::RangeFromToInclExpr &) override {}
      93    void visit (HIR::RangeToInclExpr &) override {}
      94    void visit (HIR::ReturnExpr &) override {}
      95    void visit (HIR::UnsafeBlockExpr &) override {}
      96    void visit (HIR::LoopExpr &) override {}
      97    void visit (HIR::WhileLoopExpr &) override {}
      98    void visit (HIR::WhileLetLoopExpr &) override {}
      99    void visit (HIR::ForLoopExpr &) override {}
     100    void visit (HIR::IfExprConseqIfLet &) override {}
     101    void visit (HIR::IfLetExpr &) override {}
     102    void visit (HIR::IfLetExprConseqElse &) override {}
     103    void visit (HIR::IfLetExprConseqIf &) override {}
     104    void visit (HIR::IfLetExprConseqIfLet &) override {}
     105    void visit (HIR::MatchExpr &) override {}
     106    void visit (HIR::AwaitExpr &) override {}
     107    void visit (HIR::AsyncBlockExpr &) override {}
     108  
     109  private:
     110    CompileConditionalBlocks (Context *ctx, Bvariable *result)
     111      : HIRCompileBase (ctx), translated (nullptr), result (result)
     112    {}
     113  
     114    tree translated;
     115    Bvariable *result;
     116  };
     117  
     118  class CompileExprWithBlock : public HIRCompileBase,
     119  			     public HIR::HIRExpressionVisitor
     120  {
     121  public:
     122    static tree compile (HIR::ExprWithBlock *expr, Context *ctx,
     123  		       Bvariable *result)
     124    {
     125      CompileExprWithBlock resolver (ctx, result);
     126      expr->accept_vis (resolver);
     127      return resolver.translated;
     128    }
     129  
     130    void visit (HIR::IfExpr &expr) override
     131    {
     132      translated = CompileConditionalBlocks::compile (&expr, ctx, result);
     133    }
     134  
     135    void visit (HIR::IfExprConseqElse &expr) override
     136    {
     137      translated = CompileConditionalBlocks::compile (&expr, ctx, result);
     138    }
     139  
     140    void visit (HIR::IfExprConseqIf &expr) override
     141    {
     142      translated = CompileConditionalBlocks::compile (&expr, ctx, result);
     143    }
     144  
     145    // Empty visit for unused Expression HIR nodes.
     146    void visit (HIR::PathInExpression &) override {}
     147    void visit (HIR::QualifiedPathInExpression &) override {}
     148    void visit (HIR::ClosureExpr &) override {}
     149    void visit (HIR::StructExprFieldIdentifier &) override {}
     150    void visit (HIR::StructExprFieldIdentifierValue &) override {}
     151    void visit (HIR::StructExprFieldIndexValue &) override {}
     152    void visit (HIR::StructExprStruct &) override {}
     153    void visit (HIR::StructExprStructFields &) override {}
     154    void visit (HIR::LiteralExpr &) override {}
     155    void visit (HIR::BorrowExpr &) override {}
     156    void visit (HIR::DereferenceExpr &) override {}
     157    void visit (HIR::ErrorPropagationExpr &) override {}
     158    void visit (HIR::NegationExpr &) override {}
     159    void visit (HIR::ArithmeticOrLogicalExpr &) override {}
     160    void visit (HIR::ComparisonExpr &) override {}
     161    void visit (HIR::LazyBooleanExpr &) override {}
     162    void visit (HIR::TypeCastExpr &) override {}
     163    void visit (HIR::AssignmentExpr &) override {}
     164    void visit (HIR::CompoundAssignmentExpr &) override {}
     165    void visit (HIR::GroupedExpr &) override {}
     166    void visit (HIR::ArrayExpr &) override {}
     167    void visit (HIR::ArrayIndexExpr &) override {}
     168    void visit (HIR::TupleExpr &) override {}
     169    void visit (HIR::TupleIndexExpr &) override {}
     170    void visit (HIR::CallExpr &) override {}
     171    void visit (HIR::MethodCallExpr &) override {}
     172    void visit (HIR::FieldAccessExpr &) override {}
     173    void visit (HIR::BlockExpr &) override {}
     174    void visit (HIR::ContinueExpr &) override {}
     175    void visit (HIR::BreakExpr &) override {}
     176    void visit (HIR::RangeFromToExpr &) override {}
     177    void visit (HIR::RangeFromExpr &) override {}
     178    void visit (HIR::RangeToExpr &) override {}
     179    void visit (HIR::RangeFullExpr &) override {}
     180    void visit (HIR::RangeFromToInclExpr &) override {}
     181    void visit (HIR::RangeToInclExpr &) override {}
     182    void visit (HIR::ReturnExpr &) override {}
     183    void visit (HIR::UnsafeBlockExpr &) override {}
     184    void visit (HIR::LoopExpr &) override {}
     185    void visit (HIR::WhileLoopExpr &) override {}
     186    void visit (HIR::WhileLetLoopExpr &) override {}
     187    void visit (HIR::ForLoopExpr &) override {}
     188    void visit (HIR::IfExprConseqIfLet &) override {}
     189    void visit (HIR::IfLetExpr &) override {}
     190    void visit (HIR::IfLetExprConseqElse &) override {}
     191    void visit (HIR::IfLetExprConseqIf &) override {}
     192    void visit (HIR::IfLetExprConseqIfLet &) override {}
     193    void visit (HIR::MatchExpr &) override {}
     194    void visit (HIR::AwaitExpr &) override {}
     195    void visit (HIR::AsyncBlockExpr &) override {}
     196  
     197  private:
     198    CompileExprWithBlock (Context *ctx, Bvariable *result)
     199      : HIRCompileBase (ctx), translated (nullptr), result (result)
     200    {}
     201  
     202    tree translated;
     203    Bvariable *result;
     204  };
     205  
     206  } // namespace Compile
     207  } // namespace Rust
     208  
     209  #endif // RUST_COMPILE_BLOCK