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