]> git.lizzy.rs Git - rust.git/blob - crates/hir_ty/src/infer/expr.rs
d7351d21270193138c6d380e1f894648d4b9dfd3
[rust.git] / crates / hir_ty / src / infer / expr.rs
1 //! Type inference for expressions.
2
3 use std::iter::{repeat, repeat_with};
4 use std::{mem, sync::Arc};
5
6 use hir_def::{
7     builtin_type::Signedness,
8     expr::{Array, BinaryOp, Expr, ExprId, Literal, Statement, UnaryOp},
9     path::{GenericArg, GenericArgs},
10     resolver::resolver_for_expr,
11     AdtId, AssocContainerId, FieldId, Lookup,
12 };
13 use hir_expand::name::{name, Name};
14 use syntax::ast::RangeOp;
15 use test_utils::mark;
16
17 use crate::{
18     autoderef, method_resolution, op,
19     traits::{FnTrait, InEnvironment},
20     utils::{generics, variant_data, Generics},
21     ApplicationTy, Binders, CallableDefId, InferTy, IntTy, Mutability, Obligation, OpaqueTyId,
22     Rawness, Substs, TraitRef, Ty, TypeCtor,
23 };
24
25 use super::{
26     find_breakable, BindingMode, BreakableContext, Diverges, Expectation, InferenceContext,
27     InferenceDiagnostic, TypeMismatch,
28 };
29
30 impl<'a> InferenceContext<'a> {
31     pub(super) fn infer_expr(&mut self, tgt_expr: ExprId, expected: &Expectation) -> Ty {
32         let ty = self.infer_expr_inner(tgt_expr, expected);
33         if ty.is_never() {
34             // Any expression that produces a value of type `!` must have diverged
35             self.diverges = Diverges::Always;
36         }
37         let could_unify = self.unify(&ty, &expected.ty);
38         if !could_unify {
39             self.result.type_mismatches.insert(
40                 tgt_expr,
41                 TypeMismatch { expected: expected.ty.clone(), actual: ty.clone() },
42             );
43         }
44         self.resolve_ty_as_possible(ty)
45     }
46
47     /// Infer type of expression with possibly implicit coerce to the expected type.
48     /// Return the type after possible coercion.
49     pub(super) fn infer_expr_coerce(&mut self, expr: ExprId, expected: &Expectation) -> Ty {
50         let ty = self.infer_expr_inner(expr, &expected);
51         let ty = if !self.coerce(&ty, &expected.coercion_target()) {
52             self.result
53                 .type_mismatches
54                 .insert(expr, TypeMismatch { expected: expected.ty.clone(), actual: ty.clone() });
55             // Return actual type when type mismatch.
56             // This is needed for diagnostic when return type mismatch.
57             ty
58         } else if expected.coercion_target() == &Ty::Unknown {
59             ty
60         } else {
61             expected.ty.clone()
62         };
63
64         self.resolve_ty_as_possible(ty)
65     }
66
67     fn callable_sig_from_fn_trait(&mut self, ty: &Ty, num_args: usize) -> Option<(Vec<Ty>, Ty)> {
68         let krate = self.resolver.krate()?;
69         let fn_once_trait = FnTrait::FnOnce.get_id(self.db, krate)?;
70         let output_assoc_type =
71             self.db.trait_data(fn_once_trait).associated_type_by_name(&name![Output])?;
72         let generic_params = generics(self.db.upcast(), fn_once_trait.into());
73         if generic_params.len() != 2 {
74             return None;
75         }
76
77         let mut param_builder = Substs::builder(num_args);
78         let mut arg_tys = vec![];
79         for _ in 0..num_args {
80             let arg = self.table.new_type_var();
81             param_builder = param_builder.push(arg.clone());
82             arg_tys.push(arg);
83         }
84         let parameters = param_builder.build();
85         let arg_ty = Ty::Apply(ApplicationTy {
86             ctor: TypeCtor::Tuple { cardinality: num_args as u16 },
87             parameters,
88         });
89         let substs =
90             Substs::build_for_generics(&generic_params).push(ty.clone()).push(arg_ty).build();
91
92         let trait_env = Arc::clone(&self.trait_env);
93         let implements_fn_trait =
94             Obligation::Trait(TraitRef { trait_: fn_once_trait, substs: substs.clone() });
95         let goal = self.canonicalizer().canonicalize_obligation(InEnvironment {
96             value: implements_fn_trait.clone(),
97             environment: trait_env,
98         });
99         if self.db.trait_solve(krate, goal.value).is_some() {
100             self.obligations.push(implements_fn_trait);
101             let output_proj_ty =
102                 crate::ProjectionTy { associated_ty: output_assoc_type, parameters: substs };
103             let return_ty = self.normalize_projection_ty(output_proj_ty);
104             Some((arg_tys, return_ty))
105         } else {
106             None
107         }
108     }
109
110     pub(crate) fn callable_sig(&mut self, ty: &Ty, num_args: usize) -> Option<(Vec<Ty>, Ty)> {
111         match ty.callable_sig(self.db) {
112             Some(sig) => Some((sig.params().to_vec(), sig.ret().clone())),
113             None => self.callable_sig_from_fn_trait(ty, num_args),
114         }
115     }
116
117     fn infer_expr_inner(&mut self, tgt_expr: ExprId, expected: &Expectation) -> Ty {
118         let body = Arc::clone(&self.body); // avoid borrow checker problem
119         let ty = match &body[tgt_expr] {
120             Expr::Missing => Ty::Unknown,
121             Expr::If { condition, then_branch, else_branch } => {
122                 // if let is desugared to match, so this is always simple if
123                 self.infer_expr(*condition, &Expectation::has_type(Ty::simple(TypeCtor::Bool)));
124
125                 let condition_diverges = mem::replace(&mut self.diverges, Diverges::Maybe);
126                 let mut both_arms_diverge = Diverges::Always;
127
128                 let then_ty = self.infer_expr_inner(*then_branch, &expected);
129                 both_arms_diverge &= mem::replace(&mut self.diverges, Diverges::Maybe);
130                 let else_ty = match else_branch {
131                     Some(else_branch) => self.infer_expr_inner(*else_branch, &expected),
132                     None => Ty::unit(),
133                 };
134                 both_arms_diverge &= self.diverges;
135
136                 self.diverges = condition_diverges | both_arms_diverge;
137
138                 self.coerce_merge_branch(&then_ty, &else_ty)
139             }
140             Expr::Block { statements, tail, label } => match label {
141                 Some(_) => {
142                     let break_ty = self.table.new_type_var();
143                     self.breakables.push(BreakableContext {
144                         may_break: false,
145                         break_ty: break_ty.clone(),
146                         label: label.map(|label| self.body[label].name.clone()),
147                     });
148                     let ty = self.infer_block(statements, *tail, &Expectation::has_type(break_ty));
149                     let ctxt = self.breakables.pop().expect("breakable stack broken");
150                     if ctxt.may_break {
151                         ctxt.break_ty
152                     } else {
153                         ty
154                     }
155                 }
156                 None => self.infer_block(statements, *tail, expected),
157             },
158             Expr::Unsafe { body } | Expr::Const { body } => self.infer_expr(*body, expected),
159             Expr::TryBlock { body } => {
160                 let _inner = self.infer_expr(*body, expected);
161                 // FIXME should be std::result::Result<{inner}, _>
162                 Ty::Unknown
163             }
164             Expr::Async { body } => {
165                 // Use the first type parameter as the output type of future.
166                 // existenail type AsyncBlockImplTrait<InnerType>: Future<Output = InnerType>
167                 let inner_ty = self.infer_expr(*body, &Expectation::none());
168                 let opaque_ty_id = OpaqueTyId::AsyncBlockTypeImplTrait(self.owner, *body);
169                 Ty::apply_one(TypeCtor::OpaqueType(opaque_ty_id), inner_ty)
170             }
171             Expr::Loop { body, label } => {
172                 self.breakables.push(BreakableContext {
173                     may_break: false,
174                     break_ty: self.table.new_type_var(),
175                     label: label.map(|label| self.body[label].name.clone()),
176                 });
177                 self.infer_expr(*body, &Expectation::has_type(Ty::unit()));
178
179                 let ctxt = self.breakables.pop().expect("breakable stack broken");
180                 if ctxt.may_break {
181                     self.diverges = Diverges::Maybe;
182                 }
183
184                 if ctxt.may_break {
185                     ctxt.break_ty
186                 } else {
187                     Ty::simple(TypeCtor::Never)
188                 }
189             }
190             Expr::While { condition, body, label } => {
191                 self.breakables.push(BreakableContext {
192                     may_break: false,
193                     break_ty: Ty::Unknown,
194                     label: label.map(|label| self.body[label].name.clone()),
195                 });
196                 // while let is desugared to a match loop, so this is always simple while
197                 self.infer_expr(*condition, &Expectation::has_type(Ty::simple(TypeCtor::Bool)));
198                 self.infer_expr(*body, &Expectation::has_type(Ty::unit()));
199                 let _ctxt = self.breakables.pop().expect("breakable stack broken");
200                 // the body may not run, so it diverging doesn't mean we diverge
201                 self.diverges = Diverges::Maybe;
202                 Ty::unit()
203             }
204             Expr::For { iterable, body, pat, label } => {
205                 let iterable_ty = self.infer_expr(*iterable, &Expectation::none());
206
207                 self.breakables.push(BreakableContext {
208                     may_break: false,
209                     break_ty: Ty::Unknown,
210                     label: label.map(|label| self.body[label].name.clone()),
211                 });
212                 let pat_ty =
213                     self.resolve_associated_type(iterable_ty, self.resolve_into_iter_item());
214
215                 self.infer_pat(*pat, &pat_ty, BindingMode::default());
216
217                 self.infer_expr(*body, &Expectation::has_type(Ty::unit()));
218                 let _ctxt = self.breakables.pop().expect("breakable stack broken");
219                 // the body may not run, so it diverging doesn't mean we diverge
220                 self.diverges = Diverges::Maybe;
221                 Ty::unit()
222             }
223             Expr::Lambda { body, args, ret_type, arg_types } => {
224                 assert_eq!(args.len(), arg_types.len());
225
226                 let mut sig_tys = Vec::new();
227
228                 // collect explicitly written argument types
229                 for arg_type in arg_types.iter() {
230                     let arg_ty = if let Some(type_ref) = arg_type {
231                         self.make_ty(type_ref)
232                     } else {
233                         self.table.new_type_var()
234                     };
235                     sig_tys.push(arg_ty);
236                 }
237
238                 // add return type
239                 let ret_ty = match ret_type {
240                     Some(type_ref) => self.make_ty(type_ref),
241                     None => self.table.new_type_var(),
242                 };
243                 sig_tys.push(ret_ty.clone());
244                 let sig_ty = Ty::apply(
245                     TypeCtor::FnPtr { num_args: sig_tys.len() as u16 - 1, is_varargs: false },
246                     Substs(sig_tys.clone().into()),
247                 );
248                 let closure_ty =
249                     Ty::apply_one(TypeCtor::Closure { def: self.owner, expr: tgt_expr }, sig_ty);
250
251                 // Eagerly try to relate the closure type with the expected
252                 // type, otherwise we often won't have enough information to
253                 // infer the body.
254                 self.coerce(&closure_ty, &expected.ty);
255
256                 // Now go through the argument patterns
257                 for (arg_pat, arg_ty) in args.iter().zip(sig_tys) {
258                     let resolved = self.resolve_ty_as_possible(arg_ty);
259                     self.infer_pat(*arg_pat, &resolved, BindingMode::default());
260                 }
261
262                 let prev_diverges = mem::replace(&mut self.diverges, Diverges::Maybe);
263                 let prev_ret_ty = mem::replace(&mut self.return_ty, ret_ty.clone());
264
265                 self.infer_expr_coerce(*body, &Expectation::has_type(ret_ty));
266
267                 self.diverges = prev_diverges;
268                 self.return_ty = prev_ret_ty;
269
270                 closure_ty
271             }
272             Expr::Call { callee, args } => {
273                 let callee_ty = self.infer_expr(*callee, &Expectation::none());
274                 let canonicalized = self.canonicalizer().canonicalize_ty(callee_ty.clone());
275                 let mut derefs = autoderef(
276                     self.db,
277                     self.resolver.krate(),
278                     InEnvironment {
279                         value: canonicalized.value.clone(),
280                         environment: self.trait_env.clone(),
281                     },
282                 );
283                 let (param_tys, ret_ty): (Vec<Ty>, Ty) = derefs
284                     .find_map(|callee_deref_ty| {
285                         self.callable_sig(
286                             &canonicalized.decanonicalize_ty(callee_deref_ty.value),
287                             args.len(),
288                         )
289                     })
290                     .unwrap_or((Vec::new(), Ty::Unknown));
291                 self.register_obligations_for_call(&callee_ty);
292                 self.check_call_arguments(args, &param_tys);
293                 self.normalize_associated_types_in(ret_ty)
294             }
295             Expr::MethodCall { receiver, args, method_name, generic_args } => self
296                 .infer_method_call(tgt_expr, *receiver, &args, &method_name, generic_args.as_ref()),
297             Expr::Match { expr, arms } => {
298                 let input_ty = self.infer_expr(*expr, &Expectation::none());
299
300                 let mut result_ty = if arms.is_empty() {
301                     Ty::simple(TypeCtor::Never)
302                 } else {
303                     self.table.new_type_var()
304                 };
305
306                 let matchee_diverges = self.diverges;
307                 let mut all_arms_diverge = Diverges::Always;
308
309                 for arm in arms {
310                     self.diverges = Diverges::Maybe;
311                     let _pat_ty = self.infer_pat(arm.pat, &input_ty, BindingMode::default());
312                     if let Some(guard_expr) = arm.guard {
313                         self.infer_expr(
314                             guard_expr,
315                             &Expectation::has_type(Ty::simple(TypeCtor::Bool)),
316                         );
317                     }
318
319                     let arm_ty = self.infer_expr_inner(arm.expr, &expected);
320                     all_arms_diverge &= self.diverges;
321                     result_ty = self.coerce_merge_branch(&result_ty, &arm_ty);
322                 }
323
324                 self.diverges = matchee_diverges | all_arms_diverge;
325
326                 result_ty
327             }
328             Expr::Path(p) => {
329                 // FIXME this could be more efficient...
330                 let resolver = resolver_for_expr(self.db.upcast(), self.owner, tgt_expr);
331                 self.infer_path(&resolver, p, tgt_expr.into()).unwrap_or(Ty::Unknown)
332             }
333             Expr::Continue { .. } => Ty::simple(TypeCtor::Never),
334             Expr::Break { expr, label } => {
335                 let val_ty = if let Some(expr) = expr {
336                     self.infer_expr(*expr, &Expectation::none())
337                 } else {
338                     Ty::unit()
339                 };
340
341                 let last_ty =
342                     if let Some(ctxt) = find_breakable(&mut self.breakables, label.as_ref()) {
343                         ctxt.break_ty.clone()
344                     } else {
345                         Ty::Unknown
346                     };
347
348                 let merged_type = self.coerce_merge_branch(&last_ty, &val_ty);
349
350                 if let Some(ctxt) = find_breakable(&mut self.breakables, label.as_ref()) {
351                     ctxt.break_ty = merged_type;
352                     ctxt.may_break = true;
353                 } else {
354                     self.push_diagnostic(InferenceDiagnostic::BreakOutsideOfLoop {
355                         expr: tgt_expr,
356                     });
357                 }
358
359                 Ty::simple(TypeCtor::Never)
360             }
361             Expr::Return { expr } => {
362                 if let Some(expr) = expr {
363                     self.infer_expr_coerce(*expr, &Expectation::has_type(self.return_ty.clone()));
364                 } else {
365                     let unit = Ty::unit();
366                     self.coerce(&unit, &self.return_ty.clone());
367                 }
368                 Ty::simple(TypeCtor::Never)
369             }
370             Expr::Yield { expr } => {
371                 // FIXME: track yield type for coercion
372                 if let Some(expr) = expr {
373                     self.infer_expr(*expr, &Expectation::none());
374                 }
375                 Ty::simple(TypeCtor::Never)
376             }
377             Expr::RecordLit { path, fields, spread } => {
378                 let (ty, def_id) = self.resolve_variant(path.as_ref());
379                 if let Some(variant) = def_id {
380                     self.write_variant_resolution(tgt_expr.into(), variant);
381                 }
382
383                 self.unify(&ty, &expected.ty);
384
385                 let substs = ty.substs().unwrap_or_else(Substs::empty);
386                 let field_types = def_id.map(|it| self.db.field_types(it)).unwrap_or_default();
387                 let variant_data = def_id.map(|it| variant_data(self.db.upcast(), it));
388                 for (field_idx, field) in fields.iter().enumerate() {
389                     let field_def =
390                         variant_data.as_ref().and_then(|it| match it.field(&field.name) {
391                             Some(local_id) => Some(FieldId { parent: def_id.unwrap(), local_id }),
392                             None => {
393                                 self.push_diagnostic(InferenceDiagnostic::NoSuchField {
394                                     expr: tgt_expr,
395                                     field: field_idx,
396                                 });
397                                 None
398                             }
399                         });
400                     if let Some(field_def) = field_def {
401                         self.result.record_field_resolutions.insert(field.expr, field_def);
402                     }
403                     let field_ty = field_def
404                         .map_or(Ty::Unknown, |it| field_types[it.local_id].clone().subst(&substs));
405                     self.infer_expr_coerce(field.expr, &Expectation::has_type(field_ty));
406                 }
407                 if let Some(expr) = spread {
408                     self.infer_expr(*expr, &Expectation::has_type(ty.clone()));
409                 }
410                 ty
411             }
412             Expr::Field { expr, name } => {
413                 let receiver_ty = self.infer_expr_inner(*expr, &Expectation::none());
414                 let canonicalized = self.canonicalizer().canonicalize_ty(receiver_ty);
415                 let ty = autoderef::autoderef(
416                     self.db,
417                     self.resolver.krate(),
418                     InEnvironment {
419                         value: canonicalized.value.clone(),
420                         environment: self.trait_env.clone(),
421                     },
422                 )
423                 .find_map(|derefed_ty| match canonicalized.decanonicalize_ty(derefed_ty.value) {
424                     Ty::Apply(a_ty) => match a_ty.ctor {
425                         TypeCtor::Tuple { .. } => name
426                             .as_tuple_index()
427                             .and_then(|idx| a_ty.parameters.0.get(idx).cloned()),
428                         TypeCtor::Adt(AdtId::StructId(s)) => {
429                             self.db.struct_data(s).variant_data.field(name).map(|local_id| {
430                                 let field = FieldId { parent: s.into(), local_id };
431                                 self.write_field_resolution(tgt_expr, field);
432                                 self.db.field_types(s.into())[field.local_id]
433                                     .clone()
434                                     .subst(&a_ty.parameters)
435                             })
436                         }
437                         TypeCtor::Adt(AdtId::UnionId(u)) => {
438                             self.db.union_data(u).variant_data.field(name).map(|local_id| {
439                                 let field = FieldId { parent: u.into(), local_id };
440                                 self.write_field_resolution(tgt_expr, field);
441                                 self.db.field_types(u.into())[field.local_id]
442                                     .clone()
443                                     .subst(&a_ty.parameters)
444                             })
445                         }
446                         _ => None,
447                     },
448                     _ => None,
449                 })
450                 .unwrap_or(Ty::Unknown);
451                 let ty = self.insert_type_vars(ty);
452                 self.normalize_associated_types_in(ty)
453             }
454             Expr::Await { expr } => {
455                 let inner_ty = self.infer_expr_inner(*expr, &Expectation::none());
456                 self.resolve_associated_type(inner_ty, self.resolve_future_future_output())
457             }
458             Expr::Try { expr } => {
459                 let inner_ty = self.infer_expr_inner(*expr, &Expectation::none());
460                 self.resolve_associated_type(inner_ty, self.resolve_ops_try_ok())
461             }
462             Expr::Cast { expr, type_ref } => {
463                 let _inner_ty = self.infer_expr_inner(*expr, &Expectation::none());
464                 let cast_ty = self.make_ty(type_ref);
465                 // FIXME check the cast...
466                 cast_ty
467             }
468             Expr::Ref { expr, rawness, mutability } => {
469                 let expectation = if let Some((exp_inner, exp_rawness, exp_mutability)) =
470                     &expected.ty.as_reference_or_ptr()
471                 {
472                     if *exp_mutability == Mutability::Mut && *mutability == Mutability::Shared {
473                         // FIXME: throw type error - expected mut reference but found shared ref,
474                         // which cannot be coerced
475                     }
476                     if *exp_rawness == Rawness::Ref && *rawness == Rawness::RawPtr {
477                         // FIXME: throw type error - expected reference but found ptr,
478                         // which cannot be coerced
479                     }
480                     Expectation::rvalue_hint(Ty::clone(exp_inner))
481                 } else {
482                     Expectation::none()
483                 };
484                 let inner_ty = self.infer_expr_inner(*expr, &expectation);
485                 let ty = match rawness {
486                     Rawness::RawPtr => TypeCtor::RawPtr(*mutability),
487                     Rawness::Ref => TypeCtor::Ref(*mutability),
488                 };
489                 Ty::apply_one(ty, inner_ty)
490             }
491             Expr::Box { expr } => {
492                 let inner_ty = self.infer_expr_inner(*expr, &Expectation::none());
493                 if let Some(box_) = self.resolve_boxed_box() {
494                     let mut sb = Substs::build_for_type_ctor(self.db, TypeCtor::Adt(box_));
495                     sb = sb.push(inner_ty);
496                     sb = sb.fill(repeat_with(|| self.table.new_type_var()));
497                     Ty::apply(TypeCtor::Adt(box_), sb.build())
498                 } else {
499                     Ty::Unknown
500                 }
501             }
502             Expr::UnaryOp { expr, op } => {
503                 let inner_ty = self.infer_expr_inner(*expr, &Expectation::none());
504                 match op {
505                     UnaryOp::Deref => match self.resolver.krate() {
506                         Some(krate) => {
507                             let canonicalized = self.canonicalizer().canonicalize_ty(inner_ty);
508                             match autoderef::deref(
509                                 self.db,
510                                 krate,
511                                 InEnvironment {
512                                     value: &canonicalized.value,
513                                     environment: self.trait_env.clone(),
514                                 },
515                             ) {
516                                 Some(derefed_ty) => {
517                                     canonicalized.decanonicalize_ty(derefed_ty.value)
518                                 }
519                                 None => Ty::Unknown,
520                             }
521                         }
522                         None => Ty::Unknown,
523                     },
524                     UnaryOp::Neg => {
525                         match &inner_ty {
526                             // Fast path for builtins
527                             Ty::Apply(ApplicationTy {
528                                 ctor: TypeCtor::Int(IntTy { signedness: Signedness::Signed, .. }),
529                                 ..
530                             })
531                             | Ty::Apply(ApplicationTy { ctor: TypeCtor::Float(_), .. })
532                             | Ty::Infer(InferTy::IntVar(..))
533                             | Ty::Infer(InferTy::FloatVar(..)) => inner_ty,
534                             // Otherwise we resolve via the std::ops::Neg trait
535                             _ => self
536                                 .resolve_associated_type(inner_ty, self.resolve_ops_neg_output()),
537                         }
538                     }
539                     UnaryOp::Not => {
540                         match &inner_ty {
541                             // Fast path for builtins
542                             Ty::Apply(ApplicationTy { ctor: TypeCtor::Bool, .. })
543                             | Ty::Apply(ApplicationTy { ctor: TypeCtor::Int(_), .. })
544                             | Ty::Infer(InferTy::IntVar(..)) => inner_ty,
545                             // Otherwise we resolve via the std::ops::Not trait
546                             _ => self
547                                 .resolve_associated_type(inner_ty, self.resolve_ops_not_output()),
548                         }
549                     }
550                 }
551             }
552             Expr::BinaryOp { lhs, rhs, op } => match op {
553                 Some(op) => {
554                     let lhs_expectation = match op {
555                         BinaryOp::LogicOp(..) => Expectation::has_type(Ty::simple(TypeCtor::Bool)),
556                         _ => Expectation::none(),
557                     };
558                     let lhs_ty = self.infer_expr(*lhs, &lhs_expectation);
559                     let rhs_expectation = op::binary_op_rhs_expectation(*op, lhs_ty.clone());
560                     let rhs_ty = self.infer_expr(*rhs, &Expectation::has_type(rhs_expectation));
561
562                     let ret = op::binary_op_return_ty(*op, lhs_ty.clone(), rhs_ty.clone());
563
564                     if ret == Ty::Unknown {
565                         mark::hit!(infer_expr_inner_binary_operator_overload);
566
567                         self.resolve_associated_type_with_params(
568                             lhs_ty,
569                             self.resolve_binary_op_output(op),
570                             &[rhs_ty],
571                         )
572                     } else {
573                         ret
574                     }
575                 }
576                 _ => Ty::Unknown,
577             },
578             Expr::Range { lhs, rhs, range_type } => {
579                 let lhs_ty = lhs.map(|e| self.infer_expr_inner(e, &Expectation::none()));
580                 let rhs_expect = lhs_ty
581                     .as_ref()
582                     .map_or_else(Expectation::none, |ty| Expectation::has_type(ty.clone()));
583                 let rhs_ty = rhs.map(|e| self.infer_expr(e, &rhs_expect));
584                 match (range_type, lhs_ty, rhs_ty) {
585                     (RangeOp::Exclusive, None, None) => match self.resolve_range_full() {
586                         Some(adt) => Ty::simple(TypeCtor::Adt(adt)),
587                         None => Ty::Unknown,
588                     },
589                     (RangeOp::Exclusive, None, Some(ty)) => match self.resolve_range_to() {
590                         Some(adt) => Ty::apply_one(TypeCtor::Adt(adt), ty),
591                         None => Ty::Unknown,
592                     },
593                     (RangeOp::Inclusive, None, Some(ty)) => {
594                         match self.resolve_range_to_inclusive() {
595                             Some(adt) => Ty::apply_one(TypeCtor::Adt(adt), ty),
596                             None => Ty::Unknown,
597                         }
598                     }
599                     (RangeOp::Exclusive, Some(_), Some(ty)) => match self.resolve_range() {
600                         Some(adt) => Ty::apply_one(TypeCtor::Adt(adt), ty),
601                         None => Ty::Unknown,
602                     },
603                     (RangeOp::Inclusive, Some(_), Some(ty)) => {
604                         match self.resolve_range_inclusive() {
605                             Some(adt) => Ty::apply_one(TypeCtor::Adt(adt), ty),
606                             None => Ty::Unknown,
607                         }
608                     }
609                     (RangeOp::Exclusive, Some(ty), None) => match self.resolve_range_from() {
610                         Some(adt) => Ty::apply_one(TypeCtor::Adt(adt), ty),
611                         None => Ty::Unknown,
612                     },
613                     (RangeOp::Inclusive, _, None) => Ty::Unknown,
614                 }
615             }
616             Expr::Index { base, index } => {
617                 let base_ty = self.infer_expr_inner(*base, &Expectation::none());
618                 let index_ty = self.infer_expr(*index, &Expectation::none());
619
620                 if let (Some(index_trait), Some(krate)) =
621                     (self.resolve_ops_index(), self.resolver.krate())
622                 {
623                     let canonicalized = self.canonicalizer().canonicalize_ty(base_ty);
624                     let self_ty = method_resolution::resolve_indexing_op(
625                         self.db,
626                         &canonicalized.value,
627                         self.trait_env.clone(),
628                         krate,
629                         index_trait,
630                     );
631                     let self_ty =
632                         self_ty.map_or(Ty::Unknown, |t| canonicalized.decanonicalize_ty(t.value));
633                     self.resolve_associated_type_with_params(
634                         self_ty,
635                         self.resolve_ops_index_output(),
636                         &[index_ty],
637                     )
638                 } else {
639                     Ty::Unknown
640                 }
641             }
642             Expr::Tuple { exprs } => {
643                 let mut tys = match &expected.ty {
644                     ty_app!(TypeCtor::Tuple { .. }, st) => st
645                         .iter()
646                         .cloned()
647                         .chain(repeat_with(|| self.table.new_type_var()))
648                         .take(exprs.len())
649                         .collect::<Vec<_>>(),
650                     _ => (0..exprs.len()).map(|_| self.table.new_type_var()).collect(),
651                 };
652
653                 for (expr, ty) in exprs.iter().zip(tys.iter_mut()) {
654                     self.infer_expr_coerce(*expr, &Expectation::has_type(ty.clone()));
655                 }
656
657                 Ty::apply(TypeCtor::Tuple { cardinality: tys.len() as u16 }, Substs(tys.into()))
658             }
659             Expr::Array(array) => {
660                 let elem_ty = match &expected.ty {
661                     // FIXME: remove when https://github.com/rust-lang/rust/issues/80501 is fixed
662                     #[allow(unreachable_patterns)]
663                     ty_app!(TypeCtor::Array, st) | ty_app!(TypeCtor::Slice, st) => {
664                         st.as_single().clone()
665                     }
666                     _ => self.table.new_type_var(),
667                 };
668
669                 match array {
670                     Array::ElementList(items) => {
671                         for expr in items.iter() {
672                             self.infer_expr_coerce(*expr, &Expectation::has_type(elem_ty.clone()));
673                         }
674                     }
675                     Array::Repeat { initializer, repeat } => {
676                         self.infer_expr_coerce(
677                             *initializer,
678                             &Expectation::has_type(elem_ty.clone()),
679                         );
680                         self.infer_expr(
681                             *repeat,
682                             &Expectation::has_type(Ty::simple(TypeCtor::Int(IntTy::usize()))),
683                         );
684                     }
685                 }
686
687                 Ty::apply_one(TypeCtor::Array, elem_ty)
688             }
689             Expr::Literal(lit) => match lit {
690                 Literal::Bool(..) => Ty::simple(TypeCtor::Bool),
691                 Literal::String(..) => {
692                     Ty::apply_one(TypeCtor::Ref(Mutability::Shared), Ty::simple(TypeCtor::Str))
693                 }
694                 Literal::ByteString(..) => {
695                     let byte_type = Ty::simple(TypeCtor::Int(IntTy::u8()));
696                     let array_type = Ty::apply_one(TypeCtor::Array, byte_type);
697                     Ty::apply_one(TypeCtor::Ref(Mutability::Shared), array_type)
698                 }
699                 Literal::Char(..) => Ty::simple(TypeCtor::Char),
700                 Literal::Int(_v, ty) => match ty {
701                     Some(int_ty) => Ty::simple(TypeCtor::Int((*int_ty).into())),
702                     None => self.table.new_integer_var(),
703                 },
704                 Literal::Float(_v, ty) => match ty {
705                     Some(float_ty) => Ty::simple(TypeCtor::Float((*float_ty).into())),
706                     None => self.table.new_float_var(),
707                 },
708             },
709         };
710         // use a new type variable if we got Ty::Unknown here
711         let ty = self.insert_type_vars_shallow(ty);
712         let ty = self.resolve_ty_as_possible(ty);
713         self.write_expr_ty(tgt_expr, ty.clone());
714         ty
715     }
716
717     fn infer_block(
718         &mut self,
719         statements: &[Statement],
720         tail: Option<ExprId>,
721         expected: &Expectation,
722     ) -> Ty {
723         for stmt in statements {
724             match stmt {
725                 Statement::Let { pat, type_ref, initializer } => {
726                     let decl_ty =
727                         type_ref.as_ref().map(|tr| self.make_ty(tr)).unwrap_or(Ty::Unknown);
728
729                     // Always use the declared type when specified
730                     let mut ty = decl_ty.clone();
731
732                     if let Some(expr) = initializer {
733                         let actual_ty =
734                             self.infer_expr_coerce(*expr, &Expectation::has_type(decl_ty.clone()));
735                         if decl_ty == Ty::Unknown {
736                             ty = actual_ty;
737                         }
738                     }
739
740                     let ty = self.resolve_ty_as_possible(ty);
741                     self.infer_pat(*pat, &ty, BindingMode::default());
742                 }
743                 Statement::Expr(expr) => {
744                     self.infer_expr(*expr, &Expectation::none());
745                 }
746             }
747         }
748
749         let ty = if let Some(expr) = tail {
750             self.infer_expr_coerce(expr, expected)
751         } else {
752             // Citing rustc: if there is no explicit tail expression,
753             // that is typically equivalent to a tail expression
754             // of `()` -- except if the block diverges. In that
755             // case, there is no value supplied from the tail
756             // expression (assuming there are no other breaks,
757             // this implies that the type of the block will be
758             // `!`).
759             if self.diverges.is_always() {
760                 // we don't even make an attempt at coercion
761                 self.table.new_maybe_never_type_var()
762             } else {
763                 self.coerce(&Ty::unit(), expected.coercion_target());
764                 Ty::unit()
765             }
766         };
767         ty
768     }
769
770     fn infer_method_call(
771         &mut self,
772         tgt_expr: ExprId,
773         receiver: ExprId,
774         args: &[ExprId],
775         method_name: &Name,
776         generic_args: Option<&GenericArgs>,
777     ) -> Ty {
778         let receiver_ty = self.infer_expr(receiver, &Expectation::none());
779         let canonicalized_receiver = self.canonicalizer().canonicalize_ty(receiver_ty.clone());
780
781         let traits_in_scope = self.resolver.traits_in_scope(self.db.upcast());
782
783         let resolved = self.resolver.krate().and_then(|krate| {
784             method_resolution::lookup_method(
785                 &canonicalized_receiver.value,
786                 self.db,
787                 self.trait_env.clone(),
788                 krate,
789                 &traits_in_scope,
790                 method_name,
791             )
792         });
793         let (derefed_receiver_ty, method_ty, def_generics) = match resolved {
794             Some((ty, func)) => {
795                 let ty = canonicalized_receiver.decanonicalize_ty(ty);
796                 self.write_method_resolution(tgt_expr, func);
797                 (ty, self.db.value_ty(func.into()), Some(generics(self.db.upcast(), func.into())))
798             }
799             None => (receiver_ty, Binders::new(0, Ty::Unknown), None),
800         };
801         let substs = self.substs_for_method_call(def_generics, generic_args, &derefed_receiver_ty);
802         let method_ty = method_ty.subst(&substs);
803         let method_ty = self.insert_type_vars(method_ty);
804         self.register_obligations_for_call(&method_ty);
805         let (expected_receiver_ty, param_tys, ret_ty) = match method_ty.callable_sig(self.db) {
806             Some(sig) => {
807                 if !sig.params().is_empty() {
808                     (sig.params()[0].clone(), sig.params()[1..].to_vec(), sig.ret().clone())
809                 } else {
810                     (Ty::Unknown, Vec::new(), sig.ret().clone())
811                 }
812             }
813             None => (Ty::Unknown, Vec::new(), Ty::Unknown),
814         };
815         // Apply autoref so the below unification works correctly
816         // FIXME: return correct autorefs from lookup_method
817         let actual_receiver_ty = match expected_receiver_ty.as_reference() {
818             Some((_, mutability)) => Ty::apply_one(TypeCtor::Ref(mutability), derefed_receiver_ty),
819             _ => derefed_receiver_ty,
820         };
821         self.unify(&expected_receiver_ty, &actual_receiver_ty);
822
823         self.check_call_arguments(args, &param_tys);
824         self.normalize_associated_types_in(ret_ty)
825     }
826
827     fn check_call_arguments(&mut self, args: &[ExprId], param_tys: &[Ty]) {
828         // Quoting https://github.com/rust-lang/rust/blob/6ef275e6c3cb1384ec78128eceeb4963ff788dca/src/librustc_typeck/check/mod.rs#L3325 --
829         // We do this in a pretty awful way: first we type-check any arguments
830         // that are not closures, then we type-check the closures. This is so
831         // that we have more information about the types of arguments when we
832         // type-check the functions. This isn't really the right way to do this.
833         for &check_closures in &[false, true] {
834             let param_iter = param_tys.iter().cloned().chain(repeat(Ty::Unknown));
835             for (&arg, param_ty) in args.iter().zip(param_iter) {
836                 let is_closure = matches!(&self.body[arg], Expr::Lambda { .. });
837                 if is_closure != check_closures {
838                     continue;
839                 }
840
841                 let param_ty = self.normalize_associated_types_in(param_ty);
842                 self.infer_expr_coerce(arg, &Expectation::has_type(param_ty.clone()));
843             }
844         }
845     }
846
847     fn substs_for_method_call(
848         &mut self,
849         def_generics: Option<Generics>,
850         generic_args: Option<&GenericArgs>,
851         receiver_ty: &Ty,
852     ) -> Substs {
853         let (parent_params, self_params, type_params, impl_trait_params) =
854             def_generics.as_ref().map_or((0, 0, 0, 0), |g| g.provenance_split());
855         assert_eq!(self_params, 0); // method shouldn't have another Self param
856         let total_len = parent_params + type_params + impl_trait_params;
857         let mut substs = Vec::with_capacity(total_len);
858         // Parent arguments are unknown, except for the receiver type
859         if let Some(parent_generics) = def_generics.as_ref().map(|p| p.iter_parent()) {
860             for (_id, param) in parent_generics {
861                 if param.provenance == hir_def::generics::TypeParamProvenance::TraitSelf {
862                     substs.push(receiver_ty.clone());
863                 } else {
864                     substs.push(Ty::Unknown);
865                 }
866             }
867         }
868         // handle provided type arguments
869         if let Some(generic_args) = generic_args {
870             // if args are provided, it should be all of them, but we can't rely on that
871             for arg in generic_args
872                 .args
873                 .iter()
874                 .filter(|arg| matches!(arg, GenericArg::Type(_)))
875                 .take(type_params)
876             {
877                 match arg {
878                     GenericArg::Type(type_ref) => {
879                         let ty = self.make_ty(type_ref);
880                         substs.push(ty);
881                     }
882                     GenericArg::Lifetime(_) => {}
883                 }
884             }
885         };
886         let supplied_params = substs.len();
887         for _ in supplied_params..total_len {
888             substs.push(Ty::Unknown);
889         }
890         assert_eq!(substs.len(), total_len);
891         Substs(substs.into())
892     }
893
894     fn register_obligations_for_call(&mut self, callable_ty: &Ty) {
895         if let Ty::Apply(a_ty) = callable_ty {
896             if let TypeCtor::FnDef(def) = a_ty.ctor {
897                 let generic_predicates = self.db.generic_predicates(def.into());
898                 for predicate in generic_predicates.iter() {
899                     let predicate = predicate.clone().subst(&a_ty.parameters);
900                     if let Some(obligation) = Obligation::from_predicate(predicate) {
901                         self.obligations.push(obligation);
902                     }
903                 }
904                 // add obligation for trait implementation, if this is a trait method
905                 match def {
906                     CallableDefId::FunctionId(f) => {
907                         if let AssocContainerId::TraitId(trait_) =
908                             f.lookup(self.db.upcast()).container
909                         {
910                             // construct a TraitDef
911                             let substs = a_ty
912                                 .parameters
913                                 .prefix(generics(self.db.upcast(), trait_.into()).len());
914                             self.obligations.push(Obligation::Trait(TraitRef { trait_, substs }));
915                         }
916                     }
917                     CallableDefId::StructId(_) | CallableDefId::EnumVariantId(_) => {}
918                 }
919             }
920         }
921     }
922 }