Remove OpaqueTyOrigin::Binding
This commit is contained in:
@@ -264,7 +264,7 @@ enum ImplTraitContext<'b, 'a> {
|
||||
/// Origin: Either OpaqueTyOrigin::FnReturn or OpaqueTyOrigin::AsyncFn,
|
||||
origin: hir::OpaqueTyOrigin,
|
||||
},
|
||||
/// Impl trait in type aliases, consts and statics.
|
||||
/// Impl trait in type aliases.
|
||||
OtherOpaqueTy {
|
||||
/// Set of lifetimes that this opaque type can capture, if it uses
|
||||
/// them. This includes lifetimes bound since we entered this context.
|
||||
@@ -1767,21 +1767,10 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
||||
}
|
||||
|
||||
fn lower_local(&mut self, l: &Local) -> hir::Local<'hir> {
|
||||
let ty = l.ty.as_ref().map(|t| {
|
||||
let mut capturable_lifetimes;
|
||||
self.lower_ty(
|
||||
t,
|
||||
if self.sess.features_untracked().impl_trait_in_bindings {
|
||||
capturable_lifetimes = FxHashSet::default();
|
||||
ImplTraitContext::OtherOpaqueTy {
|
||||
capturable_lifetimes: &mut capturable_lifetimes,
|
||||
origin: hir::OpaqueTyOrigin::Binding,
|
||||
}
|
||||
} else {
|
||||
ImplTraitContext::Disallowed(ImplTraitPosition::Binding)
|
||||
},
|
||||
)
|
||||
});
|
||||
let ty = l
|
||||
.ty
|
||||
.as_ref()
|
||||
.map(|t| self.lower_ty(t, ImplTraitContext::Disallowed(ImplTraitPosition::Binding)));
|
||||
let init = l.init.as_ref().map(|e| self.lower_expr(e));
|
||||
let hir_id = self.lower_node_id(l.id);
|
||||
self.lower_attrs(hir_id, &l.attrs);
|
||||
|
||||
@@ -2270,8 +2270,6 @@ pub enum OpaqueTyOrigin {
|
||||
FnReturn,
|
||||
/// `async fn`
|
||||
AsyncFn,
|
||||
/// `let _: impl Trait = ...`
|
||||
Binding,
|
||||
/// type aliases: `type Foo = impl Trait;`
|
||||
TyAlias,
|
||||
/// Impl trait consts, statics, bounds.
|
||||
|
||||
@@ -402,9 +402,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
|
||||
}
|
||||
// These opaque type inherit all lifetime parameters from their
|
||||
// parent, so we have to check them all.
|
||||
hir::OpaqueTyOrigin::Binding
|
||||
| hir::OpaqueTyOrigin::TyAlias
|
||||
| hir::OpaqueTyOrigin::Misc => 0,
|
||||
hir::OpaqueTyOrigin::TyAlias | hir::OpaqueTyOrigin::Misc => 0,
|
||||
};
|
||||
|
||||
let span = tcx.def_span(def_id);
|
||||
|
||||
@@ -665,13 +665,9 @@ pub(super) fn check_opaque_for_cycles<'tcx>(
|
||||
span: Span,
|
||||
origin: &hir::OpaqueTyOrigin,
|
||||
) -> Result<(), ErrorReported> {
|
||||
if let Err(partially_expanded_type) = tcx.try_expand_impl_trait_type(def_id.to_def_id(), substs)
|
||||
{
|
||||
if tcx.try_expand_impl_trait_type(def_id.to_def_id(), substs).is_err() {
|
||||
match origin {
|
||||
hir::OpaqueTyOrigin::AsyncFn => async_opaque_type_cycle_error(tcx, span),
|
||||
hir::OpaqueTyOrigin::Binding => {
|
||||
binding_opaque_type_cycle_error(tcx, def_id, span, partially_expanded_type)
|
||||
}
|
||||
_ => opaque_type_cycle_error(tcx, def_id, span),
|
||||
}
|
||||
Err(ErrorReported)
|
||||
@@ -704,8 +700,7 @@ fn check_opaque_meets_bounds<'tcx>(
|
||||
// Checked when type checking the function containing them.
|
||||
hir::OpaqueTyOrigin::FnReturn | hir::OpaqueTyOrigin::AsyncFn => return,
|
||||
// Can have different predicates to their defining use
|
||||
hir::OpaqueTyOrigin::Binding | hir::OpaqueTyOrigin::Misc | hir::OpaqueTyOrigin::TyAlias => {
|
||||
}
|
||||
hir::OpaqueTyOrigin::Misc | hir::OpaqueTyOrigin::TyAlias => {}
|
||||
}
|
||||
|
||||
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id);
|
||||
|
||||
@@ -573,66 +573,6 @@ fn get_owner_return_paths(
|
||||
})
|
||||
}
|
||||
|
||||
/// Emit an error for recursive opaque types in a `let` binding.
|
||||
fn binding_opaque_type_cycle_error(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
def_id: LocalDefId,
|
||||
span: Span,
|
||||
partially_expanded_type: Ty<'tcx>,
|
||||
) {
|
||||
let mut err = struct_span_err!(tcx.sess, span, E0720, "cannot resolve opaque type");
|
||||
err.span_label(span, "cannot resolve opaque type");
|
||||
// Find the owner that declared this `impl Trait` type.
|
||||
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id);
|
||||
let mut prev_hir_id = hir_id;
|
||||
let mut hir_id = tcx.hir().get_parent_node(hir_id);
|
||||
while let Some(node) = tcx.hir().find(hir_id) {
|
||||
match node {
|
||||
hir::Node::Local(hir::Local {
|
||||
pat,
|
||||
init: None,
|
||||
ty: Some(ty),
|
||||
source: hir::LocalSource::Normal,
|
||||
..
|
||||
}) => {
|
||||
err.span_label(pat.span, "this binding might not have a concrete type");
|
||||
err.span_suggestion_verbose(
|
||||
ty.span.shrink_to_hi(),
|
||||
"set the binding to a value for a concrete type to be resolved",
|
||||
" = /* value */".to_string(),
|
||||
Applicability::HasPlaceholders,
|
||||
);
|
||||
}
|
||||
hir::Node::Local(hir::Local {
|
||||
init: Some(expr),
|
||||
source: hir::LocalSource::Normal,
|
||||
..
|
||||
}) => {
|
||||
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id);
|
||||
let typeck_results =
|
||||
tcx.typeck(tcx.hir().local_def_id(tcx.hir().get_parent_item(hir_id)));
|
||||
if let Some(ty) = typeck_results.node_type_opt(expr.hir_id) {
|
||||
err.span_label(
|
||||
expr.span,
|
||||
&format!(
|
||||
"this is of type `{}`, which doesn't constrain \
|
||||
`{}` enough to arrive to a concrete type",
|
||||
ty, partially_expanded_type
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
if prev_hir_id == hir_id {
|
||||
break;
|
||||
}
|
||||
prev_hir_id = hir_id;
|
||||
hir_id = tcx.hir().get_parent_node(hir_id);
|
||||
}
|
||||
err.emit();
|
||||
}
|
||||
|
||||
// Forbid defining intrinsics in Rust code,
|
||||
// as they must always be defined by the compiler.
|
||||
fn fn_maybe_err(tcx: TyCtxt<'_>, sp: Span, abi: Abi) {
|
||||
|
||||
@@ -356,9 +356,6 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: DefId) -> Ty<'_> {
|
||||
let substs = InternalSubsts::identity_for_item(tcx, def_id.to_def_id());
|
||||
tcx.mk_adt(def, substs)
|
||||
}
|
||||
ItemKind::OpaqueTy(OpaqueTy { origin: hir::OpaqueTyOrigin::Binding, .. }) => {
|
||||
let_position_impl_trait_type(tcx, def_id)
|
||||
}
|
||||
ItemKind::OpaqueTy(OpaqueTy { impl_trait_fn: None, .. }) => {
|
||||
find_opaque_ty_constraints(tcx, def_id)
|
||||
}
|
||||
@@ -696,60 +693,6 @@ fn find_opaque_ty_constraints(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Ty<'_> {
|
||||
}
|
||||
}
|
||||
|
||||
/// Retrieve the inferred concrete type for let position impl trait.
|
||||
///
|
||||
/// This is different to other kinds of impl trait because:
|
||||
///
|
||||
/// 1. We know which function contains the defining use (the function that
|
||||
/// contains the let statement)
|
||||
/// 2. We do not currently allow (free) lifetimes in the return type. `let`
|
||||
/// statements in some statically unreachable code are removed from the MIR
|
||||
/// by the time we borrow check, and it's not clear how we should handle
|
||||
/// those.
|
||||
fn let_position_impl_trait_type(tcx: TyCtxt<'_>, opaque_ty_id: LocalDefId) -> Ty<'_> {
|
||||
let scope = tcx.hir().get_defining_scope(tcx.hir().local_def_id_to_hir_id(opaque_ty_id));
|
||||
let scope_def_id = tcx.hir().local_def_id(scope);
|
||||
|
||||
let opaque_ty_def_id = opaque_ty_id.to_def_id();
|
||||
|
||||
let owner_typeck_results = tcx.typeck(scope_def_id);
|
||||
let concrete_ty = owner_typeck_results
|
||||
.concrete_opaque_types
|
||||
.get_by(|(key, _)| key.def_id == opaque_ty_def_id)
|
||||
.map(|concrete_ty| *concrete_ty)
|
||||
.unwrap_or_else(|| {
|
||||
tcx.sess.delay_span_bug(
|
||||
DUMMY_SP,
|
||||
&format!(
|
||||
"owner {:?} has no opaque type for {:?} in its typeck results",
|
||||
scope_def_id, opaque_ty_id
|
||||
),
|
||||
);
|
||||
if let Some(ErrorReported) = owner_typeck_results.tainted_by_errors {
|
||||
// Some error in the owner fn prevented us from populating the
|
||||
// `concrete_opaque_types` table.
|
||||
tcx.ty_error()
|
||||
} else {
|
||||
// We failed to resolve the opaque type or it resolves to
|
||||
// itself. Return the non-revealed type, which should result in
|
||||
// E0720.
|
||||
tcx.mk_opaque(
|
||||
opaque_ty_def_id,
|
||||
InternalSubsts::identity_for_item(tcx, opaque_ty_def_id),
|
||||
)
|
||||
}
|
||||
});
|
||||
debug!("concrete_ty = {:?}", concrete_ty);
|
||||
if concrete_ty.has_erased_regions() {
|
||||
// FIXME(impl_trait_in_bindings) Handle this case.
|
||||
tcx.sess.span_fatal(
|
||||
tcx.hir().span(tcx.hir().local_def_id_to_hir_id(opaque_ty_id)),
|
||||
"lifetimes in impl Trait types in bindings are not currently supported",
|
||||
);
|
||||
}
|
||||
concrete_ty
|
||||
}
|
||||
|
||||
fn infer_placeholder_type<'a>(
|
||||
tcx: TyCtxt<'a>,
|
||||
def_id: LocalDefId,
|
||||
|
||||
Reference in New Issue
Block a user