use rustc_data_structures::fx::FxHashMap;
use syntax::ast;
use traits::{self, PredicateObligation};
-use ty::{self, Ty, TyCtxt};
+use ty::{self, Ty, TyCtxt, GenericParamDef};
use ty::fold::{BottomUpFolder, TypeFoldable, TypeFolder};
use ty::outlives::Component;
use ty::subst::{Kind, Substs, UnpackedKind};
// `['a]` for the first impl trait and `'b` for the
// second.
let mut least_region = None;
- for region_def in abstract_type_generics.lifetimes_depr() {
+ for region_def in abstract_type_generics.params.iter().filter_map(|param| {
+ if let GenericParamDef::Lifetime(lt) = param {
+ Some(lt)
+ } else {
+ None
+ }
+ }) {
// Find the index of this region in the list of substitutions.
let index = region_def.index as usize;
ctp::identify_constrained_type_params(
tcx, &impl_predicates.predicates.as_slice(), impl_trait_ref, &mut input_parameters);
- // Disallow ANY unconstrained type parameters.
- for (ty_param, param) in impl_generics.types_depr().zip(impl_hir_generics.ty_params()) {
- let param_ty = ty::ParamTy::for_def(ty_param);
- if !input_parameters.contains(&ctp::Parameter::from(param_ty)) {
- report_unused_parameter(tcx, param.span, "type", ¶m_ty.to_string());
- }
- }
-
// Disallow unconstrained lifetimes, but only if they appear in assoc types.
let lifetimes_in_associated_types: FxHashSet<_> = impl_item_refs.iter()
.map(|item_ref| tcx.hir.local_def_id(item_ref.id.node_id))
.flat_map(|def_id| {
ctp::parameters_for(&tcx.type_of(def_id), true)
}).collect();
- for (ty_lt, lt) in impl_generics.lifetimes_depr().zip(impl_hir_generics.lifetimes()) {
- let param = ctp::Parameter::from(ty_lt.to_early_bound_region_data());
- if lifetimes_in_associated_types.contains(¶m) && // (*)
- !input_parameters.contains(¶m) {
- report_unused_parameter(tcx, lt.lifetime.span,
- "lifetime", <.lifetime.name.name().to_string());
+ for (ty_param, hir_param) in impl_generics.params.iter()
+ .zip(impl_hir_generics.params.iter()) {
+ match (ty_param, hir_param) {
+ // Disallow ANY unconstrained type parameters.
+ (ty::GenericParamDef::Type(ty_ty), hir::GenericParamDef::Type(hir_ty)) => {
+ let param_ty = ty::ParamTy::for_def(ty_ty);
+ if !input_parameters.contains(&ctp::Parameter::from(param_ty)) {
+ report_unused_parameter(tcx, hir_ty.span, "type", ¶m_ty.to_string());
+ }
+ }
+ (ty::GenericParamDef::Lifetime(ty_lt), hir::GenericParamDef::Lifetime(hir_lt)) => {
+ let param = ctp::Parameter::from(ty_lt.to_early_bound_region_data());
+ if lifetimes_in_associated_types.contains(¶m) && // (*)
+ !input_parameters.contains(¶m) {
+ report_unused_parameter(tcx, hir_lt.lifetime.span,
+ "lifetime", &hir_lt.lifetime.name.name().to_string());
+ }
+ }
+ (ty::GenericParamDef::Type(_), _) => continue,
+ (ty::GenericParamDef::Lifetime(_), _) => continue,
}
}