1use rustc_attr_ir::lang_items::LangItem;
4use rustc_errors::DiagMessage;
5use rustc_hir as hir;
6use rustc_middle::traits::{ObligationCause, ObligationCauseCode};
7use rustc_middle::ty::{self, Const, Ty, TyCtxt};
8use rustc_span::def_id::LocalDefId;
9use rustc_span::{Span, Symbol, sym};
10
11use crate::check::check_function_signature;
12use crate::diagnostics::{UnrecognizedIntrinsicFunction, WrongNumberOfGenericArgumentsToIntrinsic};
13
14fn equate_intrinsic_type<'tcx>(
15 tcx: TyCtxt<'tcx>,
16 span: Span,
17 def_id: LocalDefId,
18 n_tps: usize,
19 n_lts: usize,
20 n_cts: usize,
21 sig: ty::PolyFnSig<'tcx>,
22) {
23 let (generics, span) = match tcx.hir_node_by_def_id(def_id) {
24 hir::Node::Item(hir::Item { kind: hir::ItemKind::Fn { generics, .. }, .. }) => {
25 (tcx.generics_of(def_id), generics.span)
26 }
27 _ => tcx.dcx().span_bug(span, "intrinsic must be a function"),
28 };
29 let own_counts = generics.own_counts();
30
31 let gen_count_ok = |found: usize, expected: usize, descr: &str| -> bool {
32 if found != expected {
33 tcx.dcx().emit_err(WrongNumberOfGenericArgumentsToIntrinsic {
34 span,
35 found,
36 expected,
37 descr,
38 });
39 false
40 } else {
41 true
42 }
43 };
44
45 if gen_count_ok(own_counts.lifetimes, n_lts, "lifetime")
48 && gen_count_ok(own_counts.types, n_tps, "type")
49 && gen_count_ok(own_counts.consts, n_cts, "const")
50 {
51 let _ = check_function_signature(
52 tcx,
53 ObligationCause::new(span, def_id, ObligationCauseCode::IntrinsicType),
54 def_id.into(),
55 sig,
56 );
57 }
58}
59
60fn intrinsic_operation_unsafety(tcx: TyCtxt<'_>, intrinsic_id: LocalDefId) -> hir::Safety {
62 let is_in_list = match tcx.item_name(intrinsic_id) {
63 | sym::abort_immediate
70 | sym::add_with_overflow
71 | sym::aggregate_raw_ptr
72 | sym::align_of
73 | sym::amdgpu_dispatch_ptr
74 | sym::assert_inhabited
75 | sym::assert_mem_uninitialized_valid
76 | sym::assert_zero_valid
77 | sym::autodiff
78 | sym::bitreverse
79 | sym::black_box
80 | sym::breakpoint
81 | sym::bswap
82 | sym::caller_location
83 | sym::carrying_mul_add
84 | sym::carryless_mul
85 | sym::ceil
86 | sym::codeview_annotation
87 | sym::cold_path
88 | sym::const_eval_select
89 | sym::contract_check_ensures
90 | sym::contract_check_requires
91 | sym::contract_checks
92 | sym::copysignf16
93 | sym::copysignf32
94 | sym::copysignf64
95 | sym::copysignf128
96 | sym::cos
97 | sym::ctlz
98 | sym::ctpop
99 | sym::cttz
100 | sym::discriminant_value
101 | sym::exp
102 | sym::exp2
103 | sym::fabs
104 | sym::fadd_algebraic
105 | sym::fdiv_algebraic
106 | sym::field_offset
107 | sym::field_representing_type_actual_type_id
108 | sym::field_representing_type_name
109 | sym::field_representing_type_offset
110 | sym::floor
111 | sym::fma
112 | sym::fmul_algebraic
113 | sym::fmuladd
114 | sym::forget
115 | sym::frem_algebraic
116 | sym::fsub_algebraic
117 | sym::gpu_launch_sized_workgroup_mem
118 | sym::integer_max
119 | sym::integer_min
120 | sym::is_val_statically_known
121 | sym::log
122 | sym::log2
123 | sym::log10
124 | sym::maximum_number_nsz_f16
125 | sym::maximum_number_nsz_f32
126 | sym::maximum_number_nsz_f64
127 | sym::maximum_number_nsz_f128
128 | sym::maximumf16
129 | sym::maximumf32
130 | sym::maximumf64
131 | sym::maximumf128
132 | sym::minimum_number_nsz_f16
133 | sym::minimum_number_nsz_f32
134 | sym::minimum_number_nsz_f64
135 | sym::minimum_number_nsz_f128
136 | sym::minimumf16
137 | sym::minimumf32
138 | sym::minimumf64
139 | sym::minimumf128
140 | sym::mul_with_overflow
141 | sym::needs_drop
142 | sym::offload
143 | sym::offload_get_num_devices
144 | sym::offset_of
145 | sym::overflow_checks
146 | sym::powf
147 | sym::powi
148 | sym::prefetch_read_data
149 | sym::prefetch_read_instruction
150 | sym::prefetch_write_data
151 | sym::prefetch_write_instruction
152 | sym::ptr_guaranteed_cmp
153 | sym::ptr_mask
154 | sym::ptr_metadata
155 | sym::resumable_breakpoint
156 | sym::return_address
157 | sym::rotate_left
158 | sym::rotate_right
159 | sym::round
160 | sym::round_ties_even
161 | sym::rustc_peek
162 | sym::saturating_add
163 | sym::saturating_sub
164 | sym::select_unpredictable
165 | sym::sin
166 | sym::size_of
167 | sym::size_of_type_id
168 | sym::sqrt
169 | sym::sub_with_overflow
170 | sym::three_way_compare
171 | sym::trunc
172 | sym::type_id
173 | sym::type_id_array_len
174 | sym::type_id_element_ty
175 | sym::type_id_eq
176 | sym::type_id_field_representing_type
177 | sym::type_id_fields
178 | sym::type_id_function_ptr
179 | sym::type_id_generics
180 | sym::type_id_is_signed
181 | sym::type_id_non_exhaustive
182 | sym::type_id_points_mutably
183 | sym::type_id_points_to
184 | sym::type_id_size_of
185 | sym::type_id_type_of
186 | sym::type_id_variant_name
187 | sym::type_id_variant_non_exhaustive
188 | sym::type_id_variants
189 | sym::type_id_vtable
190 | sym::type_name
191 | sym::ub_checks
192 | sym::va_copy
193 | sym::variant_count
194 | sym::wrapping_add
195 | sym::wrapping_mul
196 | sym::wrapping_sub
197 | sym::write_box_via_move
198 => hir::Safety::Safe,
200 _ => hir::Safety::Unsafe,
201 };
202
203 if tcx.fn_sig(intrinsic_id).skip_binder().safety() != is_in_list {
204 tcx.dcx().struct_span_err(
205 tcx.def_span(intrinsic_id),
206 DiagMessage::from(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("intrinsic safety mismatch between list of intrinsics within the compiler and core library intrinsics for intrinsic `{0}`",
tcx.item_name(intrinsic_id)))
})format!(
207 "intrinsic safety mismatch between list of intrinsics within the compiler and core library intrinsics for intrinsic `{}`",
208 tcx.item_name(intrinsic_id)
209 )
210 )).emit();
211 }
212
213 is_in_list
214}
215
216pub(crate) fn check_intrinsic_type(
219 tcx: TyCtxt<'_>,
220 intrinsic_id: LocalDefId,
221 span: Span,
222 intrinsic_name: Symbol,
223) {
224 let generics = tcx.generics_of(intrinsic_id);
225 let param = |n| {
226 if let &ty::GenericParamDef { name, kind: ty::GenericParamDefKind::Type { .. }, .. } =
227 generics.param_at(n as usize, tcx)
228 {
229 Ty::new_param(tcx, n, name)
230 } else {
231 Ty::new_error_with_message(tcx, span, "expected param")
232 }
233 };
234
235 let bound_vars = tcx.mk_bound_variable_kinds(&[
236 ty::BoundVariableKind::Region(ty::BoundRegionKind::Anon),
237 ty::BoundVariableKind::Region(ty::BoundRegionKind::Anon),
238 ty::BoundVariableKind::Region(ty::BoundRegionKind::ClosureEnv),
239 ]);
240 let mk_va_list_ty = |mutbl| {
241 let did = tcx.require_lang_item(LangItem::VaList, span);
242 let region = ty::Region::new_bound(
243 tcx,
244 ty::INNERMOST,
245 ty::BoundRegion { var: ty::BoundVar::ZERO, kind: ty::BoundRegionKind::Anon },
246 );
247 let env_region = ty::Region::new_bound(
248 tcx,
249 ty::INNERMOST,
250 ty::BoundRegion {
251 var: ty::BoundVar::from_u32(2),
252 kind: ty::BoundRegionKind::ClosureEnv,
253 },
254 );
255 let va_list_ty = tcx.type_of(did).instantiate(tcx, &[region.into()]).skip_norm_wip();
256 (Ty::new_ref(tcx, env_region, va_list_ty, mutbl), va_list_ty)
257 };
258 let type_id_ty = || tcx.type_of(tcx.lang_items().type_id().unwrap()).no_bound_vars().unwrap();
259
260 let safety = intrinsic_operation_unsafety(tcx, intrinsic_id);
261 let n_lts = 0;
262 let (n_tps, n_cts, inputs, output) = match intrinsic_name {
263 sym::autodiff => (4, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(1), param(2)]))vec![param(0), param(1), param(2)], param(3)),
264 sym::abort_immediate => (0, 0, ::alloc::vec::Vec::new()vec![], tcx.types.never),
265 sym::amdgpu_dispatch_ptr => (0, 0, ::alloc::vec::Vec::new()vec![], Ty::new_imm_ptr(tcx, tcx.types.unit)),
266 sym::unreachable => (0, 0, ::alloc::vec::Vec::new()vec![], tcx.types.never),
267 sym::breakpoint | sym::resumable_breakpoint => (0, 0, ::alloc::vec::Vec::new()vec![], tcx.types.unit),
268 sym::codeview_annotation => (1, 0, ::alloc::vec::Vec::new()vec![], tcx.types.unit),
269 sym::size_of | sym::align_of | sym::variant_count => (1, 0, ::alloc::vec::Vec::new()vec![], tcx.types.usize),
270 sym::size_of_val | sym::align_of_val => {
271 (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Ty::new_imm_ptr(tcx, param(0))]))vec![Ty::new_imm_ptr(tcx, param(0))], tcx.types.usize)
272 }
273 sym::type_id_size_of => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[type_id_ty()]))vec![type_id_ty()], Ty::new_option(tcx, tcx.types.usize)),
274 sym::offset_of => (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[tcx.types.u32, tcx.types.u32]))vec![tcx.types.u32, tcx.types.u32], tcx.types.usize),
275 sym::field_offset => (1, 0, ::alloc::vec::Vec::new()vec![], tcx.types.usize),
276 sym::rustc_peek => (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0)]))vec![param(0)], param(0)),
277 sym::caller_location => (0, 0, ::alloc::vec::Vec::new()vec![], tcx.caller_location_ty()),
278 sym::gpu_launch_sized_workgroup_mem => (1, 0, ::alloc::vec::Vec::new()vec![], Ty::new_mut_ptr(tcx, param(0))),
279 sym::assert_inhabited | sym::assert_zero_valid | sym::assert_mem_uninitialized_valid => {
280 (1, 0, ::alloc::vec::Vec::new()vec![], tcx.types.unit)
281 }
282 sym::forget => (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0)]))vec![param(0)], tcx.types.unit),
283 sym::transmute | sym::transmute_unchecked => (2, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0)]))vec![param(0)], param(1)),
284 sym::prefetch_read_data
285 | sym::prefetch_write_data
286 | sym::prefetch_read_instruction
287 | sym::prefetch_write_instruction => {
288 (1, 1, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Ty::new_imm_ptr(tcx, param(0))]))vec![Ty::new_imm_ptr(tcx, param(0))], tcx.types.unit)
289 }
290 sym::needs_drop => (1, 0, ::alloc::vec::Vec::new()vec![], tcx.types.bool),
291
292 sym::type_name => (1, 0, ::alloc::vec::Vec::new()vec![], Ty::new_static_str(tcx)),
293 sym::type_id => (1, 0, ::alloc::vec::Vec::new()vec![], type_id_ty()),
294 sym::type_id_array_len => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[type_id_ty()]))vec![type_id_ty()], tcx.types.usize),
295 sym::type_id_element_ty => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[type_id_ty()]))vec![type_id_ty()], Ty::new_option(tcx, type_id_ty())),
296 sym::type_id_eq => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[type_id_ty(), type_id_ty()]))vec![type_id_ty(), type_id_ty()], tcx.types.bool),
297 sym::type_id_field_representing_type => {
298 (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[type_id_ty(), tcx.types.usize, tcx.types.usize]))vec![type_id_ty(), tcx.types.usize, tcx.types.usize], type_id_ty())
299 }
300 sym::type_id_fields => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[type_id_ty(), tcx.types.usize]))vec![type_id_ty(), tcx.types.usize], tcx.types.usize),
301 sym::type_id_function_ptr => {
302 let fn_ptr = tcx.require_lang_item(LangItem::FnPtr, span);
303 let fn_ptr_adt_ref = tcx.adt_def(fn_ptr);
304 let fn_ptr_ty = Ty::new_adt(tcx, fn_ptr_adt_ref, ty::GenericArgs::empty());
305
306 let option = tcx.require_lang_item(LangItem::Option, span);
307 let option_adt_ref = tcx.adt_def(option);
308 let option_args = tcx.mk_args(&[fn_ptr_ty.into()]);
309 let option_fn_ptr_ty = Ty::new_adt(tcx, option_adt_ref, option_args);
310 (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[type_id_ty()]))vec![type_id_ty()], option_fn_ptr_ty)
311 }
312 sym::type_id_is_signed => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[type_id_ty()]))vec![type_id_ty()], tcx.types.bool),
313 sym::type_id_points_mutably => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[type_id_ty()]))vec![type_id_ty()], tcx.types.bool),
314 sym::type_id_points_to => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[type_id_ty()]))vec![type_id_ty()], Ty::new_option(tcx, type_id_ty())),
315 sym::type_id_variants => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[type_id_ty()]))vec![type_id_ty()], tcx.types.usize),
316 sym::type_id_variant_name => {
317 (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[type_id_ty(), tcx.types.usize]))vec![type_id_ty(), tcx.types.usize], Ty::new_static_str(tcx))
318 }
319 sym::type_id_variant_non_exhaustive => {
320 (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[type_id_ty(), tcx.types.usize]))vec![type_id_ty(), tcx.types.usize], tcx.types.bool)
321 }
322 sym::type_id_vtable => {
323 let dyn_metadata = tcx.require_lang_item(LangItem::DynMetadata, span);
324 let dyn_metadata_adt_ref = tcx.adt_def(dyn_metadata);
325 let dyn_metadata_args =
326 tcx.mk_args(&[Ty::new_ptr(tcx, tcx.types.unit, ty::Mutability::Not).into()]);
327 let dyn_ty = Ty::new_adt(tcx, dyn_metadata_adt_ref, dyn_metadata_args);
328
329 let option_did = tcx.require_lang_item(LangItem::Option, span);
330 let option_adt_ref = tcx.adt_def(option_did);
331 let option_args = tcx.mk_args(&[dyn_ty.into()]);
332 let ret_ty = Ty::new_adt(tcx, option_adt_ref, option_args);
333
334 (0, 0, ::alloc::vec::from_elem(type_id_ty(), 2)vec![type_id_ty(); 2], ret_ty)
335 }
336 sym::type_id_type_of => (
337 0,
338 0,
339 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[type_id_ty()]))vec![type_id_ty()],
340 tcx.type_of(tcx.lang_items().type_struct().unwrap()).no_bound_vars().unwrap(),
341 ),
342 sym::field_representing_type_actual_type_id => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[type_id_ty()]))vec![type_id_ty()], type_id_ty()),
343 sym::field_representing_type_name => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[type_id_ty()]))vec![type_id_ty()], Ty::new_static_str(tcx)),
344 sym::field_representing_type_offset => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[type_id_ty()]))vec![type_id_ty()], tcx.types.usize),
345 sym::type_id_non_exhaustive => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[type_id_ty()]))vec![type_id_ty()], tcx.types.bool),
346 sym::type_id_generics => (
347 0,
348 0,
349 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[type_id_ty()]))vec![type_id_ty()],
350 Ty::new_imm_ref(
351 tcx,
352 tcx.lifetimes.re_static,
353 Ty::new_slice(
354 tcx,
355 tcx.type_of(tcx.lang_items().type_generic().unwrap()).no_bound_vars().unwrap(),
356 ),
357 ),
358 ),
359 sym::offload => (
360 3,
361 0,
362 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0),
Ty::new_array_with_const_len(tcx, tcx.types.u32,
Const::from_target_usize(tcx, 3)),
Ty::new_array_with_const_len(tcx, tcx.types.u32,
Const::from_target_usize(tcx, 3)), tcx.types.u32,
tcx.types.i32, param(1)]))vec![
363 param(0),
364 Ty::new_array_with_const_len(tcx, tcx.types.u32, Const::from_target_usize(tcx, 3)),
365 Ty::new_array_with_const_len(tcx, tcx.types.u32, Const::from_target_usize(tcx, 3)),
366 tcx.types.u32,
367 tcx.types.i32,
368 param(1),
369 ],
370 param(2),
371 ),
372 sym::offload_get_num_devices => (0, 0, ::alloc::vec::Vec::new()vec![], tcx.types.i32),
373 sym::offset => (2, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(1)]))vec![param(0), param(1)], param(0)),
374 sym::arith_offset => (
375 1,
376 0,
377 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Ty::new_imm_ptr(tcx, param(0)), tcx.types.isize]))vec![Ty::new_imm_ptr(tcx, param(0)), tcx.types.isize],
378 Ty::new_imm_ptr(tcx, param(0)),
379 ),
380 sym::slice_get_unchecked => (3, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(1), tcx.types.usize]))vec![param(1), tcx.types.usize], param(0)),
381 sym::ptr_mask => (
382 1,
383 0,
384 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Ty::new_imm_ptr(tcx, param(0)), tcx.types.usize]))vec![Ty::new_imm_ptr(tcx, param(0)), tcx.types.usize],
385 Ty::new_imm_ptr(tcx, param(0)),
386 ),
387
388 sym::copy | sym::copy_nonoverlapping => (
389 1,
390 0,
391 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Ty::new_imm_ptr(tcx, param(0)), Ty::new_mut_ptr(tcx, param(0)),
tcx.types.usize]))vec![Ty::new_imm_ptr(tcx, param(0)), Ty::new_mut_ptr(tcx, param(0)), tcx.types.usize],
392 tcx.types.unit,
393 ),
394 sym::volatile_copy_memory | sym::volatile_copy_nonoverlapping_memory => (
395 1,
396 0,
397 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Ty::new_mut_ptr(tcx, param(0)), Ty::new_imm_ptr(tcx, param(0)),
tcx.types.usize]))vec![Ty::new_mut_ptr(tcx, param(0)), Ty::new_imm_ptr(tcx, param(0)), tcx.types.usize],
398 tcx.types.unit,
399 ),
400 sym::compare_bytes => {
401 let byte_ptr = Ty::new_imm_ptr(tcx, tcx.types.u8);
402 (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[byte_ptr, byte_ptr, tcx.types.usize]))vec![byte_ptr, byte_ptr, tcx.types.usize], tcx.types.i32)
403 }
404 sym::write_bytes | sym::volatile_set_memory => (
405 1,
406 0,
407 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Ty::new_mut_ptr(tcx, param(0)), tcx.types.u8, tcx.types.usize]))vec![Ty::new_mut_ptr(tcx, param(0)), tcx.types.u8, tcx.types.usize],
408 tcx.types.unit,
409 ),
410
411 sym::powi => (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), tcx.types.i32]))vec![param(0), tcx.types.i32], param(0)),
412
413 sym::fma | sym::fmuladd => (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(0), param(0)]))vec![param(0), param(0), param(0)], param(0)),
414
415 sym::exp
416 | sym::exp2
417 | sym::log
418 | sym::log2
419 | sym::log10
420 | sym::fabs
421 | sym::sin
422 | sym::cos
423 | sym::floor
424 | sym::ceil
425 | sym::trunc
426 | sym::round_ties_even
427 | sym::round
428 | sym::sqrt => (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0)]))vec![param(0)], param(0)),
429
430 sym::minimum_number_nsz_f16 => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[tcx.types.f16, tcx.types.f16]))vec![tcx.types.f16, tcx.types.f16], tcx.types.f16),
431 sym::minimum_number_nsz_f32 => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[tcx.types.f32, tcx.types.f32]))vec![tcx.types.f32, tcx.types.f32], tcx.types.f32),
432 sym::minimum_number_nsz_f64 => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[tcx.types.f64, tcx.types.f64]))vec![tcx.types.f64, tcx.types.f64], tcx.types.f64),
433 sym::minimum_number_nsz_f128 => {
434 (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[tcx.types.f128, tcx.types.f128]))vec![tcx.types.f128, tcx.types.f128], tcx.types.f128)
435 }
436
437 sym::minimumf16 => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[tcx.types.f16, tcx.types.f16]))vec![tcx.types.f16, tcx.types.f16], tcx.types.f16),
438 sym::minimumf32 => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[tcx.types.f32, tcx.types.f32]))vec![tcx.types.f32, tcx.types.f32], tcx.types.f32),
439 sym::minimumf64 => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[tcx.types.f64, tcx.types.f64]))vec![tcx.types.f64, tcx.types.f64], tcx.types.f64),
440 sym::minimumf128 => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[tcx.types.f128, tcx.types.f128]))vec![tcx.types.f128, tcx.types.f128], tcx.types.f128),
441
442 sym::maximum_number_nsz_f16 => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[tcx.types.f16, tcx.types.f16]))vec![tcx.types.f16, tcx.types.f16], tcx.types.f16),
443 sym::maximum_number_nsz_f32 => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[tcx.types.f32, tcx.types.f32]))vec![tcx.types.f32, tcx.types.f32], tcx.types.f32),
444 sym::maximum_number_nsz_f64 => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[tcx.types.f64, tcx.types.f64]))vec![tcx.types.f64, tcx.types.f64], tcx.types.f64),
445 sym::maximum_number_nsz_f128 => {
446 (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[tcx.types.f128, tcx.types.f128]))vec![tcx.types.f128, tcx.types.f128], tcx.types.f128)
447 }
448
449 sym::maximumf16 => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[tcx.types.f16, tcx.types.f16]))vec![tcx.types.f16, tcx.types.f16], tcx.types.f16),
450 sym::maximumf32 => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[tcx.types.f32, tcx.types.f32]))vec![tcx.types.f32, tcx.types.f32], tcx.types.f32),
451 sym::maximumf64 => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[tcx.types.f64, tcx.types.f64]))vec![tcx.types.f64, tcx.types.f64], tcx.types.f64),
452 sym::maximumf128 => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[tcx.types.f128, tcx.types.f128]))vec![tcx.types.f128, tcx.types.f128], tcx.types.f128),
453
454 sym::copysignf16 => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[tcx.types.f16, tcx.types.f16]))vec![tcx.types.f16, tcx.types.f16], tcx.types.f16),
455 sym::copysignf32 => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[tcx.types.f32, tcx.types.f32]))vec![tcx.types.f32, tcx.types.f32], tcx.types.f32),
456 sym::copysignf64 => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[tcx.types.f64, tcx.types.f64]))vec![tcx.types.f64, tcx.types.f64], tcx.types.f64),
457 sym::copysignf128 => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[tcx.types.f128, tcx.types.f128]))vec![tcx.types.f128, tcx.types.f128], tcx.types.f128),
458
459 sym::powf => (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(0)]))vec![param(0), param(0)], param(0)),
460
461 sym::volatile_load | sym::unaligned_volatile_load => {
462 (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Ty::new_imm_ptr(tcx, param(0))]))vec![Ty::new_imm_ptr(tcx, param(0))], param(0))
463 }
464 sym::volatile_store | sym::unaligned_volatile_store => {
465 (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Ty::new_mut_ptr(tcx, param(0)), param(0)]))vec![Ty::new_mut_ptr(tcx, param(0)), param(0)], tcx.types.unit)
466 }
467
468 sym::ctpop | sym::ctlz | sym::ctlz_nonzero | sym::cttz | sym::cttz_nonzero => {
469 (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0)]))vec![param(0)], tcx.types.u32)
470 }
471
472 sym::bswap | sym::bitreverse => (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0)]))vec![param(0)], param(0)),
473
474 sym::three_way_compare => (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(0)]))vec![param(0), param(0)], tcx.ty_ordering_enum(span)),
475
476 sym::add_with_overflow | sym::sub_with_overflow | sym::mul_with_overflow => {
477 (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(0)]))vec![param(0), param(0)], Ty::new_tup(tcx, &[param(0), tcx.types.bool]))
478 }
479
480 sym::carrying_mul_add => (2, 0, ::alloc::vec::from_elem(param(0), 4)vec![param(0); 4], Ty::new_tup(tcx, &[param(1), param(0)])),
481
482 sym::ptr_guaranteed_cmp => (
483 1,
484 0,
485 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Ty::new_imm_ptr(tcx, param(0)), Ty::new_imm_ptr(tcx, param(0))]))vec![Ty::new_imm_ptr(tcx, param(0)), Ty::new_imm_ptr(tcx, param(0))],
486 tcx.types.u8,
487 ),
488
489 sym::const_allocate => {
490 (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[tcx.types.usize, tcx.types.usize]))vec![tcx.types.usize, tcx.types.usize], Ty::new_mut_ptr(tcx, tcx.types.u8))
491 }
492 sym::const_deallocate => (
493 0,
494 0,
495 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Ty::new_mut_ptr(tcx, tcx.types.u8), tcx.types.usize,
tcx.types.usize]))vec![Ty::new_mut_ptr(tcx, tcx.types.u8), tcx.types.usize, tcx.types.usize],
496 tcx.types.unit,
497 ),
498 sym::const_make_global => {
499 (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Ty::new_mut_ptr(tcx, tcx.types.u8)]))vec![Ty::new_mut_ptr(tcx, tcx.types.u8)], Ty::new_imm_ptr(tcx, tcx.types.u8))
500 }
501
502 sym::ptr_offset_from => (
503 1,
504 0,
505 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Ty::new_imm_ptr(tcx, param(0)), Ty::new_imm_ptr(tcx, param(0))]))vec![Ty::new_imm_ptr(tcx, param(0)), Ty::new_imm_ptr(tcx, param(0))],
506 tcx.types.isize,
507 ),
508 sym::ptr_offset_from_unsigned => (
509 1,
510 0,
511 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Ty::new_imm_ptr(tcx, param(0)), Ty::new_imm_ptr(tcx, param(0))]))vec![Ty::new_imm_ptr(tcx, param(0)), Ty::new_imm_ptr(tcx, param(0))],
512 tcx.types.usize,
513 ),
514 sym::integer_max | sym::integer_min => (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(0)]))vec![param(0), param(0)], param(0)),
515 sym::unchecked_div | sym::unchecked_rem | sym::exact_div | sym::disjoint_bitor => {
516 (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(0)]))vec![param(0), param(0)], param(0))
517 }
518 sym::unchecked_shl | sym::unchecked_shr => (2, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(1)]))vec![param(0), param(1)], param(0)),
519 sym::rotate_left | sym::rotate_right => (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), tcx.types.u32]))vec![param(0), tcx.types.u32], param(0)),
520 sym::unchecked_funnel_shl | sym::unchecked_funnel_shr => {
521 (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(0), tcx.types.u32]))vec![param(0), param(0), tcx.types.u32], param(0))
522 }
523 sym::unchecked_add | sym::unchecked_sub | sym::unchecked_mul => {
524 (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(0)]))vec![param(0), param(0)], param(0))
525 }
526 sym::wrapping_add | sym::wrapping_sub | sym::wrapping_mul => {
527 (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(0)]))vec![param(0), param(0)], param(0))
528 }
529 sym::saturating_add | sym::saturating_sub => (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(0)]))vec![param(0), param(0)], param(0)),
530 sym::carryless_mul => (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(0)]))vec![param(0), param(0)], param(0)),
531 sym::fadd_fast | sym::fsub_fast | sym::fmul_fast | sym::fdiv_fast | sym::frem_fast => {
532 (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(0)]))vec![param(0), param(0)], param(0))
533 }
534 sym::fadd_algebraic
535 | sym::fsub_algebraic
536 | sym::fmul_algebraic
537 | sym::fdiv_algebraic
538 | sym::frem_algebraic => (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(0)]))vec![param(0), param(0)], param(0)),
539 sym::float_to_int_unchecked => (2, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0)]))vec![param(0)], param(1)),
540
541 sym::assume => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[tcx.types.bool]))vec![tcx.types.bool], tcx.types.unit),
542 sym::select_unpredictable => (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[tcx.types.bool, param(0), param(0)]))vec![tcx.types.bool, param(0), param(0)], param(0)),
543 sym::cold_path => (0, 0, ::alloc::vec::Vec::new()vec![], tcx.types.unit),
544
545 sym::read_via_copy => (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Ty::new_imm_ptr(tcx, param(0))]))vec![Ty::new_imm_ptr(tcx, param(0))], param(0)),
546 sym::write_via_move => {
547 (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Ty::new_mut_ptr(tcx, param(0)), param(0)]))vec![Ty::new_mut_ptr(tcx, param(0)), param(0)], tcx.types.unit)
548 }
549 sym::write_box_via_move => {
550 let t = param(0);
551 let maybe_uninit_t = Ty::new_maybe_uninit(tcx, t);
552 let box_mu_t = Ty::new_box(tcx, maybe_uninit_t);
553
554 (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[box_mu_t, param(0)]))vec![box_mu_t, param(0)], box_mu_t)
555 }
556
557 sym::typed_swap_nonoverlapping => {
558 (1, 0, ::alloc::vec::from_elem(Ty::new_mut_ptr(tcx, param(0)), 2)vec![Ty::new_mut_ptr(tcx, param(0)); 2], tcx.types.unit)
559 }
560
561 sym::discriminant_value => {
562 let assoc_items = tcx
563 .associated_item_def_ids(tcx.require_lang_item(LangItem::DiscriminantKind, span));
564 let discriminant_def_id = assoc_items[0];
565
566 let br = ty::BoundRegion { var: ty::BoundVar::ZERO, kind: ty::BoundRegionKind::Anon };
567 (
568 1,
569 0,
570 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Ty::new_imm_ref(tcx, ty::Region::new_bound(tcx, ty::INNERMOST, br),
param(0))]))vec![Ty::new_imm_ref(tcx, ty::Region::new_bound(tcx, ty::INNERMOST, br), param(0))],
571 Ty::new_projection_from_args(
572 tcx,
573 ty::IsRigid::No,
574 discriminant_def_id,
575 tcx.mk_args(&[param(0).into()]),
576 ),
577 )
578 }
579
580 sym::catch_unwind => {
581 let mut_data = Ty::new_mut_ptr(tcx, param(0));
582 let mut_u8 = Ty::new_mut_ptr(tcx, tcx.types.u8);
583 let try_fn_ty =
584 ty::Binder::dummy(tcx.mk_fn_sig_unsafe_rust_abi([mut_data], tcx.types.unit));
585 let catch_fn_ty = ty::Binder::dummy(
586 tcx.mk_fn_sig_unsafe_rust_abi([mut_data, mut_u8], tcx.types.unit),
587 );
588 (
589 1,
590 0,
591 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Ty::new_fn_ptr(tcx, try_fn_ty), mut_data,
Ty::new_fn_ptr(tcx, catch_fn_ty)]))vec![Ty::new_fn_ptr(tcx, try_fn_ty), mut_data, Ty::new_fn_ptr(tcx, catch_fn_ty)],
592 tcx.types.bool,
593 )
594 }
595
596 sym::va_copy => {
597 let (va_list_ref_ty, va_list_ty) = mk_va_list_ty(hir::Mutability::Not);
598 (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[va_list_ref_ty]))vec![va_list_ref_ty], va_list_ty)
599 }
600
601 sym::va_end => (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[mk_va_list_ty(hir::Mutability::Mut).0]))vec![mk_va_list_ty(hir::Mutability::Mut).0], tcx.types.unit),
602
603 sym::va_arg => (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[mk_va_list_ty(hir::Mutability::Mut).0]))vec![mk_va_list_ty(hir::Mutability::Mut).0], param(0)),
604
605 sym::nontemporal_store => {
606 (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Ty::new_mut_ptr(tcx, param(0)), param(0)]))vec![Ty::new_mut_ptr(tcx, param(0)), param(0)], tcx.types.unit)
607 }
608
609 sym::raw_eq => {
610 let br = ty::BoundRegion { var: ty::BoundVar::ZERO, kind: ty::BoundRegionKind::Anon };
611 let param_ty_lhs =
612 Ty::new_imm_ref(tcx, ty::Region::new_bound(tcx, ty::INNERMOST, br), param(0));
613 let br =
614 ty::BoundRegion { var: ty::BoundVar::from_u32(1), kind: ty::BoundRegionKind::Anon };
615 let param_ty_rhs =
616 Ty::new_imm_ref(tcx, ty::Region::new_bound(tcx, ty::INNERMOST, br), param(0));
617 (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param_ty_lhs, param_ty_rhs]))vec![param_ty_lhs, param_ty_rhs], tcx.types.bool)
618 }
619
620 sym::black_box => (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0)]))vec![param(0)], param(0)),
621
622 sym::is_val_statically_known => (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0)]))vec![param(0)], tcx.types.bool),
623
624 sym::const_eval_select => (4, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(1), param(2)]))vec![param(0), param(1), param(2)], param(3)),
625
626 sym::vtable_size | sym::vtable_align => {
627 (0, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Ty::new_imm_ptr(tcx, tcx.types.unit)]))vec![Ty::new_imm_ptr(tcx, tcx.types.unit)], tcx.types.usize)
628 }
629
630 sym::aggregate_raw_ptr => (3, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(1), param(2)]))vec![param(1), param(2)], param(0)),
633 sym::ptr_metadata => (2, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Ty::new_imm_ptr(tcx, param(0))]))vec![Ty::new_imm_ptr(tcx, param(0))], param(1)),
634
635 sym::ub_checks | sym::overflow_checks => (0, 0, Vec::new(), tcx.types.bool),
636
637 sym::contract_check_requires => (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0)]))vec![param(0)], tcx.types.unit),
639 sym::contract_check_ensures => {
640 (2, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Ty::new_option(tcx, param(0)), param(1)]))vec![Ty::new_option(tcx, param(0)), param(1)], param(1))
641 }
642
643 sym::simd_eq | sym::simd_ne | sym::simd_lt | sym::simd_le | sym::simd_gt | sym::simd_ge => {
644 (2, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(0)]))vec![param(0), param(0)], param(1))
645 }
646 sym::simd_add
647 | sym::simd_sub
648 | sym::simd_mul
649 | sym::simd_rem
650 | sym::simd_div
651 | sym::simd_shl
652 | sym::simd_shr
653 | sym::simd_and
654 | sym::simd_or
655 | sym::simd_xor
656 | sym::simd_minimum_number_nsz
657 | sym::simd_maximum_number_nsz
658 | sym::simd_saturating_add
659 | sym::simd_saturating_sub
660 | sym::simd_carryless_mul => (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(0)]))vec![param(0), param(0)], param(0)),
661 sym::simd_arith_offset => (2, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(1)]))vec![param(0), param(1)], param(0)),
662 sym::simd_neg
663 | sym::simd_bswap
664 | sym::simd_bitreverse
665 | sym::simd_ctlz
666 | sym::simd_cttz
667 | sym::simd_ctpop
668 | sym::simd_fsqrt
669 | sym::simd_fsin
670 | sym::simd_fcos
671 | sym::simd_fexp
672 | sym::simd_fexp2
673 | sym::simd_flog2
674 | sym::simd_flog10
675 | sym::simd_flog
676 | sym::simd_fabs
677 | sym::simd_ceil
678 | sym::simd_floor
679 | sym::simd_round
680 | sym::simd_round_ties_even
681 | sym::simd_trunc => (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0)]))vec![param(0)], param(0)),
682 sym::simd_fma | sym::simd_relaxed_fma | sym::simd_funnel_shl | sym::simd_funnel_shr => {
683 (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(0), param(0)]))vec![param(0), param(0), param(0)], param(0))
684 }
685 sym::simd_gather => (3, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(1), param(2)]))vec![param(0), param(1), param(2)], param(0)),
686 sym::simd_masked_load => (3, 1, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(1), param(2)]))vec![param(0), param(1), param(2)], param(2)),
687 sym::simd_masked_store => (3, 1, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(1), param(2)]))vec![param(0), param(1), param(2)], tcx.types.unit),
688 sym::simd_scatter => (3, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(1), param(2)]))vec![param(0), param(1), param(2)], tcx.types.unit),
689 sym::simd_insert | sym::simd_insert_dyn => {
690 (2, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), tcx.types.u32, param(1)]))vec![param(0), tcx.types.u32, param(1)], param(0))
691 }
692 sym::simd_extract | sym::simd_extract_dyn => {
693 (2, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), tcx.types.u32]))vec![param(0), tcx.types.u32], param(1))
694 }
695 sym::simd_splat => (2, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(1)]))vec![param(1)], param(0)),
696 sym::simd_cast
697 | sym::simd_as
698 | sym::simd_cast_ptr
699 | sym::simd_expose_provenance
700 | sym::simd_with_exposed_provenance => (2, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0)]))vec![param(0)], param(1)),
701 sym::simd_bitmask => (2, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0)]))vec![param(0)], param(1)),
702 sym::simd_select | sym::simd_select_bitmask => {
703 (2, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(1), param(1)]))vec![param(0), param(1), param(1)], param(1))
704 }
705 sym::simd_reduce_all | sym::simd_reduce_any => (1, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0)]))vec![param(0)], tcx.types.bool),
706 sym::simd_reduce_add_ordered | sym::simd_reduce_mul_ordered => {
707 (2, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(1)]))vec![param(0), param(1)], param(1))
708 }
709 sym::simd_reduce_add_unordered
710 | sym::simd_reduce_mul_unordered
711 | sym::simd_reduce_and
712 | sym::simd_reduce_or
713 | sym::simd_reduce_xor
714 | sym::simd_reduce_min
715 | sym::simd_reduce_max => (2, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0)]))vec![param(0)], param(1)),
716 sym::simd_shuffle => (3, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(0), param(1)]))vec![param(0), param(0), param(1)], param(2)),
717 sym::simd_shuffle_const_generic => (2, 1, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(0)]))vec![param(0), param(0)], param(1)),
718
719 sym::sve_cast => (2, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0)]))vec![param(0)], param(1)),
720 sym::sve_tuple_create2 => (2, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(0)]))vec![param(0), param(0)], param(1)),
721 sym::sve_tuple_create3 => (2, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(0), param(0)]))vec![param(0), param(0), param(0)], param(1)),
722 sym::sve_tuple_create4 => (2, 0, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(0), param(0), param(0)]))vec![param(0), param(0), param(0), param(0)], param(1)),
723 sym::sve_tuple_get => (2, 1, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0)]))vec![param(0)], param(1)),
724 sym::sve_tuple_set => (2, 1, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[param(0), param(1)]))vec![param(0), param(1)], param(0)),
725
726 sym::atomic_cxchg | sym::atomic_cxchgweak => (
727 1,
728 2,
729 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Ty::new_mut_ptr(tcx, param(0)), param(0), param(0)]))vec![Ty::new_mut_ptr(tcx, param(0)), param(0), param(0)],
730 Ty::new_tup(tcx, &[param(0), tcx.types.bool]),
731 ),
732 sym::atomic_load => (1, 2, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Ty::new_imm_ptr(tcx, param(0))]))vec![Ty::new_imm_ptr(tcx, param(0))], param(0)),
733 sym::atomic_store => (1, 2, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Ty::new_mut_ptr(tcx, param(0)), param(0)]))vec![Ty::new_mut_ptr(tcx, param(0)), param(0)], tcx.types.unit),
734
735 sym::atomic_xchg
736 | sym::atomic_max
737 | sym::atomic_min
738 | sym::atomic_umax
739 | sym::atomic_umin => (1, 1, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Ty::new_mut_ptr(tcx, param(0)), param(0)]))vec![Ty::new_mut_ptr(tcx, param(0)), param(0)], param(0)),
740 sym::atomic_xadd
741 | sym::atomic_xsub
742 | sym::atomic_and
743 | sym::atomic_nand
744 | sym::atomic_or
745 | sym::atomic_xor => (2, 1, ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Ty::new_mut_ptr(tcx, param(0)), param(1)]))vec![Ty::new_mut_ptr(tcx, param(0)), param(1)], param(0)),
746 sym::atomic_fence | sym::atomic_singlethreadfence => (0, 1, Vec::new(), tcx.types.unit),
747
748 sym::return_address => (0, 0, ::alloc::vec::Vec::new()vec![], Ty::new_imm_ptr(tcx, tcx.types.unit)),
749
750 other => {
751 tcx.dcx().emit_err(UnrecognizedIntrinsicFunction { span, name: other });
752 return;
753 }
754 };
755 let sig = tcx.mk_fn_sig_rust_abi(inputs, output, safety);
756 let sig = ty::Binder::bind_with_vars(sig, bound_vars);
757 equate_intrinsic_type(tcx, span, intrinsic_id, n_tps, n_lts, n_cts, sig)
758}