Skip to content

Commit 8ed81aa

Browse files
committed
Reinforce termination check for HIR lowering
1 parent d7ef8ee commit 8ed81aa

8 files changed

+112
-66
lines changed

gcc/rust/hir/rust-ast-lower-block.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ class ASTLoweringBlock : public ASTLoweringBase
4242
resolver.translated);
4343
}
4444

45-
*terminated = resolver.terminated;
45+
if (terminated != nullptr)
46+
*terminated = resolver.terminated;
4647
return resolver.translated;
4748
}
4849

@@ -144,8 +145,8 @@ class ASTLoweringExprWithBlock : public ASTLoweringBase
144145
{
145146
std::vector<HIR::Attribute> outer_attribs;
146147
HIR::BlockExpr *loop_block
147-
= ASTLoweringBlock::translate (expr.get_loop_block ().get (),
148-
&terminated);
148+
= ASTLoweringBlock::translate (expr.get_loop_block ().get (), nullptr);
149+
// TODO: Determine whether it is an infinite loop.
149150

150151
HIR::LoopLabel loop_label = lower_loop_label (expr.get_loop_label ());
151152

gcc/rust/hir/rust-ast-lower-expr.h

Lines changed: 69 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ class ASTLoweringExpr : public ASTLoweringBase
8989
using Rust::HIR::ASTLoweringBase::visit;
9090

9191
public:
92-
static HIR::Expr *translate (AST::Expr *expr, bool *terminated = nullptr)
92+
static HIR::Expr *translate (AST::Expr *expr, bool *terminated)
9393
{
9494
ASTLoweringExpr resolver;
9595
expr->accept_vis (resolver);
@@ -140,7 +140,7 @@ class ASTLoweringExpr : public ASTLoweringBase
140140
std::vector<std::unique_ptr<HIR::Expr> > tuple_elements;
141141
for (auto &e : expr.get_tuple_elems ())
142142
{
143-
HIR::Expr *t = ASTLoweringExpr::translate (e.get ());
143+
HIR::Expr *t = ASTLoweringExpr::translate (e.get (), &terminated);
144144
tuple_elements.push_back (std::unique_ptr<HIR::Expr> (t));
145145
}
146146

@@ -182,10 +182,10 @@ class ASTLoweringExpr : public ASTLoweringBase
182182

183183
void visit (AST::ReturnExpr &expr) override
184184
{
185-
terminated = true;
186185
HIR::Expr *return_expr
187186
= expr.has_returned_expr ()
188-
? ASTLoweringExpr::translate (expr.get_returned_expr ().get ())
187+
? ASTLoweringExpr::translate (expr.get_returned_expr ().get (),
188+
&terminated)
189189
: nullptr;
190190

191191
auto crate_num = mappings->get_current_crate ();
@@ -195,16 +195,19 @@ class ASTLoweringExpr : public ASTLoweringBase
195195

196196
translated = new HIR::ReturnExpr (mapping, expr.get_locus (),
197197
std::unique_ptr<HIR::Expr> (return_expr));
198+
terminated = true;
198199
}
199200

200201
void visit (AST::CallExpr &expr) override
201202
{
202203
std::vector<HIR::Attribute> outer_attribs;
203204
HIR::Expr *func
204-
= ASTLoweringExpr::translate (expr.get_function_expr ().get ());
205+
= ASTLoweringExpr::translate (expr.get_function_expr ().get (),
206+
&terminated);
207+
205208
std::vector<std::unique_ptr<HIR::Expr> > params;
206209
expr.iterate_params ([&] (AST::Expr *p) mutable -> bool {
207-
auto trans = ASTLoweringExpr::translate (p);
210+
auto trans = ASTLoweringExpr::translate (p, &terminated);
208211
params.push_back (std::unique_ptr<HIR::Expr> (trans));
209212
return true;
210213
});
@@ -228,11 +231,12 @@ class ASTLoweringExpr : public ASTLoweringBase
228231
= lower_path_expr_seg (expr.get_method_name ());
229232

230233
HIR::Expr *receiver
231-
= ASTLoweringExpr::translate (expr.get_receiver_expr ().get ());
234+
= ASTLoweringExpr::translate (expr.get_receiver_expr ().get (),
235+
&terminated);
232236

233237
std::vector<std::unique_ptr<HIR::Expr> > params;
234238
expr.iterate_params ([&] (AST::Expr *p) mutable -> bool {
235-
auto trans = ASTLoweringExpr::translate (p);
239+
auto trans = ASTLoweringExpr::translate (p, &terminated);
236240
params.push_back (std::unique_ptr<HIR::Expr> (trans));
237241
return true;
238242
});
@@ -250,8 +254,10 @@ class ASTLoweringExpr : public ASTLoweringBase
250254

251255
void visit (AST::AssignmentExpr &expr) override
252256
{
253-
HIR::Expr *lhs = ASTLoweringExpr::translate (expr.get_left_expr ().get ());
254-
HIR::Expr *rhs = ASTLoweringExpr::translate (expr.get_right_expr ().get ());
257+
HIR::Expr *lhs
258+
= ASTLoweringExpr::translate (expr.get_left_expr ().get (), &terminated);
259+
HIR::Expr *rhs
260+
= ASTLoweringExpr::translate (expr.get_right_expr ().get (), &terminated);
255261

256262
auto crate_num = mappings->get_current_crate ();
257263
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
@@ -280,6 +286,7 @@ class ASTLoweringExpr : public ASTLoweringBase
280286
std::vector<HIR::Attribute> inner_attribs;
281287

282288
expr.get_array_elems ()->accept_vis (*this);
289+
283290
rust_assert (translated_array_elems != nullptr);
284291
HIR::ArrayElems *elems = translated_array_elems;
285292

@@ -296,10 +303,11 @@ class ASTLoweringExpr : public ASTLoweringBase
296303
void visit (AST::ArrayIndexExpr &expr) override
297304
{
298305
std::vector<Attribute> outer_attribs;
306+
299307
HIR::Expr *array_expr
300-
= ASTLoweringExpr::translate (expr.get_array_expr ().get ());
308+
= ASTLoweringExpr::translate (expr.get_array_expr ().get (), &terminated);
301309
HIR::Expr *array_index_expr
302-
= ASTLoweringExpr::translate (expr.get_index_expr ().get ());
310+
= ASTLoweringExpr::translate (expr.get_index_expr ().get (), &terminated);
303311

304312
auto crate_num = mappings->get_current_crate ();
305313
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
@@ -317,7 +325,8 @@ class ASTLoweringExpr : public ASTLoweringBase
317325
{
318326
std::vector<std::unique_ptr<HIR::Expr> > elements;
319327
elems.iterate ([&] (AST::Expr *elem) mutable -> bool {
320-
HIR::Expr *translated_elem = ASTLoweringExpr::translate (elem);
328+
HIR::Expr *translated_elem
329+
= ASTLoweringExpr::translate (elem, &terminated);
321330
elements.push_back (std::unique_ptr<HIR::Expr> (translated_elem));
322331
return true;
323332
});
@@ -328,9 +337,12 @@ class ASTLoweringExpr : public ASTLoweringBase
328337
void visit (AST::ArrayElemsCopied &elems) override
329338
{
330339
HIR::Expr *element
331-
= ASTLoweringExpr::translate (elems.get_elem_to_copy ().get ());
340+
= ASTLoweringExpr::translate (elems.get_elem_to_copy ().get (),
341+
&terminated);
342+
332343
HIR::Expr *num_copies
333-
= ASTLoweringExpr::translate (elems.get_num_copies ().get ());
344+
= ASTLoweringExpr::translate (elems.get_num_copies ().get (),
345+
&terminated);
334346

335347
size_t folded;
336348
if (!ArrayCapacityConstant::fold (elems.get_num_copies ().get (), &folded))
@@ -339,6 +351,7 @@ class ASTLoweringExpr : public ASTLoweringBase
339351
"failed to fold capacity constant");
340352
return;
341353
}
354+
rust_assert (!terminated);
342355

343356
translated_array_elems
344357
= new HIR::ArrayElemsCopied (std::unique_ptr<HIR::Expr> (element),
@@ -391,9 +404,11 @@ class ASTLoweringExpr : public ASTLoweringBase
391404

392405
void visit (AST::ArithmeticOrLogicalExpr &expr) override
393406
{
394-
HIR::Expr *lhs = ASTLoweringExpr::translate (expr.get_left_expr ().get ());
407+
HIR::Expr *lhs
408+
= ASTLoweringExpr::translate (expr.get_left_expr ().get (), &terminated);
395409
rust_assert (lhs != nullptr);
396-
HIR::Expr *rhs = ASTLoweringExpr::translate (expr.get_right_expr ().get ());
410+
HIR::Expr *rhs
411+
= ASTLoweringExpr::translate (expr.get_right_expr ().get (), &terminated);
397412
rust_assert (rhs != nullptr);
398413

399414
auto crate_num = mappings->get_current_crate ();
@@ -411,9 +426,11 @@ class ASTLoweringExpr : public ASTLoweringBase
411426

412427
void visit (AST::ComparisonExpr &expr) override
413428
{
414-
HIR::Expr *lhs = ASTLoweringExpr::translate (expr.get_left_expr ().get ());
429+
HIR::Expr *lhs
430+
= ASTLoweringExpr::translate (expr.get_left_expr ().get (), &terminated);
415431
rust_assert (lhs != nullptr);
416-
HIR::Expr *rhs = ASTLoweringExpr::translate (expr.get_right_expr ().get ());
432+
HIR::Expr *rhs
433+
= ASTLoweringExpr::translate (expr.get_right_expr ().get (), &terminated);
417434
rust_assert (rhs != nullptr);
418435

419436
auto crate_num = mappings->get_current_crate ();
@@ -429,9 +446,13 @@ class ASTLoweringExpr : public ASTLoweringBase
429446

430447
void visit (AST::LazyBooleanExpr &expr) override
431448
{
432-
HIR::Expr *lhs = ASTLoweringExpr::translate (expr.get_left_expr ().get ());
449+
// FIXME: The termination check is not correct and neither the codegen.
450+
// See also Rust::Compile::CompileExpr::visit (Rust::HIR::LazyBooleanExpr&).
451+
HIR::Expr *lhs
452+
= ASTLoweringExpr::translate (expr.get_left_expr ().get (), &terminated);
433453
rust_assert (lhs != nullptr);
434-
HIR::Expr *rhs = ASTLoweringExpr::translate (expr.get_right_expr ().get ());
454+
HIR::Expr *rhs
455+
= ASTLoweringExpr::translate (expr.get_right_expr ().get (), &terminated);
435456
rust_assert (rhs != nullptr);
436457

437458
auto crate_num = mappings->get_current_crate ();
@@ -450,7 +471,8 @@ class ASTLoweringExpr : public ASTLoweringBase
450471
std::vector<HIR::Attribute> outer_attribs;
451472

452473
HIR::Expr *negated_value
453-
= ASTLoweringExpr::translate (expr.get_negated_expr ().get ());
474+
= ASTLoweringExpr::translate (expr.get_negated_expr ().get (),
475+
&terminated);
454476

455477
auto crate_num = mappings->get_current_crate ();
456478
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
@@ -505,22 +527,25 @@ class ASTLoweringExpr : public ASTLoweringBase
505527
gcc_unreachable ();
506528
}
507529

508-
HIR::Expr *asignee_expr
509-
= ASTLoweringExpr::translate (expr.get_left_expr ().get ());
530+
HIR::Expr *assignee_expr
531+
= ASTLoweringExpr::translate (expr.get_left_expr ().get (), &terminated);
532+
rust_assert (!terminated);
533+
510534
HIR::Expr *value
511-
= ASTLoweringExpr::translate (expr.get_right_expr ().get ());
535+
= ASTLoweringExpr::translate (expr.get_right_expr ().get (), &terminated);
512536

513537
auto crate_num = mappings->get_current_crate ();
514538
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
515539
mappings->get_next_hir_id (crate_num),
516540
UNKNOWN_LOCAL_DEFID);
541+
517542
HIR::Expr *operator_expr
518-
= new HIR::ArithmeticOrLogicalExpr (mapping, asignee_expr->clone_expr (),
543+
= new HIR::ArithmeticOrLogicalExpr (mapping, assignee_expr->clone_expr (),
519544
std::unique_ptr<HIR::Expr> (value),
520545
op, expr.get_locus ());
521546
translated
522547
= new HIR::AssignmentExpr (mapping,
523-
std::unique_ptr<HIR::Expr> (asignee_expr),
548+
std::unique_ptr<HIR::Expr> (assignee_expr),
524549
std::unique_ptr<HIR::Expr> (operator_expr),
525550
expr.get_locus ());
526551
}
@@ -540,15 +565,18 @@ class ASTLoweringExpr : public ASTLoweringBase
540565
if (struct_expr.has_struct_base ())
541566
{
542567
HIR::Expr *translated_base = ASTLoweringExpr::translate (
543-
struct_expr.get_struct_base ().get_base_struct ().get ());
568+
struct_expr.get_struct_base ().get_base_struct ().get (),
569+
&terminated);
570+
rust_assert (!terminated);
571+
544572
base
545573
= new HIR::StructBase (std::unique_ptr<HIR::Expr> (translated_base));
546574
}
547575

548576
std::vector<std::unique_ptr<HIR::StructExprField> > fields;
549577
struct_expr.iterate ([&] (AST::StructExprField *field) mutable -> bool {
550578
HIR::StructExprField *translated
551-
= ASTLowerStructExprField::translate (field);
579+
= ASTLowerStructExprField::translate (field, &terminated);
552580
fields.push_back (std::unique_ptr<HIR::StructExprField> (translated));
553581
return true;
554582
});
@@ -571,7 +599,8 @@ class ASTLoweringExpr : public ASTLoweringBase
571599
std::vector<HIR::Attribute> outer_attribs;
572600

573601
HIR::Expr *paren_expr
574-
= ASTLoweringExpr::translate (expr.get_expr_in_parens ().get ());
602+
= ASTLoweringExpr::translate (expr.get_expr_in_parens ().get (),
603+
&terminated);
575604

576605
auto crate_num = mappings->get_current_crate ();
577606
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
@@ -590,7 +619,8 @@ class ASTLoweringExpr : public ASTLoweringBase
590619
std::vector<HIR::Attribute> outer_attribs;
591620

592621
HIR::Expr *receiver
593-
= ASTLoweringExpr::translate (expr.get_receiver_expr ().get ());
622+
= ASTLoweringExpr::translate (expr.get_receiver_expr ().get (),
623+
&terminated);
594624

595625
auto crate_num = mappings->get_current_crate ();
596626
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
@@ -619,7 +649,8 @@ class ASTLoweringExpr : public ASTLoweringBase
619649
HIR::Lifetime break_label = lower_lifetime (expr.get_label ());
620650
HIR::Expr *break_expr
621651
= expr.has_break_expr ()
622-
? ASTLoweringExpr::translate (expr.get_break_expr ().get ())
652+
? ASTLoweringExpr::translate (expr.get_break_expr ().get (),
653+
&terminated)
623654
: nullptr;
624655

625656
auto crate_num = mappings->get_current_crate ();
@@ -631,6 +662,7 @@ class ASTLoweringExpr : public ASTLoweringBase
631662
std ::move (break_label),
632663
std::unique_ptr<HIR::Expr> (break_expr),
633664
std::move (outer_attribs));
665+
terminated = true;
634666
}
635667

636668
void visit (AST::ContinueExpr &expr) override
@@ -646,14 +678,16 @@ class ASTLoweringExpr : public ASTLoweringBase
646678
translated = new HIR::ContinueExpr (mapping, expr.get_locus (),
647679
std ::move (break_label),
648680
std::move (outer_attribs));
681+
terminated = true;
649682
}
650683

651684
void visit (AST::BorrowExpr &expr) override
652685
{
653686
std::vector<HIR::Attribute> outer_attribs;
654687

655688
HIR::Expr *borrow_lvalue
656-
= ASTLoweringExpr::translate (expr.get_borrowed_expr ().get ());
689+
= ASTLoweringExpr::translate (expr.get_borrowed_expr ().get (),
690+
&terminated);
657691

658692
auto crate_num = mappings->get_current_crate ();
659693
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
@@ -672,7 +706,8 @@ class ASTLoweringExpr : public ASTLoweringBase
672706
std::vector<HIR::Attribute> outer_attribs;
673707

674708
HIR::Expr *dref_lvalue
675-
= ASTLoweringExpr::translate (expr.get_dereferenced_expr ().get ());
709+
= ASTLoweringExpr::translate (expr.get_dereferenced_expr ().get (),
710+
&terminated);
676711

677712
auto crate_num = mappings->get_current_crate ();
678713
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),

gcc/rust/hir/rust-ast-lower-implitem.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ class ASTLowerImplItem : public ASTLoweringBase
6464
HIR::Visibility vis = HIR::Visibility::create_public ();
6565

6666
HIR::Type *type = ASTLoweringType::translate (constant.get_type ().get ());
67-
HIR::Expr *expr = ASTLoweringExpr::translate (constant.get_expr ().get ());
67+
HIR::Expr *expr
68+
= ASTLoweringExpr::translate (constant.get_expr ().get (), nullptr);
6869

6970
auto crate_num = mappings->get_current_crate ();
7071
Analysis::NodeMapping mapping (crate_num, constant.get_node_id (),

gcc/rust/hir/rust-ast-lower-item.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,8 @@ class ASTLoweringItem : public ASTLoweringBase
205205
HIR::Visibility vis = HIR::Visibility::create_public ();
206206

207207
HIR::Type *type = ASTLoweringType::translate (var.get_type ().get ());
208-
HIR::Expr *expr = ASTLoweringExpr::translate (var.get_expr ().get ());
208+
HIR::Expr *expr
209+
= ASTLoweringExpr::translate (var.get_expr ().get (), nullptr);
209210

210211
auto crate_num = mappings->get_current_crate ();
211212
Analysis::NodeMapping mapping (crate_num, var.get_node_id (),
@@ -231,7 +232,8 @@ class ASTLoweringItem : public ASTLoweringBase
231232
HIR::Visibility vis = HIR::Visibility::create_public ();
232233

233234
HIR::Type *type = ASTLoweringType::translate (constant.get_type ().get ());
234-
HIR::Expr *expr = ASTLoweringExpr::translate (constant.get_expr ().get ());
235+
HIR::Expr *expr
236+
= ASTLoweringExpr::translate (constant.get_expr ().get (), nullptr);
235237

236238
auto crate_num = mappings->get_current_crate ();
237239
Analysis::NodeMapping mapping (crate_num, constant.get_node_id (),

gcc/rust/hir/rust-ast-lower-stmt.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ class ASTLoweringStmt : public ASTLoweringBase
5959
translated
6060
= new HIR::ExprStmtWithBlock (mapping,
6161
std::unique_ptr<HIR::ExprWithBlock> (expr),
62-
stmt.get_locus ());
62+
stmt.get_locus (),
63+
!stmt.is_semicolon_followed ());
6364
mappings->insert_location (crate_num, mapping.get_hirid (),
6465
stmt.get_locus ());
6566
mappings->insert_hir_stmt (crate_num, mapping.get_hirid (), translated);
@@ -93,7 +94,8 @@ class ASTLoweringStmt : public ASTLoweringBase
9394
: nullptr;
9495
HIR::Expr *init_expression
9596
= stmt.has_init_expr ()
96-
? ASTLoweringExpr::translate (stmt.get_init_expr ().get ())
97+
? ASTLoweringExpr::translate (stmt.get_init_expr ().get (),
98+
&terminated)
9799
: nullptr;
98100

99101
auto crate_num = mappings->get_current_crate ();

0 commit comments

Comments
 (0)