1
Fork 0

self type param infer, avoid ICE

This commit is contained in:
lcnr 2023-07-13 13:35:00 +02:00
parent 55be59d2ce
commit 19d46b690a
4 changed files with 24 additions and 4 deletions

View file

@ -2,7 +2,7 @@ use crate::FnCtxt;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def::Res; use rustc_hir::def::Res;
use rustc_hir::def_id::DefId; use rustc_hir::def_id::DefId;
use rustc_infer::traits::ObligationCauseCode; use rustc_infer::{infer::type_variable::TypeVariableOriginKind, traits::ObligationCauseCode};
use rustc_middle::ty::{self, Ty, TyCtxt, TypeSuperVisitable, TypeVisitable, TypeVisitor}; use rustc_middle::ty::{self, Ty, TyCtxt, TypeSuperVisitable, TypeVisitable, TypeVisitor};
use rustc_span::{self, symbol::kw, Span}; use rustc_span::{self, symbol::kw, Span};
use rustc_trait_selection::traits; use rustc_trait_selection::traits;
@ -267,8 +267,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
type BreakTy = ty::GenericArg<'tcx>; type BreakTy = ty::GenericArg<'tcx>;
fn visit_ty(&mut self, ty: Ty<'tcx>) -> std::ops::ControlFlow<Self::BreakTy> { fn visit_ty(&mut self, ty: Ty<'tcx>) -> std::ops::ControlFlow<Self::BreakTy> {
if let Some(origin) = self.0.type_var_origin(ty) if let Some(origin) = self.0.type_var_origin(ty)
&& let rustc_infer::infer::type_variable::TypeVariableOriginKind::TypeParameterDefinition(_, def_id) = && let TypeVariableOriginKind::TypeParameterDefinition(_, def_id) = origin.kind
origin.kind
&& let generics = self.0.tcx.generics_of(self.1) && let generics = self.0.tcx.generics_of(self.1)
&& let Some(index) = generics.param_def_id_to_index(self.0.tcx, def_id) && let Some(index) = generics.param_def_id_to_index(self.0.tcx, def_id)
&& let Some(subst) = ty::GenericArgs::identity_for_item(self.0.tcx, self.1) && let Some(subst) = ty::GenericArgs::identity_for_item(self.0.tcx, self.1)

View file

@ -163,7 +163,7 @@ fn fmt_printer<'a, 'tcx>(infcx: &'a InferCtxt<'tcx>, ns: Namespace) -> FmtPrinte
let ty_vars = infcx_inner.type_variables(); let ty_vars = infcx_inner.type_variables();
let var_origin = ty_vars.var_origin(ty_vid); let var_origin = ty_vars.var_origin(ty_vid);
if let TypeVariableOriginKind::TypeParameterDefinition(name, def_id) = var_origin.kind if let TypeVariableOriginKind::TypeParameterDefinition(name, def_id) = var_origin.kind
&& !var_origin.span.from_expansion() && name != kw::SelfUpper && !var_origin.span.from_expansion()
{ {
let generics = infcx.tcx.generics_of(infcx.tcx.parent(def_id)); let generics = infcx.tcx.generics_of(infcx.tcx.parent(def_id));
let idx = generics.param_def_id_to_index(infcx.tcx, def_id).unwrap(); let idx = generics.param_def_id_to_index(infcx.tcx, def_id).unwrap();

View file

@ -0,0 +1,7 @@
// Regression test for #113610 where we ICEd when trying to print
// inference variables created by instantiating the self type parameter.
fn main() {
let _ = (Default::default(),);
//~^ ERROR cannot call associated function on trait
}

View file

@ -0,0 +1,14 @@
error[E0790]: cannot call associated function on trait without specifying the corresponding `impl` type
--> $DIR/infer-var-for-self-param.rs:5:14
|
LL | let _ = (Default::default(),);
| ^^^^^^^^^^^^^^^^ cannot call associated function of trait
|
help: use a fully-qualified path to a specific available implementation (271 found)
|
LL | let _ = (</* self type */ as Default>::default(),);
| +++++++++++++++++++ +
error: aborting due to previous error
For more information about this error, try `rustc --explain E0790`.