Rollup merge of #129429 - cjgillot:named-variance, r=compiler-errors
Print the generic parameter along with the variance in dumps. This allows to make sure we are testing what we think we are testing. While the tests are correct, I discovered that opaque duplicated args are in the reverse declaration order.
This commit is contained in:
commit
2269381e0a
32 changed files with 158 additions and 140 deletions
|
@ -1,18 +1,36 @@
|
|||
use std::fmt::Write;
|
||||
|
||||
use rustc_hir::def::DefKind;
|
||||
use rustc_hir::def_id::CRATE_DEF_ID;
|
||||
use rustc_middle::ty::TyCtxt;
|
||||
use rustc_hir::def_id::{LocalDefId, CRATE_DEF_ID};
|
||||
use rustc_middle::ty::{GenericArgs, TyCtxt};
|
||||
use rustc_span::symbol::sym;
|
||||
|
||||
fn format_variances(tcx: TyCtxt<'_>, def_id: LocalDefId) -> String {
|
||||
let variances = tcx.variances_of(def_id);
|
||||
let generics = GenericArgs::identity_for_item(tcx, def_id);
|
||||
// 7 = 2-letter parameter + ": " + 1-letter variance + ", "
|
||||
let mut ret = String::with_capacity(2 + 7 * variances.len());
|
||||
ret.push('[');
|
||||
for (arg, variance) in generics.iter().zip(variances.iter()) {
|
||||
write!(ret, "{arg}: {variance:?}, ").unwrap();
|
||||
}
|
||||
// Remove trailing `, `.
|
||||
if !variances.is_empty() {
|
||||
ret.pop();
|
||||
ret.pop();
|
||||
}
|
||||
ret.push(']');
|
||||
ret
|
||||
}
|
||||
|
||||
pub(crate) fn variances(tcx: TyCtxt<'_>) {
|
||||
if tcx.has_attr(CRATE_DEF_ID, sym::rustc_variance_of_opaques) {
|
||||
for id in tcx.hir().items() {
|
||||
let DefKind::OpaqueTy = tcx.def_kind(id.owner_id) else { continue };
|
||||
|
||||
let variances = tcx.variances_of(id.owner_id);
|
||||
|
||||
tcx.dcx().emit_err(crate::errors::VariancesOf {
|
||||
span: tcx.def_span(id.owner_id),
|
||||
variances: format!("{variances:?}"),
|
||||
variances: format_variances(tcx, id.owner_id.def_id),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -22,11 +40,9 @@ pub(crate) fn variances(tcx: TyCtxt<'_>) {
|
|||
continue;
|
||||
}
|
||||
|
||||
let variances = tcx.variances_of(id.owner_id);
|
||||
|
||||
tcx.dcx().emit_err(crate::errors::VariancesOf {
|
||||
span: tcx.def_span(id.owner_id),
|
||||
variances: format!("{variances:?}"),
|
||||
variances: format_variances(tcx, id.owner_id.def_id),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue