@@ -325,7 +325,6 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
325325 self . arenas . alloc_name_binding ( NameBindingData {
326326 kind : NameBindingKind :: Import { binding, import } ,
327327 ambiguity : None ,
328- warn_ambiguity : false ,
329328 span : import. span ,
330329 vis,
331330 expansion : import. parent_scope . expansion ,
@@ -339,7 +338,6 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
339338 ident : Ident ,
340339 ns : Namespace ,
341340 binding : NameBinding < ' ra > ,
342- warn_ambiguity : bool ,
343341 ) -> Result < ( ) , NameBinding < ' ra > > {
344342 let res = binding. res ( ) ;
345343 self . check_reserved_macro_name ( ident, res) ;
@@ -351,7 +349,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
351349 module. underscore_disambiguator . update_unchecked ( |d| d + 1 ) ;
352350 module. underscore_disambiguator . get ( )
353351 } ) ;
354- self . update_local_resolution ( module, key, warn_ambiguity , |this, resolution| {
352+ self . update_local_resolution ( module, key, |this, resolution| {
355353 if let Some ( old_binding) = resolution. best_binding ( ) {
356354 if res == Res :: Err && old_binding. res ( ) != Res :: Err {
357355 // Do not override real bindings with `Res::Err`s from error recovery.
@@ -360,30 +358,31 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
360358 match ( old_binding. is_glob_import ( ) , binding. is_glob_import ( ) ) {
361359 ( true , true ) => {
362360 let ( glob_binding, old_glob_binding) = ( binding, old_binding) ;
363- // FIXME: remove `!binding.is_ambiguity_recursive()` after delete the warning ambiguity.
364- if !binding. is_ambiguity_recursive ( )
365- && let NameBindingKind :: Import { import : old_import, .. } =
366- old_glob_binding. kind
367- && let NameBindingKind :: Import { import, .. } = glob_binding. kind
368- && old_import == import
369- {
370- // When imported from the same glob-import statement, we should replace
371- // `old_glob_binding` with `glob_binding`, regardless of whether
372- // they have the same resolution or not.
373- resolution. glob_binding = Some ( glob_binding) ;
374- } else if res != old_glob_binding. res ( ) {
361+ if res != old_glob_binding. res ( ) {
362+ let ( primary_binding, secondary_binding, warning) = if !binding
363+ . is_ambiguity_recursive ( )
364+ && let NameBindingKind :: Import { import : old_import, .. } =
365+ old_glob_binding. kind
366+ && let NameBindingKind :: Import { import, .. } = glob_binding. kind
367+ && old_import == import
368+ {
369+ // When imported from the same import, we have to replace
370+ // `old_glob_binding` with `glob_binding` to avoid cascade errors.
371+ ( glob_binding, old_glob_binding, true )
372+ } else {
373+ ( old_glob_binding, glob_binding, false )
374+ } ;
375375 resolution. glob_binding = Some ( this. new_ambiguity_binding (
376376 AmbiguityKind :: GlobVsGlob ,
377- old_glob_binding ,
378- glob_binding ,
379- warn_ambiguity ,
377+ primary_binding ,
378+ secondary_binding ,
379+ warning ,
380380 ) ) ;
381- } else if !old_binding. vis . is_at_least ( binding. vis , this. tcx ) {
381+ } else if !old_glob_binding. vis . is_at_least ( glob_binding. vis , this. tcx )
382+ || glob_binding. is_ambiguity_recursive ( )
383+ {
382384 // We are glob-importing the same item but with greater visibility.
383385 resolution. glob_binding = Some ( glob_binding) ;
384- } else if binding. is_ambiguity_recursive ( ) {
385- resolution. glob_binding =
386- Some ( this. new_warn_ambiguity_binding ( glob_binding) ) ;
387386 }
388387 }
389388 ( old_glob @ true , false ) | ( old_glob @ false , true ) => {
@@ -412,7 +411,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
412411 glob_binding,
413412 false ,
414413 ) ) ;
415- } else if !old_glob_binding. vis . is_at_least ( binding. vis , this. tcx ) {
414+ } else if !old_glob_binding. vis . is_at_least ( glob_binding. vis , this. tcx )
415+ || glob_binding. is_ambiguity_recursive ( )
416+ {
417+ // We are glob-importing the same item but with greater visibility.
416418 resolution. glob_binding = Some ( glob_binding) ;
417419 }
418420 } else {
@@ -440,33 +442,22 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
440442 ambiguity_kind : AmbiguityKind ,
441443 primary_binding : NameBinding < ' ra > ,
442444 secondary_binding : NameBinding < ' ra > ,
443- warn_ambiguity : bool ,
445+ warning : bool ,
444446 ) -> NameBinding < ' ra > {
445- let ambiguity = Some ( ( secondary_binding, ambiguity_kind) ) ;
446- let data = NameBindingData { ambiguity, warn_ambiguity , ..* primary_binding } ;
447+ let ambiguity = Some ( ( secondary_binding, ambiguity_kind, warning ) ) ;
448+ let data = NameBindingData { ambiguity, ..* primary_binding } ;
447449 self . arenas . alloc_name_binding ( data)
448450 }
449451
450- fn new_warn_ambiguity_binding ( & self , binding : NameBinding < ' ra > ) -> NameBinding < ' ra > {
451- assert ! ( binding. is_ambiguity_recursive( ) ) ;
452- self . arenas . alloc_name_binding ( NameBindingData { warn_ambiguity : true , ..* binding } )
453- }
454-
455452 // Use `f` to mutate the resolution of the name in the module.
456453 // If the resolution becomes a success, define it in the module's glob importers.
457- fn update_local_resolution < T , F > (
458- & mut self ,
459- module : Module < ' ra > ,
460- key : BindingKey ,
461- warn_ambiguity : bool ,
462- f : F ,
463- ) -> T
454+ fn update_local_resolution < T , F > ( & mut self , module : Module < ' ra > , key : BindingKey , f : F ) -> T
464455 where
465456 F : FnOnce ( & Resolver < ' ra , ' tcx > , & mut NameResolution < ' ra > ) -> T ,
466457 {
467458 // Ensure that `resolution` isn't borrowed when defining in the module's glob importers,
468459 // during which the resolution might end up getting re-defined via a glob cycle.
469- let ( binding, t, warn_ambiguity ) = {
460+ let ( binding, t) = {
470461 let resolution = & mut * self . resolution_or_default ( module, key) . borrow_mut_unchecked ( ) ;
471462 let old_binding = resolution. binding ( ) ;
472463
@@ -475,7 +466,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
475466 if let Some ( binding) = resolution. binding ( )
476467 && old_binding != Some ( binding)
477468 {
478- ( binding, t, warn_ambiguity || old_binding . is_some ( ) )
469+ ( binding, t)
479470 } else {
480471 return t;
481472 }
@@ -500,7 +491,6 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
500491 ident. 0 ,
501492 key. ns ,
502493 imported_binding,
503- warn_ambiguity,
504494 ) ;
505495 }
506496 }
@@ -521,11 +511,11 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
521511 let dummy_binding = self . import ( dummy_binding, import) ;
522512 self . per_ns ( |this, ns| {
523513 let module = import. parent_scope . module ;
524- let _ = this. try_define_local ( module, target, ns, dummy_binding, false ) ;
514+ let _ = this. try_define_local ( module, target, ns, dummy_binding) ;
525515 // Don't remove underscores from `single_imports`, they were never added.
526516 if target. name != kw:: Underscore {
527517 let key = BindingKey :: new ( target, ns) ;
528- this. update_local_resolution ( module, key, false , |_, resolution| {
518+ this. update_local_resolution ( module, key, |_, resolution| {
529519 resolution. single_imports . swap_remove ( & import) ;
530520 } )
531521 }
@@ -658,7 +648,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
658648 let Some ( binding) = resolution. best_binding ( ) else { continue } ;
659649
660650 if let NameBindingKind :: Import { import, .. } = binding. kind
661- && let Some ( ( amb_binding, _ ) ) = binding. ambiguity
651+ && let Some ( ( amb_binding, .. ) ) = binding. ambiguity
662652 && binding. res ( ) != Res :: Err
663653 && exported_ambiguities. contains ( & binding)
664654 {
@@ -917,7 +907,6 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
917907 this. get_mut_unchecked ( ) . update_local_resolution (
918908 parent,
919909 key,
920- false ,
921910 |_, resolution| {
922911 resolution. single_imports . swap_remove ( & import) ;
923912 } ,
@@ -1523,16 +1512,11 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
15231512 } ;
15241513 if self . is_accessible_from ( binding. vis , scope) {
15251514 let imported_binding = self . import ( binding, import) ;
1526- let warn_ambiguity = self
1527- . resolution ( import. parent_scope . module , key)
1528- . and_then ( |r| r. binding ( ) )
1529- . is_some_and ( |binding| binding. warn_ambiguity_recursive ( ) ) ;
15301515 let _ = self . try_define_local (
15311516 import. parent_scope . module ,
15321517 key. ident . 0 ,
15331518 key. ns ,
15341519 imported_binding,
1535- warn_ambiguity,
15361520 ) ;
15371521 }
15381522 }
0 commit comments