@@ -2180,7 +2180,8 @@ impl<'a> Resolver<'a> {
21802180 // because that breaks the assumptions later
21812181 // passes make about or-patterns.)
21822182 let renamed = mtwt:: resolve ( ident. node ) ;
2183- let def = match bindings. get ( & renamed) . cloned ( ) {
2183+ let mut def = Def :: Local ( self . definitions . local_def_id ( pat_id) , pat_id) ;
2184+ match bindings. get ( & renamed) . cloned ( ) {
21842185 Some ( id) if id == outer_pat_id => {
21852186 // `Variant(a, a)`, error
21862187 resolve_error (
@@ -2189,7 +2190,6 @@ impl<'a> Resolver<'a> {
21892190 ResolutionError :: IdentifierBoundMoreThanOnceInSamePattern (
21902191 & ident. node . name . as_str ( ) )
21912192 ) ;
2192- Def :: Err
21932193 }
21942194 Some ( ..) if pat_src == PatternSource :: FnParam => {
21952195 // `fn f(a: u8, a: u8)`, error
@@ -2199,29 +2199,24 @@ impl<'a> Resolver<'a> {
21992199 ResolutionError :: IdentifierBoundMoreThanOnceInParameterList (
22002200 & ident. node . name . as_str ( ) )
22012201 ) ;
2202- Def :: Err
22032202 }
22042203 Some ( ..) if pat_src == PatternSource :: Match => {
22052204 // `Variant1(a) | Variant2(a)`, ok
22062205 // Reuse definition from the first `a`.
2207- self . value_ribs . last_mut ( ) . unwrap ( ) . bindings [ & renamed]
2206+ def = self . value_ribs . last_mut ( ) . unwrap ( ) . bindings [ & renamed] ;
22082207 }
22092208 Some ( ..) => {
22102209 span_bug ! ( ident. span, "two bindings with the same name from \
22112210 unexpected pattern source {:?}", pat_src) ;
22122211 }
22132212 None => {
2214- // A completely fresh binding, add to the lists.
2215- // FIXME: Later stages are not ready to deal with `Def::Err` here yet, so
2216- // define `Invalid` bindings as `Def::Local`, just don't add them to the lists.
2217- let def = Def :: Local ( self . definitions . local_def_id ( pat_id) , pat_id) ;
2213+ // A completely fresh binding, add to the lists if it's valid.
22182214 if ident. node . name != keywords:: Invalid . name ( ) {
22192215 bindings. insert ( renamed, outer_pat_id) ;
22202216 self . value_ribs . last_mut ( ) . unwrap ( ) . bindings . insert ( renamed, def) ;
22212217 }
2222- def
22232218 }
2224- } ;
2219+ }
22252220
22262221 PathResolution :: new ( def)
22272222 }
@@ -2287,15 +2282,16 @@ impl<'a> Resolver<'a> {
22872282 PatKind :: Ident ( bmode, ref ident, ref opt_pat) => {
22882283 // First try to resolve the identifier as some existing
22892284 // entity, then fall back to a fresh binding.
2290- let local_def = self . resolve_identifier ( ident. node , ValueNS , true ) ;
2291- let resolution = if let Some ( LocalDef { def, .. } ) = local_def {
2285+ let resolution = self . resolve_identifier ( ident. node , ValueNS , true )
2286+ . map ( |local_def| PathResolution :: new ( local_def. def ) )
2287+ . and_then ( |resolution| {
22922288 let always_binding = !pat_src. is_refutable ( ) || opt_pat. is_some ( ) ||
22932289 bmode != BindingMode :: ByValue ( Mutability :: Immutable ) ;
22942290 match def {
22952291 Def :: Struct ( ..) | Def :: Variant ( ..) |
22962292 Def :: Const ( ..) | Def :: AssociatedConst ( ..) if !always_binding => {
22972293 // A constant, unit variant, etc pattern.
2298- PathResolution :: new ( def )
2294+ Some ( resolution )
22992295 }
23002296 Def :: Struct ( ..) | Def :: Variant ( ..) |
23012297 Def :: Const ( ..) | Def :: AssociatedConst ( ..) | Def :: Static ( ..) => {
@@ -2307,23 +2303,21 @@ impl<'a> Resolver<'a> {
23072303 ResolutionError :: BindingShadowsSomethingUnacceptable (
23082304 pat_src. descr ( ) , kind_name, ident. node . name )
23092305 ) ;
2310- err_path_resolution ( )
2306+ None
23112307 }
23122308 Def :: Local ( ..) | Def :: Upvar ( ..) | Def :: Fn ( ..) => {
23132309 // These entities are explicitly allowed
23142310 // to be shadowed by fresh bindings.
2315- self . fresh_binding ( ident, pat. id , outer_pat_id,
2316- pat_src, bindings)
2311+ None
23172312 }
23182313 def => {
23192314 span_bug ! ( ident. span, "unexpected definition for an \
23202315 identifier in pattern {:?}", def) ;
23212316 }
23222317 }
2323- } else {
2324- // Fall back to a fresh binding.
2318+ } ) . unwrap_or_else ( || {
23252319 self . fresh_binding ( ident, pat. id , outer_pat_id, pat_src, bindings)
2326- } ;
2320+ } ) ;
23272321
23282322 self . record_def ( pat. id , resolution) ;
23292323 }
0 commit comments