@@ -109,6 +109,14 @@ pub(crate) enum HasGenericParams {
109109 No ,
110110}
111111
112+ /// Is this a `static` or `const` item?
113+ #[ derive( Copy , Clone , Debug ) ]
114+ pub ( crate ) enum IsStaticOrConst {
115+ No ,
116+ Static ,
117+ Const ,
118+ }
119+
112120/// May this constant have generics?
113121#[ derive( Copy , Clone , Debug , Eq , PartialEq ) ]
114122pub ( crate ) enum ConstantHasGenerics {
@@ -181,7 +189,8 @@ pub(crate) enum RibKind<'a> {
181189 FnOrCoroutine ,
182190
183191 /// We passed through an item scope. Disallow upvars.
184- Item ( HasGenericParams ) ,
192+ /// Note if this is a static/const to help with some confusing diagnostics
193+ Item ( HasGenericParams , IsStaticOrConst ) ,
185194
186195 /// We're in a constant item. Can't refer to dynamic stuff.
187196 ///
@@ -221,7 +230,7 @@ impl RibKind<'_> {
221230 | RibKind :: MacroDefinition ( _)
222231 | RibKind :: ConstParamTy
223232 | RibKind :: InlineAsmSym => false ,
224- RibKind :: AssocItem | RibKind :: Item ( _ ) | RibKind :: ForwardGenericParamBan => true ,
233+ RibKind :: AssocItem | RibKind :: Item ( .. ) | RibKind :: ForwardGenericParamBan => true ,
225234 }
226235 }
227236
@@ -870,7 +879,7 @@ impl<'a: 'ast, 'ast, 'tcx> Visitor<'ast> for LateResolutionVisitor<'a, '_, 'ast,
870879 ForeignItemKind :: TyAlias ( box TyAlias { ref generics, .. } ) => {
871880 self . with_generic_param_rib (
872881 & generics. params ,
873- RibKind :: Item ( HasGenericParams :: Yes ( generics. span ) ) ,
882+ RibKind :: Item ( HasGenericParams :: Yes ( generics. span ) , IsStaticOrConst :: No ) ,
874883 LifetimeRibKind :: Generics {
875884 binder : foreign_item. id ,
876885 kind : LifetimeBinderKind :: Item ,
@@ -882,7 +891,7 @@ impl<'a: 'ast, 'ast, 'tcx> Visitor<'ast> for LateResolutionVisitor<'a, '_, 'ast,
882891 ForeignItemKind :: Fn ( box Fn { ref generics, .. } ) => {
883892 self . with_generic_param_rib (
884893 & generics. params ,
885- RibKind :: Item ( HasGenericParams :: Yes ( generics. span ) ) ,
894+ RibKind :: Item ( HasGenericParams :: Yes ( generics. span ) , IsStaticOrConst :: No ) ,
886895 LifetimeRibKind :: Generics {
887896 binder : foreign_item. id ,
888897 kind : LifetimeBinderKind :: Function ,
@@ -2271,7 +2280,7 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
22712280 self . with_current_self_item ( item, |this| {
22722281 this. with_generic_param_rib (
22732282 & generics. params ,
2274- RibKind :: Item ( HasGenericParams :: Yes ( generics. span ) ) ,
2283+ RibKind :: Item ( HasGenericParams :: Yes ( generics. span ) , IsStaticOrConst :: No ) ,
22752284 LifetimeRibKind :: Generics {
22762285 binder : item. id ,
22772286 kind : LifetimeBinderKind :: Item ,
@@ -2349,7 +2358,7 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
23492358 ItemKind :: TyAlias ( box TyAlias { ref generics, .. } ) => {
23502359 self . with_generic_param_rib (
23512360 & generics. params ,
2352- RibKind :: Item ( HasGenericParams :: Yes ( generics. span ) ) ,
2361+ RibKind :: Item ( HasGenericParams :: Yes ( generics. span ) , IsStaticOrConst :: No ) ,
23532362 LifetimeRibKind :: Generics {
23542363 binder : item. id ,
23552364 kind : LifetimeBinderKind :: Item ,
@@ -2362,7 +2371,7 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
23622371 ItemKind :: Fn ( box Fn { ref generics, .. } ) => {
23632372 self . with_generic_param_rib (
23642373 & generics. params ,
2365- RibKind :: Item ( HasGenericParams :: Yes ( generics. span ) ) ,
2374+ RibKind :: Item ( HasGenericParams :: Yes ( generics. span ) , IsStaticOrConst :: No ) ,
23662375 LifetimeRibKind :: Generics {
23672376 binder : item. id ,
23682377 kind : LifetimeBinderKind :: Function ,
@@ -2401,7 +2410,7 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
24012410 // Create a new rib for the trait-wide type parameters.
24022411 self . with_generic_param_rib (
24032412 & generics. params ,
2404- RibKind :: Item ( HasGenericParams :: Yes ( generics. span ) ) ,
2413+ RibKind :: Item ( HasGenericParams :: Yes ( generics. span ) , IsStaticOrConst :: No ) ,
24052414 LifetimeRibKind :: Generics {
24062415 binder : item. id ,
24072416 kind : LifetimeBinderKind :: Item ,
@@ -2422,7 +2431,7 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
24222431 // Create a new rib for the trait-wide type parameters.
24232432 self . with_generic_param_rib (
24242433 & generics. params ,
2425- RibKind :: Item ( HasGenericParams :: Yes ( generics. span ) ) ,
2434+ RibKind :: Item ( HasGenericParams :: Yes ( generics. span ) , IsStaticOrConst :: No ) ,
24262435 LifetimeRibKind :: Generics {
24272436 binder : item. id ,
24282437 kind : LifetimeBinderKind :: Item ,
@@ -2471,11 +2480,14 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
24712480 ItemKind :: Const ( box ast:: ConstItem { ref generics, ref ty, ref expr, .. } ) => {
24722481 self . with_generic_param_rib (
24732482 & generics. params ,
2474- RibKind :: Item ( if self . r . tcx . features ( ) . generic_const_items {
2475- HasGenericParams :: Yes ( generics. span )
2476- } else {
2477- HasGenericParams :: No
2478- } ) ,
2483+ RibKind :: Item (
2484+ if self . r . tcx . features ( ) . generic_const_items {
2485+ HasGenericParams :: Yes ( generics. span )
2486+ } else {
2487+ HasGenericParams :: No
2488+ } ,
2489+ IsStaticOrConst :: Const ,
2490+ ) ,
24792491 LifetimeRibKind :: Generics {
24802492 binder : item. id ,
24812493 kind : LifetimeBinderKind :: ConstItem ,
@@ -2560,7 +2572,7 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
25602572 let mut add_bindings_for_ns = |ns| {
25612573 let parent_rib = self . ribs [ ns]
25622574 . iter ( )
2563- . rfind ( |r| matches ! ( r. kind, RibKind :: Item ( _ ) ) )
2575+ . rfind ( |r| matches ! ( r. kind, RibKind :: Item ( .. ) ) )
25642576 . expect ( "associated item outside of an item" ) ;
25652577 seen_bindings. extend ( parent_rib. bindings . keys ( ) . map ( |ident| ( * ident, ident. span ) ) ) ;
25662578 } ;
@@ -2696,7 +2708,7 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
26962708 }
26972709
26982710 fn with_static_rib ( & mut self , f : impl FnOnce ( & mut Self ) ) {
2699- let kind = RibKind :: Item ( HasGenericParams :: No ) ;
2711+ let kind = RibKind :: Item ( HasGenericParams :: No , IsStaticOrConst :: Static ) ;
27002712 self . with_rib ( ValueNS , kind, |this| this. with_rib ( TypeNS , kind, f) )
27012713 }
27022714
@@ -2877,7 +2889,7 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
28772889 // If applicable, create a rib for the type parameters.
28782890 self . with_generic_param_rib (
28792891 & generics. params ,
2880- RibKind :: Item ( HasGenericParams :: Yes ( generics. span ) ) ,
2892+ RibKind :: Item ( HasGenericParams :: Yes ( generics. span ) , IsStaticOrConst :: No ) ,
28812893 LifetimeRibKind :: Generics {
28822894 span : generics. span ,
28832895 binder : item_id,
0 commit comments