@@ -245,6 +245,20 @@ impl<'a> AstValidator<'a> {
245245 }
246246 }
247247
248+ fn check_impl_fn_not_const ( & self , constness : Const , parent_constness : Const ) {
249+ let Const :: Yes ( span) = constness else {
250+ return ;
251+ } ;
252+
253+ let span = self . sess . source_map ( ) . span_extend_while_whitespace ( span) ;
254+
255+ let Const :: Yes ( parent_constness) = parent_constness else {
256+ return ;
257+ } ;
258+
259+ self . dcx ( ) . emit_err ( errors:: ImplFnConst { span, parent_constness } ) ;
260+ }
261+
248262 fn check_trait_fn_not_const ( & self , constness : Const , parent : & TraitOrImpl ) {
249263 let Const :: Yes ( span) = constness else {
250264 return ;
@@ -1692,14 +1706,23 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
16921706 ) ;
16931707 }
16941708
1695- if let Some ( parent @ ( TraitOrImpl :: Trait { .. } | TraitOrImpl :: TraitImpl { .. } ) ) =
1696- & self . outer_trait_or_trait_impl
1697- {
1698- self . visibility_not_permitted ( & item. vis , errors:: VisibilityNotPermittedNote :: TraitImpl ) ;
1699- if let AssocItemKind :: Fn ( box Fn { sig, .. } ) = & item. kind {
1700- self . check_trait_fn_not_const ( sig. header . constness , parent) ;
1701- self . check_async_fn_in_const_trait_or_impl ( sig, parent) ;
1709+ match & self . outer_trait_or_trait_impl {
1710+ Some ( parent @ ( TraitOrImpl :: Trait { .. } | TraitOrImpl :: TraitImpl { .. } ) ) => {
1711+ self . visibility_not_permitted (
1712+ & item. vis ,
1713+ errors:: VisibilityNotPermittedNote :: TraitImpl ,
1714+ ) ;
1715+ if let AssocItemKind :: Fn ( box Fn { sig, .. } ) = & item. kind {
1716+ self . check_trait_fn_not_const ( sig. header . constness , parent) ;
1717+ self . check_async_fn_in_const_trait_or_impl ( sig, parent) ;
1718+ }
1719+ }
1720+ Some ( TraitOrImpl :: Impl { constness } ) => {
1721+ if let AssocItemKind :: Fn ( box Fn { sig, .. } ) = & item. kind {
1722+ self . check_impl_fn_not_const ( sig. header . constness , * constness) ;
1723+ }
17021724 }
1725+ None => { }
17031726 }
17041727
17051728 if let AssocItemKind :: Const ( ci) = & item. kind {
0 commit comments