@@ -232,6 +232,18 @@ impl<'a> AstValidator<'a> {
232232 }
233233 }
234234
235+ fn check_impl_fn_not_const ( & self , constness : Const , parent_constness : Const ) {
236+ let Const :: Yes ( span) = constness else {
237+ return ;
238+ } ;
239+
240+ let Const :: Yes ( parent_constness) = parent_constness else {
241+ return ;
242+ } ;
243+
244+ self . dcx ( ) . emit_err ( errors:: ImplFnConst { span, parent_constness } ) ;
245+ }
246+
235247 fn check_trait_fn_not_const ( & self , constness : Const , parent : & TraitOrImpl ) {
236248 let Const :: Yes ( span) = constness else {
237249 return ;
@@ -1631,14 +1643,23 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
16311643 ) ;
16321644 }
16331645
1634- if let Some ( parent @ ( TraitOrImpl :: Trait { .. } | TraitOrImpl :: TraitImpl { .. } ) ) =
1635- & self . outer_trait_or_trait_impl
1636- {
1637- self . visibility_not_permitted ( & item. vis , errors:: VisibilityNotPermittedNote :: TraitImpl ) ;
1638- if let AssocItemKind :: Fn ( box Fn { sig, .. } ) = & item. kind {
1639- self . check_trait_fn_not_const ( sig. header . constness , parent) ;
1640- self . check_async_fn_in_const_trait_or_impl ( sig, parent) ;
1646+ match & self . outer_trait_or_trait_impl {
1647+ Some ( parent @ ( TraitOrImpl :: Trait { .. } | TraitOrImpl :: TraitImpl { .. } ) ) => {
1648+ self . visibility_not_permitted (
1649+ & item. vis ,
1650+ errors:: VisibilityNotPermittedNote :: TraitImpl ,
1651+ ) ;
1652+ if let AssocItemKind :: Fn ( box Fn { sig, .. } ) = & item. kind {
1653+ self . check_trait_fn_not_const ( sig. header . constness , parent) ;
1654+ self . check_async_fn_in_const_trait_or_impl ( sig, parent) ;
1655+ }
1656+ }
1657+ Some ( TraitOrImpl :: Impl { constness } ) => {
1658+ if let AssocItemKind :: Fn ( box Fn { sig, .. } ) = & item. kind {
1659+ self . check_impl_fn_not_const ( sig. header . constness , * constness) ;
1660+ }
16411661 }
1662+ None => { }
16421663 }
16431664
16441665 if let AssocItemKind :: Const ( ci) = & item. kind {
0 commit comments