@@ -338,7 +338,6 @@ impl<'hir> LoweringContext<'_, 'hir> {
338338 // lifetime to be added, but rather a reference to a
339339 // parent lifetime.
340340 let itctx = ImplTraitContext :: Universal ;
341- // TODO we need to rip apart this infrastructure
342341 let ( generics, ( trait_ref, lowered_ty) ) =
343342 self . lower_generics ( ast_generics, Const :: No , id, itctx, |this| {
344343 let modifiers = TraitBoundModifiers {
@@ -592,30 +591,27 @@ impl<'hir> LoweringContext<'_, 'hir> {
592591 // This is used to track which lifetimes have already been defined,
593592 // and which need to be replicated when lowering an async fn.
594593
595- let generics = match parent_hir. node ( ) . expect_item ( ) . kind {
594+ let parent_item = parent_hir. node ( ) . expect_item ( ) ;
595+ let constness = match parent_item. kind {
596596 hir:: ItemKind :: Impl ( impl_) => {
597597 self . is_in_trait_impl = impl_. of_trait . is_some ( ) ;
598- & impl_. generics
598+ match impl_. constness {
599+ // TODO bad span
600+ hir:: Constness :: Const => Const :: Yes ( impl_. self_ty . span ) ,
601+ hir:: Constness :: NotConst => Const :: No ,
602+ }
599603 }
600- hir:: ItemKind :: Trait ( _, _, generics, _, _) => generics,
604+ hir:: ItemKind :: Trait ( _, _, _, _, _) => {
605+ parent_hir. attrs . get ( parent_item. hir_id ( ) . local_id ) . iter ( ) . find ( |attr| attr. has_name ( sym:: const_trait) ) . map_or ( Const :: No , |attr| Const :: Yes ( attr. span ) )
606+ } ,
601607 kind => {
602608 span_bug ! ( item. span, "assoc item has unexpected kind of parent: {}" , kind. descr( ) )
603609 }
604610 } ;
605611
606- if self . tcx . features ( ) . effects {
607- self . host_param_id = generics
608- . params
609- . iter ( )
610- . find ( |param| {
611- matches ! ( param. kind, hir:: GenericParamKind :: Const { is_host_effect: true , .. } )
612- } )
613- . map ( |param| param. def_id ) ;
614- }
615-
616612 match ctxt {
617- AssocCtxt :: Trait => hir:: OwnerNode :: TraitItem ( self . lower_trait_item ( item) ) ,
618- AssocCtxt :: Impl => hir:: OwnerNode :: ImplItem ( self . lower_impl_item ( item) ) ,
613+ AssocCtxt :: Trait => hir:: OwnerNode :: TraitItem ( self . lower_trait_item ( item, constness ) ) ,
614+ AssocCtxt :: Impl => hir:: OwnerNode :: ImplItem ( self . lower_impl_item ( item, constness ) ) ,
619615 }
620616 }
621617
@@ -742,7 +738,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
742738 }
743739 }
744740
745- fn lower_trait_item ( & mut self , i : & AssocItem ) -> & ' hir hir:: TraitItem < ' hir > {
741+ fn lower_trait_item ( & mut self , i : & AssocItem , trait_constness : Const ) -> & ' hir hir:: TraitItem < ' hir > {
746742 let hir_id = self . lower_node_id ( i. id ) ;
747743 self . lower_attrs ( hir_id, & i. attrs ) ;
748744 let trait_item_def_id = hir_id. expect_owner ( ) ;
@@ -772,6 +768,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
772768 i. id ,
773769 FnDeclKind :: Trait ,
774770 sig. header . coroutine_kind ,
771+ trait_constness,
775772 ) ;
776773 ( generics, hir:: TraitItemKind :: Fn ( sig, hir:: TraitFn :: Required ( names) ) , false )
777774 }
@@ -789,6 +786,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
789786 i. id ,
790787 FnDeclKind :: Trait ,
791788 sig. header . coroutine_kind ,
789+ trait_constness,
792790 ) ;
793791 ( generics, hir:: TraitItemKind :: Fn ( sig, hir:: TraitFn :: Provided ( body_id) ) , true )
794792 }
@@ -866,7 +864,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
866864 self . expr ( span, hir:: ExprKind :: Err ( guar) )
867865 }
868866
869- fn lower_impl_item ( & mut self , i : & AssocItem ) -> & ' hir hir:: ImplItem < ' hir > {
867+ fn lower_impl_item ( & mut self , i : & AssocItem , impl_constness : Const ) -> & ' hir hir:: ImplItem < ' hir > {
870868 // Since `default impl` is not yet implemented, this is always true in impls.
871869 let has_value = true ;
872870 let ( defaultness, _) = self . lower_defaultness ( i. kind . defaultness ( ) , has_value) ;
@@ -901,6 +899,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
901899 i. id ,
902900 if self . is_in_trait_impl { FnDeclKind :: Impl } else { FnDeclKind :: Inherent } ,
903901 sig. header . coroutine_kind ,
902+ impl_constness,
904903 ) ;
905904
906905 ( generics, hir:: ImplItemKind :: Fn ( sig, body_id) )
@@ -1313,11 +1312,12 @@ impl<'hir> LoweringContext<'_, 'hir> {
13131312 id : NodeId ,
13141313 kind : FnDeclKind ,
13151314 coroutine_kind : Option < CoroutineKind > ,
1315+ parent_constness : Const ,
13161316 ) -> ( & ' hir hir:: Generics < ' hir > , hir:: FnSig < ' hir > ) {
13171317 let header = self . lower_fn_header ( sig. header ) ;
13181318 // Don't pass along the user-provided constness of trait associated functions; we don't want to
13191319 // synthesize a host effect param for them. We reject `const` on them during AST validation.
1320- let constness = if kind == FnDeclKind :: Inherent { sig. header . constness } else { Const :: No } ;
1320+ let constness = if kind == FnDeclKind :: Inherent { sig. header . constness } else { parent_constness } ;
13211321 let itctx = ImplTraitContext :: Universal ;
13221322 let ( generics, decl) = self . lower_generics ( generics, constness, id, itctx, |this| {
13231323 this. lower_fn_decl ( & sig. decl , id, sig. span , kind, coroutine_kind)
0 commit comments