mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-11-10 15:14:32 +00:00
Be more resilient to bad language item definitions in binop inference
This commit is contained in:
parent
78c2bdce86
commit
e37df4cd24
2 changed files with 45 additions and 9 deletions
|
@ -793,11 +793,12 @@ impl InferenceContext<'_> {
|
|||
.trait_data(index_trait)
|
||||
.method_by_name(&Name::new_symbol_root(sym::index.clone()))
|
||||
{
|
||||
let substs = TyBuilder::subst_for_def(self.db, index_trait, None)
|
||||
.push(self_ty.clone())
|
||||
.push(index_ty.clone())
|
||||
.build();
|
||||
self.write_method_resolution(tgt_expr, func, substs);
|
||||
let subst = TyBuilder::subst_for_def(self.db, index_trait, None);
|
||||
if subst.remaining() != 2 {
|
||||
return self.err_ty();
|
||||
}
|
||||
let subst = subst.push(self_ty.clone()).push(index_ty.clone()).build();
|
||||
self.write_method_resolution(tgt_expr, func, subst);
|
||||
}
|
||||
let assoc = self.resolve_ops_index_output();
|
||||
let res = self.resolve_associated_type_with_params(
|
||||
|
@ -1295,10 +1296,12 @@ impl InferenceContext<'_> {
|
|||
|
||||
// HACK: We can use this substitution for the function because the function itself doesn't
|
||||
// have its own generic parameters.
|
||||
let subst = TyBuilder::subst_for_def(self.db, trait_, None)
|
||||
.push(lhs_ty.clone())
|
||||
.push(rhs_ty.clone())
|
||||
.build();
|
||||
let subst = TyBuilder::subst_for_def(self.db, trait_, None);
|
||||
if subst.remaining() != 2 {
|
||||
return Ty::new(Interner, TyKind::Error);
|
||||
}
|
||||
let subst = subst.push(lhs_ty.clone()).push(rhs_ty.clone()).build();
|
||||
|
||||
self.write_method_resolution(tgt_expr, func, subst.clone());
|
||||
|
||||
let method_ty = self.db.value_ty(func.into()).unwrap().substitute(Interner, &subst);
|
||||
|
|
|
@ -3686,3 +3686,36 @@ fn main() {
|
|||
"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn infer_bad_lang_item() {
|
||||
check_infer(
|
||||
r#"
|
||||
#[lang="eq"]
|
||||
pub trait Eq {
|
||||
fn eq(&self, ) -> bool;
|
||||
|
||||
}
|
||||
|
||||
#[lang="shr"]
|
||||
pub trait Shr<RHS,Result> {
|
||||
fn shr(&self, rhs: &RHS) -> Result;
|
||||
}
|
||||
|
||||
fn test() -> bool {
|
||||
1 >> 1;
|
||||
1 == 1;
|
||||
}
|
||||
"#,
|
||||
expect![[r#"
|
||||
39..43 'self': &'? Self
|
||||
114..118 'self': &'? Self
|
||||
120..123 'rhs': &'? RHS
|
||||
163..190 '{ ...= 1; }': bool
|
||||
169..170 '1': i32
|
||||
169..175 '1 >> 1': {unknown}
|
||||
181..182 '1': i32
|
||||
181..187 '1 == 1': {unknown}
|
||||
"#]],
|
||||
);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue