@@ -92,6 +92,12 @@ crate enum HasGenericParams {
9292 No ,
9393}
9494
95+ #[ derive( Copy , Clone , Debug , Eq , PartialEq ) ]
96+ crate enum ConstantItemKind {
97+ Const ,
98+ Static ,
99+ }
100+
95101/// The rib kind restricts certain accesses,
96102/// e.g. to a `Res::Local` of an outer item.
97103#[ derive( Copy , Clone , Debug ) ]
@@ -119,7 +125,7 @@ crate enum RibKind<'a> {
119125 ///
120126 /// The `bool` indicates if this constant may reference generic parameters
121127 /// and is used to only allow generic parameters to be used in trivial constant expressions.
122- ConstantItemRibKind ( bool ) ,
128+ ConstantItemRibKind ( bool , Option < ( Ident , ConstantItemKind ) > ) ,
123129
124130 /// We passed through a module.
125131 ModuleRibKind ( Module < ' a > ) ,
@@ -145,7 +151,7 @@ impl RibKind<'_> {
145151 NormalRibKind
146152 | ClosureOrAsyncRibKind
147153 | FnItemRibKind
148- | ConstantItemRibKind ( _ )
154+ | ConstantItemRibKind ( .. )
149155 | ModuleRibKind ( _)
150156 | MacroDefinition ( _)
151157 | ConstParamTyRibKind => false ,
@@ -634,7 +640,7 @@ impl<'a: 'ast, 'ast> Visitor<'ast> for LateResolutionVisitor<'a, '_, 'ast> {
634640 // Note that we might not be inside of an repeat expression here,
635641 // but considering that `IsRepeatExpr` is only relevant for
636642 // non-trivial constants this is doesn't matter.
637- self . with_constant_rib ( IsRepeatExpr :: No , true , |this| {
643+ self . with_constant_rib ( IsRepeatExpr :: No , true , None , |this| {
638644 this. smart_resolve_path (
639645 ty. id ,
640646 qself. as_ref ( ) ,
@@ -843,7 +849,7 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
843849 | ClosureOrAsyncRibKind
844850 | FnItemRibKind
845851 | ItemRibKind ( ..)
846- | ConstantItemRibKind ( _ )
852+ | ConstantItemRibKind ( .. )
847853 | ModuleRibKind ( ..)
848854 | ForwardTyParamBanRibKind
849855 | ConstParamTyRibKind => {
@@ -970,6 +976,7 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
970976 this. with_constant_rib (
971977 IsRepeatExpr :: No ,
972978 true ,
979+ None ,
973980 |this| this. visit_expr ( expr) ,
974981 ) ;
975982 }
@@ -1012,11 +1019,19 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
10121019 self . with_item_rib ( HasGenericParams :: No , |this| {
10131020 this. visit_ty ( ty) ;
10141021 if let Some ( expr) = expr {
1022+ let constant_item_kind = match item. kind {
1023+ ItemKind :: Const ( ..) => ConstantItemKind :: Const ,
1024+ ItemKind :: Static ( ..) => ConstantItemKind :: Static ,
1025+ _ => unreachable ! ( ) ,
1026+ } ;
10151027 // We already forbid generic params because of the above item rib,
10161028 // so it doesn't matter whether this is a trivial constant.
1017- this. with_constant_rib ( IsRepeatExpr :: No , true , |this| {
1018- this. visit_expr ( expr)
1019- } ) ;
1029+ this. with_constant_rib (
1030+ IsRepeatExpr :: No ,
1031+ true ,
1032+ Some ( ( item. ident , constant_item_kind) ) ,
1033+ |this| this. visit_expr ( expr) ,
1034+ ) ;
10201035 }
10211036 } ) ;
10221037 }
@@ -1118,15 +1133,16 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
11181133 & mut self ,
11191134 is_repeat : IsRepeatExpr ,
11201135 is_trivial : bool ,
1136+ item : Option < ( Ident , ConstantItemKind ) > ,
11211137 f : impl FnOnce ( & mut Self ) ,
11221138 ) {
11231139 debug ! ( "with_constant_rib: is_repeat={:?} is_trivial={}" , is_repeat, is_trivial) ;
1124- self . with_rib ( ValueNS , ConstantItemRibKind ( is_trivial) , |this| {
1140+ self . with_rib ( ValueNS , ConstantItemRibKind ( is_trivial, item ) , |this| {
11251141 this. with_rib (
11261142 TypeNS ,
1127- ConstantItemRibKind ( is_repeat == IsRepeatExpr :: Yes || is_trivial) ,
1143+ ConstantItemRibKind ( is_repeat == IsRepeatExpr :: Yes || is_trivial, item ) ,
11281144 |this| {
1129- this. with_label_rib ( ConstantItemRibKind ( is_trivial) , f) ;
1145+ this. with_label_rib ( ConstantItemRibKind ( is_trivial, item ) , f) ;
11301146 } ,
11311147 )
11321148 } ) ;
@@ -1266,6 +1282,7 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
12661282 this. with_constant_rib (
12671283 IsRepeatExpr :: No ,
12681284 true ,
1285+ None ,
12691286 |this| {
12701287 visit:: walk_assoc_item (
12711288 this,
@@ -2200,6 +2217,7 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
22002217 self . with_constant_rib (
22012218 is_repeat,
22022219 constant. value . is_potential_trivial_const_param ( ) ,
2220+ None ,
22032221 |this| {
22042222 visit:: walk_anon_const ( this, constant) ;
22052223 } ,
0 commit comments