@@ -654,7 +654,24 @@ impl<'a> CrateLocator<'a> {
654654 continue ;
655655 }
656656 }
657- * slot = Some ( ( hash, metadata, lib. clone ( ) ) ) ;
657+
658+ // We error eagerly here. If we're locating a rlib, then in theory the full metadata
659+ // could still be in a (later resolved) dylib. In practice, if the rlib and dylib
660+ // were produced in a way where one has full metadata and the other hasn't, it would
661+ // mean that they were compiled using different compiler flags and probably also have
662+ // a different SVH value.
663+ if metadata. get_header ( ) . is_stub {
664+ // `is_stub` should never be true for .rmeta files.
665+ assert_ne ! ( flavor, CrateFlavor :: Rmeta ) ;
666+
667+ // Because rmeta files are resolved before rlib/dylib files, if this is a stub and
668+ // we haven't found a slot already, it means that the full metadata is missing.
669+ if slot. is_none ( ) {
670+ return Err ( CrateError :: FullMetadataNotFound ( self . crate_name , flavor) ) ;
671+ }
672+ } else {
673+ * slot = Some ( ( hash, metadata, lib. clone ( ) ) ) ;
674+ }
658675 ret = Some ( ( lib, kind) ) ;
659676 }
660677
@@ -916,6 +933,7 @@ pub(crate) enum CrateError {
916933 ExternLocationNotExist ( Symbol , PathBuf ) ,
917934 ExternLocationNotFile ( Symbol , PathBuf ) ,
918935 MultipleCandidates ( Symbol , CrateFlavor , Vec < PathBuf > ) ,
936+ FullMetadataNotFound ( Symbol , CrateFlavor ) ,
919937 SymbolConflictsCurrent ( Symbol ) ,
920938 StableCrateIdCollision ( Symbol , Symbol ) ,
921939 DlOpen ( String , String ) ,
@@ -966,6 +984,9 @@ impl CrateError {
966984 CrateError :: MultipleCandidates ( crate_name, flavor, candidates) => {
967985 dcx. emit_err ( errors:: MultipleCandidates { span, crate_name, flavor, candidates } ) ;
968986 }
987+ CrateError :: FullMetadataNotFound ( crate_name, flavor) => {
988+ dcx. emit_err ( errors:: FullMetadataNotFound { span, crate_name, flavor } ) ;
989+ }
969990 CrateError :: SymbolConflictsCurrent ( root_name) => {
970991 dcx. emit_err ( errors:: SymbolConflictsCurrent { span, crate_name : root_name } ) ;
971992 }
0 commit comments