Add ty_span query

This commit is contained in:
Oli Scherer
2025-07-04 07:47:53 +00:00
parent 0d11be5aab
commit 62929b9420
10 changed files with 67 additions and 26 deletions

View File

@@ -768,16 +768,15 @@ pub(crate) fn check_item_type(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Result<(),
check_static_inhabited(tcx, def_id);
check_static_linkage(tcx, def_id);
res = res.and(wfcheck::check_static_item(tcx, def_id));
}
DefKind::Const => res = res.and(wfcheck::check_const_item(tcx, def_id)),
_ => unreachable!(),
}
// Only `Node::Item` and `Node::ForeignItem` still have HIR based
// checks. Returning early here does not miss any checks and
// avoids this query from having a direct dependency edge on the HIR
return res;
}
DefKind::Const => {}
_ => unreachable!(),
}
}
DefKind::Enum => {
tcx.ensure_ok().generics_of(def_id);
tcx.ensure_ok().type_of(def_id);

View File

@@ -290,7 +290,6 @@ pub(super) fn check_item<'tcx>(
res
}
hir::ItemKind::Fn { sig, .. } => check_item_fn(tcx, def_id, sig.decl),
hir::ItemKind::Const(_, _, ty, _) => check_const_item(tcx, def_id, ty.span),
hir::ItemKind::Struct(..) => check_type_defn(tcx, item, false),
hir::ItemKind::Union(..) => check_type_defn(tcx, item, true),
hir::ItemKind::Enum(..) => check_type_defn(tcx, item, true),
@@ -1185,7 +1184,8 @@ pub(super) fn check_static_item(
) -> Result<(), ErrorGuaranteed> {
enter_wf_checking_ctxt(tcx, item_id, |wfcx| {
let ty = tcx.type_of(item_id).instantiate_identity();
let item_ty = wfcx.deeply_normalize(DUMMY_SP, Some(WellFormedLoc::Ty(item_id)), ty);
let span = tcx.ty_span(item_id);
let item_ty = wfcx.deeply_normalize(span, Some(WellFormedLoc::Ty(item_id)), ty);
let is_foreign_item = tcx.is_foreign_item(item_id);
@@ -1194,7 +1194,7 @@ pub(super) fn check_static_item(
!matches!(tail.kind(), ty::Foreign(_))
};
wfcx.register_wf_obligation(DUMMY_SP, Some(WellFormedLoc::Ty(item_id)), item_ty.into());
wfcx.register_wf_obligation(span, Some(WellFormedLoc::Ty(item_id)), item_ty.into());
if forbid_unsized {
let span = tcx.def_span(item_id);
wfcx.register_bound(
@@ -1216,7 +1216,6 @@ pub(super) fn check_static_item(
&& !tcx.is_thread_local_static(item_id.to_def_id());
if should_check_for_sync {
let span = tcx.def_span(item_id);
wfcx.register_bound(
traits::ObligationCause::new(
span,
@@ -1232,13 +1231,10 @@ pub(super) fn check_static_item(
})
}
fn check_const_item(
tcx: TyCtxt<'_>,
def_id: LocalDefId,
ty_span: Span,
) -> Result<(), ErrorGuaranteed> {
pub(crate) fn check_const_item(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Result<(), ErrorGuaranteed> {
enter_wf_checking_ctxt(tcx, def_id, |wfcx| {
let ty = tcx.type_of(def_id).instantiate_identity();
let ty_span = tcx.ty_span(def_id);
let ty = wfcx.deeply_normalize(ty_span, Some(WellFormedLoc::Ty(def_id)), ty);
wfcx.register_wf_obligation(ty_span, Some(WellFormedLoc::Ty(def_id)), ty.into());
@@ -1505,7 +1501,7 @@ pub(super) fn check_where_clauses<'tcx>(wfcx: &WfCheckingCtxt<'_, 'tcx>, def_id:
let cause = traits::ObligationCause::new(
sp,
wfcx.body_def_id,
ObligationCauseCode::WhereClause(def_id.to_def_id(), DUMMY_SP),
ObligationCauseCode::WhereClause(def_id.to_def_id(), sp),
);
Obligation::new(tcx, cause, wfcx.param_env, pred)
});

View File

@@ -239,8 +239,16 @@ pub fn provide(providers: &mut Providers) {
let hir_id = tcx.local_def_id_to_hir_id(def_id);
tcx.hir_opt_ident_span(hir_id)
};
providers.ty_span = |tcx, def_id| {
let node = tcx.hir_node_by_def_id(def_id);
match node.ty() {
Some(ty) => ty.span,
None => bug!("{def_id:?} doesn't have a type: {node:#?}"),
}
};
providers.fn_arg_idents = |tcx, def_id| {
if let Some(body_id) = tcx.hir_node_by_def_id(def_id).body_id() {
let node = tcx.hir_node_by_def_id(def_id);
if let Some(body_id) = node.body_id() {
tcx.arena.alloc_from_iter(tcx.hir_body_param_idents(body_id))
} else if let Node::TraitItem(&TraitItem {
kind: TraitItemKind::Fn(_, TraitFn::Required(idents)),
@@ -249,7 +257,7 @@ pub fn provide(providers: &mut Providers) {
| Node::ForeignItem(&ForeignItem {
kind: ForeignItemKind::Fn(_, idents, _),
..
}) = tcx.hir_node(tcx.local_def_id_to_hir_id(def_id))
}) = node
{
idents
} else {

View File

@@ -1452,6 +1452,13 @@ rustc_queries! {
feedable
}
/// Gets the span for the type of the definition.
/// Panics if it is not a definition that has a single type.
query ty_span(def_id: LocalDefId) -> Span {
desc { |tcx| "looking up span for `{}`'s type", tcx.def_path_str(def_id) }
cache_on_disk_if { true }
}
query lookup_stability(def_id: DefId) -> Option<attr::Stability> {
desc { |tcx| "looking up stability of `{}`", tcx.def_path_str(def_id) }
cache_on_disk_if { def_id.is_local() }

View File

@@ -12,6 +12,14 @@ LL | (): Trait<N>;
|
= help: the trait `Trait<2>` is not implemented for `()`
but trait `Trait<3>` is implemented for it
note: required by a bound in `WhereClause`
--> $DIR/wfness.rs:8:9
|
LL | struct WhereClause<const N: u8 = 2>
| ----------- required by a bound in this struct
LL | where
LL | (): Trait<N>;
| ^^^^^^^^ required by this bound in `WhereClause`
error[E0277]: the trait bound `(): Trait<1>` is not satisfied
--> $DIR/wfness.rs:18:13

View File

@@ -1,8 +1,8 @@
error[E0277]: `RefCell<isize>` cannot be shared between threads safely
--> $DIR/issue-7364.rs:4:1
--> $DIR/issue-7364.rs:4:15
|
LL | static boxed: Box<RefCell<isize>> = Box::new(RefCell::new(0));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `RefCell<isize>` cannot be shared between threads safely
| ^^^^^^^^^^^^^^^^^^^ `RefCell<isize>` cannot be shared between threads safely
|
= help: the trait `Sync` is not implemented for `RefCell<isize>`
= note: if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` instead

View File

@@ -1,8 +1,8 @@
error[E0277]: `(dyn Fn() -> u32 + 'static)` cannot be shared between threads safely
--> $DIR/issue-24446.rs:2:5
--> $DIR/issue-24446.rs:2:17
|
LL | static foo: dyn Fn() -> u32 = || -> u32 {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ `(dyn Fn() -> u32 + 'static)` cannot be shared between threads safely
| ^^^^^^^^^^^^^^^ `(dyn Fn() -> u32 + 'static)` cannot be shared between threads safely
|
= help: the trait `Sync` is not implemented for `(dyn Fn() -> u32 + 'static)`
= note: shared static variables must have a type that implements `Sync`

View File

@@ -1,8 +1,8 @@
error[E0277]: `Foo` cannot be shared between threads safely
--> $DIR/issue-17718-static-sync.rs:9:1
--> $DIR/issue-17718-static-sync.rs:9:13
|
LL | static BAR: Foo = Foo;
| ^^^^^^^^^^^^^^^ `Foo` cannot be shared between threads safely
| ^^^ `Foo` cannot be shared between threads safely
|
= help: the trait `Sync` is not implemented for `Foo`
= note: shared static variables must have a type that implements `Sync`

View File

@@ -22,10 +22,10 @@ LL | fn bar() -> i32 where Self: Sized;
| +++++++++++++++++
error[E0277]: `(dyn Qux + 'static)` cannot be shared between threads safely
--> $DIR/unsizing-wfcheck-issue-127299.rs:12:1
--> $DIR/unsizing-wfcheck-issue-127299.rs:12:13
|
LL | static FOO: &Lint = &Lint { desc: "desc" };
| ^^^^^^^^^^^^^^^^^ `(dyn Qux + 'static)` cannot be shared between threads safely
| ^^^^^ `(dyn Qux + 'static)` cannot be shared between threads safely
|
= help: within `&'static Lint`, the trait `Sync` is not implemented for `(dyn Qux + 'static)`
= note: required because it appears within the type `&'static (dyn Qux + 'static)`

View File

@@ -29,18 +29,36 @@ error[E0277]: the trait bound `String: Copy` is not satisfied
|
LL | struct Bounds<T:Copy=String>(T);
| ^^^^ the trait `Copy` is not implemented for `String`
|
note: required by a bound in `Bounds`
--> $DIR/type-check-defaults.rs:11:17
|
LL | struct Bounds<T:Copy=String>(T);
| ^^^^ required by this bound in `Bounds`
error[E0277]: the trait bound `String: Copy` is not satisfied
--> $DIR/type-check-defaults.rs:14:42
|
LL | struct WhereClause<T=String>(T) where T: Copy;
| ^^^^ the trait `Copy` is not implemented for `String`
|
note: required by a bound in `WhereClause`
--> $DIR/type-check-defaults.rs:14:42
|
LL | struct WhereClause<T=String>(T) where T: Copy;
| ^^^^ required by this bound in `WhereClause`
error[E0277]: the trait bound `String: Copy` is not satisfied
--> $DIR/type-check-defaults.rs:17:20
|
LL | trait TraitBound<T:Copy=String> {}
| ^^^^ the trait `Copy` is not implemented for `String`
|
note: required by a bound in `TraitBound`
--> $DIR/type-check-defaults.rs:17:20
|
LL | trait TraitBound<T:Copy=String> {}
| ^^^^ required by this bound in `TraitBound`
error[E0277]: the trait bound `T: Copy` is not satisfied
--> $DIR/type-check-defaults.rs:21:25
@@ -70,6 +88,11 @@ LL | trait ProjectionPred<T:Iterator = IntoIter<i32>> where T::Item : Add<u8> {}
`&i32` implements `Add`
`i32` implements `Add<&i32>`
`i32` implements `Add`
note: required by a bound in `ProjectionPred`
--> $DIR/type-check-defaults.rs:24:66
|
LL | trait ProjectionPred<T:Iterator = IntoIter<i32>> where T::Item : Add<u8> {}
| ^^^^^^^ required by this bound in `ProjectionPred`
error: aborting due to 7 previous errors