@@ -32,7 +32,7 @@ import syntax::ast::{required, provided};
32
32
import syntax:: ast_util:: { def_id_of_def, dummy_sp, local_def, new_def_hash} ;
33
33
import syntax:: ast_util:: { walk_pat} ;
34
34
import syntax:: attr:: { attr_metas, contains_name} ;
35
- import syntax:: print:: pprust:: path_to_str;
35
+ import syntax:: print:: pprust:: { pat_to_str , path_to_str} ;
36
36
import syntax:: codemap:: span;
37
37
import syntax:: visit:: { default_visitor, fk_method, mk_vt, visit_block} ;
38
38
import syntax:: visit:: { visit_crate, visit_expr, visit_expr_opt, visit_fn} ;
@@ -3658,9 +3658,12 @@ class Resolver {
3658
3658
fn resolve_pattern( pattern: @pat,
3659
3659
mode: PatternBindingMode ,
3660
3660
mutability: Mutability ,
3661
- bindings_list: option<hashmap<Atom , ( ) >>,
3661
+ // Maps idents to the node ID for the (outermost)
3662
+ // pattern that binds them
3663
+ bindings_list: option<hashmap<Atom , node_id>>,
3662
3664
visitor: ResolveVisitor ) {
3663
3665
3666
+ let pat_id = pattern. id;
3664
3667
do walk_pat( pattern) |pattern| {
3665
3668
alt pattern. node {
3666
3669
pat_ident( path, _)
@@ -3705,19 +3708,18 @@ class Resolver {
3705
3708
3706
3709
let is_mutable = mutability == Mutable ;
3707
3710
3708
- let mut def;
3709
- alt mode {
3711
+ let def = alt mode {
3710
3712
RefutableMode {
3711
3713
// For pattern arms, we must use
3712
3714
// `def_binding` definitions.
3713
3715
3714
- def = def_binding( pattern. id) ;
3716
+ def_binding( pattern. id)
3715
3717
}
3716
3718
IrrefutableMode {
3717
3719
// But for locals, we use `def_local`.
3718
- def = def_local( pattern. id, is_mutable) ;
3720
+ def_local( pattern. id, is_mutable)
3719
3721
}
3720
- }
3722
+ } ;
3721
3723
3722
3724
// Record the definition so that later passes
3723
3725
// will be able to distinguish variants from
@@ -3737,10 +3739,19 @@ class Resolver {
3737
3739
let last_rib = ( * self . value_ribs) . last( ) ;
3738
3740
last_rib. bindings. insert( atom,
3739
3741
dl_def( def) ) ;
3740
- bindings_list. insert( atom, ( ) ) ;
3742
+ bindings_list. insert( atom, pat_id ) ;
3741
3743
}
3742
- some( _) {
3743
- // Do nothing.
3744
+ some( b) {
3745
+ if b. find( atom) == some( pat_id) {
3746
+ // Then this is a duplicate variable
3747
+ // in the same disjunct, which is an
3748
+ // error
3749
+ self . session. span_err( pattern. span,
3750
+ #fmt( "Identifier %s is bound more \
3751
+ than once in the same pattern",
3752
+ path_to_str( path) ) ) ;
3753
+ }
3754
+ // Not bound in the same pattern: do nothing
3744
3755
}
3745
3756
none {
3746
3757
let last_rib = ( * self . value_ribs) . last( ) ;
0 commit comments