@@ -64,7 +64,7 @@ pub(crate) enum PatternSource {
6464}
6565
6666#[ derive( Copy , Clone , Debug , PartialEq , Eq ) ]
67- enum IsRepeatExpr {
67+ pub ( crate ) enum IsRepeatExpr {
6868 No ,
6969 Yes ,
7070}
@@ -74,13 +74,28 @@ struct IsNeverPattern;
7474/// Describes whether an `AnonConst` is a type level const arg or
7575/// some other form of anon const (i.e. inline consts or enum discriminants)
7676#[ derive( Copy , Clone , Debug , PartialEq , Eq ) ]
77- enum AnonConstKind {
77+ pub ( crate ) enum AnonConstKind {
7878 EnumDiscriminant ,
7979 FieldDefaultValue ,
8080 InlineConst ,
8181 ConstArg ( IsRepeatExpr ) ,
8282}
8383
84+ impl IntoDiagArg for AnonConstKind {
85+ fn into_diag_arg ( self , _: & mut Option < std:: path:: PathBuf > ) -> DiagArgValue {
86+ DiagArgValue :: Str ( Cow :: Borrowed ( match self {
87+ AnonConstKind :: EnumDiscriminant => "enum discriminant" ,
88+ AnonConstKind :: FieldDefaultValue => "field default value" ,
89+ AnonConstKind :: InlineConst => "inline const" ,
90+ AnonConstKind :: ConstArg ( is_repeat_expr) => match is_repeat_expr {
91+ IsRepeatExpr :: No => "array repeat expression" ,
92+ IsRepeatExpr :: Yes => "const generic args" ,
93+ }
94+ } ,
95+ ) )
96+ }
97+ }
98+
8499impl PatternSource {
85100 fn descr ( self ) -> & ' static str {
86101 match self {
@@ -214,7 +229,7 @@ pub(crate) enum RibKind<'ra> {
214229 ///
215230 /// The item may reference generic parameters in trivial constant expressions.
216231 /// All other constants aren't allowed to use generic params at all.
217- ConstantItem ( ConstantHasGenerics , Option < ( Ident , ConstantItemKind ) > ) ,
232+ ConstantItem ( ConstantHasGenerics , Option < ( Ident , ConstantItemKind ) > , Option < AnonConstKind > ) ,
218233
219234 /// We passed through a module item.
220235 Module ( Module < ' ra > ) ,
@@ -2989,19 +3004,21 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
29893004 & mut self ,
29903005 is_repeat : IsRepeatExpr ,
29913006 may_use_generics : ConstantHasGenerics ,
3007+ anon_const_kind : Option < AnonConstKind > ,
29923008 item : Option < ( Ident , ConstantItemKind ) > ,
29933009 f : impl FnOnce ( & mut Self ) ,
29943010 ) {
29953011 let f = |this : & mut Self | {
2996- this. with_rib ( ValueNS , RibKind :: ConstantItem ( may_use_generics, item) , |this| {
3012+ this. with_rib ( ValueNS , RibKind :: ConstantItem ( may_use_generics, item, anon_const_kind ) , |this| {
29973013 this. with_rib (
29983014 TypeNS ,
29993015 RibKind :: ConstantItem (
30003016 may_use_generics. force_yes_if ( is_repeat == IsRepeatExpr :: Yes ) ,
30013017 item,
3018+ anon_const_kind,
30023019 ) ,
30033020 |this| {
3004- this. with_label_rib ( RibKind :: ConstantItem ( may_use_generics, item) , f) ;
3021+ this. with_label_rib ( RibKind :: ConstantItem ( may_use_generics, item, anon_const_kind ) , f) ;
30053022 } ,
30063023 )
30073024 } )
@@ -3518,7 +3535,7 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
35183535
35193536 fn resolve_const_body ( & mut self , expr : & ' ast Expr , item : Option < ( Ident , ConstantItemKind ) > ) {
35203537 self . with_lifetime_rib ( LifetimeRibKind :: Elided ( LifetimeRes :: Infer ) , |this| {
3521- this. with_constant_rib ( IsRepeatExpr :: No , ConstantHasGenerics :: Yes , item, |this| {
3538+ this. with_constant_rib ( IsRepeatExpr :: No , ConstantHasGenerics :: Yes , None , item, |this| {
35223539 this. visit_expr ( expr)
35233540 } ) ;
35243541 } )
@@ -4728,7 +4745,7 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
47284745 }
47294746 } ;
47304747
4731- self . with_constant_rib ( is_repeat_expr, may_use_generics, None , |this| {
4748+ self . with_constant_rib ( is_repeat_expr, may_use_generics, Some ( anon_const_kind ) , None , |this| {
47324749 this. with_lifetime_rib ( LifetimeRibKind :: Elided ( LifetimeRes :: Infer ) , |this| {
47334750 resolve_expr ( this) ;
47344751 } ) ;
0 commit comments