]> git.lizzy.rs Git - rust.git/blob - crates/hir_ty/src/infer/expr.rs
Update completions test output
[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                     Ty::apply_one(TypeCtor::Adt(box_), inner_ty)
495                 } else {
496                     Ty::Unknown
497                 }
498             }
499             Expr::UnaryOp { expr, op } => {
500                 let inner_ty = self.infer_expr_inner(*expr, &Expectation::none());
501                 match op {
502                     UnaryOp::Deref => match self.resolver.krate() {
503                         Some(krate) => {
504                             let canonicalized = self.canonicalizer().canonicalize_ty(inner_ty);
505                             match autoderef::deref(
506                                 self.db,
507                                 krate,
508                                 InEnvironment {
509                                     value: &canonicalized.value,
510                                     environment: self.trait_env.clone(),
511                                 },
512                             ) {
513                                 Some(derefed_ty) => {
514                                     canonicalized.decanonicalize_ty(derefed_ty.value)
515                                 }
516                                 None => Ty::Unknown,
517                             }
518                         }
519                         None => Ty::Unknown,
520                     },
521                     UnaryOp::Neg => {
522                         match &inner_ty {
523                             // Fast path for builtins
524                             Ty::Apply(ApplicationTy {
525                                 ctor: TypeCtor::Int(IntTy { signedness: Signedness::Signed, .. }),
526                                 ..
527                             })
528                             | Ty::Apply(ApplicationTy { ctor: TypeCtor::Float(_), .. })
529                             | Ty::Infer(InferTy::IntVar(..))
530                             | Ty::Infer(InferTy::FloatVar(..)) => inner_ty,
531                             // Otherwise we resolve via the std::ops::Neg trait
532                             _ => self
533                                 .resolve_associated_type(inner_ty, self.resolve_ops_neg_output()),
534                         }
535                     }
536                     UnaryOp::Not => {
537                         match &inner_ty {
538                             // Fast path for builtins
539                             Ty::Apply(ApplicationTy { ctor: TypeCtor::Bool, .. })
540                             | Ty::Apply(ApplicationTy { ctor: TypeCtor::Int(_), .. })
541                             | Ty::Infer(InferTy::IntVar(..)) => inner_ty,
542                             // Otherwise we resolve via the std::ops::Not trait
543                             _ => self
544                                 .resolve_associated_type(inner_ty, self.resolve_ops_not_output()),
545                         }
546                     }
547                 }
548             }
549             Expr::BinaryOp { lhs, rhs, op } => match op {
550                 Some(op) => {
551                     let lhs_expectation = match op {
552                         BinaryOp::LogicOp(..) => Expectation::has_type(Ty::simple(TypeCtor::Bool)),
553                         _ => Expectation::none(),
554                     };
555                     let lhs_ty = self.infer_expr(*lhs, &lhs_expectation);
556                     let rhs_expectation = op::binary_op_rhs_expectation(*op, lhs_ty.clone());
557                     let rhs_ty = self.infer_expr(*rhs, &Expectation::has_type(rhs_expectation));
558
559                     let ret = op::binary_op_return_ty(*op, lhs_ty.clone(), rhs_ty.clone());
560
561                     if ret == Ty::Unknown {
562                         mark::hit!(infer_expr_inner_binary_operator_overload);
563
564                         self.resolve_associated_type_with_params(
565                             lhs_ty,
566                             self.resolve_binary_op_output(op),
567                             &[rhs_ty],
568                         )
569                     } else {
570                         ret
571                     }
572                 }
573                 _ => Ty::Unknown,
574             },
575             Expr::Range { lhs, rhs, range_type } => {
576                 let lhs_ty = lhs.map(|e| self.infer_expr_inner(e, &Expectation::none()));
577                 let rhs_expect = lhs_ty
578                     .as_ref()
579                     .map_or_else(Expectation::none, |ty| Expectation::has_type(ty.clone()));
580                 let rhs_ty = rhs.map(|e| self.infer_expr(e, &rhs_expect));
581                 match (range_type, lhs_ty, rhs_ty) {
582                     (RangeOp::Exclusive, None, None) => match self.resolve_range_full() {
583                         Some(adt) => Ty::simple(TypeCtor::Adt(adt)),
584                         None => Ty::Unknown,
585                     },
586                     (RangeOp::Exclusive, None, Some(ty)) => match self.resolve_range_to() {
587                         Some(adt) => Ty::apply_one(TypeCtor::Adt(adt), ty),
588                         None => Ty::Unknown,
589                     },
590                     (RangeOp::Inclusive, None, Some(ty)) => {
591                         match self.resolve_range_to_inclusive() {
592                             Some(adt) => Ty::apply_one(TypeCtor::Adt(adt), ty),
593                             None => Ty::Unknown,
594                         }
595                     }
596                     (RangeOp::Exclusive, Some(_), Some(ty)) => match self.resolve_range() {
597                         Some(adt) => Ty::apply_one(TypeCtor::Adt(adt), ty),
598                         None => Ty::Unknown,
599                     },
600                     (RangeOp::Inclusive, Some(_), Some(ty)) => {
601                         match self.resolve_range_inclusive() {
602                             Some(adt) => Ty::apply_one(TypeCtor::Adt(adt), ty),
603                             None => Ty::Unknown,
604                         }
605                     }
606                     (RangeOp::Exclusive, Some(ty), None) => match self.resolve_range_from() {
607                         Some(adt) => Ty::apply_one(TypeCtor::Adt(adt), ty),
608                         None => Ty::Unknown,
609                     },
610                     (RangeOp::Inclusive, _, None) => Ty::Unknown,
611                 }
612             }
613             Expr::Index { base, index } => {
614                 let base_ty = self.infer_expr_inner(*base, &Expectation::none());
615                 let index_ty = self.infer_expr(*index, &Expectation::none());
616
617                 if let (Some(index_trait), Some(krate)) =
618                     (self.resolve_ops_index(), self.resolver.krate())
619                 {
620                     let canonicalized = self.canonicalizer().canonicalize_ty(base_ty);
621                     let self_ty = method_resolution::resolve_indexing_op(
622                         self.db,
623                         &canonicalized.value,
624                         self.trait_env.clone(),
625                         krate,
626                         index_trait,
627                     );
628                     let self_ty =
629                         self_ty.map_or(Ty::Unknown, |t| canonicalized.decanonicalize_ty(t.value));
630                     self.resolve_associated_type_with_params(
631                         self_ty,
632                         self.resolve_ops_index_output(),
633                         &[index_ty],
634                     )
635                 } else {
636                     Ty::Unknown
637                 }
638             }
639             Expr::Tuple { exprs } => {
640                 let mut tys = match &expected.ty {
641                     ty_app!(TypeCtor::Tuple { .. }, st) => st
642                         .iter()
643                         .cloned()
644                         .chain(repeat_with(|| self.table.new_type_var()))
645                         .take(exprs.len())
646                         .collect::<Vec<_>>(),
647                     _ => (0..exprs.len()).map(|_| self.table.new_type_var()).collect(),
648                 };
649
650                 for (expr, ty) in exprs.iter().zip(tys.iter_mut()) {
651                     self.infer_expr_coerce(*expr, &Expectation::has_type(ty.clone()));
652                 }
653
654                 Ty::apply(TypeCtor::Tuple { cardinality: tys.len() as u16 }, Substs(tys.into()))
655             }
656             Expr::Array(array) => {
657                 let elem_ty = match &expected.ty {
658                     // FIXME: remove when https://github.com/rust-lang/rust/issues/80501 is fixed
659                     #[allow(unreachable_patterns)]
660                     ty_app!(TypeCtor::Array, st) | ty_app!(TypeCtor::Slice, st) => {
661                         st.as_single().clone()
662                     }
663                     _ => self.table.new_type_var(),
664                 };
665
666                 match array {
667                     Array::ElementList(items) => {
668                         for expr in items.iter() {
669                             self.infer_expr_coerce(*expr, &Expectation::has_type(elem_ty.clone()));
670                         }
671                     }
672                     Array::Repeat { initializer, repeat } => {
673                         self.infer_expr_coerce(
674                             *initializer,
675                             &Expectation::has_type(elem_ty.clone()),
676                         );
677                         self.infer_expr(
678                             *repeat,
679                             &Expectation::has_type(Ty::simple(TypeCtor::Int(IntTy::usize()))),
680                         );
681                     }
682                 }
683
684                 Ty::apply_one(TypeCtor::Array, elem_ty)
685             }
686             Expr::Literal(lit) => match lit {
687                 Literal::Bool(..) => Ty::simple(TypeCtor::Bool),
688                 Literal::String(..) => {
689                     Ty::apply_one(TypeCtor::Ref(Mutability::Shared), Ty::simple(TypeCtor::Str))
690                 }
691                 Literal::ByteString(..) => {
692                     let byte_type = Ty::simple(TypeCtor::Int(IntTy::u8()));
693                     let array_type = Ty::apply_one(TypeCtor::Array, byte_type);
694                     Ty::apply_one(TypeCtor::Ref(Mutability::Shared), array_type)
695                 }
696                 Literal::Char(..) => Ty::simple(TypeCtor::Char),
697                 Literal::Int(_v, ty) => match ty {
698                     Some(int_ty) => Ty::simple(TypeCtor::Int((*int_ty).into())),
699                     None => self.table.new_integer_var(),
700                 },
701                 Literal::Float(_v, ty) => match ty {
702                     Some(float_ty) => Ty::simple(TypeCtor::Float((*float_ty).into())),
703                     None => self.table.new_float_var(),
704                 },
705             },
706         };
707         // use a new type variable if we got Ty::Unknown here
708         let ty = self.insert_type_vars_shallow(ty);
709         let ty = self.resolve_ty_as_possible(ty);
710         self.write_expr_ty(tgt_expr, ty.clone());
711         ty
712     }
713
714     fn infer_block(
715         &mut self,
716         statements: &[Statement],
717         tail: Option<ExprId>,
718         expected: &Expectation,
719     ) -> Ty {
720         for stmt in statements {
721             match stmt {
722                 Statement::Let { pat, type_ref, initializer } => {
723                     let decl_ty =
724                         type_ref.as_ref().map(|tr| self.make_ty(tr)).unwrap_or(Ty::Unknown);
725
726                     // Always use the declared type when specified
727                     let mut ty = decl_ty.clone();
728
729                     if let Some(expr) = initializer {
730                         let actual_ty =
731                             self.infer_expr_coerce(*expr, &Expectation::has_type(decl_ty.clone()));
732                         if decl_ty == Ty::Unknown {
733                             ty = actual_ty;
734                         }
735                     }
736
737                     let ty = self.resolve_ty_as_possible(ty);
738                     self.infer_pat(*pat, &ty, BindingMode::default());
739                 }
740                 Statement::Expr(expr) => {
741                     self.infer_expr(*expr, &Expectation::none());
742                 }
743             }
744         }
745
746         let ty = if let Some(expr) = tail {
747             self.infer_expr_coerce(expr, expected)
748         } else {
749             // Citing rustc: if there is no explicit tail expression,
750             // that is typically equivalent to a tail expression
751             // of `()` -- except if the block diverges. In that
752             // case, there is no value supplied from the tail
753             // expression (assuming there are no other breaks,
754             // this implies that the type of the block will be
755             // `!`).
756             if self.diverges.is_always() {
757                 // we don't even make an attempt at coercion
758                 self.table.new_maybe_never_type_var()
759             } else {
760                 self.coerce(&Ty::unit(), expected.coercion_target());
761                 Ty::unit()
762             }
763         };
764         ty
765     }
766
767     fn infer_method_call(
768         &mut self,
769         tgt_expr: ExprId,
770         receiver: ExprId,
771         args: &[ExprId],
772         method_name: &Name,
773         generic_args: Option<&GenericArgs>,
774     ) -> Ty {
775         let receiver_ty = self.infer_expr(receiver, &Expectation::none());
776         let canonicalized_receiver = self.canonicalizer().canonicalize_ty(receiver_ty.clone());
777
778         let traits_in_scope = self.resolver.traits_in_scope(self.db.upcast());
779
780         let resolved = self.resolver.krate().and_then(|krate| {
781             method_resolution::lookup_method(
782                 &canonicalized_receiver.value,
783                 self.db,
784                 self.trait_env.clone(),
785                 krate,
786                 &traits_in_scope,
787                 method_name,
788             )
789         });
790         let (derefed_receiver_ty, method_ty, def_generics) = match resolved {
791             Some((ty, func)) => {
792                 let ty = canonicalized_receiver.decanonicalize_ty(ty);
793                 self.write_method_resolution(tgt_expr, func);
794                 (ty, self.db.value_ty(func.into()), Some(generics(self.db.upcast(), func.into())))
795             }
796             None => (receiver_ty, Binders::new(0, Ty::Unknown), None),
797         };
798         let substs = self.substs_for_method_call(def_generics, generic_args, &derefed_receiver_ty);
799         let method_ty = method_ty.subst(&substs);
800         let method_ty = self.insert_type_vars(method_ty);
801         self.register_obligations_for_call(&method_ty);
802         let (expected_receiver_ty, param_tys, ret_ty) = match method_ty.callable_sig(self.db) {
803             Some(sig) => {
804                 if !sig.params().is_empty() {
805                     (sig.params()[0].clone(), sig.params()[1..].to_vec(), sig.ret().clone())
806                 } else {
807                     (Ty::Unknown, Vec::new(), sig.ret().clone())
808                 }
809             }
810             None => (Ty::Unknown, Vec::new(), Ty::Unknown),
811         };
812         // Apply autoref so the below unification works correctly
813         // FIXME: return correct autorefs from lookup_method
814         let actual_receiver_ty = match expected_receiver_ty.as_reference() {
815             Some((_, mutability)) => Ty::apply_one(TypeCtor::Ref(mutability), derefed_receiver_ty),
816             _ => derefed_receiver_ty,
817         };
818         self.unify(&expected_receiver_ty, &actual_receiver_ty);
819
820         self.check_call_arguments(args, &param_tys);
821         self.normalize_associated_types_in(ret_ty)
822     }
823
824     fn check_call_arguments(&mut self, args: &[ExprId], param_tys: &[Ty]) {
825         // Quoting https://github.com/rust-lang/rust/blob/6ef275e6c3cb1384ec78128eceeb4963ff788dca/src/librustc_typeck/check/mod.rs#L3325 --
826         // We do this in a pretty awful way: first we type-check any arguments
827         // that are not closures, then we type-check the closures. This is so
828         // that we have more information about the types of arguments when we
829         // type-check the functions. This isn't really the right way to do this.
830         for &check_closures in &[false, true] {
831             let param_iter = param_tys.iter().cloned().chain(repeat(Ty::Unknown));
832             for (&arg, param_ty) in args.iter().zip(param_iter) {
833                 let is_closure = matches!(&self.body[arg], Expr::Lambda { .. });
834                 if is_closure != check_closures {
835                     continue;
836                 }
837
838                 let param_ty = self.normalize_associated_types_in(param_ty);
839                 self.infer_expr_coerce(arg, &Expectation::has_type(param_ty.clone()));
840             }
841         }
842     }
843
844     fn substs_for_method_call(
845         &mut self,
846         def_generics: Option<Generics>,
847         generic_args: Option<&GenericArgs>,
848         receiver_ty: &Ty,
849     ) -> Substs {
850         let (parent_params, self_params, type_params, impl_trait_params) =
851             def_generics.as_ref().map_or((0, 0, 0, 0), |g| g.provenance_split());
852         assert_eq!(self_params, 0); // method shouldn't have another Self param
853         let total_len = parent_params + type_params + impl_trait_params;
854         let mut substs = Vec::with_capacity(total_len);
855         // Parent arguments are unknown, except for the receiver type
856         if let Some(parent_generics) = def_generics.as_ref().map(|p| p.iter_parent()) {
857             for (_id, param) in parent_generics {
858                 if param.provenance == hir_def::generics::TypeParamProvenance::TraitSelf {
859                     substs.push(receiver_ty.clone());
860                 } else {
861                     substs.push(Ty::Unknown);
862                 }
863             }
864         }
865         // handle provided type arguments
866         if let Some(generic_args) = generic_args {
867             // if args are provided, it should be all of them, but we can't rely on that
868             for arg in generic_args
869                 .args
870                 .iter()
871                 .filter(|arg| matches!(arg, GenericArg::Type(_)))
872                 .take(type_params)
873             {
874                 match arg {
875                     GenericArg::Type(type_ref) => {
876                         let ty = self.make_ty(type_ref);
877                         substs.push(ty);
878                     }
879                     GenericArg::Lifetime(_) => {}
880                 }
881             }
882         };
883         let supplied_params = substs.len();
884         for _ in supplied_params..total_len {
885             substs.push(Ty::Unknown);
886         }
887         assert_eq!(substs.len(), total_len);
888         Substs(substs.into())
889     }
890
891     fn register_obligations_for_call(&mut self, callable_ty: &Ty) {
892         if let Ty::Apply(a_ty) = callable_ty {
893             if let TypeCtor::FnDef(def) = a_ty.ctor {
894                 let generic_predicates = self.db.generic_predicates(def.into());
895                 for predicate in generic_predicates.iter() {
896                     let predicate = predicate.clone().subst(&a_ty.parameters);
897                     if let Some(obligation) = Obligation::from_predicate(predicate) {
898                         self.obligations.push(obligation);
899                     }
900                 }
901                 // add obligation for trait implementation, if this is a trait method
902                 match def {
903                     CallableDefId::FunctionId(f) => {
904                         if let AssocContainerId::TraitId(trait_) =
905                             f.lookup(self.db.upcast()).container
906                         {
907                             // construct a TraitDef
908                             let substs = a_ty
909                                 .parameters
910                                 .prefix(generics(self.db.upcast(), trait_.into()).len());
911                             self.obligations.push(Obligation::Trait(TraitRef { trait_, substs }));
912                         }
913                     }
914                     CallableDefId::StructId(_) | CallableDefId::EnumVariantId(_) => {}
915                 }
916             }
917         }
918     }
919 }