mirror of
https://github.com/rust-lang/rust.git
synced 2025-06-04 19:29:07 +00:00
Account for Self params properly
This commit is contained in:
parent
eb6f856169
commit
ba6c166ee4
@ -16,11 +16,10 @@ use rustc_middle::hir::nested_filter;
|
|||||||
use rustc_middle::infer::unify_key::{ConstVariableOrigin, ConstVariableValue};
|
use rustc_middle::infer::unify_key::{ConstVariableOrigin, ConstVariableValue};
|
||||||
use rustc_middle::ty::adjustment::{Adjust, Adjustment, AutoBorrow};
|
use rustc_middle::ty::adjustment::{Adjust, Adjustment, AutoBorrow};
|
||||||
use rustc_middle::ty::print::{FmtPrinter, PrettyPrinter, Print, Printer};
|
use rustc_middle::ty::print::{FmtPrinter, PrettyPrinter, Print, Printer};
|
||||||
use rustc_middle::ty::{
|
use rustc_middle::ty::{self, InferConst};
|
||||||
self, GenericArg, GenericArgKind, GenericArgsRef, InferConst, IsSuggestable, Ty, TyCtxt,
|
use rustc_middle::ty::{GenericArg, GenericArgKind, GenericArgsRef};
|
||||||
TypeFoldable, TypeFolder, TypeSuperFoldable, TypeckResults,
|
use rustc_middle::ty::{IsSuggestable, Ty, TyCtxt, TypeckResults};
|
||||||
};
|
use rustc_span::symbol::{sym, Ident};
|
||||||
use rustc_span::symbol::{kw, sym, Ident};
|
|
||||||
use rustc_span::{BytePos, Span, DUMMY_SP};
|
use rustc_span::{BytePos, Span, DUMMY_SP};
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
use std::iter;
|
use std::iter;
|
||||||
@ -187,8 +186,10 @@ 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 Some(def_id) = var_origin.param_def_id
|
if let Some(def_id) = var_origin.param_def_id
|
||||||
|
// The `Self` param of a trait has the def-id of the trait,
|
||||||
|
// since it's a synthetic parameter.
|
||||||
|
&& infcx.tcx.def_kind(def_id) == DefKind::TyParam
|
||||||
&& let name = infcx.tcx.item_name(def_id)
|
&& let name = infcx.tcx.item_name(def_id)
|
||||||
&& name != kw::SelfUpper
|
|
||||||
&& !var_origin.span.from_expansion()
|
&& !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));
|
||||||
@ -301,20 +302,18 @@ impl<'tcx> InferCtxt<'tcx> {
|
|||||||
let mut inner = self.inner.borrow_mut();
|
let mut inner = self.inner.borrow_mut();
|
||||||
let ty_vars = &inner.type_variables();
|
let ty_vars = &inner.type_variables();
|
||||||
let var_origin = ty_vars.var_origin(ty_vid);
|
let var_origin = ty_vars.var_origin(ty_vid);
|
||||||
if let Some(def_id) = var_origin.param_def_id {
|
if let Some(def_id) = var_origin.param_def_id
|
||||||
let name = self.tcx.item_name(def_id);
|
// The `Self` param of a trait has the def-id of the trait,
|
||||||
if name != kw::SelfUpper && !var_origin.span.from_expansion() {
|
// since it's a synthetic parameter.
|
||||||
return InferenceDiagnosticsData {
|
&& self.tcx.def_kind(def_id) == DefKind::TyParam
|
||||||
name: name.to_string(),
|
&& !var_origin.span.from_expansion()
|
||||||
span: Some(var_origin.span),
|
{
|
||||||
kind: UnderspecifiedArgKind::Type {
|
return InferenceDiagnosticsData {
|
||||||
prefix: "type parameter".into(),
|
name: self.tcx.item_name(def_id).to_string(),
|
||||||
},
|
span: Some(var_origin.span),
|
||||||
parent: InferenceDiagnosticsParentData::for_def_id(
|
kind: UnderspecifiedArgKind::Type { prefix: "type parameter".into() },
|
||||||
self.tcx, def_id,
|
parent: InferenceDiagnosticsParentData::for_def_id(self.tcx, def_id),
|
||||||
),
|
};
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user