1 // Copyright (C) 2020-2023 Free Software Foundation, Inc.
3 // This file is part of GCC.
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
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
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/>.
19 #ifndef RUST_BIR_BUILDER_EXPR_H
20 #define RUST_BIR_BUILDER_EXPR_H
22 #include "rust-hir-visitor.h"
23 #include "rust-bir-builder-internal.h"
29 * Compiles expressions into a BIR place.
30 * See AbstractExprBuilder for API usage docs (mainly `return_place` and
33 class ExprStmtBuilder
: public AbstractExprBuilder
, public HIR::HIRStmtVisitor
36 explicit ExprStmtBuilder (BuilderContext
&ctx
) : AbstractExprBuilder (ctx
) {}
39 PlaceId
build (HIR::Expr
&expr
, PlaceId place
= INVALID_PLACE
)
41 return visit_expr (expr
, place
);
46 std::vector
<PlaceId
> visit_list (std::vector
<std::unique_ptr
<T
>> &list
)
48 std::vector
<PlaceId
> result
;
49 for (auto &elem
: list
)
51 result
.push_back (visit_expr (*elem
));
56 /** Common infrastructure for loops. */
57 BuilderContext::LoopAndLabelCtx
&setup_loop (HIR::BaseLoopExpr
&expr
);
59 BuilderContext::LoopAndLabelCtx
&get_label_ctx (HIR::Lifetime
&label
);
60 BuilderContext::LoopAndLabelCtx
&get_unnamed_loop_ctx ();
63 void visit (HIR::ClosureExpr
&expr
) override
;
64 void visit (HIR::StructExprStructFields
&fields
) override
;
65 void visit (HIR::StructExprStruct
&expr
) override
;
66 void visit (HIR::LiteralExpr
&expr
) override
;
67 void visit (HIR::BorrowExpr
&expr
) override
;
68 void visit (HIR::DereferenceExpr
&expr
) override
;
69 void visit (HIR::ErrorPropagationExpr
&expr
) override
;
70 void visit (HIR::NegationExpr
&expr
) override
;
71 void visit (HIR::ArithmeticOrLogicalExpr
&expr
) override
;
72 void visit (HIR::ComparisonExpr
&expr
) override
;
73 void visit (HIR::LazyBooleanExpr
&expr
) override
;
74 void visit (HIR::TypeCastExpr
&expr
) override
;
75 void visit (HIR::AssignmentExpr
&expr
) override
;
76 void visit (HIR::CompoundAssignmentExpr
&expr
) override
;
77 void visit (HIR::GroupedExpr
&expr
) override
;
78 void visit (HIR::ArrayExpr
&expr
) override
;
79 void visit (HIR::ArrayIndexExpr
&expr
) override
;
80 void visit (HIR::TupleExpr
&expr
) override
;
81 void visit (HIR::TupleIndexExpr
&expr
) override
;
82 void visit (HIR::CallExpr
&expr
) override
;
83 void visit (HIR::MethodCallExpr
&expr
) override
;
84 void visit (HIR::FieldAccessExpr
&expr
) override
;
85 void visit (HIR::BlockExpr
&block
) override
;
86 void visit (HIR::ContinueExpr
&cont
) override
;
87 void visit (HIR::BreakExpr
&brk
) override
;
88 void visit (HIR::RangeFromToExpr
&range
) override
;
89 void visit (HIR::RangeFromExpr
&expr
) override
;
90 void visit (HIR::RangeToExpr
&expr
) override
;
91 void visit (HIR::RangeFullExpr
&expr
) override
;
92 void visit (HIR::RangeFromToInclExpr
&expr
) override
;
93 void visit (HIR::RangeToInclExpr
&expr
) override
;
94 void visit (HIR::ReturnExpr
&ret
) override
;
95 void visit (HIR::UnsafeBlockExpr
&expr
) override
;
96 void visit (HIR::LoopExpr
&expr
) override
;
97 void visit (HIR::WhileLoopExpr
&expr
) override
;
98 void visit (HIR::WhileLetLoopExpr
&expr
) override
;
99 void visit (HIR::IfExpr
&expr
) override
;
100 void visit (HIR::IfExprConseqElse
&expr
) override
;
102 void visit (HIR::IfLetExpr
&expr
) override
;
103 void visit (HIR::IfLetExprConseqElse
&expr
) override
;
104 void visit (HIR::MatchExpr
&expr
) override
;
105 void visit (HIR::AwaitExpr
&expr
) override
;
106 void visit (HIR::AsyncBlockExpr
&expr
) override
;
108 protected: // Nodes not containing executable code. Nothing to do.
109 void visit (HIR::QualifiedPathInExpression
&expr
) override
;
110 void visit (HIR::PathInExpression
&expr
) override
;
112 protected: // Handled by other visitors
113 void visit (HIR::StructExprFieldIdentifier
&field
) override
117 void visit (HIR::StructExprFieldIdentifierValue
&field
) override
121 void visit (HIR::StructExprFieldIndexValue
&field
) override
127 void visit (HIR::LetStmt
&stmt
) override
;
129 void visit (HIR::ExprStmt
&stmt
) override
;
131 protected: // Ignored.
132 // Only executable code of a single function/method is translated.
133 void visit (HIR::EnumItemTuple
&tuple
) override
{}
134 void visit (HIR::EnumItemStruct
&a_struct
) override
{}
135 void visit (HIR::EnumItem
&item
) override
{}
136 void visit (HIR::TupleStruct
&tuple_struct
) override
{}
137 void visit (HIR::EnumItemDiscriminant
&discriminant
) override
{}
138 void visit (HIR::TypePathSegmentFunction
&segment
) override
{}
139 void visit (HIR::TypePath
&path
) override
{}
140 void visit (HIR::QualifiedPathInType
&path
) override
{}
141 void visit (HIR::Module
&module
) override
{}
142 void visit (HIR::ExternCrate
&crate
) override
{}
143 void visit (HIR::UseDeclaration
&use_decl
) override
{}
144 void visit (HIR::Function
&function
) override
{}
145 void visit (HIR::TypeAlias
&type_alias
) override
{}
146 void visit (HIR::StructStruct
&struct_item
) override
{}
147 void visit (HIR::Enum
&enum_item
) override
{}
148 void visit (HIR::Union
&union_item
) override
{}
149 void visit (HIR::ConstantItem
&const_item
) override
{}
150 void visit (HIR::StaticItem
&static_item
) override
{}
151 void visit (HIR::Trait
&trait
) override
{}
152 void visit (HIR::ImplBlock
&impl
) override
{}
153 void visit (HIR::ExternBlock
&block
) override
{}
154 void visit (HIR::EmptyStmt
&stmt
) override
{}
160 #endif // RUST_BIR_BUILDER_EXPR_H