@@ -46,14 +46,13 @@ pub fn find_native_static_library(
4646}
4747
4848fn find_bundled_library (
49- name : Option < Symbol > ,
49+ name : Symbol ,
5050 verbatim : Option < bool > ,
5151 kind : NativeLibKind ,
5252 has_cfg : bool ,
5353 sess : & Session ,
5454) -> Option < Symbol > {
5555 if let NativeLibKind :: Static { bundle : Some ( true ) | None , whole_archive } = kind
56- && let Some ( name) = name
5756 && sess. crate_types ( ) . iter ( ) . any ( |t| matches ! ( t, & CrateType :: Rlib | CrateType :: Staticlib ) )
5857 && ( sess. opts . unstable_opts . packed_bundled_libs || has_cfg || whole_archive == Some ( true ) )
5958 {
@@ -337,10 +336,16 @@ impl<'tcx> Collector<'tcx> {
337336 if name. is_some ( ) || kind. is_some ( ) || modifiers. is_some ( ) || cfg. is_some ( ) {
338337 sess. emit_err ( errors:: IncompatibleWasmLink { span } ) ;
339338 }
340- } else if name. is_none ( ) {
341- sess. emit_err ( errors:: LinkRequiresName { span : m. span } ) ;
342339 }
343340
341+ if wasm_import_module. is_some ( ) {
342+ ( name, kind) = ( wasm_import_module, Some ( NativeLibKind :: WasmImportModule ) ) ;
343+ }
344+ let Some ( ( name, name_span) ) = name else {
345+ sess. emit_err ( errors:: LinkRequiresName { span : m. span } ) ;
346+ continue ;
347+ } ;
348+
344349 // Do this outside of the loop so that `import_name_type` can be specified before `kind`.
345350 if let Some ( ( _, span) ) = import_name_type {
346351 if kind != Some ( NativeLibKind :: RawDylib ) {
@@ -350,8 +355,8 @@ impl<'tcx> Collector<'tcx> {
350355
351356 let dll_imports = match kind {
352357 Some ( NativeLibKind :: RawDylib ) => {
353- if let Some ( ( name , span ) ) = name && name. as_str ( ) . contains ( '\0' ) {
354- sess. emit_err ( errors:: RawDylibNoNul { span } ) ;
358+ if name. as_str ( ) . contains ( '\0' ) {
359+ sess. emit_err ( errors:: RawDylibNoNul { span : name_span } ) ;
355360 }
356361 foreign_mod_items
357362 . iter ( )
@@ -390,7 +395,6 @@ impl<'tcx> Collector<'tcx> {
390395 }
391396 } ;
392397
393- let name = name. map ( |( name, _) | name) ;
394398 let kind = kind. unwrap_or ( NativeLibKind :: Unspecified ) ;
395399 let filename = find_bundled_library ( name, verbatim, kind, cfg. is_some ( ) , sess) ;
396400 self . libs . push ( NativeLib {
@@ -399,7 +403,6 @@ impl<'tcx> Collector<'tcx> {
399403 kind,
400404 cfg,
401405 foreign_module : Some ( it. owner_id . to_def_id ( ) ) ,
402- wasm_import_module : wasm_import_module. map ( |( name, _) | name) ,
403406 verbatim,
404407 dll_imports,
405408 } ) ;
@@ -416,11 +419,7 @@ impl<'tcx> Collector<'tcx> {
416419 self . tcx . sess . emit_err ( errors:: LibFrameworkApple ) ;
417420 }
418421 if let Some ( ref new_name) = lib. new_name {
419- let any_duplicate = self
420- . libs
421- . iter ( )
422- . filter_map ( |lib| lib. name . as_ref ( ) )
423- . any ( |n| n. as_str ( ) == lib. name ) ;
422+ let any_duplicate = self . libs . iter ( ) . any ( |n| n. name . as_str ( ) == lib. name ) ;
424423 if new_name. is_empty ( ) {
425424 self . tcx . sess . emit_err ( errors:: EmptyRenamingTarget { lib_name : & lib. name } ) ;
426425 } else if !any_duplicate {
@@ -445,41 +444,36 @@ impl<'tcx> Collector<'tcx> {
445444 let mut existing = self
446445 . libs
447446 . drain_filter ( |lib| {
448- if let Some ( lib_name) = lib. name {
449- if lib_name. as_str ( ) == passed_lib. name {
450- // FIXME: This whole logic is questionable, whether modifiers are
451- // involved or not, library reordering and kind overriding without
452- // explicit `:rename` in particular.
453- if lib. has_modifiers ( ) || passed_lib. has_modifiers ( ) {
454- match lib. foreign_module {
455- Some ( def_id) => {
456- self . tcx . sess . emit_err ( errors:: NoLinkModOverride {
457- span : Some ( self . tcx . def_span ( def_id) ) ,
458- } )
459- }
460- None => self
461- . tcx
462- . sess
463- . emit_err ( errors:: NoLinkModOverride { span : None } ) ,
464- } ;
465- }
466- if passed_lib. kind != NativeLibKind :: Unspecified {
467- lib. kind = passed_lib. kind ;
468- }
469- if let Some ( new_name) = & passed_lib. new_name {
470- lib. name = Some ( Symbol :: intern ( new_name) ) ;
471- }
472- lib. verbatim = passed_lib. verbatim ;
473- return true ;
447+ if lib. name . as_str ( ) == passed_lib. name {
448+ // FIXME: This whole logic is questionable, whether modifiers are
449+ // involved or not, library reordering and kind overriding without
450+ // explicit `:rename` in particular.
451+ if lib. has_modifiers ( ) || passed_lib. has_modifiers ( ) {
452+ match lib. foreign_module {
453+ Some ( def_id) => self . tcx . sess . emit_err ( errors:: NoLinkModOverride {
454+ span : Some ( self . tcx . def_span ( def_id) ) ,
455+ } ) ,
456+ None => {
457+ self . tcx . sess . emit_err ( errors:: NoLinkModOverride { span : None } )
458+ }
459+ } ;
460+ }
461+ if passed_lib. kind != NativeLibKind :: Unspecified {
462+ lib. kind = passed_lib. kind ;
463+ }
464+ if let Some ( new_name) = & passed_lib. new_name {
465+ lib. name = Symbol :: intern ( new_name) ;
474466 }
467+ lib. verbatim = passed_lib. verbatim ;
468+ return true ;
475469 }
476470 false
477471 } )
478472 . collect :: < Vec < _ > > ( ) ;
479473 if existing. is_empty ( ) {
480474 // Add if not found
481475 let new_name: Option < & str > = passed_lib. new_name . as_deref ( ) ;
482- let name = Some ( Symbol :: intern ( new_name. unwrap_or ( & passed_lib. name ) ) ) ;
476+ let name = Symbol :: intern ( new_name. unwrap_or ( & passed_lib. name ) ) ;
483477 let sess = self . tcx . sess ;
484478 let filename =
485479 find_bundled_library ( name, passed_lib. verbatim , passed_lib. kind , false , sess) ;
@@ -489,7 +483,6 @@ impl<'tcx> Collector<'tcx> {
489483 kind : passed_lib. kind ,
490484 cfg : None ,
491485 foreign_module : None ,
492- wasm_import_module : None ,
493486 verbatim : passed_lib. verbatim ,
494487 dll_imports : Vec :: new ( ) ,
495488 } ) ;
0 commit comments