2017-09-18 09:40:13 +00:00
|
|
|
//! Defines the set of legal keys that can be used in queries.
|
|
|
|
|
2019-10-31 13:32:07 +00:00
|
|
|
use rustc_hir::def_id::{CrateNum, DefId, LocalDefId, LOCAL_CRATE};
|
2021-01-19 19:40:16 +00:00
|
|
|
use rustc_middle::infer::canonical::Canonical;
|
|
|
|
use rustc_middle::mir;
|
Support HIR wf checking for function signatures
During function type-checking, we normalize any associated types in
the function signature (argument types + return type), and then
create WF obligations for each of the normalized types. The HIR wf code
does not currently support this case, so any errors that we get have
imprecise spans.
This commit extends `ObligationCauseCode::WellFormed` to support
recording a function parameter, allowing us to get the corresponding
HIR type if an error occurs. Function typechecking is modified to
pass this information during signature normalization and WF checking.
The resulting code is fairly verbose, due to the fact that we can
no longer normalize the entire signature with a single function call.
As part of the refactoring, we now perform HIR-based WF checking
for several other 'typed items' (statics, consts, and inherent impls).
As a result, WF and projection errors in a function signature now
have a precise span, which points directly at the responsible type.
If a function signature is constructed via a macro, this will allow
the error message to point at the code 'most responsible' for the error
(e.g. a user-supplied macro argument).
2021-07-18 16:33:49 +00:00
|
|
|
use rustc_middle::traits;
|
2021-01-19 19:40:16 +00:00
|
|
|
use rustc_middle::ty::fast_reject::SimplifiedType;
|
|
|
|
use rustc_middle::ty::subst::{GenericArg, SubstsRef};
|
|
|
|
use rustc_middle::ty::{self, Ty, TyCtxt};
|
2020-12-03 23:10:55 +00:00
|
|
|
use rustc_span::symbol::{Ident, Symbol};
|
2019-12-31 17:15:40 +00:00
|
|
|
use rustc_span::{Span, DUMMY_SP};
|
2017-09-18 09:40:13 +00:00
|
|
|
|
|
|
|
/// The `Key` trait controls what types can legally be used as the key
|
|
|
|
/// for a query.
|
2020-02-08 06:38:00 +00:00
|
|
|
pub trait Key {
|
2017-09-18 09:40:13 +00:00
|
|
|
/// Given an instance of this key, what crate is it referring to?
|
|
|
|
/// This is used to find the provider.
|
2021-05-15 08:55:53 +00:00
|
|
|
fn query_crate_is_local(&self) -> bool;
|
2017-09-18 09:40:13 +00:00
|
|
|
|
|
|
|
/// In the event that a cycle occurs, if no explicit span has been
|
|
|
|
/// given for a query with key `self`, what span should we use?
|
2019-06-13 21:48:52 +00:00
|
|
|
fn default_span(&self, tcx: TyCtxt<'_>) -> Span;
|
2017-09-18 09:40:13 +00:00
|
|
|
}
|
|
|
|
|
2021-05-11 09:26:52 +00:00
|
|
|
impl Key for () {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
true
|
2021-05-11 09:26:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
fn default_span(&self, _: TyCtxt<'_>) -> Span {
|
|
|
|
DUMMY_SP
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-09-18 09:40:13 +00:00
|
|
|
impl<'tcx> Key for ty::InstanceDef<'tcx> {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
true
|
2017-09-18 09:40:13 +00:00
|
|
|
}
|
|
|
|
|
2019-06-13 21:48:52 +00:00
|
|
|
fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
|
2017-09-18 09:40:13 +00:00
|
|
|
tcx.def_span(self.def_id())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'tcx> Key for ty::Instance<'tcx> {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
true
|
2017-09-18 09:40:13 +00:00
|
|
|
}
|
|
|
|
|
2019-06-13 21:48:52 +00:00
|
|
|
fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
|
2017-09-18 09:40:13 +00:00
|
|
|
tcx.def_span(self.def_id())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-02 23:22:09 +00:00
|
|
|
impl<'tcx> Key for mir::interpret::GlobalId<'tcx> {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
true
|
2018-01-02 23:22:09 +00:00
|
|
|
}
|
|
|
|
|
2019-06-13 21:48:52 +00:00
|
|
|
fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
|
2018-01-02 23:22:09 +00:00
|
|
|
self.instance.default_span(tcx)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-01-11 02:22:36 +00:00
|
|
|
impl<'tcx> Key for mir::interpret::LitToConstInput<'tcx> {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
true
|
2020-01-11 02:22:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
fn default_span(&self, _tcx: TyCtxt<'_>) -> Span {
|
|
|
|
DUMMY_SP
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-09-18 09:40:13 +00:00
|
|
|
impl Key for CrateNum {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
*self == LOCAL_CRATE
|
2017-09-18 09:40:13 +00:00
|
|
|
}
|
2019-06-13 21:48:52 +00:00
|
|
|
fn default_span(&self, _: TyCtxt<'_>) -> Span {
|
2017-09-18 09:40:13 +00:00
|
|
|
DUMMY_SP
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-10-31 13:32:07 +00:00
|
|
|
impl Key for LocalDefId {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
true
|
2017-09-18 09:40:13 +00:00
|
|
|
}
|
2019-10-31 13:32:07 +00:00
|
|
|
fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
|
|
|
|
self.to_def_id().default_span(tcx)
|
2017-09-18 09:40:13 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Key for DefId {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
self.krate == LOCAL_CRATE
|
2017-09-18 09:40:13 +00:00
|
|
|
}
|
2019-06-13 21:48:52 +00:00
|
|
|
fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
|
2017-09-18 09:40:13 +00:00
|
|
|
tcx.def_span(*self)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-15 08:50:54 +00:00
|
|
|
impl Key for ty::WithOptConstParam<LocalDefId> {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
true
|
2020-07-03 14:39:02 +00:00
|
|
|
}
|
|
|
|
fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
|
|
|
|
self.did.default_span(tcx)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-09-18 09:40:13 +00:00
|
|
|
impl Key for (DefId, DefId) {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
self.0.krate == LOCAL_CRATE
|
2017-09-18 09:40:13 +00:00
|
|
|
}
|
2019-06-13 21:48:52 +00:00
|
|
|
fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
|
2020-04-17 20:58:04 +00:00
|
|
|
self.1.default_span(tcx)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-12-29 16:21:52 +00:00
|
|
|
impl Key for (ty::Instance<'tcx>, LocalDefId) {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
true
|
2020-12-29 16:21:52 +00:00
|
|
|
}
|
|
|
|
fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
|
|
|
|
self.0.default_span(tcx)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-17 20:58:04 +00:00
|
|
|
impl Key for (DefId, LocalDefId) {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
self.0.krate == LOCAL_CRATE
|
2020-04-17 20:58:04 +00:00
|
|
|
}
|
|
|
|
fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
|
2017-09-18 09:40:13 +00:00
|
|
|
self.1.default_span(tcx)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-07 23:03:19 +00:00
|
|
|
impl Key for (LocalDefId, DefId) {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
true
|
2020-07-07 23:03:19 +00:00
|
|
|
}
|
|
|
|
fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
|
|
|
|
self.0.default_span(tcx)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-12-03 23:10:55 +00:00
|
|
|
impl Key for (DefId, Option<Ident>) {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
self.0.krate == LOCAL_CRATE
|
2020-12-03 23:10:55 +00:00
|
|
|
}
|
|
|
|
fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
|
|
|
|
tcx.def_span(self.0)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Key for (DefId, LocalDefId, Ident) {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
self.0.krate == LOCAL_CRATE
|
2020-12-03 23:10:55 +00:00
|
|
|
}
|
|
|
|
fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
|
|
|
|
self.1.default_span(tcx)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-09-18 09:40:13 +00:00
|
|
|
impl Key for (CrateNum, DefId) {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
self.0 == LOCAL_CRATE
|
2017-09-18 09:40:13 +00:00
|
|
|
}
|
2019-06-13 21:48:52 +00:00
|
|
|
fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
|
2017-09-18 09:40:13 +00:00
|
|
|
self.1.default_span(tcx)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Key for (DefId, SimplifiedType) {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
self.0.krate == LOCAL_CRATE
|
2017-09-18 09:40:13 +00:00
|
|
|
}
|
2019-06-13 21:48:52 +00:00
|
|
|
fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
|
2017-09-18 09:40:13 +00:00
|
|
|
self.0.default_span(tcx)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-01-22 11:17:21 +00:00
|
|
|
impl<'tcx> Key for SubstsRef<'tcx> {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
true
|
2020-01-22 11:17:21 +00:00
|
|
|
}
|
|
|
|
fn default_span(&self, _: TyCtxt<'_>) -> Span {
|
|
|
|
DUMMY_SP
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-02-09 14:11:53 +00:00
|
|
|
impl<'tcx> Key for (DefId, SubstsRef<'tcx>) {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
self.0.krate == LOCAL_CRATE
|
2017-09-18 09:40:13 +00:00
|
|
|
}
|
2019-06-13 21:48:52 +00:00
|
|
|
fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
|
2017-09-18 09:40:13 +00:00
|
|
|
self.0.default_span(tcx)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-09-10 16:48:18 +00:00
|
|
|
impl<'tcx> Key
|
|
|
|
for (
|
|
|
|
(ty::WithOptConstParam<DefId>, SubstsRef<'tcx>),
|
|
|
|
(ty::WithOptConstParam<DefId>, SubstsRef<'tcx>),
|
|
|
|
)
|
|
|
|
{
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
(self.0).0.did.krate == LOCAL_CRATE
|
2020-09-10 16:48:18 +00:00
|
|
|
}
|
|
|
|
fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
|
|
|
|
(self.0).0.did.default_span(tcx)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-07 23:03:19 +00:00
|
|
|
impl<'tcx> Key for (LocalDefId, DefId, SubstsRef<'tcx>) {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
true
|
2020-07-02 21:56:17 +00:00
|
|
|
}
|
|
|
|
fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
|
2020-07-07 23:03:19 +00:00
|
|
|
self.0.default_span(tcx)
|
2020-07-02 21:56:17 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-09-29 03:13:43 +00:00
|
|
|
impl<'tcx> Key for (ty::ParamEnv<'tcx>, ty::PolyTraitRef<'tcx>) {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
self.1.def_id().krate == LOCAL_CRATE
|
2017-09-29 03:13:43 +00:00
|
|
|
}
|
2019-06-13 21:48:52 +00:00
|
|
|
fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
|
2017-09-29 03:13:43 +00:00
|
|
|
tcx.def_span(self.1.def_id())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-05-24 19:58:37 +00:00
|
|
|
impl<'tcx> Key for (&'tcx ty::Const<'tcx>, mir::Field) {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
true
|
2019-05-24 19:58:37 +00:00
|
|
|
}
|
2019-06-13 21:48:52 +00:00
|
|
|
fn default_span(&self, _: TyCtxt<'_>) -> Span {
|
2019-05-24 19:58:37 +00:00
|
|
|
DUMMY_SP
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-22 14:09:24 +00:00
|
|
|
impl<'tcx> Key for mir::interpret::ConstAlloc<'tcx> {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
true
|
2021-02-22 14:09:24 +00:00
|
|
|
}
|
|
|
|
fn default_span(&self, _: TyCtxt<'_>) -> Span {
|
|
|
|
DUMMY_SP
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-06-11 21:11:55 +00:00
|
|
|
impl<'tcx> Key for ty::PolyTraitRef<'tcx> {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
self.def_id().krate == LOCAL_CRATE
|
2017-10-07 21:55:09 +00:00
|
|
|
}
|
2019-06-13 21:48:52 +00:00
|
|
|
fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
|
2017-10-07 21:55:09 +00:00
|
|
|
tcx.def_span(self.def_id())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-07-31 14:46:23 +00:00
|
|
|
impl<'tcx> Key for (ty::PolyTraitRef<'tcx>, ty::PolyTraitRef<'tcx>) {
|
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
self.0.def_id().krate == LOCAL_CRATE
|
|
|
|
}
|
|
|
|
fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
|
|
|
|
tcx.def_span(self.0.def_id())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-23 18:22:19 +00:00
|
|
|
impl<'tcx> Key for GenericArg<'tcx> {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
true
|
2020-03-23 18:22:19 +00:00
|
|
|
}
|
|
|
|
fn default_span(&self, _: TyCtxt<'_>) -> Span {
|
|
|
|
DUMMY_SP
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-03-30 14:26:40 +00:00
|
|
|
impl<'tcx> Key for mir::ConstantKind<'tcx> {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
true
|
2021-03-30 14:26:40 +00:00
|
|
|
}
|
|
|
|
fn default_span(&self, _: TyCtxt<'_>) -> Span {
|
|
|
|
DUMMY_SP
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-01-05 15:46:44 +00:00
|
|
|
impl<'tcx> Key for &'tcx ty::Const<'tcx> {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
true
|
2018-05-03 16:29:14 +00:00
|
|
|
}
|
2019-06-13 21:48:52 +00:00
|
|
|
fn default_span(&self, _: TyCtxt<'_>) -> Span {
|
2018-05-03 16:29:14 +00:00
|
|
|
DUMMY_SP
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-09-18 09:40:13 +00:00
|
|
|
impl<'tcx> Key for Ty<'tcx> {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
true
|
2017-09-18 09:40:13 +00:00
|
|
|
}
|
2019-06-13 21:48:52 +00:00
|
|
|
fn default_span(&self, _: TyCtxt<'_>) -> Span {
|
2017-09-18 09:40:13 +00:00
|
|
|
DUMMY_SP
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-11 04:50:02 +00:00
|
|
|
impl<'tcx> Key for &'tcx ty::List<ty::Predicate<'tcx>> {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
true
|
2020-04-11 04:50:02 +00:00
|
|
|
}
|
|
|
|
fn default_span(&self, _: TyCtxt<'_>) -> Span {
|
|
|
|
DUMMY_SP
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-04-10 09:55:18 +00:00
|
|
|
impl<'tcx> Key for ty::ParamEnv<'tcx> {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
true
|
2018-04-10 09:55:18 +00:00
|
|
|
}
|
2019-06-13 21:48:52 +00:00
|
|
|
fn default_span(&self, _: TyCtxt<'_>) -> Span {
|
2018-04-10 09:55:18 +00:00
|
|
|
DUMMY_SP
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-09-18 09:40:13 +00:00
|
|
|
impl<'tcx, T: Key> Key for ty::ParamEnvAnd<'tcx, T> {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
self.value.query_crate_is_local()
|
2017-09-18 09:40:13 +00:00
|
|
|
}
|
2019-06-13 21:48:52 +00:00
|
|
|
fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
|
2017-09-18 09:40:13 +00:00
|
|
|
self.value.default_span(tcx)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-10-21 06:14:03 +00:00
|
|
|
impl Key for Symbol {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
true
|
2017-09-18 09:40:13 +00:00
|
|
|
}
|
2019-06-13 21:48:52 +00:00
|
|
|
fn default_span(&self, _tcx: TyCtxt<'_>) -> Span {
|
2017-09-18 09:40:13 +00:00
|
|
|
DUMMY_SP
|
|
|
|
}
|
|
|
|
}
|
2018-02-25 15:58:54 +00:00
|
|
|
|
2018-06-11 14:33:37 +00:00
|
|
|
/// Canonical query goals correspond to abstract trait operations that
|
|
|
|
/// are not tied to any crate in particular.
|
2019-10-19 23:35:51 +00:00
|
|
|
impl<'tcx, T> Key for Canonical<'tcx, T> {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
true
|
2018-03-09 00:30:37 +00:00
|
|
|
}
|
|
|
|
|
2019-06-13 21:48:52 +00:00
|
|
|
fn default_span(&self, _tcx: TyCtxt<'_>) -> Span {
|
2018-03-09 00:30:37 +00:00
|
|
|
DUMMY_SP
|
|
|
|
}
|
|
|
|
}
|
2019-10-25 00:35:02 +00:00
|
|
|
|
|
|
|
impl Key for (Symbol, u32, u32) {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
true
|
2019-10-25 00:35:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
fn default_span(&self, _tcx: TyCtxt<'_>) -> Span {
|
|
|
|
DUMMY_SP
|
|
|
|
}
|
|
|
|
}
|
2020-05-14 15:07:46 +00:00
|
|
|
|
|
|
|
impl<'tcx> Key for (DefId, Ty<'tcx>, SubstsRef<'tcx>, ty::ParamEnv<'tcx>) {
|
2021-05-15 08:55:53 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
true
|
2020-05-14 15:07:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
fn default_span(&self, _tcx: TyCtxt<'_>) -> Span {
|
|
|
|
DUMMY_SP
|
|
|
|
}
|
|
|
|
}
|
Add initial implementation of HIR-based WF checking for diagnostics
During well-formed checking, we walk through all types 'nested' in
generic arguments. For example, WF-checking `Option<MyStruct<u8>>`
will cause us to check `MyStruct<u8>` and `u8`. However, this is done
on a `rustc_middle::ty::Ty`, which has no span information. As a result,
any errors that occur will have a very general span (e.g. the
definintion of an associated item).
This becomes a problem when macros are involved. In general, an
associated type like `type MyType = Option<MyStruct<u8>>;` may
have completely different spans for each nested type in the HIR. Using
the span of the entire associated item might end up pointing to a macro
invocation, even though a user-provided span is available in one of the
nested types.
This PR adds a framework for HIR-based well formed checking. This check
is only run during error reporting, and is used to obtain a more precise
span for an existing error. This is accomplished by individually
checking each 'nested' type in the HIR for the type, allowing us to
find the most-specific type (and span) that produces a given error.
The majority of the changes are to the error-reporting code. However,
some of the general trait code is modified to pass through more
information.
Since this has no soundness implications, I've implemented a minimal
version to begin with, which can be extended over time. In particular,
this only works for HIR items with a corresponding `DefId` (e.g. it will
not work for WF-checking performed within function bodies).
2021-04-04 20:55:39 +00:00
|
|
|
|
Support HIR wf checking for function signatures
During function type-checking, we normalize any associated types in
the function signature (argument types + return type), and then
create WF obligations for each of the normalized types. The HIR wf code
does not currently support this case, so any errors that we get have
imprecise spans.
This commit extends `ObligationCauseCode::WellFormed` to support
recording a function parameter, allowing us to get the corresponding
HIR type if an error occurs. Function typechecking is modified to
pass this information during signature normalization and WF checking.
The resulting code is fairly verbose, due to the fact that we can
no longer normalize the entire signature with a single function call.
As part of the refactoring, we now perform HIR-based WF checking
for several other 'typed items' (statics, consts, and inherent impls).
As a result, WF and projection errors in a function signature now
have a precise span, which points directly at the responsible type.
If a function signature is constructed via a macro, this will allow
the error message to point at the code 'most responsible' for the error
(e.g. a user-supplied macro argument).
2021-07-18 16:33:49 +00:00
|
|
|
impl<'tcx> Key for (ty::Predicate<'tcx>, traits::WellFormedLoc) {
|
Add initial implementation of HIR-based WF checking for diagnostics
During well-formed checking, we walk through all types 'nested' in
generic arguments. For example, WF-checking `Option<MyStruct<u8>>`
will cause us to check `MyStruct<u8>` and `u8`. However, this is done
on a `rustc_middle::ty::Ty`, which has no span information. As a result,
any errors that occur will have a very general span (e.g. the
definintion of an associated item).
This becomes a problem when macros are involved. In general, an
associated type like `type MyType = Option<MyStruct<u8>>;` may
have completely different spans for each nested type in the HIR. Using
the span of the entire associated item might end up pointing to a macro
invocation, even though a user-provided span is available in one of the
nested types.
This PR adds a framework for HIR-based well formed checking. This check
is only run during error reporting, and is used to obtain a more precise
span for an existing error. This is accomplished by individually
checking each 'nested' type in the HIR for the type, allowing us to
find the most-specific type (and span) that produces a given error.
The majority of the changes are to the error-reporting code. However,
some of the general trait code is modified to pass through more
information.
Since this has no soundness implications, I've implemented a minimal
version to begin with, which can be extended over time. In particular,
this only works for HIR items with a corresponding `DefId` (e.g. it will
not work for WF-checking performed within function bodies).
2021-04-04 20:55:39 +00:00
|
|
|
#[inline(always)]
|
|
|
|
fn query_crate_is_local(&self) -> bool {
|
|
|
|
true
|
|
|
|
}
|
|
|
|
|
|
|
|
fn default_span(&self, _tcx: TyCtxt<'_>) -> Span {
|
|
|
|
DUMMY_SP
|
|
|
|
}
|
|
|
|
}
|