@@ -433,15 +433,7 @@ private extern (C++) class S2irVisitor : Visitor
433
433
block_setLoc(b, s.loc);
434
434
435
435
// Check that bdest is in an enclosing try block
436
- for (block * bt = b.Btry; bt != bdest.Btry; bt = bt.Btry)
437
- {
438
- if (! bt)
439
- {
440
- // printf("b.Btry = %p, bdest.Btry = %p\n", b.Btry, bdest.Btry);
441
- s.error(" cannot `goto` into `try` block" );
442
- break ;
443
- }
444
- }
436
+ bdest.checkEnclosedInTry(b, s);
445
437
446
438
block_next(blx,BCgoto,null );
447
439
}
@@ -466,16 +458,7 @@ private extern (C++) class S2irVisitor : Visitor
466
458
if (b.Btry != label.lblock.Btry)
467
459
{
468
460
// Check that lblock is in an enclosing try block
469
- for (block * bt = b.Btry; bt != label.lblock.Btry; bt = bt.Btry)
470
- {
471
- if (! bt)
472
- {
473
- // printf("b.Btry = %p, label.lblock.Btry = %p\n", b.Btry, label.lblock.Btry);
474
- s.error(" cannot `goto` into `try` block" );
475
- break ;
476
- }
477
-
478
- }
461
+ label.lblock.checkEnclosedInTry(b, s);
479
462
}
480
463
}
481
464
block_next(blx, BCgoto, label.lblock);
@@ -632,15 +615,7 @@ private extern (C++) class S2irVisitor : Visitor
632
615
if (b.Btry != bdest.Btry)
633
616
{
634
617
// Check that bdest is in an enclosing try block
635
- for (block * bt = b.Btry; bt != bdest.Btry; bt = bt.Btry)
636
- {
637
- if (! bt)
638
- {
639
- // printf("b.Btry = %p, bdest.Btry = %p\n", b.Btry, bdest.Btry);
640
- s.error(" cannot `goto` into `try` block" );
641
- break ;
642
- }
643
- }
618
+ bdest.checkEnclosedInTry(b, s);
644
619
645
620
// setScopeIndex(blx, b, bdest.Btry ? bdest.Btry.Bscope_index : -1);
646
621
}
@@ -663,15 +638,7 @@ private extern (C++) class S2irVisitor : Visitor
663
638
if (b.Btry != bdest.Btry)
664
639
{
665
640
// Check that bdest is in an enclosing try block
666
- for (block * bt = b.Btry; bt != bdest.Btry; bt = bt.Btry)
667
- {
668
- if (! bt)
669
- {
670
- // printf("b.Btry = %p, bdest.Btry = %p\n", b.Btry, bdest.Btry);
671
- s.error(" cannot `goto` into `try` block" );
672
- break ;
673
- }
674
- }
641
+ bdest.checkEnclosedInTry(b, s);
675
642
676
643
// setScopeIndex(blx, b, bdest.Btry ? bdest.Btry.Bscope_index : -1);
677
644
}
@@ -1828,3 +1795,24 @@ void insertFinallyBlockGotos(block *startblock)
1828
1795
printf(" -------------------------\n " );
1829
1796
}
1830
1797
}
1798
+
1799
+ /* **************************************************
1800
+ * Issue error if bd is not enclosed in a try block.
1801
+ * Params:
1802
+ * bd = block to check
1803
+ * bcurrent = current block (starting point)
1804
+ * s = statement to use for error messages
1805
+ */
1806
+ private void checkEnclosedInTry (const block* bd, const block* bcurrent, Statement s)
1807
+ {
1808
+ for (const (block)* bt = bcurrent.Btry; bt != bd.Btry; bt = bt.Btry)
1809
+ {
1810
+ if (! bt)
1811
+ {
1812
+ // printf("b.Btry = %p, bdest.Btry = %p\n", b.Btry, bdest.Btry);
1813
+ s.error(" cannot `goto` into `try` block" );
1814
+ break ;
1815
+ }
1816
+ }
1817
+ }
1818
+
0 commit comments