@@ -399,35 +399,30 @@ impl CodegenContext {
399
399
}
400
400
401
401
struct DiagnosticHandlers < ' a > {
402
- #[ allow( dead_code) ]
403
- // This value is not actually dead, llcx has pointers to it and needs these pointers to be alive
404
- // until Drop is executed on this object
405
- inner : Box < ( & ' a CodegenContext , & ' a Handler ) > ,
402
+ data : * mut ( & ' a CodegenContext , & ' a Handler ) ,
406
403
llcx : ContextRef ,
407
404
}
408
405
409
406
impl < ' a > DiagnosticHandlers < ' a > {
410
407
fn new ( cgcx : & ' a CodegenContext ,
411
408
handler : & ' a Handler ,
412
409
llcx : ContextRef ) -> DiagnosticHandlers < ' a > {
413
- let data = Box :: new ( ( cgcx, handler) ) ;
410
+ let data = Box :: into_raw ( Box :: new ( ( cgcx, handler) ) ) ;
414
411
unsafe {
415
- let arg = & * data as & ( _ , _ ) as * const _ as * mut _ ;
416
- llvm:: LLVMRustSetInlineAsmDiagnosticHandler ( llcx, inline_asm_handler, arg) ;
417
- llvm:: LLVMContextSetDiagnosticHandler ( llcx, diagnostic_handler, arg) ;
418
- }
419
- DiagnosticHandlers {
420
- inner : data,
421
- llcx : llcx,
412
+ llvm:: LLVMRustSetInlineAsmDiagnosticHandler ( llcx, inline_asm_handler, data as * mut _ ) ;
413
+ llvm:: LLVMContextSetDiagnosticHandler ( llcx, diagnostic_handler, data as * mut _ ) ;
422
414
}
415
+ DiagnosticHandlers { data, llcx }
423
416
}
424
417
}
425
418
426
419
impl < ' a > Drop for DiagnosticHandlers < ' a > {
427
420
fn drop ( & mut self ) {
421
+ use std:: ptr:: null_mut;
428
422
unsafe {
429
- llvm:: LLVMRustSetInlineAsmDiagnosticHandler ( self . llcx , inline_asm_handler, 0 as * mut _ ) ;
430
- llvm:: LLVMContextSetDiagnosticHandler ( self . llcx , diagnostic_handler, 0 as * mut _ ) ;
423
+ llvm:: LLVMRustSetInlineAsmDiagnosticHandler ( self . llcx , inline_asm_handler, null_mut ( ) ) ;
424
+ llvm:: LLVMContextSetDiagnosticHandler ( self . llcx , diagnostic_handler, null_mut ( ) ) ;
425
+ drop ( Box :: from_raw ( self . data ) ) ;
431
426
}
432
427
}
433
428
}
0 commit comments