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