@@ -66,7 +66,7 @@ pub(crate) enum PatternSource {
6666}
6767
6868#[ derive( Copy , Clone , Debug , PartialEq , Eq ) ]
69- enum IsRepeatExpr {
69+ pub ( crate ) enum IsRepeatExpr {
7070 No ,
7171 Yes ,
7272}
@@ -76,13 +76,28 @@ struct IsNeverPattern;
7676/// Describes whether an `AnonConst` is a type level const arg or
7777/// some other form of anon const (i.e. inline consts or enum discriminants)
7878#[ derive( Copy , Clone , Debug , PartialEq , Eq ) ]
79- enum AnonConstKind {
79+ pub ( crate ) enum AnonConstKind {
8080 EnumDiscriminant ,
8181 FieldDefaultValue ,
8282 InlineConst ,
8383 ConstArg ( IsRepeatExpr ) ,
8484}
8585
86+ impl IntoDiagArg for AnonConstKind {
87+ fn into_diag_arg ( self , _: & mut Option < std:: path:: PathBuf > ) -> DiagArgValue {
88+ DiagArgValue :: Str ( Cow :: Borrowed ( match self {
89+ AnonConstKind :: EnumDiscriminant => "enum discriminant" ,
90+ AnonConstKind :: FieldDefaultValue => "field default value" ,
91+ AnonConstKind :: InlineConst => "inline const" ,
92+ AnonConstKind :: ConstArg ( is_repeat_expr) => match is_repeat_expr {
93+ IsRepeatExpr :: No => "array repeat expression" ,
94+ IsRepeatExpr :: Yes => "const generic args" ,
95+ }
96+ } ,
97+ ) )
98+ }
99+ }
100+
86101impl PatternSource {
87102 fn descr ( self ) -> & ' static str {
88103 match self {
@@ -209,7 +224,7 @@ pub(crate) enum RibKind<'ra> {
209224 ///
210225 /// The item may reference generic parameters in trivial constant expressions.
211226 /// All other constants aren't allowed to use generic params at all.
212- ConstantItem ( ConstantHasGenerics , Option < ( Ident , ConstantItemKind ) > ) ,
227+ ConstantItem ( ConstantHasGenerics , Option < ( Ident , ConstantItemKind ) > , Option < AnonConstKind > ) ,
213228
214229 /// We passed through a module.
215230 Module ( Module < ' ra > ) ,
@@ -3017,19 +3032,21 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
30173032 & mut self ,
30183033 is_repeat : IsRepeatExpr ,
30193034 may_use_generics : ConstantHasGenerics ,
3035+ anon_const_kind : Option < AnonConstKind > ,
30203036 item : Option < ( Ident , ConstantItemKind ) > ,
30213037 f : impl FnOnce ( & mut Self ) ,
30223038 ) {
30233039 let f = |this : & mut Self | {
3024- this. with_rib ( ValueNS , RibKind :: ConstantItem ( may_use_generics, item) , |this| {
3040+ this. with_rib ( ValueNS , RibKind :: ConstantItem ( may_use_generics, item, anon_const_kind ) , |this| {
30253041 this. with_rib (
30263042 TypeNS ,
30273043 RibKind :: ConstantItem (
30283044 may_use_generics. force_yes_if ( is_repeat == IsRepeatExpr :: Yes ) ,
30293045 item,
3046+ anon_const_kind,
30303047 ) ,
30313048 |this| {
3032- this. with_label_rib ( RibKind :: ConstantItem ( may_use_generics, item) , f) ;
3049+ this. with_label_rib ( RibKind :: ConstantItem ( may_use_generics, item, anon_const_kind ) , f) ;
30333050 } ,
30343051 )
30353052 } )
@@ -3548,7 +3565,7 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
35483565
35493566 fn resolve_const_body ( & mut self , expr : & ' ast Expr , item : Option < ( Ident , ConstantItemKind ) > ) {
35503567 self . with_lifetime_rib ( LifetimeRibKind :: Elided ( LifetimeRes :: Infer ) , |this| {
3551- this. with_constant_rib ( IsRepeatExpr :: No , ConstantHasGenerics :: Yes , item, |this| {
3568+ this. with_constant_rib ( IsRepeatExpr :: No , ConstantHasGenerics :: Yes , None , item, |this| {
35523569 this. visit_expr ( expr)
35533570 } ) ;
35543571 } )
@@ -4757,7 +4774,7 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
47574774 }
47584775 } ;
47594776
4760- self . with_constant_rib ( is_repeat_expr, may_use_generics, None , |this| {
4777+ self . with_constant_rib ( is_repeat_expr, may_use_generics, Some ( anon_const_kind ) , None , |this| {
47614778 this. with_lifetime_rib ( LifetimeRibKind :: Elided ( LifetimeRes :: Infer ) , |this| {
47624779 resolve_expr ( this) ;
47634780 } ) ;
0 commit comments