Rollup merge of #121416 - veera-sivarajan:bugfix-120785, r=nnethercote
Improve error messages for generics with default parameters Fixes #120785 Issue: Previously, all type parameters with default types were deliberately ignored to simplify error messages. For example, an error message for Box type would display `Box<T>` instead of `Box<T, _>`. But, this resulted in unclear error message when a concrete type was used instead of the default type. Fix: This PR fixes it by checking if a concrete type is specified after a default type to display the entire type name or the simplified type name.
This commit is contained in:
commit
f23c6ddada
4 changed files with 79 additions and 4 deletions
|
@ -360,6 +360,30 @@ impl<'tcx> Generics {
|
|||
let own = &args[self.parent_count..][..self.params.len()];
|
||||
if self.has_self && self.parent.is_none() { &own[1..] } else { own }
|
||||
}
|
||||
|
||||
/// Returns true if a concrete type is specified after a default type.
|
||||
/// For example, consider `struct T<W = usize, X = Vec<W>>(W, X)`
|
||||
/// `T<usize, String>` will return true
|
||||
/// `T<usize>` will return false
|
||||
pub fn check_concrete_type_after_default(
|
||||
&'tcx self,
|
||||
tcx: TyCtxt<'tcx>,
|
||||
args: &'tcx [ty::GenericArg<'tcx>],
|
||||
) -> bool {
|
||||
let mut default_param_seen = false;
|
||||
for param in self.params.iter() {
|
||||
if let Some(inst) =
|
||||
param.default_value(tcx).map(|default| default.instantiate(tcx, args))
|
||||
{
|
||||
if inst == args[param.index as usize] {
|
||||
default_param_seen = true;
|
||||
} else if default_param_seen {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
/// Bounds on generics.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue