use rustc_target::spec::abi;
use rustc_trait_selection::traits::error_reporting::suggestions::NextTypeParamName;
-use std::ops::ControlFlow;
-
mod item_bounds;
mod type_of;
generics: &[hir::GenericParam<'_>],
placeholder_types: Vec<Span>,
suggest: bool,
+ is_fn: bool,
) {
if placeholder_types.is_empty() {
return;
}
let mut err = bad_placeholder_type(tcx, placeholder_types);
- if suggest {
+
+ // Suggest, but only if it is not a function
+ if suggest && !is_fn {
err.multipart_suggestion(
"use type parameters instead",
sugg,
let mut visitor = PlaceholderHirTyCollector::default();
visitor.visit_item(item);
- placeholder_type_error(tcx, Some(generics.span), &generics.params[..], visitor.0, suggest);
+ placeholder_type_error(
+ tcx,
+ Some(generics.span),
+ &generics.params[..],
+ visitor.0,
+ suggest,
+ false
+ );
}
impl Visitor<'tcx> for CollectItemTypesVisitor<'tcx> {
// Account for `const C: _;`.
let mut visitor = PlaceholderHirTyCollector::default();
visitor.visit_trait_item(trait_item);
- placeholder_type_error(tcx, None, &[], visitor.0, false);
+ placeholder_type_error(tcx, None, &[], visitor.0, false, false);
}
hir::TraitItemKind::Type(_, Some(_)) => {
// Account for `type T = _;`.
let mut visitor = PlaceholderHirTyCollector::default();
visitor.visit_trait_item(trait_item);
- placeholder_type_error(tcx, None, &[], visitor.0, false);
+ placeholder_type_error(tcx, None, &[], visitor.0, false, false);
}
hir::TraitItemKind::Type(_, None) => {
// even if there is no concrete type.
let mut visitor = PlaceholderHirTyCollector::default();
visitor.visit_trait_item(trait_item);
- placeholder_type_error(tcx, None, &[], visitor.0, false);
+ placeholder_type_error(tcx, None, &[], visitor.0, false, false);
}
};
// Account for `type T = _;`
let mut visitor = PlaceholderHirTyCollector::default();
visitor.visit_impl_item(impl_item);
- placeholder_type_error(tcx, None, &[], visitor.0, false);
+ placeholder_type_error(tcx, None, &[], visitor.0, false, false);
}
hir::ImplItemKind::Const(..) => {}
}
));
}
}
-
- // Look into `TyAlias`.
- fn visit_ty(&mut self, ty: &'tcx hir::Ty<'tcx>) {
- use ty::fold::{TypeFoldable, TypeVisitor};
- struct TyAliasVisitor<'a, 'tcx> {
- tcx: TyCtxt<'tcx>,
- preds: &'a mut FxIndexSet<(ty::Predicate<'tcx>, Span)>,
- span: Span,
- }
-
- impl<'a, 'tcx> TypeVisitor<'tcx> for TyAliasVisitor<'a, 'tcx> {
- fn visit_const(&mut self, ct: &'tcx Const<'tcx>) -> ControlFlow<Self::BreakTy> {
- if let ty::ConstKind::Unevaluated(def, substs, None) = ct.val {
- self.preds.insert((
- ty::PredicateKind::ConstEvaluatable(def, substs).to_predicate(self.tcx),
- self.span,
- ));
- }
- ControlFlow::CONTINUE
- }
- }
-
- if let hir::TyKind::Path(hir::QPath::Resolved(None, path)) = ty.kind {
- if let Res::Def(DefKind::TyAlias, def_id) = path.res {
- let mut visitor =
- TyAliasVisitor { tcx: self.tcx, preds: &mut self.preds, span: path.span };
- self.tcx.type_of(def_id).visit_with(&mut visitor);
- }
- }
-
- intravisit::walk_ty(self, ty)
- }
}
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id);