Skip to content

Commit 4712d18

Browse files
committed
Allow multiple glob imports of the same item.
1 parent bf9f60a commit 4712d18

File tree

1 file changed

+10
-6
lines changed

1 file changed

+10
-6
lines changed

src/librustc_resolve/resolve_imports.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -143,10 +143,18 @@ impl<'a> NameResolution<'a> {
143143
fn try_define(&mut self, binding: &'a NameBinding<'a>) -> Result<(), &'a NameBinding<'a>> {
144144
if let Some(old_binding) = self.binding {
145145
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+
}
147153
} else if old_binding.defined_with(DefModifiers::GLOB_IMPORTED) {
148-
self.duplicate_globs.push(old_binding);
149154
self.binding = Some(binding);
155+
if binding.def().unwrap() != old_binding.def().unwrap() {
156+
self.duplicate_globs.push(old_binding);
157+
}
150158
} else {
151159
return Err(old_binding);
152160
}
@@ -315,11 +323,7 @@ impl<'a> ::ModuleS<'a> {
315323
// where it might end up getting re-defined via a glob cycle.
316324
let (new_binding, t) = {
317325
let mut resolution = &mut *self.resolution(name, ns).borrow_mut();
318-
let was_known = resolution.binding().is_some();
319-
320326
let t = update(resolution);
321-
322-
if was_known { return t; }
323327
match resolution.binding() {
324328
Some(binding) => (binding, t),
325329
None => return t,

0 commit comments

Comments
 (0)