@@ -310,21 +310,19 @@ pub trait MutVisitor: Sized {
310
310
311
311
/// Use a map-style function (`FnOnce(T) -> T`) to overwrite a `&mut T`. Useful
312
312
/// when using a `flat_map_*` or `filter_map_*` method within a `visit_`
313
- /// method.
313
+ /// method. Abort the program if the closure panics. (We used to overwrite `t`
314
+ /// with a dummy value and then resume unwinding, but having to provide a dummy
315
+ /// value for all the relevant AST nodes was a pain. If you need that back,
316
+ /// revert the relevant change from #121827.)
314
317
//
315
318
// No `noop_` prefix because there isn't a corresponding method in `MutVisitor`.
316
- pub fn visit_clobber < T : DummyAstNode > ( t : & mut T , f : impl FnOnce ( T ) -> T ) {
319
+ pub fn visit_clobber < T > ( t : & mut T , f : impl FnOnce ( T ) -> T ) {
317
320
unsafe {
318
321
// Safe because `t` is used in a read-only fashion by `read()` before
319
322
// being overwritten by `write()`.
320
323
let old_t = ptr:: read ( t) ;
321
- let new_t =
322
- panic:: catch_unwind ( panic:: AssertUnwindSafe ( || f ( old_t) ) ) . unwrap_or_else ( |err| {
323
- // Set `t` to some valid but possible meaningless value,
324
- // and pass the fatal error further.
325
- ptr:: write ( t, T :: dummy ( ) ) ;
326
- panic:: resume_unwind ( err) ;
327
- } ) ;
324
+ let new_t = panic:: catch_unwind ( panic:: AssertUnwindSafe ( || f ( old_t) ) )
325
+ . unwrap_or_else ( |_| std:: process:: abort ( ) ) ;
328
326
ptr:: write ( t, new_t) ;
329
327
}
330
328
}
@@ -1602,111 +1600,3 @@ pub fn noop_visit_capture_by<T: MutVisitor>(capture_by: &mut CaptureBy, vis: &mu
1602
1600
}
1603
1601
}
1604
1602
}
1605
-
1606
- /// Some value for the AST node that is valid but possibly meaningless. The
1607
- /// value will never be used meaningfully, it exists just to support unwinding
1608
- /// in `visit_clobber` in the case where its closure panics.
1609
- pub trait DummyAstNode {
1610
- fn dummy ( ) -> Self ;
1611
- }
1612
-
1613
- impl < T > DummyAstNode for Option < T > {
1614
- fn dummy ( ) -> Self {
1615
- Default :: default ( )
1616
- }
1617
- }
1618
-
1619
- impl < T : DummyAstNode + ' static > DummyAstNode for P < T > {
1620
- fn dummy ( ) -> Self {
1621
- P ( DummyAstNode :: dummy ( ) )
1622
- }
1623
- }
1624
-
1625
- impl DummyAstNode for Item {
1626
- fn dummy ( ) -> Self {
1627
- Item {
1628
- attrs : Default :: default ( ) ,
1629
- id : DUMMY_NODE_ID ,
1630
- span : Default :: default ( ) ,
1631
- vis : Visibility {
1632
- kind : VisibilityKind :: Public ,
1633
- span : Default :: default ( ) ,
1634
- tokens : Default :: default ( ) ,
1635
- } ,
1636
- ident : Ident :: empty ( ) ,
1637
- kind : ItemKind :: ExternCrate ( None ) ,
1638
- tokens : Default :: default ( ) ,
1639
- }
1640
- }
1641
- }
1642
-
1643
- impl DummyAstNode for Expr {
1644
- fn dummy ( ) -> Self {
1645
- Expr {
1646
- id : DUMMY_NODE_ID ,
1647
- kind : ExprKind :: Dummy ,
1648
- span : Default :: default ( ) ,
1649
- attrs : Default :: default ( ) ,
1650
- tokens : Default :: default ( ) ,
1651
- }
1652
- }
1653
- }
1654
-
1655
- impl DummyAstNode for Ty {
1656
- fn dummy ( ) -> Self {
1657
- Ty {
1658
- id : DUMMY_NODE_ID ,
1659
- kind : TyKind :: Dummy ,
1660
- span : Default :: default ( ) ,
1661
- tokens : Default :: default ( ) ,
1662
- }
1663
- }
1664
- }
1665
-
1666
- impl DummyAstNode for Pat {
1667
- fn dummy ( ) -> Self {
1668
- Pat {
1669
- id : DUMMY_NODE_ID ,
1670
- kind : PatKind :: Wild ,
1671
- span : Default :: default ( ) ,
1672
- tokens : Default :: default ( ) ,
1673
- }
1674
- }
1675
- }
1676
-
1677
- impl DummyAstNode for Stmt {
1678
- fn dummy ( ) -> Self {
1679
- Stmt { id : DUMMY_NODE_ID , kind : StmtKind :: Empty , span : Default :: default ( ) }
1680
- }
1681
- }
1682
-
1683
- impl DummyAstNode for Block {
1684
- fn dummy ( ) -> Self {
1685
- Block {
1686
- stmts : Default :: default ( ) ,
1687
- id : DUMMY_NODE_ID ,
1688
- rules : BlockCheckMode :: Default ,
1689
- span : Default :: default ( ) ,
1690
- tokens : Default :: default ( ) ,
1691
- could_be_bare_literal : Default :: default ( ) ,
1692
- }
1693
- }
1694
- }
1695
-
1696
- impl DummyAstNode for Crate {
1697
- fn dummy ( ) -> Self {
1698
- Crate {
1699
- attrs : Default :: default ( ) ,
1700
- items : Default :: default ( ) ,
1701
- spans : Default :: default ( ) ,
1702
- id : DUMMY_NODE_ID ,
1703
- is_placeholder : Default :: default ( ) ,
1704
- }
1705
- }
1706
- }
1707
-
1708
- impl < N : DummyAstNode , T : DummyAstNode > DummyAstNode for crate :: ast_traits:: AstNodeWrapper < N , T > {
1709
- fn dummy ( ) -> Self {
1710
- crate :: ast_traits:: AstNodeWrapper :: new ( N :: dummy ( ) , T :: dummy ( ) )
1711
- }
1712
- }
0 commit comments