@@ -89,7 +89,7 @@ class ASTLoweringExpr : public ASTLoweringBase
89
89
using Rust::HIR::ASTLoweringBase::visit;
90
90
91
91
public:
92
- static HIR::Expr *translate (AST::Expr *expr, bool *terminated = nullptr )
92
+ static HIR::Expr *translate (AST::Expr *expr, bool *terminated)
93
93
{
94
94
ASTLoweringExpr resolver;
95
95
expr->accept_vis (resolver);
@@ -140,7 +140,7 @@ class ASTLoweringExpr : public ASTLoweringBase
140
140
std::vector<std::unique_ptr<HIR::Expr> > tuple_elements;
141
141
for (auto &e : expr.get_tuple_elems ())
142
142
{
143
- HIR::Expr *t = ASTLoweringExpr::translate (e.get ());
143
+ HIR::Expr *t = ASTLoweringExpr::translate (e.get (), &terminated );
144
144
tuple_elements.push_back (std::unique_ptr<HIR::Expr> (t));
145
145
}
146
146
@@ -182,10 +182,10 @@ class ASTLoweringExpr : public ASTLoweringBase
182
182
183
183
void visit (AST::ReturnExpr &expr) override
184
184
{
185
- terminated = true ;
186
185
HIR::Expr *return_expr
187
186
= expr.has_returned_expr ()
188
- ? ASTLoweringExpr::translate (expr.get_returned_expr ().get ())
187
+ ? ASTLoweringExpr::translate (expr.get_returned_expr ().get (),
188
+ &terminated)
189
189
: nullptr ;
190
190
191
191
auto crate_num = mappings->get_current_crate ();
@@ -195,16 +195,19 @@ class ASTLoweringExpr : public ASTLoweringBase
195
195
196
196
translated = new HIR::ReturnExpr (mapping, expr.get_locus (),
197
197
std::unique_ptr<HIR::Expr> (return_expr));
198
+ terminated = true ;
198
199
}
199
200
200
201
void visit (AST::CallExpr &expr) override
201
202
{
202
203
std::vector<HIR::Attribute> outer_attribs;
203
204
HIR::Expr *func
204
- = ASTLoweringExpr::translate (expr.get_function_expr ().get ());
205
+ = ASTLoweringExpr::translate (expr.get_function_expr ().get (),
206
+ &terminated);
207
+
205
208
std::vector<std::unique_ptr<HIR::Expr> > params;
206
209
expr.iterate_params ([&] (AST::Expr *p) mutable -> bool {
207
- auto trans = ASTLoweringExpr::translate (p);
210
+ auto trans = ASTLoweringExpr::translate (p, &terminated );
208
211
params.push_back (std::unique_ptr<HIR::Expr> (trans));
209
212
return true ;
210
213
});
@@ -228,11 +231,12 @@ class ASTLoweringExpr : public ASTLoweringBase
228
231
= lower_path_expr_seg (expr.get_method_name ());
229
232
230
233
HIR::Expr *receiver
231
- = ASTLoweringExpr::translate (expr.get_receiver_expr ().get ());
234
+ = ASTLoweringExpr::translate (expr.get_receiver_expr ().get (),
235
+ &terminated);
232
236
233
237
std::vector<std::unique_ptr<HIR::Expr> > params;
234
238
expr.iterate_params ([&] (AST::Expr *p) mutable -> bool {
235
- auto trans = ASTLoweringExpr::translate (p);
239
+ auto trans = ASTLoweringExpr::translate (p, &terminated );
236
240
params.push_back (std::unique_ptr<HIR::Expr> (trans));
237
241
return true ;
238
242
});
@@ -250,8 +254,10 @@ class ASTLoweringExpr : public ASTLoweringBase
250
254
251
255
void visit (AST::AssignmentExpr &expr) override
252
256
{
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);
255
261
256
262
auto crate_num = mappings->get_current_crate ();
257
263
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
@@ -280,6 +286,7 @@ class ASTLoweringExpr : public ASTLoweringBase
280
286
std::vector<HIR::Attribute> inner_attribs;
281
287
282
288
expr.get_array_elems ()->accept_vis (*this );
289
+
283
290
rust_assert (translated_array_elems != nullptr );
284
291
HIR::ArrayElems *elems = translated_array_elems;
285
292
@@ -296,10 +303,11 @@ class ASTLoweringExpr : public ASTLoweringBase
296
303
void visit (AST::ArrayIndexExpr &expr) override
297
304
{
298
305
std::vector<Attribute> outer_attribs;
306
+
299
307
HIR::Expr *array_expr
300
- = ASTLoweringExpr::translate (expr.get_array_expr ().get ());
308
+ = ASTLoweringExpr::translate (expr.get_array_expr ().get (), &terminated );
301
309
HIR::Expr *array_index_expr
302
- = ASTLoweringExpr::translate (expr.get_index_expr ().get ());
310
+ = ASTLoweringExpr::translate (expr.get_index_expr ().get (), &terminated );
303
311
304
312
auto crate_num = mappings->get_current_crate ();
305
313
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
@@ -317,7 +325,8 @@ class ASTLoweringExpr : public ASTLoweringBase
317
325
{
318
326
std::vector<std::unique_ptr<HIR::Expr> > elements;
319
327
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);
321
330
elements.push_back (std::unique_ptr<HIR::Expr> (translated_elem));
322
331
return true ;
323
332
});
@@ -328,9 +337,12 @@ class ASTLoweringExpr : public ASTLoweringBase
328
337
void visit (AST::ArrayElemsCopied &elems) override
329
338
{
330
339
HIR::Expr *element
331
- = ASTLoweringExpr::translate (elems.get_elem_to_copy ().get ());
340
+ = ASTLoweringExpr::translate (elems.get_elem_to_copy ().get (),
341
+ &terminated);
342
+
332
343
HIR::Expr *num_copies
333
- = ASTLoweringExpr::translate (elems.get_num_copies ().get ());
344
+ = ASTLoweringExpr::translate (elems.get_num_copies ().get (),
345
+ &terminated);
334
346
335
347
size_t folded;
336
348
if (!ArrayCapacityConstant::fold (elems.get_num_copies ().get (), &folded))
@@ -339,6 +351,7 @@ class ASTLoweringExpr : public ASTLoweringBase
339
351
" failed to fold capacity constant" );
340
352
return ;
341
353
}
354
+ rust_assert (!terminated);
342
355
343
356
translated_array_elems
344
357
= new HIR::ArrayElemsCopied (std::unique_ptr<HIR::Expr> (element),
@@ -391,9 +404,11 @@ class ASTLoweringExpr : public ASTLoweringBase
391
404
392
405
void visit (AST::ArithmeticOrLogicalExpr &expr) override
393
406
{
394
- HIR::Expr *lhs = ASTLoweringExpr::translate (expr.get_left_expr ().get ());
407
+ HIR::Expr *lhs
408
+ = ASTLoweringExpr::translate (expr.get_left_expr ().get (), &terminated);
395
409
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);
397
412
rust_assert (rhs != nullptr );
398
413
399
414
auto crate_num = mappings->get_current_crate ();
@@ -411,9 +426,11 @@ class ASTLoweringExpr : public ASTLoweringBase
411
426
412
427
void visit (AST::ComparisonExpr &expr) override
413
428
{
414
- HIR::Expr *lhs = ASTLoweringExpr::translate (expr.get_left_expr ().get ());
429
+ HIR::Expr *lhs
430
+ = ASTLoweringExpr::translate (expr.get_left_expr ().get (), &terminated);
415
431
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);
417
434
rust_assert (rhs != nullptr );
418
435
419
436
auto crate_num = mappings->get_current_crate ();
@@ -429,9 +446,13 @@ class ASTLoweringExpr : public ASTLoweringBase
429
446
430
447
void visit (AST::LazyBooleanExpr &expr) override
431
448
{
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);
433
453
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);
435
456
rust_assert (rhs != nullptr );
436
457
437
458
auto crate_num = mappings->get_current_crate ();
@@ -450,7 +471,8 @@ class ASTLoweringExpr : public ASTLoweringBase
450
471
std::vector<HIR::Attribute> outer_attribs;
451
472
452
473
HIR::Expr *negated_value
453
- = ASTLoweringExpr::translate (expr.get_negated_expr ().get ());
474
+ = ASTLoweringExpr::translate (expr.get_negated_expr ().get (),
475
+ &terminated);
454
476
455
477
auto crate_num = mappings->get_current_crate ();
456
478
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
@@ -505,22 +527,25 @@ class ASTLoweringExpr : public ASTLoweringBase
505
527
gcc_unreachable ();
506
528
}
507
529
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
+
510
534
HIR::Expr *value
511
- = ASTLoweringExpr::translate (expr.get_right_expr ().get ());
535
+ = ASTLoweringExpr::translate (expr.get_right_expr ().get (), &terminated );
512
536
513
537
auto crate_num = mappings->get_current_crate ();
514
538
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
515
539
mappings->get_next_hir_id (crate_num),
516
540
UNKNOWN_LOCAL_DEFID);
541
+
517
542
HIR::Expr *operator_expr
518
- = new HIR::ArithmeticOrLogicalExpr (mapping, asignee_expr ->clone_expr (),
543
+ = new HIR::ArithmeticOrLogicalExpr (mapping, assignee_expr ->clone_expr (),
519
544
std::unique_ptr<HIR::Expr> (value),
520
545
op, expr.get_locus ());
521
546
translated
522
547
= new HIR::AssignmentExpr (mapping,
523
- std::unique_ptr<HIR::Expr> (asignee_expr ),
548
+ std::unique_ptr<HIR::Expr> (assignee_expr ),
524
549
std::unique_ptr<HIR::Expr> (operator_expr),
525
550
expr.get_locus ());
526
551
}
@@ -540,15 +565,18 @@ class ASTLoweringExpr : public ASTLoweringBase
540
565
if (struct_expr.has_struct_base ())
541
566
{
542
567
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
+
544
572
base
545
573
= new HIR::StructBase (std::unique_ptr<HIR::Expr> (translated_base));
546
574
}
547
575
548
576
std::vector<std::unique_ptr<HIR::StructExprField> > fields;
549
577
struct_expr.iterate ([&] (AST::StructExprField *field) mutable -> bool {
550
578
HIR::StructExprField *translated
551
- = ASTLowerStructExprField::translate (field);
579
+ = ASTLowerStructExprField::translate (field, &terminated );
552
580
fields.push_back (std::unique_ptr<HIR::StructExprField> (translated));
553
581
return true ;
554
582
});
@@ -571,7 +599,8 @@ class ASTLoweringExpr : public ASTLoweringBase
571
599
std::vector<HIR::Attribute> outer_attribs;
572
600
573
601
HIR::Expr *paren_expr
574
- = ASTLoweringExpr::translate (expr.get_expr_in_parens ().get ());
602
+ = ASTLoweringExpr::translate (expr.get_expr_in_parens ().get (),
603
+ &terminated);
575
604
576
605
auto crate_num = mappings->get_current_crate ();
577
606
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
@@ -590,7 +619,8 @@ class ASTLoweringExpr : public ASTLoweringBase
590
619
std::vector<HIR::Attribute> outer_attribs;
591
620
592
621
HIR::Expr *receiver
593
- = ASTLoweringExpr::translate (expr.get_receiver_expr ().get ());
622
+ = ASTLoweringExpr::translate (expr.get_receiver_expr ().get (),
623
+ &terminated);
594
624
595
625
auto crate_num = mappings->get_current_crate ();
596
626
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
@@ -619,7 +649,8 @@ class ASTLoweringExpr : public ASTLoweringBase
619
649
HIR::Lifetime break_label = lower_lifetime (expr.get_label ());
620
650
HIR::Expr *break_expr
621
651
= expr.has_break_expr ()
622
- ? ASTLoweringExpr::translate (expr.get_break_expr ().get ())
652
+ ? ASTLoweringExpr::translate (expr.get_break_expr ().get (),
653
+ &terminated)
623
654
: nullptr ;
624
655
625
656
auto crate_num = mappings->get_current_crate ();
@@ -631,6 +662,7 @@ class ASTLoweringExpr : public ASTLoweringBase
631
662
std ::move (break_label),
632
663
std::unique_ptr<HIR::Expr> (break_expr),
633
664
std::move (outer_attribs));
665
+ terminated = true ;
634
666
}
635
667
636
668
void visit (AST::ContinueExpr &expr) override
@@ -646,14 +678,16 @@ class ASTLoweringExpr : public ASTLoweringBase
646
678
translated = new HIR::ContinueExpr (mapping, expr.get_locus (),
647
679
std ::move (break_label),
648
680
std::move (outer_attribs));
681
+ terminated = true ;
649
682
}
650
683
651
684
void visit (AST::BorrowExpr &expr) override
652
685
{
653
686
std::vector<HIR::Attribute> outer_attribs;
654
687
655
688
HIR::Expr *borrow_lvalue
656
- = ASTLoweringExpr::translate (expr.get_borrowed_expr ().get ());
689
+ = ASTLoweringExpr::translate (expr.get_borrowed_expr ().get (),
690
+ &terminated);
657
691
658
692
auto crate_num = mappings->get_current_crate ();
659
693
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
@@ -672,7 +706,8 @@ class ASTLoweringExpr : public ASTLoweringBase
672
706
std::vector<HIR::Attribute> outer_attribs;
673
707
674
708
HIR::Expr *dref_lvalue
675
- = ASTLoweringExpr::translate (expr.get_dereferenced_expr ().get ());
709
+ = ASTLoweringExpr::translate (expr.get_dereferenced_expr ().get (),
710
+ &terminated);
676
711
677
712
auto crate_num = mappings->get_current_crate ();
678
713
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
0 commit comments