]> git.proxmox.com Git - rustc.git/blame - compiler/rustc_middle/src/values.rs
New upstream version 1.65.0+dfsg1
[rustc.git] / compiler / rustc_middle / src / values.rs
CommitLineData
f2b60f7d
FG
1use rustc_middle::ty::{self, AdtSizedConstraint, Ty, TyCtxt};
2use rustc_query_system::Value;
3
4impl<'tcx> Value<TyCtxt<'tcx>> for Ty<'_> {
5 fn from_cycle_error(tcx: TyCtxt<'tcx>) -> Self {
6 // SAFETY: This is never called when `Self` is not `Ty<'tcx>`.
7 // FIXME: Represent the above fact in the trait system somehow.
8 unsafe { std::mem::transmute::<Ty<'tcx>, Ty<'_>>(tcx.ty_error()) }
9 }
10}
11
12impl<'tcx> Value<TyCtxt<'tcx>> for ty::SymbolName<'_> {
13 fn from_cycle_error(tcx: TyCtxt<'tcx>) -> Self {
14 // SAFETY: This is never called when `Self` is not `SymbolName<'tcx>`.
15 // FIXME: Represent the above fact in the trait system somehow.
16 unsafe {
17 std::mem::transmute::<ty::SymbolName<'tcx>, ty::SymbolName<'_>>(ty::SymbolName::new(
18 tcx, "<error>",
19 ))
20 }
21 }
22}
23
24impl<'tcx> Value<TyCtxt<'tcx>> for AdtSizedConstraint<'_> {
25 fn from_cycle_error(tcx: TyCtxt<'tcx>) -> Self {
26 // SAFETY: This is never called when `Self` is not `AdtSizedConstraint<'tcx>`.
27 // FIXME: Represent the above fact in the trait system somehow.
28 unsafe {
29 std::mem::transmute::<AdtSizedConstraint<'tcx>, AdtSizedConstraint<'_>>(
30 AdtSizedConstraint(tcx.intern_type_list(&[tcx.ty_error()])),
31 )
32 }
33 }
34}
35
36impl<'tcx> Value<TyCtxt<'tcx>> for ty::Binder<'_, ty::FnSig<'_>> {
37 fn from_cycle_error(tcx: TyCtxt<'tcx>) -> Self {
38 let err = tcx.ty_error();
39 // FIXME(compiler-errors): It would be nice if we could get the
40 // query key, so we could at least generate a fn signature that
41 // has the right arity.
42 let fn_sig = ty::Binder::dummy(tcx.mk_fn_sig(
43 [].into_iter(),
44 err,
45 false,
46 rustc_hir::Unsafety::Normal,
47 rustc_target::spec::abi::Abi::Rust,
48 ));
49
50 // SAFETY: This is never called when `Self` is not `ty::Binder<'tcx, ty::FnSig<'tcx>>`.
51 // FIXME: Represent the above fact in the trait system somehow.
52 unsafe { std::mem::transmute::<ty::PolyFnSig<'tcx>, ty::Binder<'_, ty::FnSig<'_>>>(fn_sig) }
53 }
54}