File tree Expand file tree Collapse file tree 1 file changed +25
-7
lines changed
compiler/rustc_mir/src/transform/check_consts Expand file tree Collapse file tree 1 file changed +25
-7
lines changed Original file line number Diff line number Diff line change @@ -885,14 +885,32 @@ impl Visitor<'tcx> for Validator<'mir, 'tcx> {
885
885
return ;
886
886
}
887
887
888
- let caller_has_attr = tcx. has_attr ( caller, sym:: default_method_body_is_const) ;
889
- let in_same_trait = match ( tcx. trait_of_item ( caller) , tcx. trait_of_item ( callee) ) {
890
- ( Some ( t1) , Some ( t2) ) => t1 == t2,
891
- _ => false
892
- } ;
888
+ if !tcx. is_const_fn_raw ( callee) {
889
+ let mut permitted = false ;
890
+
891
+ let callee_trait = tcx. trait_of_item ( callee) ;
892
+ if let Some ( trait_id) = callee_trait {
893
+ if tcx. has_attr ( caller, sym:: default_method_body_is_const) {
894
+ // permit call to non-const fn when caller has default_method_body_is_const..
895
+ if tcx. trait_of_item ( caller) == callee_trait {
896
+ // ..and caller and callee are in the same trait.
897
+ permitted = true ;
898
+ }
899
+ }
900
+ let mut const_impls = true ;
901
+ tcx. for_each_relevant_impl ( trait_id, substs. type_at ( 0 ) , |imp| {
902
+ if const_impls {
903
+ if let hir:: Constness :: NotConst = tcx. impl_constness ( imp) {
904
+ const_impls = false ;
905
+ }
906
+ }
907
+ } ) ;
908
+ if const_impls {
909
+ permitted = true ;
910
+ }
911
+ }
893
912
894
- if !( caller_has_attr && in_same_trait) {
895
- if !tcx. is_const_fn_raw ( callee) {
913
+ if !permitted {
896
914
self . check_op ( ops:: FnCallNonConst ) ;
897
915
return ;
898
916
}
You can’t perform that action at this time.
0 commit comments