@@ -1709,104 +1709,63 @@ pub trait Lift<'tcx>: fmt::Debug {
1709
1709
fn lift_to_tcx < ' a , ' gcx > ( & self , tcx : TyCtxt < ' a , ' gcx , ' tcx > ) -> Option < Self :: Lifted > ;
1710
1710
}
1711
1711
1712
- impl < ' a , ' tcx > Lift < ' tcx > for Ty < ' a > {
1713
- type Lifted = Ty < ' tcx > ;
1714
- fn lift_to_tcx < ' b , ' gcx > ( & self , tcx : TyCtxt < ' b , ' gcx , ' tcx > ) -> Option < Ty < ' tcx > > {
1715
- if tcx. interners . arena . in_arena ( * self as * const _ ) {
1716
- return Some ( unsafe { mem:: transmute ( * self ) } ) ;
1717
- }
1718
- // Also try in the global tcx if we're not that.
1719
- if !tcx. is_global ( ) {
1720
- self . lift_to_tcx ( tcx. global_tcx ( ) )
1721
- } else {
1722
- None
1723
- }
1724
- }
1725
- }
1726
1712
1727
- impl < ' a , ' tcx > Lift < ' tcx > for Region < ' a > {
1728
- type Lifted = Region < ' tcx > ;
1729
- fn lift_to_tcx < ' b , ' gcx > ( & self , tcx : TyCtxt < ' b , ' gcx , ' tcx > ) -> Option < Region < ' tcx > > {
1730
- if tcx. interners . arena . in_arena ( * self as * const _ ) {
1731
- return Some ( unsafe { mem:: transmute ( * self ) } ) ;
1732
- }
1733
- // Also try in the global tcx if we're not that.
1734
- if !tcx. is_global ( ) {
1735
- self . lift_to_tcx ( tcx. global_tcx ( ) )
1736
- } else {
1737
- None
1738
- }
1739
- }
1740
- }
1741
-
1742
- impl < ' a , ' tcx > Lift < ' tcx > for Goal < ' a > {
1743
- type Lifted = Goal < ' tcx > ;
1744
- fn lift_to_tcx < ' b , ' gcx > ( & self , tcx : TyCtxt < ' b , ' gcx , ' tcx > ) -> Option < Goal < ' tcx > > {
1745
- if tcx. interners . arena . in_arena ( * self as * const _ ) {
1746
- return Some ( unsafe { mem:: transmute ( * self ) } ) ;
1713
+ macro_rules! nop_lift {
1714
+ ( $ty: ty => $lifted: ty) => {
1715
+ impl <' a, ' tcx> Lift <' tcx> for $ty {
1716
+ type Lifted = $lifted;
1717
+ fn lift_to_tcx<' b, ' gcx>( & self , tcx: TyCtxt <' b, ' gcx, ' tcx>) -> Option <Self :: Lifted > {
1718
+ if tcx. interners. arena. in_arena( * self as * const _) {
1719
+ return Some ( unsafe { mem:: transmute( * self ) } ) ;
1720
+ }
1721
+ // Also try in the global tcx if we're not that.
1722
+ if !tcx. is_global( ) {
1723
+ self . lift_to_tcx( tcx. global_tcx( ) )
1724
+ } else {
1725
+ None
1726
+ }
1727
+ }
1747
1728
}
1748
- Some ( tcx. intern_const_alloc ( mir:: interpret:: Allocation :: clone ( self ) ) )
1749
- }
1729
+ } ;
1750
1730
}
1751
1731
1752
- impl < ' a , ' tcx > Lift < ' tcx > for & ' a List < Goal < ' a > > {
1753
- type Lifted = & ' tcx List < Goal < ' tcx > > ;
1754
- fn lift_to_tcx < ' b , ' gcx > (
1755
- & self ,
1756
- tcx : TyCtxt < ' b , ' gcx , ' tcx > ,
1757
- ) -> Option < & ' tcx List < Goal < ' tcx > > > {
1758
- if self . is_empty ( ) {
1759
- return Some ( List :: empty ( ) ) ;
1760
- }
1761
-
1762
- if tcx . interners . arena . in_arena ( * self as * const _ ) {
1763
- return Some ( unsafe { mem :: transmute ( * self ) } ) ;
1764
- }
1765
- // Also try in the global tcx if we're not that.
1766
- if !tcx . is_global ( ) {
1767
- self . lift_to_tcx ( tcx . global_tcx ( ) )
1768
- } else {
1769
- None
1732
+ macro_rules! nop_list_lift {
1733
+ ( $ty : ty => $lifted : ty ) => {
1734
+ impl < ' a , ' tcx> Lift < ' tcx> for & ' a List <$ty> {
1735
+ type Lifted = & ' tcx List <$lifted> ;
1736
+ fn lift_to_tcx< ' b , ' gcx> ( & self , tcx: TyCtxt <' b, ' gcx, ' tcx>) -> Option < Self :: Lifted > {
1737
+ if self . is_empty ( ) {
1738
+ return Some ( List :: empty ( ) ) ;
1739
+ }
1740
+ if tcx . interners . arena . in_arena ( * self as * const _ ) {
1741
+ return Some ( unsafe { mem :: transmute ( * self ) } ) ;
1742
+ }
1743
+ // Also try in the global tcx if we're not that.
1744
+ if !tcx . is_global ( ) {
1745
+ self . lift_to_tcx ( tcx . global_tcx ( ) )
1746
+ } else {
1747
+ None
1748
+ }
1749
+ }
1770
1750
}
1771
- }
1751
+ } ;
1772
1752
}
1773
1753
1774
- impl < ' a , ' tcx > Lift < ' tcx > for & ' a List < Clause < ' a > > {
1775
- type Lifted = & ' tcx List < Clause < ' tcx > > ;
1776
- fn lift_to_tcx < ' b , ' gcx > (
1777
- & self ,
1778
- tcx : TyCtxt < ' b , ' gcx , ' tcx > ,
1779
- ) -> Option < & ' tcx List < Clause < ' tcx > > > {
1780
- if self . is_empty ( ) {
1781
- return Some ( List :: empty ( ) ) ;
1782
- }
1754
+ nop_lift ! { Ty <' a> => Ty <' tcx>}
1755
+ nop_lift ! { Region <' a> => Region <' tcx>}
1756
+ nop_lift ! { Goal <' a> => Goal <' tcx>}
1757
+ nop_lift ! { & ' a LazyConst <' a> => & ' tcx LazyConst <' tcx>}
1783
1758
1784
- if tcx. interners . arena . in_arena ( * self as * const _ ) {
1785
- return Some ( unsafe { mem:: transmute ( * self ) } ) ;
1786
- }
1787
- // Also try in the global tcx if we're not that.
1788
- if !tcx. is_global ( ) {
1789
- self . lift_to_tcx ( tcx. global_tcx ( ) )
1790
- } else {
1791
- None
1792
- }
1793
- }
1794
- }
1759
+ nop_list_lift ! { Goal <' a> => Goal <' tcx>}
1760
+ nop_list_lift ! { Clause <' a> => Clause <' tcx>}
1761
+ nop_list_lift ! { Ty <' a> => Ty <' tcx>}
1762
+ nop_list_lift ! { ExistentialPredicate <' a> => ExistentialPredicate <' tcx>}
1763
+ nop_list_lift ! { Predicate <' a> => Predicate <' tcx>}
1764
+ nop_list_lift ! { CanonicalVarInfo => CanonicalVarInfo }
1765
+ nop_list_lift ! { ProjectionKind <' a> => ProjectionKind <' tcx>}
1795
1766
1796
- impl < ' a , ' tcx > Lift < ' tcx > for & ' a LazyConst < ' a > {
1797
- type Lifted = & ' tcx LazyConst < ' tcx > ;
1798
- fn lift_to_tcx < ' b , ' gcx > ( & self , tcx : TyCtxt < ' b , ' gcx , ' tcx > ) -> Option < & ' tcx LazyConst < ' tcx > > {
1799
- if tcx. interners . arena . in_arena ( * self as * const _ ) {
1800
- return Some ( unsafe { mem:: transmute ( * self ) } ) ;
1801
- }
1802
- // Also try in the global tcx if we're not that.
1803
- if !tcx. is_global ( ) {
1804
- self . lift_to_tcx ( tcx. global_tcx ( ) )
1805
- } else {
1806
- None
1807
- }
1808
- }
1809
- }
1767
+ // this is the impl for `&'a Substs<'a>`
1768
+ nop_list_lift ! { Kind <' a> => Kind <' tcx>}
1810
1769
1811
1770
impl < ' a , ' tcx > Lift < ' tcx > for & ' a mir:: interpret:: Allocation {
1812
1771
type Lifted = & ' tcx mir:: interpret:: Allocation ;
@@ -1816,117 +1775,6 @@ impl<'a, 'tcx> Lift<'tcx> for &'a mir::interpret::Allocation {
1816
1775
}
1817
1776
}
1818
1777
1819
- impl < ' a , ' tcx > Lift < ' tcx > for & ' a Substs < ' a > {
1820
- type Lifted = & ' tcx Substs < ' tcx > ;
1821
- fn lift_to_tcx < ' b , ' gcx > ( & self , tcx : TyCtxt < ' b , ' gcx , ' tcx > ) -> Option < & ' tcx Substs < ' tcx > > {
1822
- if self . len ( ) == 0 {
1823
- return Some ( List :: empty ( ) ) ;
1824
- }
1825
- if tcx. interners . arena . in_arena ( & self [ ..] as * const _ ) {
1826
- return Some ( unsafe { mem:: transmute ( * self ) } ) ;
1827
- }
1828
- // Also try in the global tcx if we're not that.
1829
- if !tcx. is_global ( ) {
1830
- self . lift_to_tcx ( tcx. global_tcx ( ) )
1831
- } else {
1832
- None
1833
- }
1834
- }
1835
- }
1836
-
1837
- impl < ' a , ' tcx > Lift < ' tcx > for & ' a List < Ty < ' a > > {
1838
- type Lifted = & ' tcx List < Ty < ' tcx > > ;
1839
- fn lift_to_tcx < ' b , ' gcx > ( & self , tcx : TyCtxt < ' b , ' gcx , ' tcx > )
1840
- -> Option < & ' tcx List < Ty < ' tcx > > > {
1841
- if self . len ( ) == 0 {
1842
- return Some ( List :: empty ( ) ) ;
1843
- }
1844
- if tcx. interners . arena . in_arena ( * self as * const _ ) {
1845
- return Some ( unsafe { mem:: transmute ( * self ) } ) ;
1846
- }
1847
- // Also try in the global tcx if we're not that.
1848
- if !tcx. is_global ( ) {
1849
- self . lift_to_tcx ( tcx. global_tcx ( ) )
1850
- } else {
1851
- None
1852
- }
1853
- }
1854
- }
1855
-
1856
- impl < ' a , ' tcx > Lift < ' tcx > for & ' a List < ExistentialPredicate < ' a > > {
1857
- type Lifted = & ' tcx List < ExistentialPredicate < ' tcx > > ;
1858
- fn lift_to_tcx < ' b , ' gcx > ( & self , tcx : TyCtxt < ' b , ' gcx , ' tcx > )
1859
- -> Option < & ' tcx List < ExistentialPredicate < ' tcx > > > {
1860
- if self . is_empty ( ) {
1861
- return Some ( List :: empty ( ) ) ;
1862
- }
1863
- if tcx. interners . arena . in_arena ( * self as * const _ ) {
1864
- return Some ( unsafe { mem:: transmute ( * self ) } ) ;
1865
- }
1866
- // Also try in the global tcx if we're not that.
1867
- if !tcx. is_global ( ) {
1868
- self . lift_to_tcx ( tcx. global_tcx ( ) )
1869
- } else {
1870
- None
1871
- }
1872
- }
1873
- }
1874
-
1875
- impl < ' a , ' tcx > Lift < ' tcx > for & ' a List < Predicate < ' a > > {
1876
- type Lifted = & ' tcx List < Predicate < ' tcx > > ;
1877
- fn lift_to_tcx < ' b , ' gcx > ( & self , tcx : TyCtxt < ' b , ' gcx , ' tcx > )
1878
- -> Option < & ' tcx List < Predicate < ' tcx > > > {
1879
- if self . is_empty ( ) {
1880
- return Some ( List :: empty ( ) ) ;
1881
- }
1882
- if tcx. interners . arena . in_arena ( * self as * const _ ) {
1883
- return Some ( unsafe { mem:: transmute ( * self ) } ) ;
1884
- }
1885
- // Also try in the global tcx if we're not that.
1886
- if !tcx. is_global ( ) {
1887
- self . lift_to_tcx ( tcx. global_tcx ( ) )
1888
- } else {
1889
- None
1890
- }
1891
- }
1892
- }
1893
-
1894
- impl < ' a , ' tcx > Lift < ' tcx > for & ' a List < CanonicalVarInfo > {
1895
- type Lifted = & ' tcx List < CanonicalVarInfo > ;
1896
- fn lift_to_tcx < ' b , ' gcx > ( & self , tcx : TyCtxt < ' b , ' gcx , ' tcx > ) -> Option < Self :: Lifted > {
1897
- if self . len ( ) == 0 {
1898
- return Some ( List :: empty ( ) ) ;
1899
- }
1900
- if tcx. interners . arena . in_arena ( * self as * const _ ) {
1901
- return Some ( unsafe { mem:: transmute ( * self ) } ) ;
1902
- }
1903
- // Also try in the global tcx if we're not that.
1904
- if !tcx. is_global ( ) {
1905
- self . lift_to_tcx ( tcx. global_tcx ( ) )
1906
- } else {
1907
- None
1908
- }
1909
- }
1910
- }
1911
-
1912
- impl < ' a , ' tcx > Lift < ' tcx > for & ' a List < ProjectionKind < ' a > > {
1913
- type Lifted = & ' tcx List < ProjectionKind < ' tcx > > ;
1914
- fn lift_to_tcx < ' b , ' gcx > ( & self , tcx : TyCtxt < ' b , ' gcx , ' tcx > ) -> Option < Self :: Lifted > {
1915
- if self . len ( ) == 0 {
1916
- return Some ( List :: empty ( ) ) ;
1917
- }
1918
- if tcx. interners . arena . in_arena ( * self as * const _ ) {
1919
- return Some ( unsafe { mem:: transmute ( * self ) } ) ;
1920
- }
1921
- // Also try in the global tcx if we're not that.
1922
- if !tcx. is_global ( ) {
1923
- self . lift_to_tcx ( tcx. global_tcx ( ) )
1924
- } else {
1925
- None
1926
- }
1927
- }
1928
- }
1929
-
1930
1778
pub mod tls {
1931
1779
use super :: { GlobalCtxt , TyCtxt } ;
1932
1780
0 commit comments