diff options
| author | Michael Goulet <michael@errs.io> | 2022-12-01 23:01:59 -0500 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2022-12-01 23:56:57 -0500 |
| commit | 5809a0591d34b75b8fd3ffcf6bfdd19fec2a80d7 (patch) | |
| tree | 1651d77284b14a2dddfd2cfc499a5c615327786b /compiler | |
| parent | 5ac7e08aaf10d2882c6addcf220872c9390ed91e (diff) | |
| download | rust-5809a0591d34b75b8fd3ffcf6bfdd19fec2a80d7.tar.gz rust-5809a0591d34b75b8fd3ffcf6bfdd19fec2a80d7.zip | |
Properly synthesize fn sig value during cycle
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/rustc_middle/src/values.rs | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/compiler/rustc_middle/src/values.rs b/compiler/rustc_middle/src/values.rs index f4562cdfb88..70b98e59a8b 100644 --- a/compiler/rustc_middle/src/values.rs +++ b/compiler/rustc_middle/src/values.rs @@ -32,13 +32,23 @@ impl<'tcx> Value<TyCtxt<'tcx>> for ty::SymbolName<'_> { } impl<'tcx> Value<TyCtxt<'tcx>> for ty::Binder<'_, ty::FnSig<'_>> { - fn from_cycle_error(tcx: TyCtxt<'tcx>, _: &[QueryInfo]) -> Self { + fn from_cycle_error(tcx: TyCtxt<'tcx>, stack: &[QueryInfo]) -> Self { let err = tcx.ty_error(); - // FIXME(compiler-errors): It would be nice if we could get the - // query key, so we could at least generate a fn signature that - // has the right arity. + + let arity = if let Some(frame) = stack.get(0) + && frame.query.name == "fn_sig" + && let Some(def_id) = frame.query.def_id + && let Some(node) = tcx.hir().get_if_local(def_id) + && let Some(sig) = node.fn_sig() + { + sig.decl.inputs.len() + sig.decl.implicit_self.has_implicit_self() as usize + } else { + tcx.sess.abort_if_errors(); + unreachable!() + }; + let fn_sig = ty::Binder::dummy(tcx.mk_fn_sig( - [].into_iter(), + std::iter::repeat(err).take(arity), err, false, rustc_hir::Unsafety::Normal, |
