@@ -18,6 +18,7 @@ use rustc_data_structures::bitvec::BitVector;
18
18
use rustc_data_structures:: indexed_vec:: { IndexVec , Idx } ;
19
19
use rustc:: dep_graph:: DepNode ;
20
20
use rustc:: hir;
21
+ use rustc:: hir:: map as hir_map;
21
22
use rustc:: hir:: def_id:: DefId ;
22
23
use rustc:: hir:: intravisit:: FnKind ;
23
24
use rustc:: hir:: map:: blocks:: FnLikeNode ;
@@ -258,12 +259,40 @@ impl<'a, 'tcx> Qualifier<'a, 'tcx, 'tcx> {
258
259
"in Nightly builds, add `#![feature(drop_types_in_const)]` \
259
260
to the crate attributes to enable") ;
260
261
} else {
262
+ self . find_drop_implementation_method_span ( )
263
+ . map ( |span| err. span_label ( span, & format ! ( "destructor defined here" ) ) ) ;
264
+
261
265
err. span_label ( self . span , & format ! ( "constants cannot have destructors" ) ) ;
262
266
}
263
267
264
268
err. emit ( ) ;
265
269
}
266
270
271
+ fn find_drop_implementation_method_span ( & self ) -> Option < Span > {
272
+ self . tcx . lang_items
273
+ . drop_trait ( )
274
+ . and_then ( |drop_trait_id| {
275
+ let mut span = None ;
276
+
277
+ self . tcx
278
+ . lookup_trait_def ( drop_trait_id)
279
+ . for_each_relevant_impl ( self . tcx , self . mir . return_ty , |impl_did| {
280
+ self . tcx . map
281
+ . as_local_node_id ( impl_did)
282
+ . and_then ( |impl_node_id| self . tcx . map . find ( impl_node_id) )
283
+ . map ( |node| {
284
+ if let hir_map:: NodeItem ( item) = node {
285
+ if let hir:: ItemImpl ( _, _, _, _, _, ref methods) = item. node {
286
+ span = methods. first ( ) . map ( |method| method. span ) ;
287
+ }
288
+ }
289
+ } ) ;
290
+ } ) ;
291
+
292
+ span
293
+ } )
294
+ }
295
+
267
296
/// Check if an Lvalue with the current qualifications could
268
297
/// be consumed, by either an operand or a Deref projection.
269
298
fn try_consume ( & mut self ) -> bool {
0 commit comments