@@ -46,14 +46,13 @@ pub fn find_native_static_library(
46
46
}
47
47
48
48
fn find_bundled_library (
49
- name : Option < Symbol > ,
49
+ name : Symbol ,
50
50
verbatim : Option < bool > ,
51
51
kind : NativeLibKind ,
52
52
has_cfg : bool ,
53
53
sess : & Session ,
54
54
) -> Option < Symbol > {
55
55
if let NativeLibKind :: Static { bundle : Some ( true ) | None , whole_archive } = kind
56
- && let Some ( name) = name
57
56
&& sess. crate_types ( ) . iter ( ) . any ( |t| matches ! ( t, & CrateType :: Rlib | CrateType :: Staticlib ) )
58
57
&& ( sess. opts . unstable_opts . packed_bundled_libs || has_cfg || whole_archive == Some ( true ) )
59
58
{
@@ -337,10 +336,16 @@ impl<'tcx> Collector<'tcx> {
337
336
if name. is_some ( ) || kind. is_some ( ) || modifiers. is_some ( ) || cfg. is_some ( ) {
338
337
sess. emit_err ( errors:: IncompatibleWasmLink { span } ) ;
339
338
}
340
- } else if name. is_none ( ) {
341
- sess. emit_err ( errors:: LinkRequiresName { span : m. span } ) ;
342
339
}
343
340
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
+
344
349
// Do this outside of the loop so that `import_name_type` can be specified before `kind`.
345
350
if let Some ( ( _, span) ) = import_name_type {
346
351
if kind != Some ( NativeLibKind :: RawDylib ) {
@@ -350,8 +355,8 @@ impl<'tcx> Collector<'tcx> {
350
355
351
356
let dll_imports = match kind {
352
357
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 } ) ;
355
360
}
356
361
foreign_mod_items
357
362
. iter ( )
@@ -390,7 +395,6 @@ impl<'tcx> Collector<'tcx> {
390
395
}
391
396
} ;
392
397
393
- let name = name. map ( |( name, _) | name) ;
394
398
let kind = kind. unwrap_or ( NativeLibKind :: Unspecified ) ;
395
399
let filename = find_bundled_library ( name, verbatim, kind, cfg. is_some ( ) , sess) ;
396
400
self . libs . push ( NativeLib {
@@ -399,7 +403,6 @@ impl<'tcx> Collector<'tcx> {
399
403
kind,
400
404
cfg,
401
405
foreign_module : Some ( it. owner_id . to_def_id ( ) ) ,
402
- wasm_import_module : wasm_import_module. map ( |( name, _) | name) ,
403
406
verbatim,
404
407
dll_imports,
405
408
} ) ;
@@ -416,11 +419,7 @@ impl<'tcx> Collector<'tcx> {
416
419
self . tcx . sess . emit_err ( errors:: LibFrameworkApple ) ;
417
420
}
418
421
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 ) ;
424
423
if new_name. is_empty ( ) {
425
424
self . tcx . sess . emit_err ( errors:: EmptyRenamingTarget { lib_name : & lib. name } ) ;
426
425
} else if !any_duplicate {
@@ -445,41 +444,36 @@ impl<'tcx> Collector<'tcx> {
445
444
let mut existing = self
446
445
. libs
447
446
. 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) ;
474
466
}
467
+ lib. verbatim = passed_lib. verbatim ;
468
+ return true ;
475
469
}
476
470
false
477
471
} )
478
472
. collect :: < Vec < _ > > ( ) ;
479
473
if existing. is_empty ( ) {
480
474
// Add if not found
481
475
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 ) ) ;
483
477
let sess = self . tcx . sess ;
484
478
let filename =
485
479
find_bundled_library ( name, passed_lib. verbatim , passed_lib. kind , false , sess) ;
@@ -489,7 +483,6 @@ impl<'tcx> Collector<'tcx> {
489
483
kind : passed_lib. kind ,
490
484
cfg : None ,
491
485
foreign_module : None ,
492
- wasm_import_module : None ,
493
486
verbatim : passed_lib. verbatim ,
494
487
dll_imports : Vec :: new ( ) ,
495
488
} ) ;
0 commit comments