@@ -20,6 +20,7 @@ fn equate_intrinsic_type<'tcx>(
20
20
it : & hir:: ForeignItem < ' _ > ,
21
21
n_tps : usize ,
22
22
n_lts : usize ,
23
+ n_cts : usize ,
23
24
sig : ty:: PolyFnSig < ' tcx > ,
24
25
) {
25
26
let ( own_counts, span) = match & it. kind {
@@ -51,7 +52,7 @@ fn equate_intrinsic_type<'tcx>(
51
52
52
53
if gen_count_ok ( own_counts. lifetimes , n_lts, "lifetime" )
53
54
&& gen_count_ok ( own_counts. types , n_tps, "type" )
54
- && gen_count_ok ( own_counts. consts , 0 , "const" )
55
+ && gen_count_ok ( own_counts. consts , n_cts , "const" )
55
56
{
56
57
let fty = Ty :: new_fn_ptr ( tcx, sig) ;
57
58
let it_def_id = it. owner_id . def_id ;
@@ -492,7 +493,7 @@ pub fn check_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>) {
492
493
} ;
493
494
let sig = tcx. mk_fn_sig ( inputs, output, false , unsafety, Abi :: RustIntrinsic ) ;
494
495
let sig = ty:: Binder :: bind_with_vars ( sig, bound_vars) ;
495
- equate_intrinsic_type ( tcx, it, n_tps, n_lts, sig)
496
+ equate_intrinsic_type ( tcx, it, n_tps, n_lts, 0 , sig)
496
497
}
497
498
498
499
/// Type-check `extern "platform-intrinsic" { ... }` functions.
@@ -504,9 +505,9 @@ pub fn check_platform_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>)
504
505
505
506
let name = it. ident . name ;
506
507
507
- let ( n_tps, inputs, output) = match name {
508
+ let ( n_tps, n_cts , inputs, output) = match name {
508
509
sym:: simd_eq | sym:: simd_ne | sym:: simd_lt | sym:: simd_le | sym:: simd_gt | sym:: simd_ge => {
509
- ( 2 , vec ! [ param( 0 ) , param( 0 ) ] , param ( 1 ) )
510
+ ( 2 , 0 , vec ! [ param( 0 ) , param( 0 ) ] , param ( 1 ) )
510
511
}
511
512
sym:: simd_add
512
513
| sym:: simd_sub
@@ -522,8 +523,8 @@ pub fn check_platform_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>)
522
523
| sym:: simd_fmax
523
524
| sym:: simd_fpow
524
525
| sym:: simd_saturating_add
525
- | sym:: simd_saturating_sub => ( 1 , vec ! [ param( 0 ) , param( 0 ) ] , param ( 0 ) ) ,
526
- sym:: simd_arith_offset => ( 2 , vec ! [ param( 0 ) , param( 1 ) ] , param ( 0 ) ) ,
526
+ | sym:: simd_saturating_sub => ( 1 , 0 , vec ! [ param( 0 ) , param( 0 ) ] , param ( 0 ) ) ,
527
+ sym:: simd_arith_offset => ( 2 , 0 , vec ! [ param( 0 ) , param( 1 ) ] , param ( 0 ) ) ,
527
528
sym:: simd_neg
528
529
| sym:: simd_bswap
529
530
| sym:: simd_bitreverse
@@ -541,25 +542,25 @@ pub fn check_platform_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>)
541
542
| sym:: simd_ceil
542
543
| sym:: simd_floor
543
544
| sym:: simd_round
544
- | sym:: simd_trunc => ( 1 , vec ! [ param( 0 ) ] , param ( 0 ) ) ,
545
- sym:: simd_fpowi => ( 1 , vec ! [ param( 0 ) , tcx. types. i32 ] , param ( 0 ) ) ,
546
- sym:: simd_fma => ( 1 , vec ! [ param( 0 ) , param( 0 ) , param( 0 ) ] , param ( 0 ) ) ,
547
- sym:: simd_gather => ( 3 , vec ! [ param( 0 ) , param( 1 ) , param( 2 ) ] , param ( 0 ) ) ,
548
- sym:: simd_scatter => ( 3 , vec ! [ param( 0 ) , param( 1 ) , param( 2 ) ] , Ty :: new_unit ( tcx) ) ,
549
- sym:: simd_insert => ( 2 , vec ! [ param( 0 ) , tcx. types. u32 , param( 1 ) ] , param ( 0 ) ) ,
550
- sym:: simd_extract => ( 2 , vec ! [ param( 0 ) , tcx. types. u32 ] , param ( 1 ) ) ,
545
+ | sym:: simd_trunc => ( 1 , 0 , vec ! [ param( 0 ) ] , param ( 0 ) ) ,
546
+ sym:: simd_fpowi => ( 1 , 0 , vec ! [ param( 0 ) , tcx. types. i32 ] , param ( 0 ) ) ,
547
+ sym:: simd_fma => ( 1 , 0 , vec ! [ param( 0 ) , param( 0 ) , param( 0 ) ] , param ( 0 ) ) ,
548
+ sym:: simd_gather => ( 3 , 0 , vec ! [ param( 0 ) , param( 1 ) , param( 2 ) ] , param ( 0 ) ) ,
549
+ sym:: simd_scatter => ( 3 , 0 , vec ! [ param( 0 ) , param( 1 ) , param( 2 ) ] , Ty :: new_unit ( tcx) ) ,
550
+ sym:: simd_insert => ( 2 , 0 , vec ! [ param( 0 ) , tcx. types. u32 , param( 1 ) ] , param ( 0 ) ) ,
551
+ sym:: simd_extract => ( 2 , 0 , vec ! [ param( 0 ) , tcx. types. u32 ] , param ( 1 ) ) ,
551
552
sym:: simd_cast
552
553
| sym:: simd_as
553
554
| sym:: simd_cast_ptr
554
555
| sym:: simd_expose_addr
555
- | sym:: simd_from_exposed_addr => ( 2 , vec ! [ param( 0 ) ] , param ( 1 ) ) ,
556
- sym:: simd_bitmask => ( 2 , vec ! [ param( 0 ) ] , param ( 1 ) ) ,
556
+ | sym:: simd_from_exposed_addr => ( 2 , 0 , vec ! [ param( 0 ) ] , param ( 1 ) ) ,
557
+ sym:: simd_bitmask => ( 2 , 0 , vec ! [ param( 0 ) ] , param ( 1 ) ) ,
557
558
sym:: simd_select | sym:: simd_select_bitmask => {
558
- ( 2 , vec ! [ param( 0 ) , param( 1 ) , param( 1 ) ] , param ( 1 ) )
559
+ ( 2 , 0 , vec ! [ param( 0 ) , param( 1 ) , param( 1 ) ] , param ( 1 ) )
559
560
}
560
- sym:: simd_reduce_all | sym:: simd_reduce_any => ( 1 , vec ! [ param( 0 ) ] , tcx. types . bool ) ,
561
+ sym:: simd_reduce_all | sym:: simd_reduce_any => ( 1 , 0 , vec ! [ param( 0 ) ] , tcx. types . bool ) ,
561
562
sym:: simd_reduce_add_ordered | sym:: simd_reduce_mul_ordered => {
562
- ( 2 , vec ! [ param( 0 ) , param( 1 ) ] , param ( 1 ) )
563
+ ( 2 , 0 , vec ! [ param( 0 ) , param( 1 ) ] , param ( 1 ) )
563
564
}
564
565
sym:: simd_reduce_add_unordered
565
566
| sym:: simd_reduce_mul_unordered
@@ -569,8 +570,9 @@ pub fn check_platform_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>)
569
570
| sym:: simd_reduce_min
570
571
| sym:: simd_reduce_max
571
572
| sym:: simd_reduce_min_nanless
572
- | sym:: simd_reduce_max_nanless => ( 2 , vec ! [ param( 0 ) ] , param ( 1 ) ) ,
573
- sym:: simd_shuffle => ( 3 , vec ! [ param( 0 ) , param( 0 ) , param( 1 ) ] , param ( 2 ) ) ,
573
+ | sym:: simd_reduce_max_nanless => ( 2 , 0 , vec ! [ param( 0 ) ] , param ( 1 ) ) ,
574
+ sym:: simd_shuffle => ( 3 , 0 , vec ! [ param( 0 ) , param( 0 ) , param( 1 ) ] , param ( 2 ) ) ,
575
+ sym:: simd_shuffle_generic => ( 2 , 1 , vec ! [ param( 0 ) , param( 0 ) ] , param ( 1 ) ) ,
574
576
_ => {
575
577
let msg = format ! ( "unrecognized platform-specific intrinsic function: `{name}`" ) ;
576
578
tcx. sess . struct_span_err ( it. span , msg) . emit ( ) ;
@@ -580,5 +582,5 @@ pub fn check_platform_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>)
580
582
581
583
let sig = tcx. mk_fn_sig ( inputs, output, false , hir:: Unsafety :: Unsafe , Abi :: PlatformIntrinsic ) ;
582
584
let sig = ty:: Binder :: dummy ( sig) ;
583
- equate_intrinsic_type ( tcx, it, n_tps, 0 , sig)
585
+ equate_intrinsic_type ( tcx, it, n_tps, 0 , n_cts , sig)
584
586
}
0 commit comments