Skip to content

Commit df5b0c0

Browse files
committed
auto merge of #7046 : luqmana/rust/issue-7044, r=sanxiyn
Fixes #7044.
2 parents 37733c7 + 693b9ce commit df5b0c0

File tree

2 files changed

+44
-36
lines changed

2 files changed

+44
-36
lines changed

src/librustc/middle/resolve.rs

+30-36
Original file line numberDiff line numberDiff line change
@@ -294,18 +294,6 @@ pub enum DuplicateCheckingMode {
294294
OverwriteDuplicates
295295
}
296296

297-
// Returns the namespace associated with the given duplicate checking mode,
298-
// or fails for OverwriteDuplicates. This is used for error messages.
299-
pub fn namespace_for_duplicate_checking_mode(mode: DuplicateCheckingMode)
300-
-> Namespace {
301-
match mode {
302-
ForbidDuplicateModules | ForbidDuplicateTypes |
303-
ForbidDuplicateTypesAndValues => TypeNS,
304-
ForbidDuplicateValues => ValueNS,
305-
OverwriteDuplicates => fail!("OverwriteDuplicates has no namespace")
306-
}
307-
}
308-
309297
/// One local scope.
310298
pub struct Rib {
311299
bindings: @mut HashMap<ident,def_like>,
@@ -1007,37 +995,43 @@ impl Resolver {
1007995
// nothing.
1008996

1009997
let mut is_duplicate = false;
1010-
match duplicate_checking_mode {
998+
let ns = match duplicate_checking_mode {
1011999
ForbidDuplicateModules => {
1012-
is_duplicate =
1013-
child.get_module_if_available().is_some();
1000+
is_duplicate = child.get_module_if_available().is_some();
1001+
Some(TypeNS)
10141002
}
10151003
ForbidDuplicateTypes => {
10161004
match child.def_for_namespace(TypeNS) {
10171005
Some(def_mod(_)) | None => {}
10181006
Some(_) => is_duplicate = true
10191007
}
1008+
Some(TypeNS)
10201009
}
10211010
ForbidDuplicateValues => {
10221011
is_duplicate = child.defined_in_namespace(ValueNS);
1012+
Some(ValueNS)
10231013
}
10241014
ForbidDuplicateTypesAndValues => {
1015+
let mut n = None;
10251016
match child.def_for_namespace(TypeNS) {
10261017
Some(def_mod(_)) | None => {}
1027-
Some(_) => is_duplicate = true
1018+
Some(_) => {
1019+
n = Some(TypeNS);
1020+
is_duplicate = true;
1021+
}
10281022
};
10291023
if child.defined_in_namespace(ValueNS) {
10301024
is_duplicate = true;
1025+
n = Some(ValueNS);
10311026
}
1027+
n
10321028
}
1033-
OverwriteDuplicates => {}
1034-
}
1035-
if duplicate_checking_mode != OverwriteDuplicates &&
1036-
is_duplicate {
1029+
OverwriteDuplicates => None
1030+
};
1031+
if is_duplicate {
10371032
// Return an error here by looking up the namespace that
10381033
// had the duplicate.
1039-
let ns = namespace_for_duplicate_checking_mode(
1040-
duplicate_checking_mode);
1034+
let ns = ns.unwrap();
10411035
self.session.span_err(sp,
10421036
fmt!("duplicate definition of %s `%s`",
10431037
namespace_to_str(ns),
@@ -1195,22 +1189,22 @@ impl Resolver {
11951189

11961190
// These items live in both the type and value namespaces.
11971191
item_struct(struct_def, _) => {
1198-
let (name_bindings, new_parent) =
1199-
self.add_child(ident, parent, ForbidDuplicateTypes, sp);
1192+
// Adding to both Type and Value namespaces or just Type?
1193+
let (forbid, ctor_id) = match struct_def.ctor_id {
1194+
Some(ctor_id) => (ForbidDuplicateTypesAndValues, Some(ctor_id)),
1195+
None => (ForbidDuplicateTypes, None)
1196+
};
12001197

1201-
name_bindings.define_type(
1202-
privacy, def_ty(local_def(item.id)), sp);
1198+
let (name_bindings, new_parent) = self.add_child(ident, parent, forbid, sp);
12031199

1204-
// If this struct is tuple-like or enum-like, define a name
1205-
// in the value namespace.
1206-
match struct_def.ctor_id {
1207-
None => {}
1208-
Some(ctor_id) => {
1209-
name_bindings.define_value(
1210-
privacy,
1211-
def_struct(local_def(ctor_id)),
1212-
sp);
1213-
}
1200+
// Define a name in the type namespace.
1201+
name_bindings.define_type(privacy, def_ty(local_def(item.id)), sp);
1202+
1203+
// If this is a newtype or unit-like struct, define a name
1204+
// in the value namespace as well
1205+
do ctor_id.while_some |cid| {
1206+
name_bindings.define_value(privacy, def_struct(local_def(cid)), sp);
1207+
None
12141208
}
12151209

12161210
// Record the def ID of this struct.

src/test/compile-fail/issue-7044.rs

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
static X: int = 0;
12+
struct X; //~ ERROR error: duplicate definition of value `X`
13+
14+
fn main() {}

0 commit comments

Comments
 (0)