Skip to content

Commit

Permalink
Rollup merge of #98610 - lcnr:emit_inference_failure_err-ice, r=estebank
Browse files Browse the repository at this point in the history
fix `emit_inference_failure_err` ICE

fixes #98598

this fix doesn't make me too happy, but 🤷
  • Loading branch information
matthiaskrgr authored Jul 1, 2022
2 parents acdcdfb + e043821 commit 0d5636c
Show file tree
Hide file tree
Showing 8 changed files with 119 additions and 7 deletions.
23 changes: 17 additions & 6 deletions compiler/rustc_infer/src/infer/error_reporting/need_type_info.rs
Original file line number Diff line number Diff line change
Expand Up @@ -334,7 +334,6 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
let mut local_visitor = FindInferSourceVisitor::new(&self, typeck_results, arg);
if let Some(body_id) = body_id {
let expr = self.tcx.hir().expect_expr(body_id.hir_id);
debug!(?expr);
local_visitor.visit_expr(expr);
}

Expand Down Expand Up @@ -550,6 +549,7 @@ impl<'tcx> InferSourceKind<'tcx> {
}
}

#[derive(Debug)]
struct InsertableGenericArgs<'tcx> {
insert_span: Span,
substs: SubstsRef<'tcx>,
Expand Down Expand Up @@ -735,10 +735,20 @@ impl<'a, 'tcx> FindInferSourceVisitor<'a, 'tcx> {
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 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));
}
}
}
Expand Down Expand Up @@ -945,6 +955,7 @@ impl<'a, 'tcx> Visitor<'tcx> for FindInferSourceVisitor<'a, 'tcx> {
intravisit::walk_body(self, body);
}

#[instrument(level = "debug", skip(self))]
fn visit_expr(&mut self, expr: &'tcx Expr<'tcx>) {
let tcx = self.infcx.tcx;
match expr.kind {
Expand All @@ -959,9 +970,9 @@ impl<'a, 'tcx> Visitor<'tcx> for FindInferSourceVisitor<'a, 'tcx> {
_ => intravisit::walk_expr(self, expr),
}

for InsertableGenericArgs { insert_span, substs, generics_def_id, def_id } in
self.expr_inferred_subst_iter(expr)
{
for args in 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);
if let Some(argument_index) =
generics.own_substs(substs).iter().position(|&arg| self.generic_arg_is_target(arg))
Expand Down
3 changes: 2 additions & 1 deletion compiler/rustc_typeck/src/check/fn_ctxt/_impl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
self.typeck_results.borrow_mut().field_indices_mut().insert(hir_id, index);
}

#[instrument(level = "debug", skip(self))]
pub(in super::super) fn write_resolution(
&self,
hir_id: hir::HirId,
Expand All @@ -164,8 +165,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
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>) {
debug!("write_method_call(hir_id={:?}, method={:?})", hir_id, method);
self.write_resolution(hir_id, Ok((DefKind::AssocFn, method.def_id)));
self.write_substs(hir_id, method.substs);

Expand Down
Original file line number Diff line number Diff line change
@@ -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() {}
Original file line number Diff line number Diff line change
@@ -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`.
Original file line number Diff line number Diff line change
@@ -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() {}
Original file line number Diff line number Diff line change
@@ -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`.
21 changes: 21 additions & 0 deletions src/test/ui/inference/need_type_info/expr-struct-type-relative.rs
Original file line number Diff line number Diff line change
@@ -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() {}
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit 0d5636c

Please sign in to comment.