Skip to content

Commit 3274781

Browse files
authored
Unrolled build for rust-lang#113671
Rollup merge of rust-lang#113671 - oli-obk:normalize_weak_tys, r=petrochenkov Make privacy visitor use types more (instead of HIR) r? ``@petrochenkov`` This is a prerequisite to normalizing projections, as otherwise we have too many invalid bound vars (hir_ty_to_ty is creating types that have bound vars, but no binder). The commits are still chaotic, I'm gonna clean them up, but I just wanted to let you know about the general direction and wondering if we could land this before adding normalization, as normalization is where behavioral changes happen, and I'd like to keep that part as minimal as possible. [context can be found on zulip](https://rust-lang.zulipchat.com/#narrow/stream/315482-t-compiler.2Fetc.2Fopaque-types/topic/weak.20type.20aliases.20and.20privacy)
2 parents 8fb67fb + d80d7ea commit 3274781

36 files changed

+400
-582
lines changed

Cargo.lock

+1
Original file line numberDiff line numberDiff line change
@@ -4374,6 +4374,7 @@ dependencies = [
43744374
"rustc_middle",
43754375
"rustc_session",
43764376
"rustc_span",
4377+
"rustc_ty_utils",
43774378
"tracing",
43784379
]
43794380

compiler/rustc_privacy/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,6 @@ rustc_macros = { path = "../rustc_macros" }
1616
rustc_middle = { path = "../rustc_middle" }
1717
rustc_session = { path = "../rustc_session" }
1818
rustc_span = { path = "../rustc_span" }
19+
rustc_ty_utils = { path = "../rustc_ty_utils" }
1920
tracing = "0.1"
2021
# tidy-alphabetical-end

compiler/rustc_privacy/src/lib.rs

+50-61
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use rustc_hir as hir;
2121
use rustc_hir::def::{DefKind, Res};
2222
use rustc_hir::def_id::{DefId, LocalDefId, LocalModDefId, CRATE_DEF_ID};
2323
use rustc_hir::intravisit::{self, Visitor};
24-
use rustc_hir::{AssocItemKind, ForeignItemKind, ItemId, PatKind};
24+
use rustc_hir::{AssocItemKind, ForeignItemKind, ItemId, ItemKind, PatKind};
2525
use rustc_middle::middle::privacy::{EffectiveVisibilities, EffectiveVisibility, Level};
2626
use rustc_middle::query::Providers;
2727
use rustc_middle::ty::GenericArgs;
@@ -98,9 +98,6 @@ trait DefIdVisitor<'tcx> {
9898
fn visit_trait(&mut self, trait_ref: TraitRef<'tcx>) -> ControlFlow<Self::BreakTy> {
9999
self.skeleton().visit_trait(trait_ref)
100100
}
101-
fn visit_projection_ty(&mut self, projection: ty::AliasTy<'tcx>) -> ControlFlow<Self::BreakTy> {
102-
self.skeleton().visit_projection_ty(projection)
103-
}
104101
fn visit_predicates(
105102
&mut self,
106103
predicates: ty::GenericPredicates<'tcx>,
@@ -173,6 +170,10 @@ where
173170
{
174171
type BreakTy = V::BreakTy;
175172

173+
fn visit_predicate(&mut self, p: ty::Predicate<'tcx>) -> ControlFlow<Self::BreakTy> {
174+
self.visit_clause(p.as_clause().unwrap())
175+
}
176+
176177
fn visit_ty(&mut self, ty: Ty<'tcx>) -> ControlFlow<V::BreakTy> {
177178
let tcx = self.def_id_visitor.tcx();
178179
// GenericArgs are not visited here because they are visited below
@@ -1076,6 +1077,14 @@ impl<'tcx> TypePrivacyVisitor<'tcx> {
10761077
}
10771078
}
10781079

1080+
impl<'tcx> rustc_ty_utils::sig_types::SpannedTypeVisitor<'tcx> for TypePrivacyVisitor<'tcx> {
1081+
type BreakTy = ();
1082+
fn visit(&mut self, span: Span, value: impl TypeVisitable<TyCtxt<'tcx>>) -> ControlFlow<()> {
1083+
self.span = span;
1084+
value.visit_with(&mut self.skeleton())
1085+
}
1086+
}
1087+
10791088
impl<'tcx> Visitor<'tcx> for TypePrivacyVisitor<'tcx> {
10801089
fn visit_nested_body(&mut self, body_id: hir::BodyId) {
10811090
let old_maybe_typeck_results =
@@ -1086,75 +1095,36 @@ impl<'tcx> Visitor<'tcx> for TypePrivacyVisitor<'tcx> {
10861095

10871096
fn visit_ty(&mut self, hir_ty: &'tcx hir::Ty<'tcx>) {
10881097
self.span = hir_ty.span;
1089-
if let Some(typeck_results) = self.maybe_typeck_results {
1090-
// Types in bodies.
1091-
if self.visit(typeck_results.node_type(hir_ty.hir_id)).is_break() {
1092-
return;
1093-
}
1094-
} else {
1095-
// Types in signatures.
1096-
// FIXME: This is very ineffective. Ideally each HIR type should be converted
1097-
// into a semantic type only once and the result should be cached somehow.
1098-
if self.visit(rustc_hir_analysis::hir_ty_to_ty(self.tcx, hir_ty)).is_break() {
1099-
return;
1100-
}
1098+
if self
1099+
.visit(
1100+
self.maybe_typeck_results
1101+
.unwrap_or_else(|| span_bug!(hir_ty.span, "`hir::Ty` outside of a body"))
1102+
.node_type(hir_ty.hir_id),
1103+
)
1104+
.is_break()
1105+
{
1106+
return;
11011107
}
11021108

11031109
intravisit::walk_ty(self, hir_ty);
11041110
}
11051111

11061112
fn visit_infer(&mut self, inf: &'tcx hir::InferArg) {
11071113
self.span = inf.span;
1108-
if let Some(typeck_results) = self.maybe_typeck_results {
1109-
if let Some(ty) = typeck_results.node_type_opt(inf.hir_id) {
1110-
if self.visit(ty).is_break() {
1111-
return;
1112-
}
1113-
} else {
1114-
// FIXME: check types of const infers here.
1114+
if let Some(ty) = self
1115+
.maybe_typeck_results
1116+
.unwrap_or_else(|| span_bug!(inf.span, "`hir::InferArg` outside of a body"))
1117+
.node_type_opt(inf.hir_id)
1118+
{
1119+
if self.visit(ty).is_break() {
1120+
return;
11151121
}
11161122
} else {
1117-
span_bug!(self.span, "`hir::InferArg` outside of a body");
1123+
// FIXME: check types of const infers here.
11181124
}
11191125
intravisit::walk_inf(self, inf);
11201126
}
11211127

1122-
fn visit_trait_ref(&mut self, trait_ref: &'tcx hir::TraitRef<'tcx>) {
1123-
self.span = trait_ref.path.span;
1124-
if self.maybe_typeck_results.is_some() {
1125-
// Privacy of traits in bodies is checked as a part of trait object types.
1126-
} else {
1127-
let bounds = rustc_hir_analysis::hir_trait_to_predicates(
1128-
self.tcx,
1129-
trait_ref,
1130-
// NOTE: This isn't really right, but the actual type doesn't matter here. It's
1131-
// just required by `ty::TraitRef`.
1132-
self.tcx.types.never,
1133-
);
1134-
1135-
for (clause, _) in bounds.clauses() {
1136-
match clause.kind().skip_binder() {
1137-
ty::ClauseKind::Trait(trait_predicate) => {
1138-
if self.visit_trait(trait_predicate.trait_ref).is_break() {
1139-
return;
1140-
}
1141-
}
1142-
ty::ClauseKind::Projection(proj_predicate) => {
1143-
let term = self.visit(proj_predicate.term);
1144-
if term.is_break()
1145-
|| self.visit_projection_ty(proj_predicate.projection_ty).is_break()
1146-
{
1147-
return;
1148-
}
1149-
}
1150-
_ => {}
1151-
}
1152-
}
1153-
}
1154-
1155-
intravisit::walk_trait_ref(self, trait_ref);
1156-
}
1157-
11581128
// Check types of expressions
11591129
fn visit_expr(&mut self, expr: &'tcx hir::Expr<'tcx>) {
11601130
if self.check_expr_pat_type(expr.hir_id, expr.span) {
@@ -1727,7 +1697,26 @@ fn check_mod_privacy(tcx: TyCtxt<'_>, module_def_id: LocalModDefId) {
17271697
// inferred types of expressions and patterns.
17281698
let span = tcx.def_span(module_def_id);
17291699
let mut visitor = TypePrivacyVisitor { tcx, module_def_id, maybe_typeck_results: None, span };
1730-
tcx.hir().visit_item_likes_in_module(module_def_id, &mut visitor);
1700+
1701+
let module = tcx.hir_module_items(module_def_id);
1702+
for def_id in module.definitions() {
1703+
rustc_ty_utils::sig_types::walk_types(tcx, def_id, &mut visitor);
1704+
1705+
if let Some(body_id) = tcx.hir().maybe_body_owned_by(def_id) {
1706+
visitor.visit_nested_body(body_id);
1707+
}
1708+
}
1709+
1710+
for id in module.items() {
1711+
if let ItemKind::Impl(i) = tcx.hir().item(id).kind {
1712+
if let Some(item) = i.of_trait {
1713+
let trait_ref = tcx.impl_trait_ref(id.owner_id.def_id).unwrap();
1714+
let trait_ref = trait_ref.instantiate_identity();
1715+
visitor.span = item.path.span;
1716+
visitor.visit_def_id(trait_ref.def_id, "trait", &trait_ref.print_only_trait_path());
1717+
}
1718+
}
1719+
}
17311720
}
17321721

17331722
fn effective_visibilities(tcx: TyCtxt<'_>, (): ()) -> &EffectiveVisibilities {

compiler/rustc_ty_utils/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ mod layout_sanity_check;
3737
mod needs_drop;
3838
mod opaque_types;
3939
mod representability;
40-
mod sig_types;
40+
pub mod sig_types;
4141
mod structural_match;
4242
mod ty;
4343

compiler/rustc_ty_utils/src/sig_types.rs

+18-10
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44
use std::ops::ControlFlow;
55

66
use rustc_hir::{def::DefKind, def_id::LocalDefId};
7-
use rustc_middle::ty::TyCtxt;
7+
use rustc_middle::ty::{self, TyCtxt};
88
use rustc_span::Span;
99
use rustc_type_ir::visit::TypeVisitable;
1010

11-
pub(crate) trait SpannedTypeVisitor<'tcx> {
11+
pub trait SpannedTypeVisitor<'tcx> {
1212
type BreakTy = !;
1313
fn visit(
1414
&mut self,
@@ -17,7 +17,7 @@ pub(crate) trait SpannedTypeVisitor<'tcx> {
1717
) -> ControlFlow<Self::BreakTy>;
1818
}
1919

20-
pub(crate) fn walk_types<'tcx, V: SpannedTypeVisitor<'tcx>>(
20+
pub fn walk_types<'tcx, V: SpannedTypeVisitor<'tcx>>(
2121
tcx: TyCtxt<'tcx>,
2222
item: LocalDefId,
2323
visitor: &mut V,
@@ -42,11 +42,10 @@ pub(crate) fn walk_types<'tcx, V: SpannedTypeVisitor<'tcx>>(
4242
DefKind::TyAlias {..} | DefKind::AssocTy |
4343
// Walk over the type of the item
4444
DefKind::Static(_) | DefKind::Const | DefKind::AssocConst | DefKind::AnonConst => {
45-
let span = match tcx.hir_node_by_def_id(item).ty() {
46-
Some(ty) => ty.span,
47-
_ => tcx.def_span(item),
48-
};
49-
visitor.visit(span, tcx.type_of(item).instantiate_identity());
45+
if let Some(ty) = tcx.hir_node_by_def_id(item).ty() {
46+
// Associated types in traits don't necessarily have a type that we can visit
47+
visitor.visit(ty.span, tcx.type_of(item).instantiate_identity())?;
48+
}
5049
for (pred, span) in tcx.predicates_of(item).instantiate_identity(tcx) {
5150
visitor.visit(span, pred)?;
5251
}
@@ -59,7 +58,16 @@ pub(crate) fn walk_types<'tcx, V: SpannedTypeVisitor<'tcx>>(
5958
// Look at field types
6059
DefKind::Struct | DefKind::Union | DefKind::Enum => {
6160
let span = tcx.def_ident_span(item).unwrap();
62-
visitor.visit(span, tcx.type_of(item).instantiate_identity());
61+
let ty = tcx.type_of(item).instantiate_identity();
62+
visitor.visit(span, ty);
63+
let ty::Adt(def, args) = ty.kind() else {
64+
span_bug!(span, "invalid type for {kind:?}: {:#?}", ty.kind())
65+
};
66+
for field in def.all_fields() {
67+
let span = tcx.def_ident_span(field.did).unwrap();
68+
let ty = field.ty(tcx, args);
69+
visitor.visit(span, ty);
70+
}
6371
for (pred, span) in tcx.predicates_of(item).instantiate_identity(tcx) {
6472
visitor.visit(span, pred)?;
6573
}
@@ -89,7 +97,6 @@ pub(crate) fn walk_types<'tcx, V: SpannedTypeVisitor<'tcx>>(
8997
}
9098
}
9199
| DefKind::Variant
92-
| DefKind::ForeignTy
93100
| DefKind::TyParam
94101
| DefKind::ConstParam
95102
| DefKind::Ctor(_, _)
@@ -103,6 +110,7 @@ pub(crate) fn walk_types<'tcx, V: SpannedTypeVisitor<'tcx>>(
103110
// These don't have any types.
104111
| DefKind::ExternCrate
105112
| DefKind::ForeignMod
113+
| DefKind::ForeignTy
106114
| DefKind::Macro(_)
107115
| DefKind::GlobalAsm
108116
| DefKind::Mod

tests/ui/dyn-keyword/dyn-2018-edition-lint.rs

-8
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,6 @@ fn function(x: &SomeTrait, y: Box<SomeTrait>) {
66
//~| WARN this is accepted in the current edition
77
//~| ERROR trait objects without an explicit `dyn` are deprecated
88
//~| WARN this is accepted in the current edition
9-
//~| ERROR trait objects without an explicit `dyn` are deprecated
10-
//~| WARN this is accepted in the current edition
11-
//~| ERROR trait objects without an explicit `dyn` are deprecated
12-
//~| WARN this is accepted in the current edition
13-
//~| ERROR trait objects without an explicit `dyn` are deprecated
14-
//~| WARN this is accepted in the current edition
15-
//~| ERROR trait objects without an explicit `dyn` are deprecated
16-
//~| WARN this is accepted in the current edition
179
let _x: &SomeTrait = todo!();
1810
//~^ ERROR trait objects without an explicit `dyn` are deprecated
1911
//~| WARN this is accepted in the current edition

tests/ui/dyn-keyword/dyn-2018-edition-lint.stderr

+2-58
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ LL | fn function(x: &SomeTrait, y: Box<dyn SomeTrait>) {
3030
| +++
3131

3232
error: trait objects without an explicit `dyn` are deprecated
33-
--> $DIR/dyn-2018-edition-lint.rs:17:14
33+
--> $DIR/dyn-2018-edition-lint.rs:9:14
3434
|
3535
LL | let _x: &SomeTrait = todo!();
3636
| ^^^^^^^^^
@@ -42,61 +42,5 @@ help: use `dyn`
4242
LL | let _x: &dyn SomeTrait = todo!();
4343
| +++
4444

45-
error: trait objects without an explicit `dyn` are deprecated
46-
--> $DIR/dyn-2018-edition-lint.rs:4:17
47-
|
48-
LL | fn function(x: &SomeTrait, y: Box<SomeTrait>) {
49-
| ^^^^^^^^^
50-
|
51-
= warning: this is accepted in the current edition (Rust 2018) but is a hard error in Rust 2021!
52-
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
53-
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
54-
help: use `dyn`
55-
|
56-
LL | fn function(x: &dyn SomeTrait, y: Box<SomeTrait>) {
57-
| +++
58-
59-
error: trait objects without an explicit `dyn` are deprecated
60-
--> $DIR/dyn-2018-edition-lint.rs:4:17
61-
|
62-
LL | fn function(x: &SomeTrait, y: Box<SomeTrait>) {
63-
| ^^^^^^^^^
64-
|
65-
= warning: this is accepted in the current edition (Rust 2018) but is a hard error in Rust 2021!
66-
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
67-
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
68-
help: use `dyn`
69-
|
70-
LL | fn function(x: &dyn SomeTrait, y: Box<SomeTrait>) {
71-
| +++
72-
73-
error: trait objects without an explicit `dyn` are deprecated
74-
--> $DIR/dyn-2018-edition-lint.rs:4:35
75-
|
76-
LL | fn function(x: &SomeTrait, y: Box<SomeTrait>) {
77-
| ^^^^^^^^^
78-
|
79-
= warning: this is accepted in the current edition (Rust 2018) but is a hard error in Rust 2021!
80-
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
81-
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
82-
help: use `dyn`
83-
|
84-
LL | fn function(x: &SomeTrait, y: Box<dyn SomeTrait>) {
85-
| +++
86-
87-
error: trait objects without an explicit `dyn` are deprecated
88-
--> $DIR/dyn-2018-edition-lint.rs:4:35
89-
|
90-
LL | fn function(x: &SomeTrait, y: Box<SomeTrait>) {
91-
| ^^^^^^^^^
92-
|
93-
= warning: this is accepted in the current edition (Rust 2018) but is a hard error in Rust 2021!
94-
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
95-
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
96-
help: use `dyn`
97-
|
98-
LL | fn function(x: &SomeTrait, y: Box<dyn SomeTrait>) {
99-
| +++
100-
101-
error: aborting due to 7 previous errors
45+
error: aborting due to 3 previous errors
10246

tests/ui/impl-trait/fresh-lifetime-from-bare-trait-obj-114664.rs

-4
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,6 @@
44

55
fn ice() -> impl AsRef<Fn(&())> {
66
//~^ WARN trait objects without an explicit `dyn` are deprecated
7-
//~| WARN trait objects without an explicit `dyn` are deprecated
8-
//~| WARN trait objects without an explicit `dyn` are deprecated
9-
//~| WARN this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
10-
//~| WARN this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
117
//~| WARN this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
128
Foo
139
}

tests/ui/impl-trait/fresh-lifetime-from-bare-trait-obj-114664.stderr

+1-29
Original file line numberDiff line numberDiff line change
@@ -12,33 +12,5 @@ help: use `dyn`
1212
LL | fn ice() -> impl AsRef<dyn Fn(&())> {
1313
| +++
1414

15-
warning: trait objects without an explicit `dyn` are deprecated
16-
--> $DIR/fresh-lifetime-from-bare-trait-obj-114664.rs:5:24
17-
|
18-
LL | fn ice() -> impl AsRef<Fn(&())> {
19-
| ^^^^^^^
20-
|
21-
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
22-
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
23-
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
24-
help: use `dyn`
25-
|
26-
LL | fn ice() -> impl AsRef<dyn Fn(&())> {
27-
| +++
28-
29-
warning: trait objects without an explicit `dyn` are deprecated
30-
--> $DIR/fresh-lifetime-from-bare-trait-obj-114664.rs:5:24
31-
|
32-
LL | fn ice() -> impl AsRef<Fn(&())> {
33-
| ^^^^^^^
34-
|
35-
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
36-
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
37-
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
38-
help: use `dyn`
39-
|
40-
LL | fn ice() -> impl AsRef<dyn Fn(&())> {
41-
| +++
42-
43-
warning: 3 warnings emitted
15+
warning: 1 warning emitted
4416

0 commit comments

Comments
 (0)