@@ -143,10 +143,18 @@ impl<'a> NameResolution<'a> {
143
143
fn try_define ( & mut self , binding : & ' a NameBinding < ' a > ) -> Result < ( ) , & ' a NameBinding < ' a > > {
144
144
if let Some ( old_binding) = self . binding {
145
145
if binding. defined_with ( DefModifiers :: GLOB_IMPORTED ) {
146
- self . duplicate_globs . push ( binding) ;
146
+ if binding. def ( ) . unwrap ( ) != old_binding. def ( ) . unwrap ( ) {
147
+ self . duplicate_globs . push ( binding) ;
148
+ } else if old_binding. defined_with ( DefModifiers :: GLOB_IMPORTED ) &&
149
+ old_binding. is_public ( ) < binding. is_public ( ) {
150
+ // We are glob-importing the same item but with greater visibility.
151
+ self . binding = Some ( binding) ;
152
+ }
147
153
} else if old_binding. defined_with ( DefModifiers :: GLOB_IMPORTED ) {
148
- self . duplicate_globs . push ( old_binding) ;
149
154
self . binding = Some ( binding) ;
155
+ if binding. def ( ) . unwrap ( ) != old_binding. def ( ) . unwrap ( ) {
156
+ self . duplicate_globs . push ( old_binding) ;
157
+ }
150
158
} else {
151
159
return Err ( old_binding) ;
152
160
}
@@ -315,11 +323,7 @@ impl<'a> ::ModuleS<'a> {
315
323
// where it might end up getting re-defined via a glob cycle.
316
324
let ( new_binding, t) = {
317
325
let mut resolution = & mut * self . resolution ( name, ns) . borrow_mut ( ) ;
318
- let was_known = resolution. binding ( ) . is_some ( ) ;
319
-
320
326
let t = update ( resolution) ;
321
-
322
- if was_known { return t; }
323
327
match resolution. binding ( ) {
324
328
Some ( binding) => ( binding, t) ,
325
329
None => return t,
0 commit comments