Semantic changes from new hir representation
Always lower to `GenericArg::Infer` Update `PlaceholderCollector` Update closure lifetime binder infer var visitor Fallback visitor handle ambig infer args Ensure type infer args have their type recorded
This commit is contained in:
parent
98d80e22d0
commit
7c8c6d2497
7 changed files with 47 additions and 53 deletions
|
@ -139,29 +139,12 @@ pub(crate) struct HirPlaceholderCollector {
|
|||
}
|
||||
|
||||
impl<'v> Visitor<'v> for HirPlaceholderCollector {
|
||||
fn visit_ty(&mut self, t: &'v hir::Ty<'v>) {
|
||||
if let hir::TyKind::Infer = t.kind {
|
||||
self.spans.push(t.span);
|
||||
}
|
||||
intravisit::walk_ty(self, t)
|
||||
}
|
||||
fn visit_generic_arg(&mut self, generic_arg: &'v hir::GenericArg<'v>) {
|
||||
match generic_arg {
|
||||
hir::GenericArg::Infer(inf) => {
|
||||
self.spans.push(inf.span);
|
||||
self.may_contain_const_infer = true;
|
||||
intravisit::walk_inf(self, inf);
|
||||
}
|
||||
hir::GenericArg::Type(t) => self.visit_ty(t),
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
fn visit_const_arg(&mut self, const_arg: &'v hir::ConstArg<'v>) {
|
||||
if let hir::ConstArgKind::Infer(span) = const_arg.kind {
|
||||
fn visit_infer(&mut self, _inf_id: HirId, inf_span: Span, kind: InferKind<'v>) -> Self::Result {
|
||||
self.spans.push(inf_span);
|
||||
|
||||
if let InferKind::Const(_) | InferKind::Ambig(_) = kind {
|
||||
self.may_contain_const_infer = true;
|
||||
self.spans.push(span);
|
||||
}
|
||||
intravisit::walk_const_arg(self, const_arg)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -489,15 +489,17 @@ impl<'a, 'tcx> Visitor<'tcx> for BoundVarContext<'a, 'tcx> {
|
|||
struct FindInferInClosureWithBinder;
|
||||
impl<'v> Visitor<'v> for FindInferInClosureWithBinder {
|
||||
type Result = ControlFlow<Span>;
|
||||
fn visit_ty(&mut self, t: &'v hir::Ty<'v>) -> Self::Result {
|
||||
if matches!(t.kind, hir::TyKind::Infer) {
|
||||
ControlFlow::Break(t.span)
|
||||
} else {
|
||||
intravisit::walk_ty(self, t)
|
||||
}
|
||||
|
||||
fn visit_infer(
|
||||
&mut self,
|
||||
_inf_id: HirId,
|
||||
inf_span: Span,
|
||||
_kind: InferKind<'v>,
|
||||
) -> Self::Result {
|
||||
ControlFlow::Break(inf_span)
|
||||
}
|
||||
}
|
||||
FindInferInClosureWithBinder.visit_ty(ty).break_value()
|
||||
FindInferInClosureWithBinder.visit_unambig_ty(ty).break_value()
|
||||
}
|
||||
|
||||
let infer_in_rt_sp = match fn_decl.output {
|
||||
|
|
|
@ -40,17 +40,6 @@ fn generic_arg_mismatch_err(
|
|||
param.kind.descr(),
|
||||
);
|
||||
|
||||
if let GenericParamDefKind::Const { .. } = param.kind {
|
||||
if matches!(arg, GenericArg::Type(hir::Ty { kind: hir::TyKind::Infer, .. })) {
|
||||
err.help("const arguments cannot yet be inferred with `_`");
|
||||
tcx.disabled_nightly_features(
|
||||
&mut err,
|
||||
param.def_id.as_local().map(|local| tcx.local_def_id_to_hir_id(local)),
|
||||
[(String::new(), sym::generic_arg_infer)],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
let add_braces_suggestion = |arg: &GenericArg<'_>, err: &mut Diag<'_>| {
|
||||
let suggestions = vec![
|
||||
(arg.span().shrink_to_lo(), String::from("{ ")),
|
||||
|
@ -269,6 +258,21 @@ pub fn lower_generic_args<'tcx: 'a, 'a>(
|
|||
GenericParamDefKind::Const { .. },
|
||||
_,
|
||||
) => {
|
||||
if let GenericParamDefKind::Const { .. } = param.kind
|
||||
&& let GenericArg::Infer(inf) = arg
|
||||
&& !tcx.features().generic_arg_infer()
|
||||
{
|
||||
rustc_session::parse::feature_err(
|
||||
tcx.sess,
|
||||
sym::generic_arg_infer,
|
||||
inf.span,
|
||||
"const arguments cannot yet be inferred with `_`",
|
||||
)
|
||||
.emit();
|
||||
}
|
||||
|
||||
// We lower to an infer even when the feature gate is not enabled
|
||||
// as it is useful for diagnostics to be able to see a `ConstKind::Infer`
|
||||
args.push(ctx.provided_kind(&args, param, arg));
|
||||
args_iter.next();
|
||||
params.next();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue