@@ -25,12 +25,10 @@ pub fn is_parent_const_impl_raw(tcx: TyCtxt<'_>, def_id: LocalDefId) -> bool {
2525/// report whether said intrinsic has a `rustc_const_{un,}stable` attribute. Otherwise, return
2626/// `Constness::NotConst`.
2727fn constness ( tcx : TyCtxt < ' _ > , def_id : DefId ) -> hir:: Constness {
28- let def_id = def_id. expect_local ( ) ;
29- let node = tcx. hir ( ) . get_by_def_id ( def_id) ;
30-
31- match node {
28+ let hir_id = tcx. hir ( ) . local_def_id_to_hir_id ( def_id. expect_local ( ) ) ;
29+ match tcx. hir ( ) . get ( hir_id) {
3230 hir:: Node :: Ctor ( _) => hir:: Constness :: Const ,
33- hir :: Node :: Item ( hir :: Item { kind : hir :: ItemKind :: Impl ( impl_ ) , .. } ) => impl_ . constness ,
31+
3432 hir:: Node :: ForeignItem ( hir:: ForeignItem { kind : hir:: ForeignItemKind :: Fn ( ..) , .. } ) => {
3533 // Intrinsics use `rustc_const_{un,}stable` attributes to indicate constness. All other
3634 // foreign items cannot be evaluated at compile-time.
@@ -41,20 +39,62 @@ fn constness(tcx: TyCtxt<'_>, def_id: DefId) -> hir::Constness {
4139 } ;
4240 if is_const { hir:: Constness :: Const } else { hir:: Constness :: NotConst }
4341 }
44- _ => {
45- if let Some ( fn_kind) = node. fn_kind ( ) {
46- if fn_kind. constness ( ) == hir:: Constness :: Const {
47- return hir:: Constness :: Const ;
48- }
4942
50- // If the function itself is not annotated with `const`, it may still be a `const fn`
51- // if it resides in a const trait impl.
52- let is_const = is_parent_const_impl_raw ( tcx, def_id) ;
53- if is_const { hir:: Constness :: Const } else { hir:: Constness :: NotConst }
54- } else {
55- hir:: Constness :: NotConst
43+ hir:: Node :: TraitItem ( hir:: TraitItem { kind : hir:: TraitItemKind :: Fn ( ..) , .. } )
44+ if tcx. is_const_default_method ( def_id) =>
45+ {
46+ hir:: Constness :: Const
47+ }
48+
49+ hir:: Node :: Item ( hir:: Item { kind : hir:: ItemKind :: Const ( ..) , .. } )
50+ | hir:: Node :: Item ( hir:: Item { kind : hir:: ItemKind :: Static ( ..) , .. } )
51+ | hir:: Node :: TraitItem ( hir:: TraitItem { kind : hir:: TraitItemKind :: Const ( ..) , .. } )
52+ | hir:: Node :: AnonConst ( _)
53+ | hir:: Node :: ImplItem ( hir:: ImplItem { kind : hir:: ImplItemKind :: Const ( ..) , .. } )
54+ | hir:: Node :: ImplItem ( hir:: ImplItem {
55+ kind :
56+ hir:: ImplItemKind :: Fn (
57+ hir:: FnSig {
58+ header : hir:: FnHeader { constness : hir:: Constness :: Const , .. } ,
59+ ..
60+ } ,
61+ ..,
62+ ) ,
63+ ..
64+ } ) => hir:: Constness :: Const ,
65+
66+ hir:: Node :: ImplItem ( hir:: ImplItem {
67+ kind : hir:: ImplItemKind :: Type ( ..) | hir:: ImplItemKind :: Fn ( ..) ,
68+ ..
69+ } ) => {
70+ let parent_hir_id = tcx. hir ( ) . get_parent_node ( hir_id) ;
71+ match tcx. hir ( ) . get ( parent_hir_id) {
72+ hir:: Node :: Item ( hir:: Item {
73+ kind : hir:: ItemKind :: Impl ( hir:: Impl { constness, .. } ) ,
74+ ..
75+ } ) => * constness,
76+ _ => span_bug ! (
77+ tcx. def_span( parent_hir_id. owner) ,
78+ "impl item's parent node is not an impl" ,
79+ ) ,
5680 }
5781 }
82+
83+ hir:: Node :: Item ( hir:: Item {
84+ kind : hir:: ItemKind :: Fn ( hir:: FnSig { header : hir:: FnHeader { constness, .. } , .. } , ..) ,
85+ ..
86+ } )
87+ | hir:: Node :: TraitItem ( hir:: TraitItem {
88+ kind :
89+ hir:: TraitItemKind :: Fn ( hir:: FnSig { header : hir:: FnHeader { constness, .. } , .. } , ..) ,
90+ ..
91+ } )
92+ | hir:: Node :: Item ( hir:: Item {
93+ kind : hir:: ItemKind :: Impl ( hir:: Impl { constness, .. } ) ,
94+ ..
95+ } ) => * constness,
96+
97+ _ => hir:: Constness :: NotConst ,
5898 }
5999}
60100
0 commit comments