@@ -242,6 +242,20 @@ impl<'a> AstValidator<'a> {
242242 }
243243 }
244244
245+ fn check_impl_fn_not_const ( & self , constness : Const , parent_constness : Const ) {
246+ let Const :: Yes ( span) = constness else {
247+ return ;
248+ } ;
249+
250+ let span = self . sess . source_map ( ) . span_extend_while_whitespace ( span) ;
251+
252+ let Const :: Yes ( parent_constness) = parent_constness else {
253+ return ;
254+ } ;
255+
256+ self . dcx ( ) . emit_err ( errors:: ImplFnConst { span, parent_constness } ) ;
257+ }
258+
245259 fn check_trait_fn_not_const ( & self , constness : Const , parent : & TraitOrImpl ) {
246260 let Const :: Yes ( span) = constness else {
247261 return ;
@@ -1689,14 +1703,23 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
16891703 ) ;
16901704 }
16911705
1692- if let Some ( parent @ ( TraitOrImpl :: Trait { .. } | TraitOrImpl :: TraitImpl { .. } ) ) =
1693- & self . outer_trait_or_trait_impl
1694- {
1695- self . visibility_not_permitted ( & item. vis , errors:: VisibilityNotPermittedNote :: TraitImpl ) ;
1696- if let AssocItemKind :: Fn ( box Fn { sig, .. } ) = & item. kind {
1697- self . check_trait_fn_not_const ( sig. header . constness , parent) ;
1698- self . check_async_fn_in_const_trait_or_impl ( sig, parent) ;
1706+ match & self . outer_trait_or_trait_impl {
1707+ Some ( parent @ ( TraitOrImpl :: Trait { .. } | TraitOrImpl :: TraitImpl { .. } ) ) => {
1708+ self . visibility_not_permitted (
1709+ & item. vis ,
1710+ errors:: VisibilityNotPermittedNote :: TraitImpl ,
1711+ ) ;
1712+ if let AssocItemKind :: Fn ( box Fn { sig, .. } ) = & item. kind {
1713+ self . check_trait_fn_not_const ( sig. header . constness , parent) ;
1714+ self . check_async_fn_in_const_trait_or_impl ( sig, parent) ;
1715+ }
1716+ }
1717+ Some ( TraitOrImpl :: Impl { constness } ) => {
1718+ if let AssocItemKind :: Fn ( box Fn { sig, .. } ) = & item. kind {
1719+ self . check_impl_fn_not_const ( sig. header . constness , * constness) ;
1720+ }
16991721 }
1722+ None => { }
17001723 }
17011724
17021725 if let AssocItemKind :: Const ( ci) = & item. kind {
0 commit comments