@@ -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 it_def_id = it. owner_id . def_id ;
57
58
check_function_signature (
@@ -489,7 +490,7 @@ pub fn check_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>) {
489
490
} ;
490
491
let sig = tcx. mk_fn_sig ( inputs, output, false , unsafety, Abi :: RustIntrinsic ) ;
491
492
let sig = ty:: Binder :: bind_with_vars ( sig, bound_vars) ;
492
- equate_intrinsic_type ( tcx, it, n_tps, n_lts, sig)
493
+ equate_intrinsic_type ( tcx, it, n_tps, n_lts, 0 , sig)
493
494
}
494
495
495
496
/// Type-check `extern "platform-intrinsic" { ... }` functions.
@@ -501,9 +502,9 @@ pub fn check_platform_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>)
501
502
502
503
let name = it. ident . name ;
503
504
504
- let ( n_tps, inputs, output) = match name {
505
+ let ( n_tps, n_cts , inputs, output) = match name {
505
506
sym:: simd_eq | sym:: simd_ne | sym:: simd_lt | sym:: simd_le | sym:: simd_gt | sym:: simd_ge => {
506
- ( 2 , vec ! [ param( 0 ) , param( 0 ) ] , param ( 1 ) )
507
+ ( 2 , 0 , vec ! [ param( 0 ) , param( 0 ) ] , param ( 1 ) )
507
508
}
508
509
sym:: simd_add
509
510
| sym:: simd_sub
@@ -519,8 +520,8 @@ pub fn check_platform_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>)
519
520
| sym:: simd_fmax
520
521
| sym:: simd_fpow
521
522
| sym:: simd_saturating_add
522
- | sym:: simd_saturating_sub => ( 1 , vec ! [ param( 0 ) , param( 0 ) ] , param ( 0 ) ) ,
523
- sym:: simd_arith_offset => ( 2 , vec ! [ param( 0 ) , param( 1 ) ] , param ( 0 ) ) ,
523
+ | sym:: simd_saturating_sub => ( 1 , 0 , vec ! [ param( 0 ) , param( 0 ) ] , param ( 0 ) ) ,
524
+ sym:: simd_arith_offset => ( 2 , 0 , vec ! [ param( 0 ) , param( 1 ) ] , param ( 0 ) ) ,
524
525
sym:: simd_neg
525
526
| sym:: simd_bswap
526
527
| sym:: simd_bitreverse
@@ -538,25 +539,25 @@ pub fn check_platform_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>)
538
539
| sym:: simd_ceil
539
540
| sym:: simd_floor
540
541
| sym:: simd_round
541
- | sym:: simd_trunc => ( 1 , vec ! [ param( 0 ) ] , param ( 0 ) ) ,
542
- sym:: simd_fpowi => ( 1 , vec ! [ param( 0 ) , tcx. types. i32 ] , param ( 0 ) ) ,
543
- sym:: simd_fma => ( 1 , vec ! [ param( 0 ) , param( 0 ) , param( 0 ) ] , param ( 0 ) ) ,
544
- sym:: simd_gather => ( 3 , vec ! [ param( 0 ) , param( 1 ) , param( 2 ) ] , param ( 0 ) ) ,
545
- sym:: simd_scatter => ( 3 , vec ! [ param( 0 ) , param( 1 ) , param( 2 ) ] , Ty :: new_unit ( tcx) ) ,
546
- sym:: simd_insert => ( 2 , vec ! [ param( 0 ) , tcx. types. u32 , param( 1 ) ] , param ( 0 ) ) ,
547
- sym:: simd_extract => ( 2 , vec ! [ param( 0 ) , tcx. types. u32 ] , param ( 1 ) ) ,
542
+ | sym:: simd_trunc => ( 1 , 0 , vec ! [ param( 0 ) ] , param ( 0 ) ) ,
543
+ sym:: simd_fpowi => ( 1 , 0 , vec ! [ param( 0 ) , tcx. types. i32 ] , param ( 0 ) ) ,
544
+ sym:: simd_fma => ( 1 , 0 , vec ! [ param( 0 ) , param( 0 ) , param( 0 ) ] , param ( 0 ) ) ,
545
+ sym:: simd_gather => ( 3 , 0 , vec ! [ param( 0 ) , param( 1 ) , param( 2 ) ] , param ( 0 ) ) ,
546
+ sym:: simd_scatter => ( 3 , 0 , vec ! [ param( 0 ) , param( 1 ) , param( 2 ) ] , Ty :: new_unit ( tcx) ) ,
547
+ sym:: simd_insert => ( 2 , 0 , vec ! [ param( 0 ) , tcx. types. u32 , param( 1 ) ] , param ( 0 ) ) ,
548
+ sym:: simd_extract => ( 2 , 0 , vec ! [ param( 0 ) , tcx. types. u32 ] , param ( 1 ) ) ,
548
549
sym:: simd_cast
549
550
| sym:: simd_as
550
551
| sym:: simd_cast_ptr
551
552
| sym:: simd_expose_addr
552
- | sym:: simd_from_exposed_addr => ( 2 , vec ! [ param( 0 ) ] , param ( 1 ) ) ,
553
- sym:: simd_bitmask => ( 2 , vec ! [ param( 0 ) ] , param ( 1 ) ) ,
553
+ | sym:: simd_from_exposed_addr => ( 2 , 0 , vec ! [ param( 0 ) ] , param ( 1 ) ) ,
554
+ sym:: simd_bitmask => ( 2 , 0 , vec ! [ param( 0 ) ] , param ( 1 ) ) ,
554
555
sym:: simd_select | sym:: simd_select_bitmask => {
555
- ( 2 , vec ! [ param( 0 ) , param( 1 ) , param( 1 ) ] , param ( 1 ) )
556
+ ( 2 , 0 , vec ! [ param( 0 ) , param( 1 ) , param( 1 ) ] , param ( 1 ) )
556
557
}
557
- sym:: simd_reduce_all | sym:: simd_reduce_any => ( 1 , vec ! [ param( 0 ) ] , tcx. types . bool ) ,
558
+ sym:: simd_reduce_all | sym:: simd_reduce_any => ( 1 , 0 , vec ! [ param( 0 ) ] , tcx. types . bool ) ,
558
559
sym:: simd_reduce_add_ordered | sym:: simd_reduce_mul_ordered => {
559
- ( 2 , vec ! [ param( 0 ) , param( 1 ) ] , param ( 1 ) )
560
+ ( 2 , 0 , vec ! [ param( 0 ) , param( 1 ) ] , param ( 1 ) )
560
561
}
561
562
sym:: simd_reduce_add_unordered
562
563
| sym:: simd_reduce_mul_unordered
@@ -566,8 +567,9 @@ pub fn check_platform_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>)
566
567
| sym:: simd_reduce_min
567
568
| sym:: simd_reduce_max
568
569
| sym:: simd_reduce_min_nanless
569
- | sym:: simd_reduce_max_nanless => ( 2 , vec ! [ param( 0 ) ] , param ( 1 ) ) ,
570
- sym:: simd_shuffle => ( 3 , vec ! [ param( 0 ) , param( 0 ) , param( 1 ) ] , param ( 2 ) ) ,
570
+ | sym:: simd_reduce_max_nanless => ( 2 , 0 , vec ! [ param( 0 ) ] , param ( 1 ) ) ,
571
+ sym:: simd_shuffle => ( 3 , 0 , vec ! [ param( 0 ) , param( 0 ) , param( 1 ) ] , param ( 2 ) ) ,
572
+ sym:: simd_shuffle_generic => ( 2 , 1 , vec ! [ param( 0 ) , param( 0 ) ] , param ( 1 ) ) ,
571
573
_ => {
572
574
let msg = format ! ( "unrecognized platform-specific intrinsic function: `{name}`" ) ;
573
575
tcx. sess . struct_span_err ( it. span , msg) . emit ( ) ;
@@ -577,5 +579,5 @@ pub fn check_platform_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>)
577
579
578
580
let sig = tcx. mk_fn_sig ( inputs, output, false , hir:: Unsafety :: Unsafe , Abi :: PlatformIntrinsic ) ;
579
581
let sig = ty:: Binder :: dummy ( sig) ;
580
- equate_intrinsic_type ( tcx, it, n_tps, 0 , sig)
582
+ equate_intrinsic_type ( tcx, it, n_tps, 0 , n_cts , sig)
581
583
}
0 commit comments