@@ -2504,11 +2504,39 @@ fn lval_static_fn_inner(bcx: block, fn_id: ast::def_id, id: ast::node_id,
2504
2504
2505
2505
// Check whether this fn has an inlined copy and, if so, redirect fn_id to
2506
2506
// the local id of the inlined copy.
2507
+ let original_crate = fn_id. crate ;
2507
2508
let fn_id = if fn_id. crate != ast:: local_crate {
2508
2509
maybe_instantiate_inline ( ccx, fn_id)
2509
2510
} else { fn_id } ;
2510
2511
2511
- if fn_id. crate == ast:: local_crate && tys. len ( ) > 0 u {
2512
+ let must_monomorphise = {
2513
+ let local_with_type_params =
2514
+ fn_id. crate == ast:: local_crate && tys. len ( ) > 0 u;
2515
+
2516
+ // Rust intrinsic functions should always be monomorphised
2517
+ let inlined_rust_intrinsic = {
2518
+ if fn_id. crate == ast:: local_crate
2519
+ && original_crate != ast:: local_crate {
2520
+
2521
+ let map_node = session:: expect (
2522
+ ccx. sess ,
2523
+ ccx. tcx . items . find ( fn_id. node ) ,
2524
+ || fmt ! ( "inlined item should be in ast map" ) ) ;
2525
+
2526
+ match map_node {
2527
+ ast_map:: node_foreign_item(
2528
+ _, ast:: foreign_abi_rust_intrinsic, _) => true ,
2529
+ _ => false
2530
+ }
2531
+ } else {
2532
+ false
2533
+ }
2534
+ } ;
2535
+
2536
+ local_with_type_params || inlined_rust_intrinsic
2537
+ } ;
2538
+
2539
+ if must_monomorphise {
2512
2540
let mut { val, must_cast} =
2513
2541
monomorphic_fn ( ccx, fn_id, tys, vtables, Some ( id) ) ;
2514
2542
if must_cast {
0 commit comments