@@ -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