@@ -803,38 +803,55 @@ impl<'a> CrateLoader<'a> {
803803 return
804804 }
805805
806+ let any_unsupported = self . sess . crate_types . borrow ( ) . iter ( ) . any ( |ct| {
807+ match * ct {
808+ config:: CrateType :: Executable |
809+ config:: CrateType :: Staticlib |
810+ config:: CrateType :: Cdylib |
811+ config:: CrateType :: Dylib |
812+ config:: CrateType :: Rlib => false ,
813+ _ => true ,
814+ }
815+ } ) ;
816+ if any_unsupported {
817+ self . sess . err ( "Only executables, staticlibs, cdylibs, dylibs and rlibs can be compiled \
818+ with `-Z sanitizer`") ;
819+ self . sess . injected_sanitizer_runtime . set ( None ) ;
820+ return
821+ }
822+
806823 let mut uses_std = false ;
807824 self . cstore . iter_crate_data ( |_, data| {
808825 if data. name == sym:: std {
809826 uses_std = true ;
810827 }
811828 } ) ;
829+ if !uses_std {
830+ self . sess . err ( "Must link std to be compiled with `-Z sanitizer`" ) ;
831+ return
832+ }
812833
813- if uses_std {
814- let name = match * sanitizer {
815- Sanitizer :: Address => "rustc_asan" ,
816- Sanitizer :: Leak => "rustc_lsan" ,
817- Sanitizer :: Memory => "rustc_msan" ,
818- Sanitizer :: Thread => "rustc_tsan" ,
819- } ;
820- info ! ( "loading sanitizer: {}" , name) ;
834+ let name = match * sanitizer {
835+ Sanitizer :: Address => "rustc_asan" ,
836+ Sanitizer :: Leak => "rustc_lsan" ,
837+ Sanitizer :: Memory => "rustc_msan" ,
838+ Sanitizer :: Thread => "rustc_tsan" ,
839+ } ;
840+ info ! ( "loading sanitizer: {}" , name) ;
821841
822- let symbol = Symbol :: intern ( name) ;
823- let dep_kind = DepKind :: Implicit ;
824- let ( cnum, data) =
825- self . resolve_crate ( & None , symbol, symbol, None , None , DUMMY_SP ,
826- PathKind :: Crate , dep_kind)
827- . unwrap_or_else ( |err| err. report ( ) ) ;
842+ let symbol = Symbol :: intern ( name) ;
843+ let dep_kind = DepKind :: Implicit ;
844+ let ( cnum, data) =
845+ self . resolve_crate ( & None , symbol, symbol, None , None , DUMMY_SP ,
846+ PathKind :: Crate , dep_kind)
847+ . unwrap_or_else ( |err| err. report ( ) ) ;
828848
829- // Sanity check the loaded crate to ensure it is indeed a sanitizer runtime
830- if !data. root . sanitizer_runtime {
831- self . sess . err ( & format ! ( "the crate `{}` is not a sanitizer runtime" ,
832- name) ) ;
833- }
834- self . sess . injected_sanitizer_runtime . set ( Some ( cnum) ) ;
835- } else {
836- self . sess . err ( "Must link std to be compiled with `-Z sanitizer`" ) ;
849+ // Sanity check the loaded crate to ensure it is indeed a sanitizer runtime
850+ if !data. root . sanitizer_runtime {
851+ self . sess . err ( & format ! ( "the crate `{}` is not a sanitizer runtime" ,
852+ name) ) ;
837853 }
854+ self . sess . injected_sanitizer_runtime . set ( Some ( cnum) ) ;
838855 }
839856
840857 fn inject_profiler_runtime ( & mut self ) {
0 commit comments