@@ -127,8 +127,6 @@ impl Ord for BindingError {
127127enum  ResolutionError < ' a >  { 
128128    /// error E0401: can't use type parameters from outer function 
129129     TypeParametersFromOuterFunction , 
130-     /// error E0402: cannot use an outer type parameter in this context 
131-      OuterTypeParameterContext , 
132130    /// error E0403: the name is already used for a type parameter in this type parameter list 
133131     NameAlreadyUsedInTypeParameterList ( Name ,  & ' a  Span ) , 
134132    /// error E0407: method is not a member of trait 
@@ -187,12 +185,6 @@ fn resolve_struct_error<'sess, 'a>(resolver: &'sess Resolver,
187185            err. span_label ( span,  "use of type variable from outer function" ) ; 
188186            err
189187        } 
190-         ResolutionError :: OuterTypeParameterContext  => { 
191-             struct_span_err ! ( resolver. session, 
192-                              span, 
193-                              E0402 , 
194-                              "cannot use an outer type parameter in this context" ) 
195-         } 
196188        ResolutionError :: NameAlreadyUsedInTypeParameterList ( name,  first_use_span)  => { 
197189             let  mut  err = struct_span_err ! ( resolver. session, 
198190                                            span, 
@@ -1671,16 +1663,16 @@ impl<'a> Resolver<'a> {
16711663                            this. check_proc_macro_attrs ( & trait_item. attrs ) ; 
16721664
16731665                            match  trait_item. node  { 
1674-                                 TraitItemKind :: Const ( _,  ref  default)  => { 
1666+                                 TraitItemKind :: Const ( ref  ty,  ref  default)  => { 
1667+                                     this. visit_ty ( ty) ; 
1668+ 
16751669                                    // Only impose the restrictions of 
1676-                                     // ConstRibKind if there's  an actual constant 
1670+                                     // ConstRibKind for  an actual constant 
16771671                                    // expression in a provided default. 
1678-                                     if  default . is_some ( )   { 
1672+                                     if  let   Some ( ref  expr )  =  * default { 
16791673                                        this. with_constant_rib ( |this| { 
1680-                                             visit :: walk_trait_item ( this,  trait_item ) 
1674+                                             this. visit_expr ( expr ) ; 
16811675                                        } ) ; 
1682-                                     }  else  { 
1683-                                         visit:: walk_trait_item ( this,  trait_item) 
16841676                                    } 
16851677                                } 
16861678                                TraitItemKind :: Method ( ref  sig,  _)  => { 
@@ -1709,9 +1701,13 @@ impl<'a> Resolver<'a> {
17091701                } ) ; 
17101702            } 
17111703
1712-             ItemKind :: Const ( ..)  | ItemKind :: Static ( ..)  => { 
1713-                 self . with_constant_rib ( |this| { 
1714-                     visit:: walk_item ( this,  item) ; 
1704+             ItemKind :: Static ( ref  ty,  _,  ref  expr)  |
1705+             ItemKind :: Const ( ref  ty,  ref  expr)  => { 
1706+                 self . with_item_rib ( |this| { 
1707+                     this. visit_ty ( ty) ; 
1708+                     this. with_constant_rib ( |this| { 
1709+                         this. visit_expr ( expr) ; 
1710+                     } ) ; 
17151711                } ) ; 
17161712            } 
17171713
@@ -1782,13 +1778,21 @@ impl<'a> Resolver<'a> {
17821778        self . label_ribs . pop ( ) ; 
17831779    } 
17841780
1781+     fn  with_item_rib < F > ( & mut  self ,  f :  F ) 
1782+         where  F :  FnOnce ( & mut  Resolver ) 
1783+     { 
1784+         self . ribs [ ValueNS ] . push ( Rib :: new ( ItemRibKind ) ) ; 
1785+         self . ribs [ TypeNS ] . push ( Rib :: new ( ItemRibKind ) ) ; 
1786+         f ( self ) ; 
1787+         self . ribs [ TypeNS ] . pop ( ) ; 
1788+         self . ribs [ ValueNS ] . pop ( ) ; 
1789+     } 
1790+ 
17851791    fn  with_constant_rib < F > ( & mut  self ,  f :  F ) 
17861792        where  F :  FnOnce ( & mut  Resolver ) 
17871793    { 
17881794        self . ribs [ ValueNS ] . push ( Rib :: new ( ConstantItemRibKind ) ) ; 
1789-         self . ribs [ TypeNS ] . push ( Rib :: new ( ConstantItemRibKind ) ) ; 
17901795        f ( self ) ; 
1791-         self . ribs [ TypeNS ] . pop ( ) ; 
17921796        self . ribs [ ValueNS ] . pop ( ) ; 
17931797    } 
17941798
@@ -2755,7 +2759,8 @@ impl<'a> Resolver<'a> {
27552759                for  rib in  ribs { 
27562760                    match  rib. kind  { 
27572761                        NormalRibKind  | MethodRibKind ( _)  | ClosureRibKind ( ..)  |
2758-                         ModuleRibKind ( ..)  | MacroDefinition ( ..)  | ForwardTyParamBanRibKind  => { 
2762+                         ModuleRibKind ( ..)  | MacroDefinition ( ..)  | ForwardTyParamBanRibKind  |
2763+                         ConstantItemRibKind  => { 
27592764                            // Nothing to do. Continue. 
27602765                        } 
27612766                        ItemRibKind  => { 
@@ -2767,14 +2772,6 @@ impl<'a> Resolver<'a> {
27672772                            } 
27682773                            return  Def :: Err ; 
27692774                        } 
2770-                         ConstantItemRibKind  => { 
2771-                             // see #9186 
2772-                             if  record_used { 
2773-                                 resolve_error ( self ,  span, 
2774-                                               ResolutionError :: OuterTypeParameterContext ) ; 
2775-                             } 
2776-                             return  Def :: Err ; 
2777-                         } 
27782775                    } 
27792776                } 
27802777            } 
0 commit comments