@@ -1885,9 +1885,8 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
18851885 let mut function_value_rib = Rib :: new ( kind) ;
18861886 let mut function_lifetime_rib = LifetimeRib :: new ( lifetime_kind) ;
18871887 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 ( ) ;
18911890
18921891 // We also can't shadow bindings from the parent item
18931892 if let AssocItemRibKind = kind {
@@ -1905,7 +1904,7 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
19051904
19061905 // Forbid shadowing lifetime bindings
19071906 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) ) ;
19091908 if let LifetimeRibKind :: Item = rib. kind {
19101909 break ;
19111910 }
@@ -1915,35 +1914,28 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
19151914 let ident = param. ident . normalize_to_macros_2_0 ( ) ;
19161915 debug ! ( "with_generic_param_rib: {}" , param. id) ;
19171916
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 {
19291932 // Record lifetime res, so lowering knows there is something fishy.
19301933 self . record_lifetime_res ( param. id , LifetimeRes :: Error ) ;
19311934 continue ;
19321935 }
1933- Entry :: Vacant ( entry) => {
1934- entry. insert ( true ) ;
1935- }
19361936 }
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 ) ;
19471939 }
19481940 }
19491941
0 commit comments