Skip to content

Commit 030f10f

Browse files
committed
Clean up generic param handling
1 parent 25bf73d commit 030f10f

File tree

6 files changed

+35
-22
lines changed

6 files changed

+35
-22
lines changed

src/librustc/traits/error_reporting.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -382,13 +382,12 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
382382
for param in generics.params.iter() {
383383
let value = match param.kind {
384384
GenericParamDefKind::Type(_) => {
385-
let ty = trait_ref.substs.type_for_def(&param);
386-
ty.to_string()
385+
trait_ref.substs[param.index as usize].to_string()
387386
},
388387
GenericParamDefKind::Lifetime => continue,
389388
};
390389
let name = param.name.to_string();
391-
flags.push((name.clone(), Some(value.clone())));
390+
flags.push((name, Some(value)));
392391
}
393392

394393
if let Some(true) = self_ty.ty_to_def_id().map(|def_id| def_id.is_local()) {

src/librustc/traits/on_unimplemented.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ impl<'a, 'gcx, 'tcx> OnUnimplementedFormatString {
290290
let generic_map = generics.params.iter().filter_map(|param| {
291291
let value = match param.kind {
292292
GenericParamDefKind::Type(_) => {
293-
trait_ref.substs.type_for_def(&param).to_string()
293+
trait_ref.substs[param.index as usize].to_string()
294294
},
295295
GenericParamDefKind::Lifetime => return None
296296
};

src/librustc/ty/mod.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -837,7 +837,7 @@ impl<'a, 'gcx, 'tcx> Generics {
837837
let param = &self.params[index as usize];
838838
match param.kind {
839839
ty::GenericParamDefKind::Lifetime => param,
840-
_ => bug!("expected region parameter, but found another generic parameter")
840+
_ => bug!("expected lifetime parameter, but found another generic parameter")
841841
}
842842
} else {
843843
tcx.generics_of(self.parent.expect("parent_count>0 but no parent?"))
@@ -851,7 +851,11 @@ impl<'a, 'gcx, 'tcx> Generics {
851851
tcx: TyCtxt<'a, 'gcx, 'tcx>)
852852
-> &'tcx GenericParamDef {
853853
if let Some(index) = param.idx.checked_sub(self.parent_count as u32) {
854-
&self.params[index as usize]
854+
let param = &self.params[index as usize];
855+
match param.kind {
856+
ty::GenericParamDefKind::Type(_) => param,
857+
_ => bug!("expected type parameter, but found another generic parameter")
858+
}
855859
} else {
856860
tcx.generics_of(self.parent.expect("parent_count>0 but no parent?"))
857861
.type_param(param, tcx)

src/librustc_typeck/astconv.rs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,11 @@ struct ConvertedBinding<'tcx> {
8787
span: Span,
8888
}
8989

90+
struct ParamRange {
91+
required: usize,
92+
accepted: usize
93+
}
94+
9095
/// Dummy type used for the `Self` of a `TraitRef` created for converting
9196
/// a trait object, and which gets removed in `ExistentialTraitRef`.
9297
/// This type must not appear anywhere in other converted types.
@@ -212,23 +217,23 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
212217
let lt_provided = parameters.lifetimes.len();
213218

214219
let mut lt_accepted = 0;
215-
let mut ty_range = (0, 0);
220+
let mut ty_params = ParamRange { required: 0, accepted: 0 };
216221
for param in &decl_generics.params {
217222
match param.kind {
218223
GenericParamDefKind::Lifetime => {
219224
lt_accepted += 1;
220225
}
221226
GenericParamDefKind::Type(ty) => {
222-
ty_range.1 += 1;
227+
ty_params.accepted += 1;
223228
if !ty.has_default {
224-
ty_range.0 += 1;
229+
ty_params.required += 1;
225230
}
226231
}
227232
};
228233
}
229234
if self_ty.is_some() {
230-
ty_range.0 -= 1;
231-
ty_range.1 -= 1;
235+
ty_params.required -= 1;
236+
ty_params.accepted -= 1;
232237
}
233238

234239
if lt_accepted != lt_provided {
@@ -239,8 +244,8 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
239244
assert_eq!(decl_generics.has_self, self_ty.is_some());
240245

241246
// Check the number of type parameters supplied by the user.
242-
if !infer_types || ty_provided > ty_range.0 {
243-
check_type_argument_count(tcx, span, ty_provided, ty_range);
247+
if !infer_types || ty_provided > ty_params.required {
248+
check_type_argument_count(tcx, span, ty_provided, ty_params);
244249
}
245250

246251
let is_object = self_ty.map_or(false, |ty| ty.sty == TRAIT_OBJECT_DUMMY_SELF);
@@ -1327,9 +1332,9 @@ fn split_auto_traits<'a, 'b, 'gcx, 'tcx>(tcx: TyCtxt<'a, 'gcx, 'tcx>,
13271332
fn check_type_argument_count(tcx: TyCtxt,
13281333
span: Span,
13291334
supplied: usize,
1330-
ty_range: (usize, usize))
1335+
ty_params: ParamRange)
13311336
{
1332-
let (required, accepted) = ty_range;
1337+
let (required, accepted) = (ty_params.required, ty_params.accepted);
13331338
if supplied < required {
13341339
let expected = if required < accepted {
13351340
"expected at least"

src/librustc_typeck/check/mod.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4925,27 +4925,32 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
49254925
// Check provided parameters.
49264926
let ((ty_required, ty_accepted), lt_accepted) =
49274927
segment.map_or(((0, 0), 0), |(_, generics)| {
4928+
struct ParamRange {
4929+
required: usize,
4930+
accepted: usize
4931+
};
4932+
49284933
let mut lt_accepted = 0;
4929-
let mut ty_range = (0, 0);
4934+
let mut ty_params = ParamRange { required: 0, accepted: 0 };
49304935
for param in &generics.params {
49314936
match param.kind {
49324937
GenericParamDefKind::Lifetime => {
49334938
lt_accepted += 1;
49344939
}
49354940
GenericParamDefKind::Type(ty) => {
4936-
ty_range.1 += 1;
4941+
ty_params.accepted += 1;
49374942
if !ty.has_default {
4938-
ty_range.0 += 1;
4943+
ty_params.required += 1;
49394944
}
49404945
}
49414946
};
49424947
}
49434948
if generics.parent.is_none() && generics.has_self {
4944-
ty_range.0 -= 1;
4945-
ty_range.1 -= 1;
4949+
ty_params.required -= 1;
4950+
ty_params.accepted -= 1;
49464951
}
49474952

4948-
((ty_range.0, ty_range.1), lt_accepted)
4953+
((ty_params.required, ty_params.accepted), lt_accepted)
49494954
});
49504955

49514956
if types.len() > ty_accepted {

src/librustc_typeck/impl_wf_check.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ struct ImplWfCheck<'a, 'tcx: 'a> {
7272
impl<'a, 'tcx> ItemLikeVisitor<'tcx> for ImplWfCheck<'a, 'tcx> {
7373
fn visit_item(&mut self, item: &'tcx hir::Item) {
7474
match item.node {
75-
hir::ItemImpl(.., _, _, _, ref impl_item_refs) => {
75+
hir::ItemImpl(.., ref impl_item_refs) => {
7676
let impl_def_id = self.tcx.hir.local_def_id(item.id);
7777
enforce_impl_params_are_constrained(self.tcx,
7878
impl_def_id,

0 commit comments

Comments
 (0)