Skip to content

Commit 86d8b79

Browse files
Use a post-monomorphization typing env when mangling components that come from impls
1 parent ab07e78 commit 86d8b79

File tree

3 files changed

+61
-38
lines changed

3 files changed

+61
-38
lines changed

compiler/rustc_middle/src/ty/print/mod.rs

+19-21
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,25 @@ pub trait Printer<'tcx>: Sized {
4545
&mut self,
4646
impl_def_id: DefId,
4747
args: &'tcx [GenericArg<'tcx>],
48-
self_ty: Ty<'tcx>,
49-
trait_ref: Option<ty::TraitRef<'tcx>>,
5048
) -> Result<(), PrintError> {
51-
self.default_print_impl_path(impl_def_id, args, self_ty, trait_ref)
49+
let tcx = self.tcx();
50+
let self_ty = tcx.type_of(impl_def_id);
51+
let impl_trait_ref = tcx.impl_trait_ref(impl_def_id);
52+
let (self_ty, impl_trait_ref) = if tcx.generics_of(impl_def_id).count() <= args.len() {
53+
(
54+
self_ty.instantiate(tcx, args),
55+
impl_trait_ref.map(|impl_trait_ref| impl_trait_ref.instantiate(tcx, args)),
56+
)
57+
} else {
58+
// We are probably printing a nested item inside of an impl.
59+
// Use the identity substitutions for the impl.
60+
(
61+
self_ty.instantiate_identity(),
62+
impl_trait_ref.map(|impl_trait_ref| impl_trait_ref.instantiate_identity()),
63+
)
64+
};
65+
66+
self.default_print_impl_path(impl_def_id, self_ty, impl_trait_ref)
5267
}
5368

5469
fn print_region(&mut self, region: ty::Region<'tcx>) -> Result<(), PrintError>;
@@ -107,23 +122,7 @@ pub trait Printer<'tcx>: Sized {
107122
self.path_crate(def_id.krate)
108123
}
109124

110-
DefPathData::Impl => {
111-
let generics = self.tcx().generics_of(def_id);
112-
let self_ty = self.tcx().type_of(def_id);
113-
let impl_trait_ref = self.tcx().impl_trait_ref(def_id);
114-
let (self_ty, impl_trait_ref) = if args.len() >= generics.count() {
115-
(
116-
self_ty.instantiate(self.tcx(), args),
117-
impl_trait_ref.map(|i| i.instantiate(self.tcx(), args)),
118-
)
119-
} else {
120-
(
121-
self_ty.instantiate_identity(),
122-
impl_trait_ref.map(|i| i.instantiate_identity()),
123-
)
124-
};
125-
self.print_impl_path(def_id, args, self_ty, impl_trait_ref)
126-
}
125+
DefPathData::Impl => self.print_impl_path(def_id, args),
127126

128127
_ => {
129128
let parent_def_id = DefId { index: key.parent.unwrap(), ..def_id };
@@ -201,7 +200,6 @@ pub trait Printer<'tcx>: Sized {
201200
fn default_print_impl_path(
202201
&mut self,
203202
impl_def_id: DefId,
204-
_args: &'tcx [GenericArg<'tcx>],
205203
self_ty: Ty<'tcx>,
206204
impl_trait_ref: Option<ty::TraitRef<'tcx>>,
207205
) -> Result<(), PrintError> {

compiler/rustc_symbol_mangling/src/legacy.rs

+21-8
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use rustc_middle::bug;
88
use rustc_middle::ty::print::{PrettyPrinter, Print, PrintError, Printer};
99
use rustc_middle::ty::{
1010
self, GenericArg, GenericArgKind, Instance, ReifyReason, Ty, TyCtxt, TypeVisitableExt,
11+
TypingEnv,
1112
};
1213
use tracing::debug;
1314

@@ -383,14 +384,26 @@ impl<'tcx> Printer<'tcx> for SymbolPrinter<'tcx> {
383384
&mut self,
384385
impl_def_id: DefId,
385386
args: &'tcx [GenericArg<'tcx>],
386-
mut self_ty: Ty<'tcx>,
387-
mut impl_trait_ref: Option<ty::TraitRef<'tcx>>,
388387
) -> Result<(), PrintError> {
389-
let mut typing_env = ty::TypingEnv::post_analysis(self.tcx, impl_def_id);
390-
if !args.is_empty() {
391-
typing_env.param_env =
392-
ty::EarlyBinder::bind(typing_env.param_env).instantiate(self.tcx, args);
393-
}
388+
let self_ty = self.tcx.type_of(impl_def_id);
389+
let impl_trait_ref = self.tcx.impl_trait_ref(impl_def_id);
390+
let (typing_env, mut self_ty, mut impl_trait_ref) =
391+
if self.tcx.generics_of(impl_def_id).count() <= args.len() {
392+
(
393+
TypingEnv::fully_monomorphized(),
394+
self_ty.instantiate(self.tcx, args),
395+
impl_trait_ref.map(|impl_trait_ref| impl_trait_ref.instantiate(self.tcx, args)),
396+
)
397+
} else {
398+
// We are probably printing a nested item inside of an impl.
399+
// Use the identity substitutions for the impl. We also need
400+
// a well-formed param-env, so let's use post-analysis.
401+
(
402+
TypingEnv::post_analysis(self.tcx, impl_def_id),
403+
self_ty.instantiate_identity(),
404+
impl_trait_ref.map(|impl_trait_ref| impl_trait_ref.instantiate_identity()),
405+
)
406+
};
394407

395408
match &mut impl_trait_ref {
396409
Some(impl_trait_ref) => {
@@ -403,7 +416,7 @@ impl<'tcx> Printer<'tcx> for SymbolPrinter<'tcx> {
403416
}
404417
}
405418

406-
self.default_print_impl_path(impl_def_id, args, self_ty, impl_trait_ref)
419+
self.default_print_impl_path(impl_def_id, self_ty, impl_trait_ref)
407420
}
408421
}
409422

compiler/rustc_symbol_mangling/src/v0.rs

+21-9
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ use rustc_middle::bug;
1414
use rustc_middle::ty::layout::IntegerExt;
1515
use rustc_middle::ty::print::{Print, PrintError, Printer};
1616
use rustc_middle::ty::{
17-
self, EarlyBinder, FloatTy, GenericArg, GenericArgKind, Instance, IntTy, ReifyReason, Ty,
18-
TyCtxt, TypeVisitable, TypeVisitableExt, UintTy,
17+
self, FloatTy, GenericArg, GenericArgKind, Instance, IntTy, ReifyReason, Ty, TyCtxt,
18+
TypeVisitable, TypeVisitableExt, UintTy,
1919
};
2020
use rustc_span::kw;
2121

@@ -227,17 +227,29 @@ impl<'tcx> Printer<'tcx> for SymbolMangler<'tcx> {
227227
&mut self,
228228
impl_def_id: DefId,
229229
args: &'tcx [GenericArg<'tcx>],
230-
mut self_ty: Ty<'tcx>,
231-
mut impl_trait_ref: Option<ty::TraitRef<'tcx>>,
232230
) -> Result<(), PrintError> {
233231
let key = self.tcx.def_key(impl_def_id);
234232
let parent_def_id = DefId { index: key.parent.unwrap(), ..impl_def_id };
235233

236-
let mut typing_env = ty::TypingEnv::post_analysis(self.tcx, impl_def_id);
237-
if !args.is_empty() {
238-
typing_env.param_env =
239-
EarlyBinder::bind(typing_env.param_env).instantiate(self.tcx, args);
240-
}
234+
let self_ty = self.tcx.type_of(impl_def_id);
235+
let impl_trait_ref = self.tcx.impl_trait_ref(impl_def_id);
236+
let (typing_env, mut self_ty, mut impl_trait_ref) =
237+
if self.tcx.generics_of(impl_def_id).count() <= args.len() {
238+
(
239+
ty::TypingEnv::fully_monomorphized(),
240+
self_ty.instantiate(self.tcx, args),
241+
impl_trait_ref.map(|impl_trait_ref| impl_trait_ref.instantiate(self.tcx, args)),
242+
)
243+
} else {
244+
// We are probably printing a nested item inside of an impl.
245+
// Use the identity substitutions for the impl. We also need
246+
// a well-formed param-env, so let's use post-analysis.
247+
(
248+
ty::TypingEnv::post_analysis(self.tcx, impl_def_id),
249+
self_ty.instantiate_identity(),
250+
impl_trait_ref.map(|impl_trait_ref| impl_trait_ref.instantiate_identity()),
251+
)
252+
};
241253

242254
match &mut impl_trait_ref {
243255
Some(impl_trait_ref) => {

0 commit comments

Comments
 (0)