@@ -1876,6 +1876,30 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1876
1876
res : LifetimeRes ,
1877
1877
itctx : ImplTraitContext < ' _ , ' hir > ,
1878
1878
) -> hir:: Lifetime {
1879
+ fn check_impl_trait_lifetimes (
1880
+ sess : & Session ,
1881
+ itctx : ImplTraitContext < ' _ , ' _ > ,
1882
+ span : Span ,
1883
+ note_span : Option < Span > ,
1884
+ ) {
1885
+ match itctx {
1886
+ ImplTraitContext :: ReturnPositionOpaqueTy { nested : Some ( true ) , .. }
1887
+ | ImplTraitContext :: TypeAliasesOpaqueTy => {
1888
+ let mut err = sess. struct_span_err (
1889
+ span,
1890
+ "higher kinded lifetime bounds on nested opaque types are not supported yet" ,
1891
+ ) ;
1892
+ if let Some ( span) = note_span {
1893
+ err. span_note ( span, "lifetime declared here" ) ;
1894
+ }
1895
+ err. help (
1896
+ "See https://github.com/rust-lang/rust/issues/96194 for further details" ,
1897
+ ) ;
1898
+ err. emit ( ) ;
1899
+ }
1900
+ _ => { }
1901
+ }
1902
+ }
1879
1903
debug ! ( ?self . captured_lifetimes) ;
1880
1904
let name = match res {
1881
1905
LifetimeRes :: Param { param, binder } => {
@@ -1885,23 +1909,12 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1885
1909
& mut self . captured_lifetimes
1886
1910
{
1887
1911
if binders_to_ignore. contains ( & binder) {
1888
- match itctx {
1889
- ImplTraitContext :: ReturnPositionOpaqueTy {
1890
- nested : Some ( true ) , ..
1891
- }
1892
- | ImplTraitContext :: TypeAliasesOpaqueTy => {
1893
- let mut err = self . sess . struct_span_err (
1894
- span,
1895
- "higher kinded lifetime bounds on nested opaque types are not supported yet" ,
1896
- ) ;
1897
- if let Some ( & ( span, _, _, _) ) = captures. get ( & param) {
1898
- err. span_note ( span, "lifetime declared here" ) ;
1899
- }
1900
- err. help ( "See https://github.com/rust-lang/rust/issues/96194 for further details" ) ;
1901
- err. emit ( ) ;
1902
- }
1903
- _ => { }
1904
- }
1912
+ check_impl_trait_lifetimes (
1913
+ self . sess ,
1914
+ itctx,
1915
+ span,
1916
+ captures. get ( & param) . map ( |cap| cap. 0 ) ,
1917
+ ) ;
1905
1918
} else {
1906
1919
match captures. entry ( param) {
1907
1920
Entry :: Occupied ( _) => { }
@@ -1926,23 +1939,31 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1926
1939
debug_assert_eq ! ( ident. name, kw:: UnderscoreLifetime ) ;
1927
1940
if let Some ( LifetimeCaptureContext { parent_def_id, captures, binders_to_ignore } ) =
1928
1941
& mut self . captured_lifetimes
1929
- && !binders_to_ignore. contains ( & binder)
1930
1942
{
1931
- match captures. entry ( param) {
1932
- Entry :: Occupied ( o) => param = self . resolver . local_def_id ( o. get ( ) . 1 ) ,
1933
- Entry :: Vacant ( v) => {
1934
- let p_id = self . resolver . next_node_id ( ) ;
1935
- let p_def_id = self . resolver . create_def (
1936
- * parent_def_id,
1937
- p_id,
1938
- DefPathData :: LifetimeNs ( kw:: UnderscoreLifetime ) ,
1939
- ExpnId :: root ( ) ,
1940
- span. with_parent ( None ) ,
1941
- ) ;
1942
-
1943
- let p_name = ParamName :: Fresh ( param) ;
1944
- v. insert ( ( span, p_id, p_name, res) ) ;
1945
- param = p_def_id;
1943
+ if binders_to_ignore. contains ( & binder) {
1944
+ check_impl_trait_lifetimes (
1945
+ self . sess ,
1946
+ itctx,
1947
+ span,
1948
+ captures. get ( & param) . map ( |cap| cap. 0 ) ,
1949
+ ) ;
1950
+ } else {
1951
+ match captures. entry ( param) {
1952
+ Entry :: Occupied ( o) => param = self . resolver . local_def_id ( o. get ( ) . 1 ) ,
1953
+ Entry :: Vacant ( v) => {
1954
+ let p_id = self . resolver . next_node_id ( ) ;
1955
+ let p_def_id = self . resolver . create_def (
1956
+ * parent_def_id,
1957
+ p_id,
1958
+ DefPathData :: LifetimeNs ( kw:: UnderscoreLifetime ) ,
1959
+ ExpnId :: root ( ) ,
1960
+ span. with_parent ( None ) ,
1961
+ ) ;
1962
+
1963
+ let p_name = ParamName :: Fresh ( param) ;
1964
+ v. insert ( ( span, p_id, p_name, res) ) ;
1965
+ param = p_def_id;
1966
+ }
1946
1967
}
1947
1968
}
1948
1969
}
@@ -1957,19 +1978,23 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1957
1978
} ;
1958
1979
if let Some ( LifetimeCaptureContext { parent_def_id, captures, binders_to_ignore } ) =
1959
1980
& mut self . captured_lifetimes
1960
- && !binders_to_ignore. contains ( & binder)
1961
1981
{
1962
- let p_id = self . resolver . next_node_id ( ) ;
1963
- let p_def_id = self . resolver . create_def (
1964
- * parent_def_id,
1965
- p_id,
1966
- DefPathData :: LifetimeNs ( kw:: UnderscoreLifetime ) ,
1967
- ExpnId :: root ( ) ,
1968
- span. with_parent ( None ) ,
1969
- ) ;
1970
- let p_name = ParamName :: Fresh ( p_def_id) ;
1971
- captures. insert ( p_def_id, ( span, p_id, p_name, res) ) ;
1972
- hir:: LifetimeName :: Param ( p_name)
1982
+ if binders_to_ignore. contains ( & binder) {
1983
+ check_impl_trait_lifetimes ( self . sess , itctx, span, None ) ;
1984
+ l_name
1985
+ } else {
1986
+ let p_id = self . resolver . next_node_id ( ) ;
1987
+ let p_def_id = self . resolver . create_def (
1988
+ * parent_def_id,
1989
+ p_id,
1990
+ DefPathData :: LifetimeNs ( kw:: UnderscoreLifetime ) ,
1991
+ ExpnId :: root ( ) ,
1992
+ span. with_parent ( None ) ,
1993
+ ) ;
1994
+ let p_name = ParamName :: Fresh ( p_def_id) ;
1995
+ captures. insert ( p_def_id, ( span, p_id, p_name, res) ) ;
1996
+ hir:: LifetimeName :: Param ( p_name)
1997
+ }
1973
1998
} else {
1974
1999
l_name
1975
2000
}
0 commit comments