@@ -1885,9 +1885,8 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
1885
1885
let mut function_value_rib = Rib :: new ( kind) ;
1886
1886
let mut function_lifetime_rib = LifetimeRib :: new ( lifetime_kind) ;
1887
1887
let mut seen_bindings = FxHashMap :: default ( ) ;
1888
- // Store all seen lifetimes names, and whether they were created in the currently processed
1889
- // parameter set.
1890
- let mut seen_lifetimes = FxHashMap :: default ( ) ;
1888
+ // Store all seen lifetimes names from outer scopes.
1889
+ let mut seen_lifetimes = FxHashSet :: default ( ) ;
1891
1890
1892
1891
// We also can't shadow bindings from the parent item
1893
1892
if let AssocItemRibKind = kind {
@@ -1905,7 +1904,7 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
1905
1904
1906
1905
// Forbid shadowing lifetime bindings
1907
1906
for rib in self . lifetime_ribs . iter ( ) . rev ( ) {
1908
- seen_lifetimes. extend ( rib. bindings . iter ( ) . map ( |( ident, _) | ( * ident, false ) ) ) ;
1907
+ seen_lifetimes. extend ( rib. bindings . iter ( ) . map ( |( ident, _) | * ident) ) ;
1909
1908
if let LifetimeRibKind :: Item = rib. kind {
1910
1909
break ;
1911
1910
}
@@ -1915,35 +1914,28 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
1915
1914
let ident = param. ident . normalize_to_macros_2_0 ( ) ;
1916
1915
debug ! ( "with_generic_param_rib: {}" , param. id) ;
1917
1916
1918
- if let GenericParamKind :: Lifetime = param. kind {
1919
- match seen_lifetimes. entry ( ident) {
1920
- Entry :: Occupied ( entry) => {
1921
- let original = * entry. key ( ) ;
1922
- let orig_is_param = * entry. get ( ) ;
1923
- diagnostics:: signal_lifetime_shadowing (
1924
- self . r . session ,
1925
- original,
1926
- param. ident ,
1927
- orig_is_param,
1928
- ) ;
1917
+ if let GenericParamKind :: Lifetime = param. kind
1918
+ && let Some ( & original) = seen_lifetimes. get ( & ident)
1919
+ {
1920
+ diagnostics:: signal_lifetime_shadowing ( self . r . session , original, param. ident ) ;
1921
+ // Record lifetime res, so lowering knows there is something fishy.
1922
+ self . record_lifetime_res ( param. id , LifetimeRes :: Error ) ;
1923
+ continue ;
1924
+ }
1925
+
1926
+ match seen_bindings. entry ( ident) {
1927
+ Entry :: Occupied ( entry) => {
1928
+ let span = * entry. get ( ) ;
1929
+ let err = ResolutionError :: NameAlreadyUsedInParameterList ( ident. name , span) ;
1930
+ self . report_error ( param. ident . span , err) ;
1931
+ if let GenericParamKind :: Lifetime = param. kind {
1929
1932
// Record lifetime res, so lowering knows there is something fishy.
1930
1933
self . record_lifetime_res ( param. id , LifetimeRes :: Error ) ;
1931
1934
continue ;
1932
1935
}
1933
- Entry :: Vacant ( entry) => {
1934
- entry. insert ( true ) ;
1935
- }
1936
1936
}
1937
- } else {
1938
- match seen_bindings. entry ( ident) {
1939
- Entry :: Occupied ( entry) => {
1940
- let span = * entry. get ( ) ;
1941
- let err = ResolutionError :: NameAlreadyUsedInParameterList ( ident. name , span) ;
1942
- self . report_error ( param. ident . span , err) ;
1943
- }
1944
- Entry :: Vacant ( entry) => {
1945
- entry. insert ( param. ident . span ) ;
1946
- }
1937
+ Entry :: Vacant ( entry) => {
1938
+ entry. insert ( param. ident . span ) ;
1947
1939
}
1948
1940
}
1949
1941
0 commit comments