Rollup merge of #98610 - lcnr:emit_inference_failure_err-ice, r=estebank
fix `emit_inference_failure_err` ICE fixes #98598 this fix doesn't make me too happy, but 🤷
This commit is contained in:
commit
0d5636ce88
@ -334,7 +334,6 @@ pub fn emit_inference_failure_err(
|
|||||||
let mut local_visitor = FindInferSourceVisitor::new(&self, typeck_results, arg);
|
let mut local_visitor = FindInferSourceVisitor::new(&self, typeck_results, arg);
|
||||||
if let Some(body_id) = body_id {
|
if let Some(body_id) = body_id {
|
||||||
let expr = self.tcx.hir().expect_expr(body_id.hir_id);
|
let expr = self.tcx.hir().expect_expr(body_id.hir_id);
|
||||||
debug!(?expr);
|
|
||||||
local_visitor.visit_expr(expr);
|
local_visitor.visit_expr(expr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -550,6 +549,7 @@ fn ty_msg(&self, infcx: &InferCtxt<'_, 'tcx>) -> String {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
struct InsertableGenericArgs<'tcx> {
|
struct InsertableGenericArgs<'tcx> {
|
||||||
insert_span: Span,
|
insert_span: Span,
|
||||||
substs: SubstsRef<'tcx>,
|
substs: SubstsRef<'tcx>,
|
||||||
@ -735,10 +735,20 @@ fn expr_inferred_subst_iter(
|
|||||||
return self.path_inferred_subst_iter(expr.hir_id, substs, path);
|
return self.path_inferred_subst_iter(expr.hir_id, substs, path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
hir::ExprKind::Struct(path, _, _) => {
|
// FIXME(#98711): Ideally we would also deal with type relative
|
||||||
|
// paths here, even if that is quite rare.
|
||||||
|
//
|
||||||
|
// See the `need_type_info/expr-struct-type-relative-gat.rs` test
|
||||||
|
// for an example where that would be needed.
|
||||||
|
//
|
||||||
|
// However, the `type_dependent_def_id` for `Self::Output` in an
|
||||||
|
// impl is currently the `DefId` of `Output` in the trait definition
|
||||||
|
// which makes this somewhat difficult and prevents us from just
|
||||||
|
// using `self.path_inferred_subst_iter` here.
|
||||||
|
hir::ExprKind::Struct(&hir::QPath::Resolved(_self_ty, path), _, _) => {
|
||||||
if let Some(ty) = self.opt_node_type(expr.hir_id) {
|
if let Some(ty) = self.opt_node_type(expr.hir_id) {
|
||||||
if let ty::Adt(_, substs) = ty.kind() {
|
if let ty::Adt(_, substs) = ty.kind() {
|
||||||
return self.path_inferred_subst_iter(expr.hir_id, substs, path);
|
return Box::new(self.resolved_path_inferred_subst_iter(path, substs));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -945,6 +955,7 @@ fn visit_body(&mut self, body: &'tcx Body<'tcx>) {
|
|||||||
intravisit::walk_body(self, body);
|
intravisit::walk_body(self, body);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[instrument(level = "debug", skip(self))]
|
||||||
fn visit_expr(&mut self, expr: &'tcx Expr<'tcx>) {
|
fn visit_expr(&mut self, expr: &'tcx Expr<'tcx>) {
|
||||||
let tcx = self.infcx.tcx;
|
let tcx = self.infcx.tcx;
|
||||||
match expr.kind {
|
match expr.kind {
|
||||||
@ -959,9 +970,9 @@ fn visit_expr(&mut self, expr: &'tcx Expr<'tcx>) {
|
|||||||
_ => intravisit::walk_expr(self, expr),
|
_ => intravisit::walk_expr(self, expr),
|
||||||
}
|
}
|
||||||
|
|
||||||
for InsertableGenericArgs { insert_span, substs, generics_def_id, def_id } in
|
for args in self.expr_inferred_subst_iter(expr) {
|
||||||
self.expr_inferred_subst_iter(expr)
|
debug!(?args);
|
||||||
{
|
let InsertableGenericArgs { insert_span, substs, generics_def_id, def_id } = args;
|
||||||
let generics = tcx.generics_of(generics_def_id);
|
let generics = tcx.generics_of(generics_def_id);
|
||||||
if let Some(argument_index) =
|
if let Some(argument_index) =
|
||||||
generics.own_substs(substs).iter().position(|&arg| self.generic_arg_is_target(arg))
|
generics.own_substs(substs).iter().position(|&arg| self.generic_arg_is_target(arg))
|
||||||
|
@ -156,6 +156,7 @@ pub fn write_field_index(&self, hir_id: hir::HirId, index: usize) {
|
|||||||
self.typeck_results.borrow_mut().field_indices_mut().insert(hir_id, index);
|
self.typeck_results.borrow_mut().field_indices_mut().insert(hir_id, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[instrument(level = "debug", skip(self))]
|
||||||
pub(in super::super) fn write_resolution(
|
pub(in super::super) fn write_resolution(
|
||||||
&self,
|
&self,
|
||||||
hir_id: hir::HirId,
|
hir_id: hir::HirId,
|
||||||
@ -164,8 +165,8 @@ pub(in super::super) fn write_resolution(
|
|||||||
self.typeck_results.borrow_mut().type_dependent_defs_mut().insert(hir_id, r);
|
self.typeck_results.borrow_mut().type_dependent_defs_mut().insert(hir_id, r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[instrument(level = "debug", skip(self))]
|
||||||
pub fn write_method_call(&self, hir_id: hir::HirId, method: MethodCallee<'tcx>) {
|
pub fn write_method_call(&self, hir_id: hir::HirId, method: MethodCallee<'tcx>) {
|
||||||
debug!("write_method_call(hir_id={:?}, method={:?})", hir_id, method);
|
|
||||||
self.write_resolution(hir_id, Ok((DefKind::AssocFn, method.def_id)));
|
self.write_resolution(hir_id, Ok((DefKind::AssocFn, method.def_id)));
|
||||||
self.write_substs(hir_id, method.substs);
|
self.write_substs(hir_id, method.substs);
|
||||||
|
|
||||||
|
@ -0,0 +1,21 @@
|
|||||||
|
trait Foo {
|
||||||
|
type Output;
|
||||||
|
|
||||||
|
fn baz() -> Self::Output;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn needs_infer<T>() {}
|
||||||
|
|
||||||
|
enum Bar {
|
||||||
|
Variant {}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Foo for u8 {
|
||||||
|
type Output = Bar;
|
||||||
|
fn baz() -> Self::Output {
|
||||||
|
needs_infer(); //~ ERROR type annotations needed
|
||||||
|
Self::Output::Variant {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
@ -0,0 +1,14 @@
|
|||||||
|
error[E0282]: type annotations needed
|
||||||
|
--> $DIR/expr-struct-type-relative-enum.rs:16:9
|
||||||
|
|
|
||||||
|
LL | needs_infer();
|
||||||
|
| ^^^^^^^^^^^ cannot infer type of the type parameter `T` declared on the function `needs_infer`
|
||||||
|
|
|
||||||
|
help: consider specifying the generic argument
|
||||||
|
|
|
||||||
|
LL | needs_infer::<T>();
|
||||||
|
| +++++
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0282`.
|
@ -0,0 +1,21 @@
|
|||||||
|
#![feature(generic_associated_types)]
|
||||||
|
|
||||||
|
trait Foo {
|
||||||
|
type Output<T>;
|
||||||
|
|
||||||
|
fn baz();
|
||||||
|
}
|
||||||
|
|
||||||
|
enum Bar<T> {
|
||||||
|
Simple {},
|
||||||
|
Generic(T),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Foo for u8 {
|
||||||
|
type Output<T> = Bar<T>;
|
||||||
|
fn baz() {
|
||||||
|
Self::Output::Simple {}; //~ ERROR type annotations needed
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
@ -0,0 +1,9 @@
|
|||||||
|
error[E0282]: type annotations needed
|
||||||
|
--> $DIR/expr-struct-type-relative-gat.rs:17:9
|
||||||
|
|
|
||||||
|
LL | Self::Output::Simple {};
|
||||||
|
| ^^^^^^^^^^^^ cannot infer type for type parameter `T` declared on the associated type `Output`
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0282`.
|
@ -0,0 +1,21 @@
|
|||||||
|
// regression test for #98598
|
||||||
|
|
||||||
|
trait Foo {
|
||||||
|
type Output;
|
||||||
|
|
||||||
|
fn baz() -> Self::Output;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn needs_infer<T>() {}
|
||||||
|
|
||||||
|
struct Bar {}
|
||||||
|
|
||||||
|
impl Foo for u8 {
|
||||||
|
type Output = Bar;
|
||||||
|
fn baz() -> Self::Output {
|
||||||
|
needs_infer(); //~ ERROR type annotations needed
|
||||||
|
Self::Output {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
@ -0,0 +1,14 @@
|
|||||||
|
error[E0282]: type annotations needed
|
||||||
|
--> $DIR/expr-struct-type-relative.rs:16:9
|
||||||
|
|
|
||||||
|
LL | needs_infer();
|
||||||
|
| ^^^^^^^^^^^ cannot infer type of the type parameter `T` declared on the function `needs_infer`
|
||||||
|
|
|
||||||
|
help: consider specifying the generic argument
|
||||||
|
|
|
||||||
|
LL | needs_infer::<T>();
|
||||||
|
| +++++
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0282`.
|
Loading…
Reference in New Issue
Block a user