@@ -74,65 +74,67 @@ impl NonConstOp for FnCallIndirect {
74
74
75
75
/// A function call where the callee is not marked as `const`.
76
76
#[ derive( Debug ) ]
77
- pub struct FnCallNonConst < ' tcx > ( pub Option < ( DefId , SubstsRef < ' tcx > ) > ) ;
77
+ pub struct FnCallNonConst < ' tcx > ( pub DefId , pub SubstsRef < ' tcx > ) ;
78
78
impl < ' a > NonConstOp for FnCallNonConst < ' a > {
79
79
fn build_error < ' tcx > ( & self , ccx : & ConstCx < ' _ , ' tcx > , span : Span ) -> DiagnosticBuilder < ' tcx > {
80
+ let FnCallNonConst ( def_id, substs) = * self ;
80
81
let mut err = struct_span_err ! (
81
82
ccx. tcx. sess,
82
83
span,
83
84
E0015 ,
85
+ "cannot call non-const fn `{}` in {}s" ,
86
+ ccx. tcx. def_path_str_with_substs( def_id, substs) ,
87
+ ccx. const_kind( )
88
+ ) ;
89
+ err. note ( & format ! (
84
90
"calls in {}s are limited to constant functions, \
85
91
tuple structs and tuple variants",
86
92
ccx. const_kind( ) ,
87
- ) ;
88
-
89
- if let FnCallNonConst ( Some ( ( callee, substs) ) ) = * self {
90
- if let Some ( trait_def_id) = ccx. tcx . lang_items ( ) . eq_trait ( ) {
91
- if let Some ( eq_item) = ccx. tcx . associated_items ( trait_def_id) . find_by_name_and_kind (
92
- ccx. tcx ,
93
- Ident :: with_dummy_span ( sym:: eq) ,
94
- AssocKind :: Fn ,
95
- trait_def_id,
96
- ) {
97
- if callee == eq_item. def_id && substs. len ( ) == 2 {
98
- match ( substs[ 0 ] . unpack ( ) , substs[ 1 ] . unpack ( ) ) {
99
- ( GenericArgKind :: Type ( self_ty) , GenericArgKind :: Type ( rhs_ty) )
100
- if self_ty == rhs_ty
101
- && self_ty. is_ref ( )
102
- && self_ty. peel_refs ( ) . is_primitive ( ) =>
103
- {
104
- let mut num_refs = 0 ;
105
- let mut tmp_ty = self_ty;
106
- while let rustc_middle:: ty:: Ref ( _, inner_ty, _) = tmp_ty. kind ( ) {
107
- num_refs += 1 ;
108
- tmp_ty = inner_ty;
109
- }
110
- let deref = "*" . repeat ( num_refs) ;
111
-
112
- if let Ok ( call_str) =
113
- ccx. tcx . sess . source_map ( ) . span_to_snippet ( span)
114
- {
115
- if let Some ( eq_idx) = call_str. find ( "==" ) {
116
- if let Some ( rhs_idx) = call_str[ ( eq_idx + 2 ) ..]
117
- . find ( |c : char | !c. is_whitespace ( ) )
118
- {
119
- let rhs_pos = span. lo ( )
120
- + BytePos :: from_usize ( eq_idx + 2 + rhs_idx) ;
121
- let rhs_span = span. with_lo ( rhs_pos) . with_hi ( rhs_pos) ;
122
- err. multipart_suggestion (
123
- "consider dereferencing here" ,
124
- vec ! [
125
- ( span. shrink_to_lo( ) , deref. clone( ) ) ,
126
- ( rhs_span, deref) ,
127
- ] ,
128
- Applicability :: MachineApplicable ,
129
- ) ;
130
- }
93
+ ) ) ;
94
+
95
+ if let Some ( trait_def_id) = ccx. tcx . lang_items ( ) . eq_trait ( ) {
96
+ if let Some ( eq_item) = ccx. tcx . associated_items ( trait_def_id) . find_by_name_and_kind (
97
+ ccx. tcx ,
98
+ Ident :: with_dummy_span ( sym:: eq) ,
99
+ AssocKind :: Fn ,
100
+ trait_def_id,
101
+ ) {
102
+ if callee == eq_item. def_id && substs. len ( ) == 2 {
103
+ match ( substs[ 0 ] . unpack ( ) , substs[ 1 ] . unpack ( ) ) {
104
+ ( GenericArgKind :: Type ( self_ty) , GenericArgKind :: Type ( rhs_ty) )
105
+ if self_ty == rhs_ty
106
+ && self_ty. is_ref ( )
107
+ && self_ty. peel_refs ( ) . is_primitive ( ) =>
108
+ {
109
+ let mut num_refs = 0 ;
110
+ let mut tmp_ty = self_ty;
111
+ while let rustc_middle:: ty:: Ref ( _, inner_ty, _) = tmp_ty. kind ( ) {
112
+ num_refs += 1 ;
113
+ tmp_ty = inner_ty;
114
+ }
115
+ let deref = "*" . repeat ( num_refs) ;
116
+
117
+ if let Ok ( call_str) = ccx. tcx . sess . source_map ( ) . span_to_snippet ( span) {
118
+ if let Some ( eq_idx) = call_str. find ( "==" ) {
119
+ if let Some ( rhs_idx) =
120
+ call_str[ ( eq_idx + 2 ) ..] . find ( |c : char | !c. is_whitespace ( ) )
121
+ {
122
+ let rhs_pos =
123
+ span. lo ( ) + BytePos :: from_usize ( eq_idx + 2 + rhs_idx) ;
124
+ let rhs_span = span. with_lo ( rhs_pos) . with_hi ( rhs_pos) ;
125
+ err. multipart_suggestion (
126
+ "consider dereferencing here" ,
127
+ vec ! [
128
+ ( span. shrink_to_lo( ) , deref. clone( ) ) ,
129
+ ( rhs_span, deref) ,
130
+ ] ,
131
+ Applicability :: MachineApplicable ,
132
+ ) ;
131
133
}
132
134
}
133
135
}
134
- _ => { }
135
136
}
137
+ _ => { }
136
138
}
137
139
}
138
140
}
0 commit comments