Hex Artifact Content
Not logged in

Artifact 95a2648c61c0b95688ea35595c6a426d94e76f95:


0000: 2f 2f 20 69 67 6e 6f 72 65 2d 74 69 64 79 2d 66  // ignore-tidy-f
0010: 69 6c 65 6c 65 6e 67 74 68 0a 0a 2f 2f 21 20 4d  ilelength..//! M
0020: 49 52 20 64 61 74 61 74 79 70 65 73 20 61 6e 64  IR datatypes and
0030: 20 70 61 73 73 65 73 2e 20 53 65 65 20 74 68 65   passes. See the
0040: 20 5b 72 75 73 74 63 20 67 75 69 64 65 5d 20 66   [rustc guide] f
0050: 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 2e 0a 2f 2f  or more info..//
0060: 21 0a 2f 2f 21 20 5b 72 75 73 74 63 20 67 75 69  !.//! [rustc gui
0070: 64 65 5d 3a 20 68 74 74 70 73 3a 2f 2f 72 75 73  de]: https://rus
0080: 74 2d 6c 61 6e 67 2e 67 69 74 68 75 62 2e 69 6f  t-lang.github.io
0090: 2f 72 75 73 74 63 2d 67 75 69 64 65 2f 6d 69 72  /rustc-guide/mir
00a0: 2f 69 6e 64 65 78 2e 68 74 6d 6c 0a 0a 75 73 65  /index.html..use
00b0: 20 63 72 61 74 65 3a 3a 68 69 72 3a 3a 64 65 66   crate::hir::def
00c0: 3a 3a 7b 43 74 6f 72 4b 69 6e 64 2c 20 4e 61 6d  ::{CtorKind, Nam
00d0: 65 73 70 61 63 65 7d 3b 0a 75 73 65 20 63 72 61  espace};.use cra
00e0: 74 65 3a 3a 68 69 72 3a 3a 64 65 66 5f 69 64 3a  te::hir::def_id:
00f0: 3a 44 65 66 49 64 3b 0a 75 73 65 20 63 72 61 74  :DefId;.use crat
0100: 65 3a 3a 68 69 72 3a 3a 7b 73 65 6c 66 2c 20 47  e::hir::{self, G
0110: 65 6e 65 72 61 74 6f 72 4b 69 6e 64 7d 3b 0a 75  eneratorKind};.u
0120: 73 65 20 63 72 61 74 65 3a 3a 6d 69 72 3a 3a 69  se crate::mir::i
0130: 6e 74 65 72 70 72 65 74 3a 3a 7b 47 6c 6f 62 61  nterpret::{Globa
0140: 6c 41 6c 6c 6f 63 2c 20 50 61 6e 69 63 49 6e 66  lAlloc, PanicInf
0150: 6f 2c 20 53 63 61 6c 61 72 7d 3b 0a 75 73 65 20  o, Scalar};.use 
0160: 63 72 61 74 65 3a 3a 6d 69 72 3a 3a 76 69 73 69  crate::mir::visi
0170: 74 3a 3a 4d 69 72 56 69 73 69 74 61 62 6c 65 3b  t::MirVisitable;
0180: 0a 75 73 65 20 63 72 61 74 65 3a 3a 74 79 3a 3a  .use crate::ty::
0190: 61 64 6a 75 73 74 6d 65 6e 74 3a 3a 50 6f 69 6e  adjustment::Poin
01a0: 74 65 72 43 61 73 74 3b 0a 75 73 65 20 63 72 61  terCast;.use cra
01b0: 74 65 3a 3a 74 79 3a 3a 66 6f 6c 64 3a 3a 7b 54  te::ty::fold::{T
01c0: 79 70 65 46 6f 6c 64 61 62 6c 65 2c 20 54 79 70  ypeFoldable, Typ
01d0: 65 46 6f 6c 64 65 72 2c 20 54 79 70 65 56 69 73  eFolder, TypeVis
01e0: 69 74 6f 72 7d 3b 0a 75 73 65 20 63 72 61 74 65  itor};.use crate
01f0: 3a 3a 74 79 3a 3a 6c 61 79 6f 75 74 3a 3a 56 61  ::ty::layout::Va
0200: 72 69 61 6e 74 49 64 78 3b 0a 75 73 65 20 63 72  riantIdx;.use cr
0210: 61 74 65 3a 3a 74 79 3a 3a 70 72 69 6e 74 3a 3a  ate::ty::print::
0220: 7b 46 6d 74 50 72 69 6e 74 65 72 2c 20 50 72 69  {FmtPrinter, Pri
0230: 6e 74 65 72 7d 3b 0a 75 73 65 20 63 72 61 74 65  nter};.use crate
0240: 3a 3a 74 79 3a 3a 73 75 62 73 74 3a 3a 7b 53 75  ::ty::subst::{Su
0250: 62 73 74 2c 20 53 75 62 73 74 73 52 65 66 7d 3b  bst, SubstsRef};
0260: 0a 75 73 65 20 63 72 61 74 65 3a 3a 74 79 3a 3a  .use crate::ty::
0270: 7b 0a 20 20 20 20 73 65 6c 66 2c 20 41 64 74 44  {.    self, AdtD
0280: 65 66 2c 20 43 61 6e 6f 6e 69 63 61 6c 55 73 65  ef, CanonicalUse
0290: 72 54 79 70 65 41 6e 6e 6f 74 61 74 69 6f 6e 73  rTypeAnnotations
02a0: 2c 20 4c 69 73 74 2c 20 52 65 67 69 6f 6e 2c 20  , List, Region, 
02b0: 54 79 2c 20 54 79 43 74 78 74 2c 20 55 73 65 72  Ty, TyCtxt, User
02c0: 54 79 70 65 41 6e 6e 6f 74 61 74 69 6f 6e 49 6e  TypeAnnotationIn
02d0: 64 65 78 2c 0a 7d 3b 0a 0a 75 73 65 20 70 6f 6c  dex,.};..use pol
02e0: 6f 6e 69 75 73 5f 65 6e 67 69 6e 65 3a 3a 41 74  onius_engine::At
02f0: 6f 6d 3b 0a 75 73 65 20 72 75 73 74 63 5f 69 6e  om;.use rustc_in
0300: 64 65 78 3a 3a 62 69 74 5f 73 65 74 3a 3a 42 69  dex::bit_set::Bi
0310: 74 4d 61 74 72 69 78 3b 0a 75 73 65 20 72 75 73  tMatrix;.use rus
0320: 74 63 5f 64 61 74 61 5f 73 74 72 75 63 74 75 72  tc_data_structur
0330: 65 73 3a 3a 66 78 3a 3a 46 78 48 61 73 68 53 65  es::fx::FxHashSe
0340: 74 3b 0a 75 73 65 20 72 75 73 74 63 5f 64 61 74  t;.use rustc_dat
0350: 61 5f 73 74 72 75 63 74 75 72 65 73 3a 3a 67 72  a_structures::gr
0360: 61 70 68 3a 3a 64 6f 6d 69 6e 61 74 6f 72 73 3a  aph::dominators:
0370: 3a 44 6f 6d 69 6e 61 74 6f 72 73 3b 0a 75 73 65  :Dominators;.use
0380: 20 72 75 73 74 63 5f 64 61 74 61 5f 73 74 72 75   rustc_data_stru
0390: 63 74 75 72 65 73 3a 3a 67 72 61 70 68 3a 3a 7b  ctures::graph::{
03a0: 73 65 6c 66 2c 20 47 72 61 70 68 53 75 63 63 65  self, GraphSucce
03b0: 73 73 6f 72 73 7d 3b 0a 75 73 65 20 72 75 73 74  ssors};.use rust
03c0: 63 5f 69 6e 64 65 78 3a 3a 76 65 63 3a 3a 7b 49  c_index::vec::{I
03d0: 64 78 2c 20 49 6e 64 65 78 56 65 63 7d 3b 0a 75  dx, IndexVec};.u
03e0: 73 65 20 72 75 73 74 63 5f 64 61 74 61 5f 73 74  se rustc_data_st
03f0: 72 75 63 74 75 72 65 73 3a 3a 73 79 6e 63 3a 3a  ructures::sync::
0400: 4c 72 63 3b 0a 75 73 65 20 72 75 73 74 63 5f 6d  Lrc;.use rustc_m
0410: 61 63 72 6f 73 3a 3a 48 61 73 68 53 74 61 62 6c  acros::HashStabl
0420: 65 3b 0a 75 73 65 20 72 75 73 74 63 5f 73 65 72  e;.use rustc_ser
0430: 69 61 6c 69 7a 65 3a 3a 7b 45 6e 63 6f 64 61 62  ialize::{Encodab
0440: 6c 65 2c 20 44 65 63 6f 64 61 62 6c 65 7d 3b 0a  le, Decodable};.
0450: 75 73 65 20 73 6d 61 6c 6c 76 65 63 3a 3a 53 6d  use smallvec::Sm
0460: 61 6c 6c 56 65 63 3b 0a 75 73 65 20 73 74 64 3a  allVec;.use std:
0470: 3a 62 6f 72 72 6f 77 3a 3a 43 6f 77 3b 0a 75 73  :borrow::Cow;.us
0480: 65 20 73 74 64 3a 3a 66 6d 74 3a 3a 7b 73 65 6c  e std::fmt::{sel
0490: 66 2c 20 44 65 62 75 67 2c 20 44 69 73 70 6c 61  f, Debug, Displa
04a0: 79 2c 20 46 6f 72 6d 61 74 74 65 72 2c 20 57 72  y, Formatter, Wr
04b0: 69 74 65 7d 3b 0a 75 73 65 20 73 74 64 3a 3a 6f  ite};.use std::o
04c0: 70 73 3a 3a 49 6e 64 65 78 3b 0a 75 73 65 20 73  ps::Index;.use s
04d0: 74 64 3a 3a 73 6c 69 63 65 3b 0a 75 73 65 20 73  td::slice;.use s
04e0: 74 64 3a 3a 7b 69 74 65 72 2c 20 6d 65 6d 2c 20  td::{iter, mem, 
04f0: 6f 70 74 69 6f 6e 2c 20 75 33 32 7d 3b 0a 75 73  option, u32};.us
0500: 65 20 73 79 6e 74 61 78 3a 3a 61 73 74 3a 3a 4e  e syntax::ast::N
0510: 61 6d 65 3b 0a 75 73 65 20 73 79 6e 74 61 78 3a  ame;.use syntax:
0520: 3a 73 79 6d 62 6f 6c 3a 3a 53 79 6d 62 6f 6c 3b  :symbol::Symbol;
0530: 0a 75 73 65 20 73 79 6e 74 61 78 5f 70 6f 73 3a  .use syntax_pos:
0540: 3a 7b 53 70 61 6e 2c 20 44 55 4d 4d 59 5f 53 50  :{Span, DUMMY_SP
0550: 7d 3b 0a 0a 70 75 62 20 75 73 65 20 63 72 61 74  };..pub use crat
0560: 65 3a 3a 6d 69 72 3a 3a 69 6e 74 65 72 70 72 65  e::mir::interpre
0570: 74 3a 3a 41 73 73 65 72 74 4d 65 73 73 61 67 65  t::AssertMessage
0580: 3b 0a 70 75 62 20 75 73 65 20 63 72 61 74 65 3a  ;.pub use crate:
0590: 3a 6d 69 72 3a 3a 63 61 63 68 65 3a 3a 7b 42 6f  :mir::cache::{Bo
05a0: 64 79 41 6e 64 43 61 63 68 65 2c 20 52 65 61 64  dyAndCache, Read
05b0: 4f 6e 6c 79 42 6f 64 79 41 6e 64 43 61 63 68 65  OnlyBodyAndCache
05c0: 7d 3b 0a 70 75 62 20 75 73 65 20 63 72 61 74 65  };.pub use crate
05d0: 3a 3a 72 65 61 64 5f 6f 6e 6c 79 3b 0a 0a 6d 6f  ::read_only;..mo
05e0: 64 20 63 61 63 68 65 3b 0a 70 75 62 20 6d 6f 64  d cache;.pub mod
05f0: 20 69 6e 74 65 72 70 72 65 74 3b 0a 70 75 62 20   interpret;.pub 
0600: 6d 6f 64 20 6d 6f 6e 6f 3b 0a 70 75 62 20 6d 6f  mod mono;.pub mo
0610: 64 20 74 63 78 3b 0a 70 75 62 20 6d 6f 64 20 74  d tcx;.pub mod t
0620: 72 61 76 65 72 73 61 6c 3b 0a 70 75 62 20 6d 6f  raversal;.pub mo
0630: 64 20 76 69 73 69 74 3b 0a 0a 2f 2f 2f 20 54 79  d visit;../// Ty
0640: 70 65 73 20 66 6f 72 20 6c 6f 63 61 6c 73 0a 74  pes for locals.t
0650: 79 70 65 20 4c 6f 63 61 6c 44 65 63 6c 73 3c 27  ype LocalDecls<'
0660: 74 63 78 3e 20 3d 20 49 6e 64 65 78 56 65 63 3c  tcx> = IndexVec<
0670: 4c 6f 63 61 6c 2c 20 4c 6f 63 61 6c 44 65 63 6c  Local, LocalDecl
0680: 3c 27 74 63 78 3e 3e 3b 0a 0a 70 75 62 20 74 72  <'tcx>>;..pub tr
0690: 61 69 74 20 48 61 73 4c 6f 63 61 6c 44 65 63 6c  ait HasLocalDecl
06a0: 73 3c 27 74 63 78 3e 20 7b 0a 20 20 20 20 66 6e  s<'tcx> {.    fn
06b0: 20 6c 6f 63 61 6c 5f 64 65 63 6c 73 28 26 73 65   local_decls(&se
06c0: 6c 66 29 20 2d 3e 20 26 4c 6f 63 61 6c 44 65 63  lf) -> &LocalDec
06d0: 6c 73 3c 27 74 63 78 3e 3b 0a 7d 0a 0a 69 6d 70  ls<'tcx>;.}..imp
06e0: 6c 3c 27 74 63 78 3e 20 48 61 73 4c 6f 63 61 6c  l<'tcx> HasLocal
06f0: 44 65 63 6c 73 3c 27 74 63 78 3e 20 66 6f 72 20  Decls<'tcx> for 
0700: 4c 6f 63 61 6c 44 65 63 6c 73 3c 27 74 63 78 3e  LocalDecls<'tcx>
0710: 20 7b 0a 20 20 20 20 66 6e 20 6c 6f 63 61 6c 5f   {.    fn local_
0720: 64 65 63 6c 73 28 26 73 65 6c 66 29 20 2d 3e 20  decls(&self) -> 
0730: 26 4c 6f 63 61 6c 44 65 63 6c 73 3c 27 74 63 78  &LocalDecls<'tcx
0740: 3e 20 7b 0a 20 20 20 20 20 20 20 20 73 65 6c 66  > {.        self
0750: 0a 20 20 20 20 7d 0a 7d 0a 0a 69 6d 70 6c 3c 27  .    }.}..impl<'
0760: 74 63 78 3e 20 48 61 73 4c 6f 63 61 6c 44 65 63  tcx> HasLocalDec
0770: 6c 73 3c 27 74 63 78 3e 20 66 6f 72 20 42 6f 64  ls<'tcx> for Bod
0780: 79 3c 27 74 63 78 3e 20 7b 0a 20 20 20 20 66 6e  y<'tcx> {.    fn
0790: 20 6c 6f 63 61 6c 5f 64 65 63 6c 73 28 26 73 65   local_decls(&se
07a0: 6c 66 29 20 2d 3e 20 26 4c 6f 63 61 6c 44 65 63  lf) -> &LocalDec
07b0: 6c 73 3c 27 74 63 78 3e 20 7b 0a 20 20 20 20 20  ls<'tcx> {.     
07c0: 20 20 20 26 73 65 6c 66 2e 6c 6f 63 61 6c 5f 64     &self.local_d
07d0: 65 63 6c 73 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2f  ecls.    }.}..//
07e0: 2f 20 54 68 65 20 76 61 72 69 6f 75 73 20 22 62  / The various "b
07f0: 69 67 20 70 68 61 73 65 73 22 20 74 68 61 74 20  ig phases" that 
0800: 4d 49 52 20 67 6f 65 73 20 74 68 72 6f 75 67 68  MIR goes through
0810: 2e 0a 2f 2f 2f 0a 2f 2f 2f 20 57 61 72 6e 69 6e  ..///./// Warnin
0820: 67 3a 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 76  g: ordering of v
0830: 61 72 69 61 6e 74 73 20 69 73 20 73 69 67 6e 69  ariants is signi
0840: 66 69 63 61 6e 74 2e 0a 23 5b 64 65 72 69 76 65  ficant..#[derive
0850: 28 43 6f 70 79 2c 20 43 6c 6f 6e 65 2c 20 52 75  (Copy, Clone, Ru
0860: 73 74 63 45 6e 63 6f 64 61 62 6c 65 2c 20 52 75  stcEncodable, Ru
0870: 73 74 63 44 65 63 6f 64 61 62 6c 65 2c 20 48 61  stcDecodable, Ha
0880: 73 68 53 74 61 62 6c 65 2c 0a 20 20 20 20 20 20  shStable,.      
0890: 20 20 20 44 65 62 75 67 2c 20 50 61 72 74 69 61     Debug, Partia
08a0: 6c 45 71 2c 20 45 71 2c 20 50 61 72 74 69 61 6c  lEq, Eq, Partial
08b0: 4f 72 64 2c 20 4f 72 64 29 5d 0a 70 75 62 20 65  Ord, Ord)].pub e
08c0: 6e 75 6d 20 4d 69 72 50 68 61 73 65 20 7b 0a 20  num MirPhase {. 
08d0: 20 20 20 42 75 69 6c 64 20 3d 20 30 2c 0a 20 20     Build = 0,.  
08e0: 20 20 43 6f 6e 73 74 20 3d 20 31 2c 0a 20 20 20    Const = 1,.   
08f0: 20 56 61 6c 69 64 61 74 65 64 20 3d 20 32 2c 0a   Validated = 2,.
0900: 20 20 20 20 4f 70 74 69 6d 69 7a 65 64 20 3d 20      Optimized = 
0910: 33 2c 0a 7d 0a 0a 69 6d 70 6c 20 4d 69 72 50 68  3,.}..impl MirPh
0920: 61 73 65 20 7b 0a 20 20 20 20 2f 2f 2f 20 47 65  ase {.    /// Ge
0930: 74 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  ts the index of 
0940: 74 68 65 20 63 75 72 72 65 6e 74 20 4d 69 72 50  the current MirP
0950: 68 61 73 65 20 77 69 74 68 69 6e 20 74 68 65 20  hase within the 
0960: 73 65 74 20 6f 66 20 61 6c 6c 20 60 4d 69 72 50  set of all `MirP
0970: 68 61 73 65 60 73 2e 0a 20 20 20 20 70 75 62 20  hase`s..    pub 
0980: 66 6e 20 70 68 61 73 65 5f 69 6e 64 65 78 28 26  fn phase_index(&
0990: 73 65 6c 66 29 20 2d 3e 20 75 73 69 7a 65 20 7b  self) -> usize {
09a0: 0a 20 20 20 20 20 20 20 20 2a 73 65 6c 66 20 61  .        *self a
09b0: 73 20 75 73 69 7a 65 0a 20 20 20 20 7d 0a 7d 0a  s usize.    }.}.
09c0: 0a 2f 2f 2f 20 54 68 65 20 6c 6f 77 65 72 65 64  ./// The lowered
09d0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
09e0: 6f 66 20 61 20 73 69 6e 67 6c 65 20 66 75 6e 63  of a single func
09f0: 74 69 6f 6e 2e 0a 23 5b 64 65 72 69 76 65 28 43  tion..#[derive(C
0a00: 6c 6f 6e 65 2c 20 52 75 73 74 63 45 6e 63 6f 64  lone, RustcEncod
0a10: 61 62 6c 65 2c 20 52 75 73 74 63 44 65 63 6f 64  able, RustcDecod
0a20: 61 62 6c 65 2c 20 44 65 62 75 67 2c 20 48 61 73  able, Debug, Has
0a30: 68 53 74 61 62 6c 65 2c 20 54 79 70 65 46 6f 6c  hStable, TypeFol
0a40: 64 61 62 6c 65 29 5d 0a 70 75 62 20 73 74 72 75  dable)].pub stru
0a50: 63 74 20 42 6f 64 79 3c 27 74 63 78 3e 20 7b 0a  ct Body<'tcx> {.
0a60: 20 20 20 20 2f 2f 2f 20 41 20 6c 69 73 74 20 6f      /// A list o
0a70: 66 20 62 61 73 69 63 20 62 6c 6f 63 6b 73 2e 20  f basic blocks. 
0a80: 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 62 61  References to ba
0a90: 73 69 63 20 62 6c 6f 63 6b 20 75 73 65 20 61 20  sic block use a 
0aa0: 6e 65 77 74 79 70 65 64 20 69 6e 64 65 78 20 74  newtyped index t
0ab0: 79 70 65 20 60 42 61 73 69 63 42 6c 6f 63 6b 60  ype `BasicBlock`
0ac0: 0a 20 20 20 20 2f 2f 2f 20 74 68 61 74 20 69 6e  .    /// that in
0ad0: 64 65 78 65 73 20 69 6e 74 6f 20 74 68 69 73 20  dexes into this 
0ae0: 76 65 63 74 6f 72 2e 0a 20 20 20 20 62 61 73 69  vector..    basi
0af0: 63 5f 62 6c 6f 63 6b 73 3a 20 49 6e 64 65 78 56  c_blocks: IndexV
0b00: 65 63 3c 42 61 73 69 63 42 6c 6f 63 6b 2c 20 42  ec<BasicBlock, B
0b10: 61 73 69 63 42 6c 6f 63 6b 44 61 74 61 3c 27 74  asicBlockData<'t
0b20: 63 78 3e 3e 2c 0a 0a 20 20 20 20 2f 2f 2f 20 52  cx>>,..    /// R
0b30: 65 63 6f 72 64 73 20 68 6f 77 20 66 61 72 20 74  ecords how far t
0b40: 68 72 6f 75 67 68 20 74 68 65 20 22 64 65 73 75  hrough the "desu
0b50: 67 61 72 69 6e 67 20 61 6e 64 20 6f 70 74 69 6d  garing and optim
0b60: 69 7a 61 74 69 6f 6e 22 20 70 72 6f 63 65 73 73  ization" process
0b70: 20 74 68 69 73 20 70 61 72 74 69 63 75 6c 61 72   this particular
0b80: 0a 20 20 20 20 2f 2f 2f 20 4d 49 52 20 68 61 73  .    /// MIR has
0b90: 20 74 72 61 76 65 72 73 65 64 2e 20 54 68 69 73   traversed. This
0ba0: 20 69 73 20 70 61 72 74 69 63 75 6c 61 72 6c 79   is particularly
0bb0: 20 75 73 65 66 75 6c 20 77 68 65 6e 20 69 6e 6c   useful when inl
0bc0: 69 6e 69 6e 67 2c 20 73 69 6e 63 65 20 69 6e 20  ining, since in 
0bd0: 74 68 61 74 20 63 6f 6e 74 65 78 74 0a 20 20 20  that context.   
0be0: 20 2f 2f 2f 20 77 65 20 69 6e 73 74 61 6e 74 69   /// we instanti
0bf0: 61 74 65 20 74 68 65 20 70 72 6f 6d 6f 74 65 64  ate the promoted
0c00: 20 63 6f 6e 73 74 61 6e 74 73 20 61 6e 64 20 61   constants and a
0c10: 64 64 20 74 68 65 6d 20 74 6f 20 6f 75 72 20 70  dd them to our p
0c20: 72 6f 6d 6f 74 65 64 20 76 65 63 74 6f 72 20 2d  romoted vector -
0c30: 2d 20 62 75 74 20 74 68 6f 73 65 0a 20 20 20 20  - but those.    
0c40: 2f 2f 2f 20 70 72 6f 6d 6f 74 65 64 20 69 74 65  /// promoted ite
0c50: 6d 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ms have already 
0c60: 62 65 65 6e 20 6f 70 74 69 6d 69 7a 65 64 2c 20  been optimized, 
0c70: 77 68 65 72 65 61 73 20 6f 75 72 73 20 68 61 76  whereas ours hav
0c80: 65 20 6e 6f 74 2e 20 54 68 69 73 20 66 69 65 6c  e not. This fiel
0c90: 64 20 61 6c 6c 6f 77 73 0a 20 20 20 20 2f 2f 2f  d allows.    ///
0ca0: 20 75 73 20 74 6f 20 73 65 65 20 74 68 65 20 64   us to see the d
0cb0: 69 66 66 65 72 65 6e 63 65 20 61 6e 64 20 66 6f  ifference and fo
0cc0: 72 65 67 6f 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rego optimizatio
0cd0: 6e 20 6f 6e 20 74 68 65 20 69 6e 6c 69 6e 65 64  n on the inlined
0ce0: 20 70 72 6f 6d 6f 74 65 64 20 69 74 65 6d 73 2e   promoted items.
0cf0: 0a 20 20 20 20 70 75 62 20 70 68 61 73 65 3a 20  .    pub phase: 
0d00: 4d 69 72 50 68 61 73 65 2c 0a 0a 20 20 20 20 2f  MirPhase,..    /
0d10: 2f 2f 20 41 20 6c 69 73 74 20 6f 66 20 73 6f 75  // A list of sou
0d20: 72 63 65 20 73 63 6f 70 65 73 3b 20 74 68 65 73  rce scopes; thes
0d30: 65 20 61 72 65 20 72 65 66 65 72 65 6e 63 65 64  e are referenced
0d40: 20 62 79 20 73 74 61 74 65 6d 65 6e 74 73 0a 20   by statements. 
0d50: 20 20 20 2f 2f 2f 20 61 6e 64 20 75 73 65 64 20     /// and used 
0d60: 66 6f 72 20 64 65 62 75 67 69 6e 66 6f 2e 20 49  for debuginfo. I
0d70: 6e 64 65 78 65 64 20 62 79 20 61 20 60 53 6f 75  ndexed by a `Sou
0d80: 72 63 65 53 63 6f 70 65 60 2e 0a 20 20 20 20 70  rceScope`..    p
0d90: 75 62 20 73 6f 75 72 63 65 5f 73 63 6f 70 65 73  ub source_scopes
0da0: 3a 20 49 6e 64 65 78 56 65 63 3c 53 6f 75 72 63  : IndexVec<Sourc
0db0: 65 53 63 6f 70 65 2c 20 53 6f 75 72 63 65 53 63  eScope, SourceSc
0dc0: 6f 70 65 44 61 74 61 3e 2c 0a 0a 20 20 20 20 2f  opeData>,..    /
0dd0: 2f 2f 20 54 68 65 20 79 69 65 6c 64 20 74 79 70  // The yield typ
0de0: 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  e of the functio
0df0: 6e 2c 20 69 66 20 69 74 20 69 73 20 61 20 67 65  n, if it is a ge
0e00: 6e 65 72 61 74 6f 72 2e 0a 20 20 20 20 70 75 62  nerator..    pub
0e10: 20 79 69 65 6c 64 5f 74 79 3a 20 4f 70 74 69 6f   yield_ty: Optio
0e20: 6e 3c 54 79 3c 27 74 63 78 3e 3e 2c 0a 0a 20 20  n<Ty<'tcx>>,..  
0e30: 20 20 2f 2f 2f 20 47 65 6e 65 72 61 74 6f 72 20    /// Generator 
0e40: 64 72 6f 70 20 67 6c 75 65 2e 0a 20 20 20 20 70  drop glue..    p
0e50: 75 62 20 67 65 6e 65 72 61 74 6f 72 5f 64 72 6f  ub generator_dro
0e60: 70 3a 20 4f 70 74 69 6f 6e 3c 42 6f 78 3c 42 6f  p: Option<Box<Bo
0e70: 64 79 41 6e 64 43 61 63 68 65 3c 27 74 63 78 3e  dyAndCache<'tcx>
0e80: 3e 3e 2c 0a 0a 20 20 20 20 2f 2f 2f 20 54 68 65  >>,..    /// The
0e90: 20 6c 61 79 6f 75 74 20 6f 66 20 61 20 67 65 6e   layout of a gen
0ea0: 65 72 61 74 6f 72 2e 20 50 72 6f 64 75 63 65 64  erator. Produced
0eb0: 20 62 79 20 74 68 65 20 73 74 61 74 65 20 74 72   by the state tr
0ec0: 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20  ansformation..  
0ed0: 20 20 70 75 62 20 67 65 6e 65 72 61 74 6f 72 5f    pub generator_
0ee0: 6c 61 79 6f 75 74 3a 20 4f 70 74 69 6f 6e 3c 47  layout: Option<G
0ef0: 65 6e 65 72 61 74 6f 72 4c 61 79 6f 75 74 3c 27  eneratorLayout<'
0f00: 74 63 78 3e 3e 2c 0a 0a 20 20 20 20 2f 2f 2f 20  tcx>>,..    /// 
0f10: 49 66 20 74 68 69 73 20 69 73 20 61 20 67 65 6e  If this is a gen
0f20: 65 72 61 74 6f 72 20 74 68 65 6e 20 72 65 63 6f  erator then reco
0f30: 72 64 20 74 68 65 20 74 79 70 65 20 6f 66 20 73  rd the type of s
0f40: 6f 75 72 63 65 20 65 78 70 72 65 73 73 69 6f 6e  ource expression
0f50: 20 74 68 61 74 20 63 61 75 73 65 64 20 74 68 69   that caused thi
0f60: 73 20 67 65 6e 65 72 61 74 6f 72 0a 20 20 20 20  s generator.    
0f70: 2f 2f 2f 20 74 6f 20 62 65 20 63 72 65 61 74 65  /// to be create
0f80: 64 2e 0a 20 20 20 20 70 75 62 20 67 65 6e 65 72  d..    pub gener
0f90: 61 74 6f 72 5f 6b 69 6e 64 3a 20 4f 70 74 69 6f  ator_kind: Optio
0fa0: 6e 3c 47 65 6e 65 72 61 74 6f 72 4b 69 6e 64 3e  n<GeneratorKind>
0fb0: 2c 0a 0a 20 20 20 20 2f 2f 2f 20 44 65 63 6c 61  ,..    /// Decla
0fc0: 72 61 74 69 6f 6e 73 20 6f 66 20 6c 6f 63 61 6c  rations of local
0fd0: 73 2e 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f  s..    ///.    /
0fe0: 2f 2f 20 54 68 65 20 66 69 72 73 74 20 6c 6f 63  // The first loc
0ff0: 61 6c 20 69 73 20 74 68 65 20 72 65 74 75 72 6e  al is the return
1000: 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 72 2c 20   value pointer, 
1010: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 60 61 72 67  followed by `arg
1020: 5f 63 6f 75 6e 74 60 0a 20 20 20 20 2f 2f 2f 20  _count`.    /// 
1030: 6c 6f 63 61 6c 73 20 66 6f 72 20 74 68 65 20 66  locals for the f
1040: 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
1050: 73 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  s, followed by a
1060: 6e 79 20 75 73 65 72 2d 64 65 63 6c 61 72 65 64  ny user-declared
1070: 0a 20 20 20 20 2f 2f 2f 20 76 61 72 69 61 62 6c  .    /// variabl
1080: 65 73 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 69  es and temporari
1090: 65 73 2e 0a 20 20 20 20 70 75 62 20 6c 6f 63 61  es..    pub loca
10a0: 6c 5f 64 65 63 6c 73 3a 20 4c 6f 63 61 6c 44 65  l_decls: LocalDe
10b0: 63 6c 73 3c 27 74 63 78 3e 2c 0a 0a 20 20 20 20  cls<'tcx>,..    
10c0: 2f 2f 2f 20 55 73 65 72 20 74 79 70 65 20 61 6e  /// User type an
10d0: 6e 6f 74 61 74 69 6f 6e 73 2e 0a 20 20 20 20 70  notations..    p
10e0: 75 62 20 75 73 65 72 5f 74 79 70 65 5f 61 6e 6e  ub user_type_ann
10f0: 6f 74 61 74 69 6f 6e 73 3a 20 43 61 6e 6f 6e 69  otations: Canoni
1100: 63 61 6c 55 73 65 72 54 79 70 65 41 6e 6e 6f 74  calUserTypeAnnot
1110: 61 74 69 6f 6e 73 3c 27 74 63 78 3e 2c 0a 0a 20  ations<'tcx>,.. 
1120: 20 20 20 2f 2f 2f 20 54 68 65 20 6e 75 6d 62 65     /// The numbe
1130: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74  r of arguments t
1140: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b  his function tak
1150: 65 73 2e 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20  es..    ///.    
1160: 2f 2f 2f 20 53 74 61 72 74 69 6e 67 20 61 74 20  /// Starting at 
1170: 6c 6f 63 61 6c 20 31 2c 20 60 61 72 67 5f 63 6f  local 1, `arg_co
1180: 75 6e 74 60 20 6c 6f 63 61 6c 73 20 77 69 6c 6c  unt` locals will
1190: 20 62 65 20 70 72 6f 76 69 64 65 64 20 62 79 20   be provided by 
11a0: 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 20 20 2f  the caller.    /
11b0: 2f 2f 20 61 6e 64 20 63 61 6e 20 62 65 20 61 73  // and can be as
11c0: 73 75 6d 65 64 20 74 6f 20 62 65 20 69 6e 69 74  sumed to be init
11d0: 69 61 6c 69 7a 65 64 2e 0a 20 20 20 20 2f 2f 2f  ialized..    ///
11e0: 0a 20 20 20 20 2f 2f 2f 20 49 66 20 74 68 69 73  .    /// If this
11f0: 20 4d 49 52 20 77 61 73 20 62 75 69 6c 74 20 66   MIR was built f
1200: 6f 72 20 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74  or a constant, t
1210: 68 69 73 20 77 69 6c 6c 20 62 65 20 30 2e 0a 20  his will be 0.. 
1220: 20 20 20 70 75 62 20 61 72 67 5f 63 6f 75 6e 74     pub arg_count
1230: 3a 20 75 73 69 7a 65 2c 0a 0a 20 20 20 20 2f 2f  : usize,..    //
1240: 2f 20 4d 61 72 6b 20 61 6e 20 61 72 67 75 6d 65  / Mark an argume
1250: 6e 74 20 6c 6f 63 61 6c 20 28 77 68 69 63 68 20  nt local (which 
1260: 6d 75 73 74 20 62 65 20 61 20 74 75 70 6c 65 29  must be a tuple)
1270: 20 61 73 20 67 65 74 74 69 6e 67 20 70 61 73 73   as getting pass
1280: 65 64 20 61 73 0a 20 20 20 20 2f 2f 2f 20 69 74  ed as.    /// it
1290: 73 20 69 6e 64 69 76 69 64 75 61 6c 20 63 6f 6d  s individual com
12a0: 70 6f 6e 65 6e 74 73 20 61 74 20 74 68 65 20 4c  ponents at the L
12b0: 4c 56 4d 20 6c 65 76 65 6c 2e 0a 20 20 20 20 2f  LVM level..    /
12c0: 2f 2f 0a 20 20 20 20 2f 2f 2f 20 54 68 69 73 20  //.    /// This 
12d0: 69 73 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  is used for the 
12e0: 22 72 75 73 74 2d 63 61 6c 6c 22 20 41 42 49 2e  "rust-call" ABI.
12f0: 0a 20 20 20 20 70 75 62 20 73 70 72 65 61 64 5f  .    pub spread_
1300: 61 72 67 3a 20 4f 70 74 69 6f 6e 3c 4c 6f 63 61  arg: Option<Loca
1310: 6c 3e 2c 0a 0a 20 20 20 20 2f 2f 2f 20 44 65 62  l>,..    /// Deb
1320: 75 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70  ug information p
1330: 65 72 74 61 69 6e 69 6e 67 20 74 6f 20 75 73 65  ertaining to use
1340: 72 20 76 61 72 69 61 62 6c 65 73 2c 20 69 6e 63  r variables, inc
1350: 6c 75 64 69 6e 67 20 63 61 70 74 75 72 65 73 2e  luding captures.
1360: 0a 20 20 20 20 70 75 62 20 76 61 72 5f 64 65 62  .    pub var_deb
1370: 75 67 5f 69 6e 66 6f 3a 20 56 65 63 3c 56 61 72  ug_info: Vec<Var
1380: 44 65 62 75 67 49 6e 66 6f 3c 27 74 63 78 3e 3e  DebugInfo<'tcx>>
1390: 2c 0a 0a 20 20 20 20 2f 2f 2f 20 4d 61 72 6b 20  ,..    /// Mark 
13a0: 74 68 69 73 20 4d 49 52 20 6f 66 20 61 20 63 6f  this MIR of a co
13b0: 6e 73 74 20 63 6f 6e 74 65 78 74 20 6f 74 68 65  nst context othe
13c0: 72 20 74 68 61 6e 20 63 6f 6e 73 74 20 66 75 6e  r than const fun
13d0: 63 74 69 6f 6e 73 20 61 73 20 68 61 76 69 6e 67  ctions as having
13e0: 20 63 6f 6e 76 65 72 74 65 64 20 61 20 60 26 26   converted a `&&
13f0: 60 20 6f 72 0a 20 20 20 20 2f 2f 2f 20 60 7c 7c  ` or.    /// `||
1400: 60 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 74  ` expression int
1410: 6f 20 60 26 60 20 6f 72 20 60 7c 60 20 72 65 73  o `&` or `|` res
1420: 70 65 63 74 69 76 65 6c 79 2e 20 54 68 69 73 20  pectively. This 
1430: 69 73 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 62  is problematic b
1440: 65 63 61 75 73 65 20 69 66 20 77 65 20 65 76 65  ecause if we eve
1450: 72 20 73 74 6f 70 0a 20 20 20 20 2f 2f 2f 20 74  r stop.    /// t
1460: 68 69 73 20 63 6f 6e 76 65 72 73 69 6f 6e 20 66  his conversion f
1470: 72 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20 61 6e  rom happening an
1480: 64 20 75 73 65 20 73 68 6f 72 74 20 63 69 72 63  d use short circ
1490: 75 69 74 69 6e 67 2c 20 77 65 20 77 69 6c 6c 20  uiting, we will 
14a0: 63 61 75 73 65 20 74 68 65 20 66 6f 6c 6c 6f 77  cause the follow
14b0: 69 6e 67 20 63 6f 64 65 0a 20 20 20 20 2f 2f 2f  ing code.    ///
14c0: 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76   to change the v
14d0: 61 6c 75 65 20 6f 66 20 60 78 60 3a 20 60 6c 65  alue of `x`: `le
14e0: 74 20 6d 75 74 20 78 20 3d 20 34 32 3b 20 66 61  t mut x = 42; fa
14f0: 6c 73 65 20 26 26 20 7b 20 78 20 3d 20 35 35 3b  lse && { x = 55;
1500: 20 74 72 75 65 20 7d 3b 60 0a 20 20 20 20 2f 2f   true };`.    //
1510: 2f 0a 20 20 20 20 2f 2f 2f 20 4c 69 73 74 20 6f  /.    /// List o
1520: 66 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 63  f places where c
1530: 6f 6e 74 72 6f 6c 20 66 6c 6f 77 20 77 61 73 20  ontrol flow was 
1540: 64 65 73 74 72 6f 79 65 64 2e 20 55 73 65 64 20  destroyed. Used 
1550: 66 6f 72 20 65 72 72 6f 72 20 72 65 70 6f 72 74  for error report
1560: 69 6e 67 2e 0a 20 20 20 20 70 75 62 20 63 6f 6e  ing..    pub con
1570: 74 72 6f 6c 5f 66 6c 6f 77 5f 64 65 73 74 72 6f  trol_flow_destro
1580: 79 65 64 3a 20 56 65 63 3c 28 53 70 61 6e 2c 20  yed: Vec<(Span, 
1590: 53 74 72 69 6e 67 29 3e 2c 0a 0a 20 20 20 20 2f  String)>,..    /
15a0: 2f 2f 20 41 20 73 70 61 6e 20 72 65 70 72 65 73  // A span repres
15b0: 65 6e 74 69 6e 67 20 74 68 69 73 20 4d 49 52 2c  enting this MIR,
15c0: 20 66 6f 72 20 65 72 72 6f 72 20 72 65 70 6f 72   for error repor
15d0: 74 69 6e 67 2e 0a 20 20 20 20 70 75 62 20 73 70  ting..    pub sp
15e0: 61 6e 3a 20 53 70 61 6e 2c 0a 7d 0a 0a 69 6d 70  an: Span,.}..imp
15f0: 6c 3c 27 74 63 78 3e 20 42 6f 64 79 3c 27 74 63  l<'tcx> Body<'tc
1600: 78 3e 20 7b 0a 20 20 20 20 70 75 62 20 66 6e 20  x> {.    pub fn 
1610: 6e 65 77 28 0a 20 20 20 20 20 20 20 20 62 61 73  new(.        bas
1620: 69 63 5f 62 6c 6f 63 6b 73 3a 20 49 6e 64 65 78  ic_blocks: Index
1630: 56 65 63 3c 42 61 73 69 63 42 6c 6f 63 6b 2c 20  Vec<BasicBlock, 
1640: 42 61 73 69 63 42 6c 6f 63 6b 44 61 74 61 3c 27  BasicBlockData<'
1650: 74 63 78 3e 3e 2c 0a 20 20 20 20 20 20 20 20 73  tcx>>,.        s
1660: 6f 75 72 63 65 5f 73 63 6f 70 65 73 3a 20 49 6e  ource_scopes: In
1670: 64 65 78 56 65 63 3c 53 6f 75 72 63 65 53 63 6f  dexVec<SourceSco
1680: 70 65 2c 20 53 6f 75 72 63 65 53 63 6f 70 65 44  pe, SourceScopeD
1690: 61 74 61 3e 2c 0a 20 20 20 20 20 20 20 20 6c 6f  ata>,.        lo
16a0: 63 61 6c 5f 64 65 63 6c 73 3a 20 4c 6f 63 61 6c  cal_decls: Local
16b0: 44 65 63 6c 73 3c 27 74 63 78 3e 2c 0a 20 20 20  Decls<'tcx>,.   
16c0: 20 20 20 20 20 75 73 65 72 5f 74 79 70 65 5f 61       user_type_a
16d0: 6e 6e 6f 74 61 74 69 6f 6e 73 3a 20 43 61 6e 6f  nnotations: Cano
16e0: 6e 69 63 61 6c 55 73 65 72 54 79 70 65 41 6e 6e  nicalUserTypeAnn
16f0: 6f 74 61 74 69 6f 6e 73 3c 27 74 63 78 3e 2c 0a  otations<'tcx>,.
1700: 20 20 20 20 20 20 20 20 61 72 67 5f 63 6f 75 6e          arg_coun
1710: 74 3a 20 75 73 69 7a 65 2c 0a 20 20 20 20 20 20  t: usize,.      
1720: 20 20 76 61 72 5f 64 65 62 75 67 5f 69 6e 66 6f    var_debug_info
1730: 3a 20 56 65 63 3c 56 61 72 44 65 62 75 67 49 6e  : Vec<VarDebugIn
1740: 66 6f 3c 27 74 63 78 3e 3e 2c 0a 20 20 20 20 20  fo<'tcx>>,.     
1750: 20 20 20 73 70 61 6e 3a 20 53 70 61 6e 2c 0a 20     span: Span,. 
1760: 20 20 20 20 20 20 20 63 6f 6e 74 72 6f 6c 5f 66         control_f
1770: 6c 6f 77 5f 64 65 73 74 72 6f 79 65 64 3a 20 56  low_destroyed: V
1780: 65 63 3c 28 53 70 61 6e 2c 20 53 74 72 69 6e 67  ec<(Span, String
1790: 29 3e 2c 0a 20 20 20 20 20 20 20 20 67 65 6e 65  )>,.        gene
17a0: 72 61 74 6f 72 5f 6b 69 6e 64 20 3a 20 4f 70 74  rator_kind : Opt
17b0: 69 6f 6e 3c 47 65 6e 65 72 61 74 6f 72 4b 69 6e  ion<GeneratorKin
17c0: 64 3e 2c 0a 20 20 20 20 29 20 2d 3e 20 53 65 6c  d>,.    ) -> Sel
17d0: 66 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 57  f {.        // W
17e0: 65 20 6e 65 65 64 20 60 61 72 67 5f 63 6f 75 6e  e need `arg_coun
17f0: 74 60 20 6c 6f 63 61 6c 73 2c 20 61 6e 64 20 6f  t` locals, and o
1800: 6e 65 20 66 6f 72 20 74 68 65 20 72 65 74 75 72  ne for the retur
1810: 6e 20 70 6c 61 63 65 2e 0a 20 20 20 20 20 20 20  n place..       
1820: 20 61 73 73 65 72 74 21 28 0a 20 20 20 20 20 20   assert!(.      
1830: 20 20 20 20 20 20 6c 6f 63 61 6c 5f 64 65 63 6c        local_decl
1840: 73 2e 6c 65 6e 28 29 20 3e 3d 20 61 72 67 5f 63  s.len() >= arg_c
1850: 6f 75 6e 74 20 2b 20 31 2c 0a 20 20 20 20 20 20  ount + 1,.      
1860: 20 20 20 20 20 20 22 65 78 70 65 63 74 65 64 20        "expected 
1870: 61 74 20 6c 65 61 73 74 20 7b 7d 20 6c 6f 63 61  at least {} loca
1880: 6c 73 2c 20 67 6f 74 20 7b 7d 22 2c 0a 20 20 20  ls, got {}",.   
1890: 20 20 20 20 20 20 20 20 20 61 72 67 5f 63 6f 75           arg_cou
18a0: 6e 74 20 2b 20 31 2c 0a 20 20 20 20 20 20 20 20  nt + 1,.        
18b0: 20 20 20 20 6c 6f 63 61 6c 5f 64 65 63 6c 73 2e      local_decls.
18c0: 6c 65 6e 28 29 0a 20 20 20 20 20 20 20 20 29 3b  len().        );
18d0: 0a 0a 20 20 20 20 20 20 20 20 42 6f 64 79 20 7b  ..        Body {
18e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 68 61  .            pha
18f0: 73 65 3a 20 4d 69 72 50 68 61 73 65 3a 3a 42 75  se: MirPhase::Bu
1900: 69 6c 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ild,.           
1910: 20 62 61 73 69 63 5f 62 6c 6f 63 6b 73 2c 0a 20   basic_blocks,. 
1920: 20 20 20 20 20 20 20 20 20 20 20 73 6f 75 72 63             sourc
1930: 65 5f 73 63 6f 70 65 73 2c 0a 20 20 20 20 20 20  e_scopes,.      
1940: 20 20 20 20 20 20 79 69 65 6c 64 5f 74 79 3a 20        yield_ty: 
1950: 4e 6f 6e 65 2c 0a 20 20 20 20 20 20 20 20 20 20  None,.          
1960: 20 20 67 65 6e 65 72 61 74 6f 72 5f 64 72 6f 70    generator_drop
1970: 3a 20 4e 6f 6e 65 2c 0a 20 20 20 20 20 20 20 20  : None,.        
1980: 20 20 20 20 67 65 6e 65 72 61 74 6f 72 5f 6c 61      generator_la
1990: 79 6f 75 74 3a 20 4e 6f 6e 65 2c 0a 20 20 20 20  yout: None,.    
19a0: 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 6f          generato
19b0: 72 5f 6b 69 6e 64 2c 0a 20 20 20 20 20 20 20 20  r_kind,.        
19c0: 20 20 20 20 6c 6f 63 61 6c 5f 64 65 63 6c 73 2c      local_decls,
19d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 73 65  .            use
19e0: 72 5f 74 79 70 65 5f 61 6e 6e 6f 74 61 74 69 6f  r_type_annotatio
19f0: 6e 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ns,.            
1a00: 61 72 67 5f 63 6f 75 6e 74 2c 0a 20 20 20 20 20  arg_count,.     
1a10: 20 20 20 20 20 20 20 73 70 72 65 61 64 5f 61 72         spread_ar
1a20: 67 3a 20 4e 6f 6e 65 2c 0a 20 20 20 20 20 20 20  g: None,.       
1a30: 20 20 20 20 20 76 61 72 5f 64 65 62 75 67 5f 69       var_debug_i
1a40: 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nfo,.           
1a50: 20 73 70 61 6e 2c 0a 20 20 20 20 20 20 20 20 20   span,.         
1a60: 20 20 20 63 6f 6e 74 72 6f 6c 5f 66 6c 6f 77 5f     control_flow_
1a70: 64 65 73 74 72 6f 79 65 64 2c 0a 20 20 20 20 20  destroyed,.     
1a80: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1a90: 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 70 75  #[inline].    pu
1aa0: 62 20 66 6e 20 62 61 73 69 63 5f 62 6c 6f 63 6b  b fn basic_block
1ab0: 73 28 26 73 65 6c 66 29 20 2d 3e 20 26 49 6e 64  s(&self) -> &Ind
1ac0: 65 78 56 65 63 3c 42 61 73 69 63 42 6c 6f 63 6b  exVec<BasicBlock
1ad0: 2c 20 42 61 73 69 63 42 6c 6f 63 6b 44 61 74 61  , BasicBlockData
1ae0: 3c 27 74 63 78 3e 3e 20 7b 0a 20 20 20 20 20 20  <'tcx>> {.      
1af0: 20 20 26 73 65 6c 66 2e 62 61 73 69 63 5f 62 6c    &self.basic_bl
1b00: 6f 63 6b 73 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ocks.    }..    
1b10: 2f 2f 2f 20 52 65 74 75 72 6e 73 20 60 74 72 75  /// Returns `tru
1b20: 65 60 20 69 66 20 61 20 63 79 63 6c 65 20 65 78  e` if a cycle ex
1b30: 69 73 74 73 20 69 6e 20 74 68 65 20 63 6f 6e 74  ists in the cont
1b40: 72 6f 6c 2d 66 6c 6f 77 20 67 72 61 70 68 20 74  rol-flow graph t
1b50: 68 61 74 20 69 73 20 72 65 61 63 68 61 62 6c 65  hat is reachable
1b60: 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2f 2f   from the.    //
1b70: 2f 20 60 53 54 41 52 54 5f 42 4c 4f 43 4b 60 2e  / `START_BLOCK`.
1b80: 0a 20 20 20 20 70 75 62 20 66 6e 20 69 73 5f 63  .    pub fn is_c
1b90: 66 67 5f 63 79 63 6c 69 63 28 26 73 65 6c 66 29  fg_cyclic(&self)
1ba0: 20 2d 3e 20 62 6f 6f 6c 20 7b 0a 20 20 20 20 20   -> bool {.     
1bb0: 20 20 20 67 72 61 70 68 3a 3a 69 73 5f 63 79 63     graph::is_cyc
1bc0: 6c 69 63 28 73 65 6c 66 29 0a 20 20 20 20 7d 0a  lic(self).    }.
1bd0: 0a 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20  .    #[inline]. 
1be0: 20 20 20 70 75 62 20 66 6e 20 6c 6f 63 61 6c 5f     pub fn local_
1bf0: 6b 69 6e 64 28 26 73 65 6c 66 2c 20 6c 6f 63 61  kind(&self, loca
1c00: 6c 3a 20 4c 6f 63 61 6c 29 20 2d 3e 20 4c 6f 63  l: Local) -> Loc
1c10: 61 6c 4b 69 6e 64 20 7b 0a 20 20 20 20 20 20 20  alKind {.       
1c20: 20 6c 65 74 20 69 6e 64 65 78 20 3d 20 6c 6f 63   let index = loc
1c30: 61 6c 2e 61 73 5f 75 73 69 7a 65 28 29 3b 0a 20  al.as_usize();. 
1c40: 20 20 20 20 20 20 20 69 66 20 69 6e 64 65 78 20         if index 
1c50: 3d 3d 20 30 20 7b 0a 20 20 20 20 20 20 20 20 20  == 0 {.         
1c60: 20 20 20 64 65 62 75 67 5f 61 73 73 65 72 74 21     debug_assert!
1c70: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
1c80: 20 20 73 65 6c 66 2e 6c 6f 63 61 6c 5f 64 65 63    self.local_dec
1c90: 6c 73 5b 6c 6f 63 61 6c 5d 2e 6d 75 74 61 62 69  ls[local].mutabi
1ca0: 6c 69 74 79 20 3d 3d 20 4d 75 74 61 62 69 6c 69  lity == Mutabili
1cb0: 74 79 3a 3a 4d 75 74 2c 0a 20 20 20 20 20 20 20  ty::Mut,.       
1cc0: 20 20 20 20 20 20 20 20 20 22 72 65 74 75 72 6e           "return
1cd0: 20 70 6c 61 63 65 20 73 68 6f 75 6c 64 20 62 65   place should be
1ce0: 20 6d 75 74 61 62 6c 65 22 0a 20 20 20 20 20 20   mutable".      
1cf0: 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20        );..      
1d00: 20 20 20 20 20 20 4c 6f 63 61 6c 4b 69 6e 64 3a        LocalKind:
1d10: 3a 52 65 74 75 72 6e 50 6f 69 6e 74 65 72 0a 20  :ReturnPointer. 
1d20: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66         } else if
1d30: 20 69 6e 64 65 78 20 3c 20 73 65 6c 66 2e 61 72   index < self.ar
1d40: 67 5f 63 6f 75 6e 74 20 2b 20 31 20 7b 0a 20 20  g_count + 1 {.  
1d50: 20 20 20 20 20 20 20 20 20 20 4c 6f 63 61 6c 4b            LocalK
1d60: 69 6e 64 3a 3a 41 72 67 0a 20 20 20 20 20 20 20  ind::Arg.       
1d70: 20 7d 20 65 6c 73 65 20 69 66 20 73 65 6c 66 2e   } else if self.
1d80: 6c 6f 63 61 6c 5f 64 65 63 6c 73 5b 6c 6f 63 61  local_decls[loca
1d90: 6c 5d 2e 69 73 5f 75 73 65 72 5f 76 61 72 69 61  l].is_user_varia
1da0: 62 6c 65 28 29 20 7b 0a 20 20 20 20 20 20 20 20  ble() {.        
1db0: 20 20 20 20 4c 6f 63 61 6c 4b 69 6e 64 3a 3a 56      LocalKind::V
1dc0: 61 72 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  ar.        } els
1dd0: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
1de0: 4c 6f 63 61 6c 4b 69 6e 64 3a 3a 54 65 6d 70 0a  LocalKind::Temp.
1df0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
1e00: 0a 20 20 20 20 2f 2f 2f 20 52 65 74 75 72 6e 73  .    /// Returns
1e10: 20 61 6e 20 69 74 65 72 61 74 6f 72 20 6f 76 65   an iterator ove
1e20: 72 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 69 65  r all temporarie
1e30: 73 2e 0a 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d  s..    #[inline]
1e40: 0a 20 20 20 20 70 75 62 20 66 6e 20 74 65 6d 70  .    pub fn temp
1e50: 73 5f 69 74 65 72 3c 27 61 3e 28 26 27 61 20 73  s_iter<'a>(&'a s
1e60: 65 6c 66 29 20 2d 3e 20 69 6d 70 6c 20 49 74 65  elf) -> impl Ite
1e70: 72 61 74 6f 72 3c 49 74 65 6d 20 3d 20 4c 6f 63  rator<Item = Loc
1e80: 61 6c 3e 20 2b 20 27 61 20 7b 0a 20 20 20 20 20  al> + 'a {.     
1e90: 20 20 20 28 73 65 6c 66 2e 61 72 67 5f 63 6f 75     (self.arg_cou
1ea0: 6e 74 20 2b 20 31 2e 2e 73 65 6c 66 2e 6c 6f 63  nt + 1..self.loc
1eb0: 61 6c 5f 64 65 63 6c 73 2e 6c 65 6e 28 29 29 2e  al_decls.len()).
1ec0: 66 69 6c 74 65 72 5f 6d 61 70 28 6d 6f 76 65 20  filter_map(move 
1ed0: 7c 69 6e 64 65 78 7c 20 7b 0a 20 20 20 20 20 20  |index| {.      
1ee0: 20 20 20 20 20 20 6c 65 74 20 6c 6f 63 61 6c 20        let local 
1ef0: 3d 20 4c 6f 63 61 6c 3a 3a 6e 65 77 28 69 6e 64  = Local::new(ind
1f00: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ex);.           
1f10: 20 69 66 20 73 65 6c 66 2e 6c 6f 63 61 6c 5f 64   if self.local_d
1f20: 65 63 6c 73 5b 6c 6f 63 61 6c 5d 2e 69 73 5f 75  ecls[local].is_u
1f30: 73 65 72 5f 76 61 72 69 61 62 6c 65 28 29 20 7b  ser_variable() {
1f40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f50: 20 4e 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20   None.          
1f60: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
1f70: 20 20 20 20 20 20 20 20 20 20 20 53 6f 6d 65 28             Some(
1f80: 6c 6f 63 61 6c 29 0a 20 20 20 20 20 20 20 20 20  local).         
1f90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 29 0a     }.        }).
1fa0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 52      }..    /// R
1fb0: 65 74 75 72 6e 73 20 61 6e 20 69 74 65 72 61 74  eturns an iterat
1fc0: 6f 72 20 6f 76 65 72 20 61 6c 6c 20 75 73 65 72  or over all user
1fd0: 2d 64 65 63 6c 61 72 65 64 20 6c 6f 63 61 6c 73  -declared locals
1fe0: 2e 0a 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a  ..    #[inline].
1ff0: 20 20 20 20 70 75 62 20 66 6e 20 76 61 72 73 5f      pub fn vars_
2000: 69 74 65 72 3c 27 61 3e 28 26 27 61 20 73 65 6c  iter<'a>(&'a sel
2010: 66 29 20 2d 3e 20 69 6d 70 6c 20 49 74 65 72 61  f) -> impl Itera
2020: 74 6f 72 3c 49 74 65 6d 20 3d 20 4c 6f 63 61 6c  tor<Item = Local
2030: 3e 20 2b 20 27 61 20 7b 0a 20 20 20 20 20 20 20  > + 'a {.       
2040: 20 28 73 65 6c 66 2e 61 72 67 5f 63 6f 75 6e 74   (self.arg_count
2050: 20 2b 20 31 2e 2e 73 65 6c 66 2e 6c 6f 63 61 6c   + 1..self.local
2060: 5f 64 65 63 6c 73 2e 6c 65 6e 28 29 29 2e 66 69  _decls.len()).fi
2070: 6c 74 65 72 5f 6d 61 70 28 6d 6f 76 65 20 7c 69  lter_map(move |i
2080: 6e 64 65 78 7c 20 7b 0a 20 20 20 20 20 20 20 20  ndex| {.        
2090: 20 20 20 20 6c 65 74 20 6c 6f 63 61 6c 20 3d 20      let local = 
20a0: 4c 6f 63 61 6c 3a 3a 6e 65 77 28 69 6e 64 65 78  Local::new(index
20b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
20c0: 65 6c 66 2e 6c 6f 63 61 6c 5f 64 65 63 6c 73 5b  elf.local_decls[
20d0: 6c 6f 63 61 6c 5d 2e 69 73 5f 75 73 65 72 5f 76  local].is_user_v
20e0: 61 72 69 61 62 6c 65 28 29 2e 74 68 65 6e 5f 73  ariable().then_s
20f0: 6f 6d 65 28 6c 6f 63 61 6c 29 0a 20 20 20 20 20  ome(local).     
2100: 20 20 20 7d 29 0a 20 20 20 20 7d 0a 0a 20 20 20     }).    }..   
2110: 20 2f 2f 2f 20 52 65 74 75 72 6e 73 20 61 6e 20   /// Returns an 
2120: 69 74 65 72 61 74 6f 72 20 6f 76 65 72 20 61 6c  iterator over al
2130: 6c 20 75 73 65 72 2d 64 65 63 6c 61 72 65 64 20  l user-declared 
2140: 6d 75 74 61 62 6c 65 20 6c 6f 63 61 6c 73 2e 0a  mutable locals..
2150: 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20      #[inline].  
2160: 20 20 70 75 62 20 66 6e 20 6d 75 74 5f 76 61 72    pub fn mut_var
2170: 73 5f 69 74 65 72 3c 27 61 3e 28 26 27 61 20 73  s_iter<'a>(&'a s
2180: 65 6c 66 29 20 2d 3e 20 69 6d 70 6c 20 49 74 65  elf) -> impl Ite
2190: 72 61 74 6f 72 3c 49 74 65 6d 20 3d 20 4c 6f 63  rator<Item = Loc
21a0: 61 6c 3e 20 2b 20 27 61 20 7b 0a 20 20 20 20 20  al> + 'a {.     
21b0: 20 20 20 28 73 65 6c 66 2e 61 72 67 5f 63 6f 75     (self.arg_cou
21c0: 6e 74 20 2b 20 31 2e 2e 73 65 6c 66 2e 6c 6f 63  nt + 1..self.loc
21d0: 61 6c 5f 64 65 63 6c 73 2e 6c 65 6e 28 29 29 2e  al_decls.len()).
21e0: 66 69 6c 74 65 72 5f 6d 61 70 28 6d 6f 76 65 20  filter_map(move 
21f0: 7c 69 6e 64 65 78 7c 20 7b 0a 20 20 20 20 20 20  |index| {.      
2200: 20 20 20 20 20 20 6c 65 74 20 6c 6f 63 61 6c 20        let local 
2210: 3d 20 4c 6f 63 61 6c 3a 3a 6e 65 77 28 69 6e 64  = Local::new(ind
2220: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ex);.           
2230: 20 6c 65 74 20 64 65 63 6c 20 3d 20 26 73 65 6c   let decl = &sel
2240: 66 2e 6c 6f 63 61 6c 5f 64 65 63 6c 73 5b 6c 6f  f.local_decls[lo
2250: 63 61 6c 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  cal];.          
2260: 20 20 69 66 20 64 65 63 6c 2e 69 73 5f 75 73 65    if decl.is_use
2270: 72 5f 76 61 72 69 61 62 6c 65 28 29 20 26 26 20  r_variable() && 
2280: 64 65 63 6c 2e 6d 75 74 61 62 69 6c 69 74 79 20  decl.mutability 
2290: 3d 3d 20 4d 75 74 61 62 69 6c 69 74 79 3a 3a 4d  == Mutability::M
22a0: 75 74 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ut {.           
22b0: 20 20 20 20 20 53 6f 6d 65 28 6c 6f 63 61 6c 29       Some(local)
22c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
22d0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
22e0: 20 20 20 20 20 20 4e 6f 6e 65 0a 20 20 20 20 20        None.     
22f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2300: 20 7d 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   }).    }..    /
2310: 2f 2f 20 52 65 74 75 72 6e 73 20 61 6e 20 69 74  // Returns an it
2320: 65 72 61 74 6f 72 20 6f 76 65 72 20 61 6c 6c 20  erator over all 
2330: 75 73 65 72 2d 64 65 63 6c 61 72 65 64 20 6d 75  user-declared mu
2340: 74 61 62 6c 65 20 61 72 67 75 6d 65 6e 74 73 20  table arguments 
2350: 61 6e 64 20 6c 6f 63 61 6c 73 2e 0a 20 20 20 20  and locals..    
2360: 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 70 75  #[inline].    pu
2370: 62 20 66 6e 20 6d 75 74 5f 76 61 72 73 5f 61 6e  b fn mut_vars_an
2380: 64 5f 61 72 67 73 5f 69 74 65 72 3c 27 61 3e 28  d_args_iter<'a>(
2390: 26 27 61 20 73 65 6c 66 29 20 2d 3e 20 69 6d 70  &'a self) -> imp
23a0: 6c 20 49 74 65 72 61 74 6f 72 3c 49 74 65 6d 20  l Iterator<Item 
23b0: 3d 20 4c 6f 63 61 6c 3e 20 2b 20 27 61 20 7b 0a  = Local> + 'a {.
23c0: 20 20 20 20 20 20 20 20 28 31 2e 2e 73 65 6c 66          (1..self
23d0: 2e 6c 6f 63 61 6c 5f 64 65 63 6c 73 2e 6c 65 6e  .local_decls.len
23e0: 28 29 29 2e 66 69 6c 74 65 72 5f 6d 61 70 28 6d  ()).filter_map(m
23f0: 6f 76 65 20 7c 69 6e 64 65 78 7c 20 7b 0a 20 20  ove |index| {.  
2400: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6c 6f            let lo
2410: 63 61 6c 20 3d 20 4c 6f 63 61 6c 3a 3a 6e 65 77  cal = Local::new
2420: 28 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20  (index);.       
2430: 20 20 20 20 20 6c 65 74 20 64 65 63 6c 20 3d 20       let decl = 
2440: 26 73 65 6c 66 2e 6c 6f 63 61 6c 5f 64 65 63 6c  &self.local_decl
2450: 73 5b 6c 6f 63 61 6c 5d 3b 0a 20 20 20 20 20 20  s[local];.      
2460: 20 20 20 20 20 20 69 66 20 28 64 65 63 6c 2e 69        if (decl.i
2470: 73 5f 75 73 65 72 5f 76 61 72 69 61 62 6c 65 28  s_user_variable(
2480: 29 20 7c 7c 20 69 6e 64 65 78 20 3c 20 73 65 6c  ) || index < sel
2490: 66 2e 61 72 67 5f 63 6f 75 6e 74 20 2b 20 31 29  f.arg_count + 1)
24a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24b0: 20 26 26 20 64 65 63 6c 2e 6d 75 74 61 62 69 6c   && decl.mutabil
24c0: 69 74 79 20 3d 3d 20 4d 75 74 61 62 69 6c 69 74  ity == Mutabilit
24d0: 79 3a 3a 4d 75 74 0a 20 20 20 20 20 20 20 20 20  y::Mut.         
24e0: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20     {.           
24f0: 20 20 20 20 20 53 6f 6d 65 28 6c 6f 63 61 6c 29       Some(local)
2500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
2510: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
2520: 20 20 20 20 20 20 4e 6f 6e 65 0a 20 20 20 20 20        None.     
2530: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2540: 20 7d 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   }).    }..    /
2550: 2f 2f 20 52 65 74 75 72 6e 73 20 61 6e 20 69 74  // Returns an it
2560: 65 72 61 74 6f 72 20 6f 76 65 72 20 61 6c 6c 20  erator over all 
2570: 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
2580: 74 73 2e 0a 20 20 20 20 23 5b 69 6e 6c 69 6e 65  ts..    #[inline
2590: 5d 0a 20 20 20 20 70 75 62 20 66 6e 20 61 72 67  ].    pub fn arg
25a0: 73 5f 69 74 65 72 28 26 73 65 6c 66 29 20 2d 3e  s_iter(&self) ->
25b0: 20 69 6d 70 6c 20 49 74 65 72 61 74 6f 72 3c 49   impl Iterator<I
25c0: 74 65 6d 20 3d 20 4c 6f 63 61 6c 3e 20 2b 20 45  tem = Local> + E
25d0: 78 61 63 74 53 69 7a 65 49 74 65 72 61 74 6f 72  xactSizeIterator
25e0: 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 61   {.        let a
25f0: 72 67 5f 63 6f 75 6e 74 20 3d 20 73 65 6c 66 2e  rg_count = self.
2600: 61 72 67 5f 63 6f 75 6e 74 3b 0a 20 20 20 20 20  arg_count;.     
2610: 20 20 20 28 31 2e 2e 61 72 67 5f 63 6f 75 6e 74     (1..arg_count
2620: 20 2b 20 31 29 2e 6d 61 70 28 4c 6f 63 61 6c 3a   + 1).map(Local:
2630: 3a 6e 65 77 29 0a 20 20 20 20 7d 0a 0a 20 20 20  :new).    }..   
2640: 20 2f 2f 2f 20 52 65 74 75 72 6e 73 20 61 6e 20   /// Returns an 
2650: 69 74 65 72 61 74 6f 72 20 6f 76 65 72 20 61 6c  iterator over al
2660: 6c 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 76  l user-defined v
2670: 61 72 69 61 62 6c 65 73 20 61 6e 64 20 63 6f 6d  ariables and com
2680: 70 69 6c 65 72 2d 67 65 6e 65 72 61 74 65 64 20  piler-generated 
2690: 74 65 6d 70 6f 72 61 72 69 65 73 20 28 61 6c 6c  temporaries (all
26a0: 0a 20 20 20 20 2f 2f 2f 20 6c 6f 63 61 6c 73 20  .    /// locals 
26b0: 74 68 61 74 20 61 72 65 20 6e 65 69 74 68 65 72  that are neither
26c0: 20 61 72 67 75 6d 65 6e 74 73 20 6e 6f 72 20 74   arguments nor t
26d0: 68 65 20 72 65 74 75 72 6e 20 70 6c 61 63 65 29  he return place)
26e0: 2e 0a 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a  ..    #[inline].
26f0: 20 20 20 20 70 75 62 20 66 6e 20 76 61 72 73 5f      pub fn vars_
2700: 61 6e 64 5f 74 65 6d 70 73 5f 69 74 65 72 28 26  and_temps_iter(&
2710: 73 65 6c 66 29 20 2d 3e 20 69 6d 70 6c 20 49 74  self) -> impl It
2720: 65 72 61 74 6f 72 3c 49 74 65 6d 20 3d 20 4c 6f  erator<Item = Lo
2730: 63 61 6c 3e 20 2b 20 45 78 61 63 74 53 69 7a 65  cal> + ExactSize
2740: 49 74 65 72 61 74 6f 72 20 7b 0a 20 20 20 20 20  Iterator {.     
2750: 20 20 20 6c 65 74 20 61 72 67 5f 63 6f 75 6e 74     let arg_count
2760: 20 3d 20 73 65 6c 66 2e 61 72 67 5f 63 6f 75 6e   = self.arg_coun
2770: 74 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6c  t;.        let l
2780: 6f 63 61 6c 5f 63 6f 75 6e 74 20 3d 20 73 65 6c  ocal_count = sel
2790: 66 2e 6c 6f 63 61 6c 5f 64 65 63 6c 73 2e 6c 65  f.local_decls.le
27a0: 6e 28 29 3b 0a 20 20 20 20 20 20 20 20 28 61 72  n();.        (ar
27b0: 67 5f 63 6f 75 6e 74 20 2b 20 31 2e 2e 6c 6f 63  g_count + 1..loc
27c0: 61 6c 5f 63 6f 75 6e 74 29 2e 6d 61 70 28 4c 6f  al_count).map(Lo
27d0: 63 61 6c 3a 3a 6e 65 77 29 0a 20 20 20 20 7d 0a  cal::new).    }.
27e0: 0a 20 20 20 20 2f 2f 2f 20 43 68 61 6e 67 65 73  .    /// Changes
27f0: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20   a statement to 
2800: 61 20 6e 6f 70 2e 20 54 68 69 73 20 69 73 20 62  a nop. This is b
2810: 6f 74 68 20 66 61 73 74 65 72 20 74 68 61 6e 20  oth faster than 
2820: 64 65 6c 65 74 69 6e 67 20 69 6e 73 74 72 75 63  deleting instruc
2830: 74 69 6f 6e 73 20 61 6e 64 20 61 76 6f 69 64 73  tions and avoids
2840: 0a 20 20 20 20 2f 2f 2f 20 69 6e 76 61 6c 69 64  .    /// invalid
2850: 61 74 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20  ating statement 
2860: 69 6e 64 69 63 65 73 20 69 6e 20 60 4c 6f 63 61  indices in `Loca
2870: 74 69 6f 6e 60 73 2e 0a 20 20 20 20 70 75 62 20  tion`s..    pub 
2880: 66 6e 20 6d 61 6b 65 5f 73 74 61 74 65 6d 65 6e  fn make_statemen
2890: 74 5f 6e 6f 70 28 26 6d 75 74 20 73 65 6c 66 2c  t_nop(&mut self,
28a0: 20 6c 6f 63 61 74 69 6f 6e 3a 20 4c 6f 63 61 74   location: Locat
28b0: 69 6f 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 6c  ion) {.        l
28c0: 65 74 20 62 6c 6f 63 6b 20 3d 20 26 6d 75 74 20  et block = &mut 
28d0: 73 65 6c 66 2e 62 61 73 69 63 5f 62 6c 6f 63 6b  self.basic_block
28e0: 73 5b 6c 6f 63 61 74 69 6f 6e 2e 62 6c 6f 63 6b  s[location.block
28f0: 5d 3b 0a 20 20 20 20 20 20 20 20 64 65 62 75 67  ];.        debug
2900: 5f 61 73 73 65 72 74 21 28 6c 6f 63 61 74 69 6f  _assert!(locatio
2910: 6e 2e 73 74 61 74 65 6d 65 6e 74 5f 69 6e 64 65  n.statement_inde
2920: 78 20 3c 20 62 6c 6f 63 6b 2e 73 74 61 74 65 6d  x < block.statem
2930: 65 6e 74 73 2e 6c 65 6e 28 29 29 3b 0a 20 20 20  ents.len());.   
2940: 20 20 20 20 20 62 6c 6f 63 6b 2e 73 74 61 74 65       block.state
2950: 6d 65 6e 74 73 5b 6c 6f 63 61 74 69 6f 6e 2e 73  ments[location.s
2960: 74 61 74 65 6d 65 6e 74 5f 69 6e 64 65 78 5d 2e  tatement_index].
2970: 6d 61 6b 65 5f 6e 6f 70 28 29 0a 20 20 20 20 7d  make_nop().    }
2980: 0a 0a 20 20 20 20 2f 2f 2f 20 52 65 74 75 72 6e  ..    /// Return
2990: 73 20 74 68 65 20 73 6f 75 72 63 65 20 69 6e 66  s the source inf
29a0: 6f 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  o associated wit
29b0: 68 20 60 6c 6f 63 61 74 69 6f 6e 60 2e 0a 20 20  h `location`..  
29c0: 20 20 70 75 62 20 66 6e 20 73 6f 75 72 63 65 5f    pub fn source_
29d0: 69 6e 66 6f 28 26 73 65 6c 66 2c 20 6c 6f 63 61  info(&self, loca
29e0: 74 69 6f 6e 3a 20 4c 6f 63 61 74 69 6f 6e 29 20  tion: Location) 
29f0: 2d 3e 20 26 53 6f 75 72 63 65 49 6e 66 6f 20 7b  -> &SourceInfo {
2a00: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 62 6c 6f  .        let blo
2a10: 63 6b 20 3d 20 26 73 65 6c 66 5b 6c 6f 63 61 74  ck = &self[locat
2a20: 69 6f 6e 2e 62 6c 6f 63 6b 5d 3b 0a 20 20 20 20  ion.block];.    
2a30: 20 20 20 20 6c 65 74 20 73 74 6d 74 73 20 3d 20      let stmts = 
2a40: 26 62 6c 6f 63 6b 2e 73 74 61 74 65 6d 65 6e 74  &block.statement
2a50: 73 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 69  s;.        let i
2a60: 64 78 20 3d 20 6c 6f 63 61 74 69 6f 6e 2e 73 74  dx = location.st
2a70: 61 74 65 6d 65 6e 74 5f 69 6e 64 65 78 3b 0a 20  atement_index;. 
2a80: 20 20 20 20 20 20 20 69 66 20 69 64 78 20 3c 20         if idx < 
2a90: 73 74 6d 74 73 2e 6c 65 6e 28 29 20 7b 0a 20 20  stmts.len() {.  
2aa0: 20 20 20 20 20 20 20 20 20 20 26 73 74 6d 74 73            &stmts
2ab0: 5b 69 64 78 5d 2e 73 6f 75 72 63 65 5f 69 6e 66  [idx].source_inf
2ac0: 6f 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  o.        } else
2ad0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61   {.            a
2ae0: 73 73 65 72 74 5f 65 71 21 28 69 64 78 2c 20 73  ssert_eq!(idx, s
2af0: 74 6d 74 73 2e 6c 65 6e 28 29 29 3b 0a 20 20 20  tmts.len());.   
2b00: 20 20 20 20 20 20 20 20 20 26 62 6c 6f 63 6b 2e           &block.
2b10: 74 65 72 6d 69 6e 61 74 6f 72 28 29 2e 73 6f 75  terminator().sou
2b20: 72 63 65 5f 69 6e 66 6f 0a 20 20 20 20 20 20 20  rce_info.       
2b30: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f   }.    }..    //
2b40: 2f 20 43 68 65 63 6b 73 20 69 66 20 60 73 75 62  / Checks if `sub
2b50: 60 20 69 73 20 61 20 73 75 62 20 73 63 6f 70 65  ` is a sub scope
2b60: 20 6f 66 20 60 73 75 70 60 0a 20 20 20 20 70 75   of `sup`.    pu
2b70: 62 20 66 6e 20 69 73 5f 73 75 62 5f 73 63 6f 70  b fn is_sub_scop
2b80: 65 28 26 73 65 6c 66 2c 20 6d 75 74 20 73 75 62  e(&self, mut sub
2b90: 3a 20 53 6f 75 72 63 65 53 63 6f 70 65 2c 20 73  : SourceScope, s
2ba0: 75 70 3a 20 53 6f 75 72 63 65 53 63 6f 70 65 29  up: SourceScope)
2bb0: 20 2d 3e 20 62 6f 6f 6c 20 7b 0a 20 20 20 20 20   -> bool {.     
2bc0: 20 20 20 77 68 69 6c 65 20 73 75 62 20 21 3d 20     while sub != 
2bd0: 73 75 70 20 7b 0a 20 20 20 20 20 20 20 20 20 20  sup {.          
2be0: 20 20 6d 61 74 63 68 20 73 65 6c 66 2e 73 6f 75    match self.sou
2bf0: 72 63 65 5f 73 63 6f 70 65 73 5b 73 75 62 5d 2e  rce_scopes[sub].
2c00: 70 61 72 65 6e 74 5f 73 63 6f 70 65 20 7b 0a 20  parent_scope {. 
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
2c20: 6f 6e 65 20 3d 3e 20 72 65 74 75 72 6e 20 66 61  one => return fa
2c30: 6c 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  lse,.           
2c40: 20 20 20 20 20 53 6f 6d 65 28 70 29 20 3d 3e 20       Some(p) => 
2c50: 73 75 62 20 3d 20 70 2c 0a 20 20 20 20 20 20 20  sub = p,.       
2c60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2c70: 0a 20 20 20 20 20 20 20 20 74 72 75 65 0a 20 20  .        true.  
2c80: 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 52 65 74    }..    /// Ret
2c90: 75 72 6e 73 20 74 68 65 20 72 65 74 75 72 6e 20  urns the return 
2ca0: 74 79 70 65 3b 20 69 74 20 61 6c 77 61 79 73 20  type; it always 
2cb0: 72 65 74 75 72 6e 20 66 69 72 73 74 20 65 6c 65  return first ele
2cc0: 6d 65 6e 74 20 66 72 6f 6d 20 60 6c 6f 63 61 6c  ment from `local
2cd0: 5f 64 65 63 6c 73 60 20 61 72 72 61 79 2e 0a 20  _decls` array.. 
2ce0: 20 20 20 70 75 62 20 66 6e 20 72 65 74 75 72 6e     pub fn return
2cf0: 5f 74 79 28 26 73 65 6c 66 29 20 2d 3e 20 54 79  _ty(&self) -> Ty
2d00: 3c 27 74 63 78 3e 20 7b 0a 20 20 20 20 20 20 20  <'tcx> {.       
2d10: 20 73 65 6c 66 2e 6c 6f 63 61 6c 5f 64 65 63 6c   self.local_decl
2d20: 73 5b 52 45 54 55 52 4e 5f 50 4c 41 43 45 5d 2e  s[RETURN_PLACE].
2d30: 74 79 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f  ty.    }..    //
2d40: 2f 20 47 65 74 73 20 74 68 65 20 6c 6f 63 61 74  / Gets the locat
2d50: 69 6f 6e 20 6f 66 20 74 68 65 20 74 65 72 6d 69  ion of the termi
2d60: 6e 61 74 6f 72 20 66 6f 72 20 74 68 65 20 67 69  nator for the gi
2d70: 76 65 6e 20 62 6c 6f 63 6b 2e 0a 20 20 20 20 70  ven block..    p
2d80: 75 62 20 66 6e 20 74 65 72 6d 69 6e 61 74 6f 72  ub fn terminator
2d90: 5f 6c 6f 63 28 26 73 65 6c 66 2c 20 62 62 3a 20  _loc(&self, bb: 
2da0: 42 61 73 69 63 42 6c 6f 63 6b 29 20 2d 3e 20 4c  BasicBlock) -> L
2db0: 6f 63 61 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20  ocation {.      
2dc0: 20 20 4c 6f 63 61 74 69 6f 6e 20 7b 20 62 6c 6f    Location { blo
2dd0: 63 6b 3a 20 62 62 2c 20 73 74 61 74 65 6d 65 6e  ck: bb, statemen
2de0: 74 5f 69 6e 64 65 78 3a 20 73 65 6c 66 5b 62 62  t_index: self[bb
2df0: 5d 2e 73 74 61 74 65 6d 65 6e 74 73 2e 6c 65 6e  ].statements.len
2e00: 28 29 20 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 23 5b  () }.    }.}..#[
2e10: 64 65 72 69 76 65 28 43 6f 70 79 2c 20 43 6c 6f  derive(Copy, Clo
2e20: 6e 65 2c 20 44 65 62 75 67 2c 20 52 75 73 74 63  ne, Debug, Rustc
2e30: 45 6e 63 6f 64 61 62 6c 65 2c 20 52 75 73 74 63  Encodable, Rustc
2e40: 44 65 63 6f 64 61 62 6c 65 2c 20 48 61 73 68 53  Decodable, HashS
2e50: 74 61 62 6c 65 29 5d 0a 70 75 62 20 65 6e 75 6d  table)].pub enum
2e60: 20 53 61 66 65 74 79 20 7b 0a 20 20 20 20 53 61   Safety {.    Sa
2e70: 66 65 2c 0a 20 20 20 20 2f 2f 2f 20 55 6e 73 61  fe,.    /// Unsa
2e80: 66 65 20 62 65 63 61 75 73 65 20 6f 66 20 61 20  fe because of a 
2e90: 50 75 73 68 55 6e 73 61 66 65 42 6c 6f 63 6b 0a  PushUnsafeBlock.
2ea0: 20 20 20 20 42 75 69 6c 74 69 6e 55 6e 73 61 66      BuiltinUnsaf
2eb0: 65 2c 0a 20 20 20 20 2f 2f 2f 20 55 6e 73 61 66  e,.    /// Unsaf
2ec0: 65 20 62 65 63 61 75 73 65 20 6f 66 20 61 6e 20  e because of an 
2ed0: 75 6e 73 61 66 65 20 66 6e 0a 20 20 20 20 46 6e  unsafe fn.    Fn
2ee0: 55 6e 73 61 66 65 2c 0a 20 20 20 20 2f 2f 2f 20  Unsafe,.    /// 
2ef0: 55 6e 73 61 66 65 20 62 65 63 61 75 73 65 20 6f  Unsafe because o
2f00: 66 20 61 6e 20 60 75 6e 73 61 66 65 60 20 62 6c  f an `unsafe` bl
2f10: 6f 63 6b 0a 20 20 20 20 45 78 70 6c 69 63 69 74  ock.    Explicit
2f20: 55 6e 73 61 66 65 28 68 69 72 3a 3a 48 69 72 49  Unsafe(hir::HirI
2f30: 64 29 2c 0a 7d 0a 0a 69 6d 70 6c 3c 27 74 63 78  d),.}..impl<'tcx
2f40: 3e 20 49 6e 64 65 78 3c 42 61 73 69 63 42 6c 6f  > Index<BasicBlo
2f50: 63 6b 3e 20 66 6f 72 20 42 6f 64 79 3c 27 74 63  ck> for Body<'tc
2f60: 78 3e 20 7b 0a 20 20 20 20 74 79 70 65 20 4f 75  x> {.    type Ou
2f70: 74 70 75 74 20 3d 20 42 61 73 69 63 42 6c 6f 63  tput = BasicBloc
2f80: 6b 44 61 74 61 3c 27 74 63 78 3e 3b 0a 0a 20 20  kData<'tcx>;..  
2f90: 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20    #[inline].    
2fa0: 66 6e 20 69 6e 64 65 78 28 26 73 65 6c 66 2c 20  fn index(&self, 
2fb0: 69 6e 64 65 78 3a 20 42 61 73 69 63 42 6c 6f 63  index: BasicBloc
2fc0: 6b 29 20 2d 3e 20 26 42 61 73 69 63 42 6c 6f 63  k) -> &BasicBloc
2fd0: 6b 44 61 74 61 3c 27 74 63 78 3e 20 7b 0a 20 20  kData<'tcx> {.  
2fe0: 20 20 20 20 20 20 26 73 65 6c 66 2e 62 61 73 69        &self.basi
2ff0: 63 5f 62 6c 6f 63 6b 73 28 29 5b 69 6e 64 65 78  c_blocks()[index
3000: 5d 0a 20 20 20 20 7d 0a 7d 0a 0a 23 5b 64 65 72  ].    }.}..#[der
3010: 69 76 65 28 43 6f 70 79 2c 20 43 6c 6f 6e 65 2c  ive(Copy, Clone,
3020: 20 44 65 62 75 67 2c 20 48 61 73 68 53 74 61 62   Debug, HashStab
3030: 6c 65 2c 20 54 79 70 65 46 6f 6c 64 61 62 6c 65  le, TypeFoldable
3040: 29 5d 0a 70 75 62 20 65 6e 75 6d 20 43 6c 65 61  )].pub enum Clea
3050: 72 43 72 6f 73 73 43 72 61 74 65 3c 54 3e 20 7b  rCrossCrate<T> {
3060: 0a 20 20 20 20 43 6c 65 61 72 2c 0a 20 20 20 20  .    Clear,.    
3070: 53 65 74 28 54 29 2c 0a 7d 0a 0a 69 6d 70 6c 3c  Set(T),.}..impl<
3080: 54 3e 20 43 6c 65 61 72 43 72 6f 73 73 43 72 61  T> ClearCrossCra
3090: 74 65 3c 54 3e 20 7b 0a 20 20 20 20 70 75 62 20  te<T> {.    pub 
30a0: 66 6e 20 61 73 5f 72 65 66 28 26 27 61 20 73 65  fn as_ref(&'a se
30b0: 6c 66 29 20 2d 3e 20 43 6c 65 61 72 43 72 6f 73  lf) -> ClearCros
30c0: 73 43 72 61 74 65 3c 26 27 61 20 54 3e 20 7b 0a  sCrate<&'a T> {.
30d0: 20 20 20 20 20 20 20 20 6d 61 74 63 68 20 73 65          match se
30e0: 6c 66 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lf {.           
30f0: 20 43 6c 65 61 72 43 72 6f 73 73 43 72 61 74 65   ClearCrossCrate
3100: 3a 3a 43 6c 65 61 72 20 3d 3e 20 43 6c 65 61 72  ::Clear => Clear
3110: 43 72 6f 73 73 43 72 61 74 65 3a 3a 43 6c 65 61  CrossCrate::Clea
3120: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 43  r,.            C
3130: 6c 65 61 72 43 72 6f 73 73 43 72 61 74 65 3a 3a  learCrossCrate::
3140: 53 65 74 28 76 29 20 3d 3e 20 43 6c 65 61 72 43  Set(v) => ClearC
3150: 72 6f 73 73 43 72 61 74 65 3a 3a 53 65 74 28 76  rossCrate::Set(v
3160: 29 2c 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ),.        }.   
3170: 20 7d 0a 0a 20 20 20 20 70 75 62 20 66 6e 20 61   }..    pub fn a
3180: 73 73 65 72 74 5f 63 72 61 74 65 5f 6c 6f 63 61  ssert_crate_loca
3190: 6c 28 73 65 6c 66 29 20 2d 3e 20 54 20 7b 0a 20  l(self) -> T {. 
31a0: 20 20 20 20 20 20 20 6d 61 74 63 68 20 73 65 6c         match sel
31b0: 66 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  f {.            
31c0: 43 6c 65 61 72 43 72 6f 73 73 43 72 61 74 65 3a  ClearCrossCrate:
31d0: 3a 43 6c 65 61 72 20 3d 3e 20 62 75 67 21 28 22  :Clear => bug!("
31e0: 75 6e 77 72 61 70 70 69 6e 67 20 63 72 6f 73 73  unwrapping cross
31f0: 2d 63 72 61 74 65 20 64 61 74 61 22 29 2c 0a 20  -crate data"),. 
3200: 20 20 20 20 20 20 20 20 20 20 20 43 6c 65 61 72             Clear
3210: 43 72 6f 73 73 43 72 61 74 65 3a 3a 53 65 74 28  CrossCrate::Set(
3220: 76 29 20 3d 3e 20 76 2c 0a 20 20 20 20 20 20 20  v) => v,.       
3230: 20 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 69 6d 70 6c   }.    }.}..impl
3240: 3c 54 3a 20 45 6e 63 6f 64 61 62 6c 65 3e 20 72  <T: Encodable> r
3250: 75 73 74 63 5f 73 65 72 69 61 6c 69 7a 65 3a 3a  ustc_serialize::
3260: 55 73 65 53 70 65 63 69 61 6c 69 7a 65 64 45 6e  UseSpecializedEn
3270: 63 6f 64 61 62 6c 65 20 66 6f 72 20 43 6c 65 61  codable for Clea
3280: 72 43 72 6f 73 73 43 72 61 74 65 3c 54 3e 20 7b  rCrossCrate<T> {
3290: 7d 0a 69 6d 70 6c 3c 54 3a 20 44 65 63 6f 64 61  }.impl<T: Decoda
32a0: 62 6c 65 3e 20 72 75 73 74 63 5f 73 65 72 69 61  ble> rustc_seria
32b0: 6c 69 7a 65 3a 3a 55 73 65 53 70 65 63 69 61 6c  lize::UseSpecial
32c0: 69 7a 65 64 44 65 63 6f 64 61 62 6c 65 20 66 6f  izedDecodable fo
32d0: 72 20 43 6c 65 61 72 43 72 6f 73 73 43 72 61 74  r ClearCrossCrat
32e0: 65 3c 54 3e 20 7b 7d 0a 0a 2f 2f 2f 20 47 72 6f  e<T> {}../// Gro
32f0: 75 70 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  uped information
3300: 20 61 62 6f 75 74 20 74 68 65 20 73 6f 75 72 63   about the sourc
3310: 65 20 63 6f 64 65 20 6f 72 69 67 69 6e 20 6f 66  e code origin of
3320: 20 61 20 4d 49 52 20 65 6e 74 69 74 79 2e 0a 2f   a MIR entity../
3330: 2f 2f 20 49 6e 74 65 6e 64 65 64 20 74 6f 20 62  // Intended to b
3340: 65 20 69 6e 73 70 65 63 74 65 64 20 62 79 20 64  e inspected by d
3350: 69 61 67 6e 6f 73 74 69 63 73 20 61 6e 64 20 64  iagnostics and d
3360: 65 62 75 67 69 6e 66 6f 2e 0a 2f 2f 2f 20 4d 6f  ebuginfo../// Mo
3370: 73 74 20 70 61 73 73 65 73 20 63 61 6e 20 77 6f  st passes can wo
3380: 72 6b 20 77 69 74 68 20 69 74 20 61 73 20 61 20  rk with it as a 
3390: 77 68 6f 6c 65 2c 20 77 69 74 68 69 6e 20 61 20  whole, within a 
33a0: 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f 6e 2e  single function.
33b0: 0a 2f 2f 20 54 68 65 20 75 6e 6f 66 66 69 63 69  .// The unoffici
33c0: 61 6c 20 43 72 61 6e 65 6c 69 66 74 20 62 61 63  al Cranelift bac
33d0: 6b 65 6e 64 2c 20 61 74 20 6c 65 61 73 74 20 61  kend, at least a
33e0: 73 20 6f 66 20 23 36 35 38 32 38 2c 20 6e 65 65  s of #65828, nee
33f0: 64 73 20 60 53 6f 75 72 63 65 49 6e 66 6f 60 20  ds `SourceInfo` 
3400: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 60 45 71  to implement `Eq
3410: 60 20 61 6e 64 0a 2f 2f 20 60 48 61 73 68 60 2e  ` and.// `Hash`.
3420: 20 50 6c 65 61 73 65 20 70 69 6e 67 20 40 62 6a   Please ping @bj
3430: 6f 72 6e 33 20 69 66 20 72 65 6d 6f 76 69 6e 67  orn3 if removing
3440: 20 74 68 65 6d 2e 0a 23 5b 64 65 72 69 76 65 28   them..#[derive(
3450: 43 6f 70 79 2c 20 43 6c 6f 6e 65 2c 20 44 65 62  Copy, Clone, Deb
3460: 75 67 2c 20 45 71 2c 20 50 61 72 74 69 61 6c 45  ug, Eq, PartialE
3470: 71 2c 20 52 75 73 74 63 45 6e 63 6f 64 61 62 6c  q, RustcEncodabl
3480: 65 2c 20 52 75 73 74 63 44 65 63 6f 64 61 62 6c  e, RustcDecodabl
3490: 65 2c 20 48 61 73 68 2c 20 48 61 73 68 53 74 61  e, Hash, HashSta
34a0: 62 6c 65 29 5d 0a 70 75 62 20 73 74 72 75 63 74  ble)].pub struct
34b0: 20 53 6f 75 72 63 65 49 6e 66 6f 20 7b 0a 20 20   SourceInfo {.  
34c0: 20 20 2f 2f 2f 20 54 68 65 20 73 6f 75 72 63 65    /// The source
34d0: 20 73 70 61 6e 20 66 6f 72 20 74 68 65 20 41 53   span for the AS
34e0: 54 20 70 65 72 74 61 69 6e 69 6e 67 20 74 6f 20  T pertaining to 
34f0: 74 68 69 73 20 4d 49 52 20 65 6e 74 69 74 79 2e  this MIR entity.
3500: 0a 20 20 20 20 70 75 62 20 73 70 61 6e 3a 20 53  .    pub span: S
3510: 70 61 6e 2c 0a 0a 20 20 20 20 2f 2f 2f 20 54 68  pan,..    /// Th
3520: 65 20 73 6f 75 72 63 65 20 73 63 6f 70 65 2c 20  e source scope, 
3530: 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66  keeping track of
3540: 20 77 68 69 63 68 20 62 69 6e 64 69 6e 67 73 20   which bindings 
3550: 63 61 6e 20 62 65 0a 20 20 20 20 2f 2f 2f 20 73  can be.    /// s
3560: 65 65 6e 20 62 79 20 64 65 62 75 67 69 6e 66 6f  een by debuginfo
3570: 2c 20 61 63 74 69 76 65 20 6c 69 6e 74 20 6c 65  , active lint le
3580: 76 65 6c 73 2c 20 60 75 6e 73 61 66 65 20 7b 2e  vels, `unsafe {.
3590: 2e 2e 7d 60 2c 20 65 74 63 2e 0a 20 20 20 20 70  ..}`, etc..    p
35a0: 75 62 20 73 63 6f 70 65 3a 20 53 6f 75 72 63 65  ub scope: Source
35b0: 53 63 6f 70 65 2c 0a 7d 0a 0a 2f 2f 2f 2f 2f 2f  Scope,.}..//////
35c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
35d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
35e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
35f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3600: 2f 2f 2f 2f 2f 0a 2f 2f 20 4d 75 74 61 62 69 6c  /////.// Mutabil
3610: 69 74 79 20 61 6e 64 20 62 6f 72 72 6f 77 20 6b  ity and borrow k
3620: 69 6e 64 73 0a 0a 23 5b 64 65 72 69 76 65 28 43  inds..#[derive(C
3630: 6f 70 79 2c 20 43 6c 6f 6e 65 2c 20 44 65 62 75  opy, Clone, Debu
3640: 67 2c 20 50 61 72 74 69 61 6c 45 71 2c 20 45 71  g, PartialEq, Eq
3650: 2c 20 52 75 73 74 63 45 6e 63 6f 64 61 62 6c 65  , RustcEncodable
3660: 2c 20 52 75 73 74 63 44 65 63 6f 64 61 62 6c 65  , RustcDecodable
3670: 2c 20 48 61 73 68 53 74 61 62 6c 65 29 5d 0a 70  , HashStable)].p
3680: 75 62 20 65 6e 75 6d 20 4d 75 74 61 62 69 6c 69  ub enum Mutabili
3690: 74 79 20 7b 0a 20 20 20 20 4d 75 74 2c 0a 20 20  ty {.    Mut,.  
36a0: 20 20 4e 6f 74 2c 0a 7d 0a 0a 69 6d 70 6c 20 46    Not,.}..impl F
36b0: 72 6f 6d 3c 4d 75 74 61 62 69 6c 69 74 79 3e 20  rom<Mutability> 
36c0: 66 6f 72 20 68 69 72 3a 3a 4d 75 74 61 62 69 6c  for hir::Mutabil
36d0: 69 74 79 20 7b 0a 20 20 20 20 66 6e 20 66 72 6f  ity {.    fn fro
36e0: 6d 28 6d 3a 20 4d 75 74 61 62 69 6c 69 74 79 29  m(m: Mutability)
36f0: 20 2d 3e 20 53 65 6c 66 20 7b 0a 20 20 20 20 20   -> Self {.     
3700: 20 20 20 6d 61 74 63 68 20 6d 20 7b 0a 20 20 20     match m {.   
3710: 20 20 20 20 20 20 20 20 20 4d 75 74 61 62 69 6c           Mutabil
3720: 69 74 79 3a 3a 4d 75 74 20 3d 3e 20 68 69 72 3a  ity::Mut => hir:
3730: 3a 4d 75 74 61 62 69 6c 69 74 79 3a 3a 4d 75 74  :Mutability::Mut
3740: 61 62 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20  able,.          
3750: 20 20 4d 75 74 61 62 69 6c 69 74 79 3a 3a 4e 6f    Mutability::No
3760: 74 20 3d 3e 20 68 69 72 3a 3a 4d 75 74 61 62 69  t => hir::Mutabi
3770: 6c 69 74 79 3a 3a 49 6d 6d 75 74 61 62 6c 65 2c  lity::Immutable,
3780: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
3790: 0a 7d 0a 0a 23 5b 64 65 72 69 76 65 28 0a 20 20  .}..#[derive(.  
37a0: 20 20 43 6f 70 79 2c 20 43 6c 6f 6e 65 2c 20 44    Copy, Clone, D
37b0: 65 62 75 67 2c 20 50 61 72 74 69 61 6c 45 71 2c  ebug, PartialEq,
37c0: 20 45 71 2c 20 50 61 72 74 69 61 6c 4f 72 64 2c   Eq, PartialOrd,
37d0: 20 4f 72 64 2c 20 52 75 73 74 63 45 6e 63 6f 64   Ord, RustcEncod
37e0: 61 62 6c 65 2c 20 52 75 73 74 63 44 65 63 6f 64  able, RustcDecod
37f0: 61 62 6c 65 2c 20 48 61 73 68 53 74 61 62 6c 65  able, HashStable
3800: 2c 0a 29 5d 0a 70 75 62 20 65 6e 75 6d 20 42 6f  ,.)].pub enum Bo
3810: 72 72 6f 77 4b 69 6e 64 20 7b 0a 20 20 20 20 2f  rrowKind {.    /
3820: 2f 2f 20 44 61 74 61 20 6d 75 73 74 20 62 65 20  // Data must be 
3830: 69 6d 6d 75 74 61 62 6c 65 20 61 6e 64 20 69 73  immutable and is
3840: 20 61 6c 69 61 73 61 62 6c 65 2e 0a 20 20 20 20   aliasable..    
3850: 53 68 61 72 65 64 2c 0a 0a 20 20 20 20 2f 2f 2f  Shared,..    ///
3860: 20 54 68 65 20 69 6d 6d 65 64 69 61 74 65 6c 79   The immediately
3870: 20 62 6f 72 72 6f 77 65 64 20 70 6c 61 63 65 20   borrowed place 
3880: 6d 75 73 74 20 62 65 20 69 6d 6d 75 74 61 62 6c  must be immutabl
3890: 65 2c 20 62 75 74 20 70 72 6f 6a 65 63 74 69 6f  e, but projectio
38a0: 6e 73 20 66 72 6f 6d 0a 20 20 20 20 2f 2f 2f 20  ns from.    /// 
38b0: 69 74 20 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f  it don't need to
38c0: 20 62 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65   be. For example
38d0: 2c 20 61 20 73 68 61 6c 6c 6f 77 20 62 6f 72 72  , a shallow borr
38e0: 6f 77 20 6f 66 20 60 61 2e 62 60 20 64 6f 65 73  ow of `a.b` does
38f0: 6e 27 74 0a 20 20 20 20 2f 2f 2f 20 63 6f 6e 66  n't.    /// conf
3900: 6c 69 63 74 20 77 69 74 68 20 61 20 6d 75 74 61  lict with a muta
3910: 62 6c 65 20 62 6f 72 72 6f 77 20 6f 66 20 60 61  ble borrow of `a
3920: 2e 62 2e 63 60 2e 0a 20 20 20 20 2f 2f 2f 0a 20  .b.c`..    ///. 
3930: 20 20 20 2f 2f 2f 20 54 68 69 73 20 69 73 20 75     /// This is u
3940: 73 65 64 20 77 68 65 6e 20 6c 6f 77 65 72 69 6e  sed when lowerin
3950: 67 20 6d 61 74 63 68 65 73 3a 20 77 68 65 6e 20  g matches: when 
3960: 6d 61 74 63 68 69 6e 67 20 6f 6e 20 61 20 70 6c  matching on a pl
3970: 61 63 65 20 77 65 20 77 61 6e 74 20 74 6f 0a 20  ace we want to. 
3980: 20 20 20 2f 2f 2f 20 65 6e 73 75 72 65 20 74 68     /// ensure th
3990: 61 74 20 70 6c 61 63 65 20 68 61 76 65 20 74 68  at place have th
39a0: 65 20 73 61 6d 65 20 76 61 6c 75 65 20 66 72 6f  e same value fro
39b0: 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  m the start of t
39c0: 68 65 20 6d 61 74 63 68 20 75 6e 74 69 6c 0a 20  he match until. 
39d0: 20 20 20 2f 2f 2f 20 61 6e 20 61 72 6d 20 69 73     /// an arm is
39e0: 20 73 65 6c 65 63 74 65 64 2e 20 54 68 69 73 20   selected. This 
39f0: 70 72 65 76 65 6e 74 73 20 74 68 69 73 20 63 6f  prevents this co
3a00: 64 65 20 66 72 6f 6d 20 63 6f 6d 70 69 6c 69 6e  de from compilin
3a10: 67 3a 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f  g:.    ///.    /
3a20: 2f 2f 20 20 20 20 20 6c 65 74 20 6d 75 74 20 78  //     let mut x
3a30: 20 3d 20 26 53 6f 6d 65 28 30 29 3b 0a 20 20 20   = &Some(0);.   
3a40: 20 2f 2f 2f 20 20 20 20 20 6d 61 74 63 68 20 2a   ///     match *
3a50: 78 20 7b 0a 20 20 20 20 2f 2f 2f 20 20 20 20 20  x {.    ///     
3a60: 20 20 20 20 4e 6f 6e 65 20 3d 3e 20 28 29 2c 0a      None => (),.
3a70: 20 20 20 20 2f 2f 2f 20 20 20 20 20 20 20 20 20      ///         
3a80: 53 6f 6d 65 28 5f 29 20 69 66 20 7b 20 78 20 3d  Some(_) if { x =
3a90: 20 26 4e 6f 6e 65 3b 20 66 61 6c 73 65 20 7d 20   &None; false } 
3aa0: 3d 3e 20 28 29 2c 0a 20 20 20 20 2f 2f 2f 20 20  => (),.    ///  
3ab0: 20 20 20 20 20 20 20 53 6f 6d 65 28 5f 29 20 3d         Some(_) =
3ac0: 3e 20 28 29 2c 0a 20 20 20 20 2f 2f 2f 20 20 20  > (),.    ///   
3ad0: 20 20 7d 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20    }.    ///.    
3ae0: 2f 2f 2f 20 54 68 69 73 20 63 61 6e 27 74 20 62  /// This can't b
3af0: 65 20 61 20 73 68 61 72 65 64 20 62 6f 72 72 6f  e a shared borro
3b00: 77 20 62 65 63 61 75 73 65 20 6d 75 74 61 62 6c  w because mutabl
3b10: 79 20 62 6f 72 72 6f 77 69 6e 67 20 28 2a 78 20  y borrowing (*x 
3b20: 61 73 20 53 6f 6d 65 29 2e 30 0a 20 20 20 20 2f  as Some).0.    /
3b30: 2f 2f 20 73 68 6f 75 6c 64 20 6e 6f 74 20 70 72  // should not pr
3b40: 65 76 65 6e 74 20 60 69 66 20 6c 65 74 20 4e 6f  event `if let No
3b50: 6e 65 20 3d 20 78 20 7b 20 2e 2e 2e 20 7d 60 2c  ne = x { ... }`,
3b60: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65   for example, be
3b70: 63 61 75 73 65 20 74 68 65 0a 20 20 20 20 2f 2f  cause the.    //
3b80: 2f 20 6d 75 74 61 74 69 6e 67 20 60 28 2a 78 20  / mutating `(*x 
3b90: 61 73 20 53 6f 6d 65 29 2e 30 60 20 63 61 6e 27  as Some).0` can'
3ba0: 74 20 61 66 66 65 63 74 20 74 68 65 20 64 69 73  t affect the dis
3bb0: 63 72 69 6d 69 6e 61 6e 74 20 6f 66 20 60 78 60  criminant of `x`
3bc0: 2e 0a 20 20 20 20 2f 2f 2f 20 57 65 20 63 61 6e  ..    /// We can
3bd0: 20 61 6c 73 6f 20 72 65 70 6f 72 74 20 65 72 72   also report err
3be0: 6f 72 73 20 77 69 74 68 20 74 68 69 73 20 6b 69  ors with this ki
3bf0: 6e 64 20 6f 66 20 62 6f 72 72 6f 77 20 64 69 66  nd of borrow dif
3c00: 66 65 72 65 6e 74 6c 79 2e 0a 20 20 20 20 53 68  ferently..    Sh
3c10: 61 6c 6c 6f 77 2c 0a 0a 20 20 20 20 2f 2f 2f 20  allow,..    /// 
3c20: 44 61 74 61 20 6d 75 73 74 20 62 65 20 69 6d 6d  Data must be imm
3c30: 75 74 61 62 6c 65 20 62 75 74 20 6e 6f 74 20 61  utable but not a
3c40: 6c 69 61 73 61 62 6c 65 2e 20 54 68 69 73 20 6b  liasable. This k
3c50: 69 6e 64 20 6f 66 20 62 6f 72 72 6f 77 0a 20 20  ind of borrow.  
3c60: 20 20 2f 2f 2f 20 63 61 6e 6e 6f 74 20 63 75 72    /// cannot cur
3c70: 72 65 6e 74 6c 79 20 62 65 20 65 78 70 72 65 73  rently be expres
3c80: 73 65 64 20 62 79 20 74 68 65 20 75 73 65 72 20  sed by the user 
3c90: 61 6e 64 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  and is used only
3ca0: 20 69 6e 0a 20 20 20 20 2f 2f 2f 20 69 6d 70 6c   in.    /// impl
3cb0: 69 63 69 74 20 63 6c 6f 73 75 72 65 20 62 69 6e  icit closure bin
3cc0: 64 69 6e 67 73 2e 20 49 74 20 69 73 20 6e 65 65  dings. It is nee
3cd0: 64 65 64 20 77 68 65 6e 20 74 68 65 20 63 6c 6f  ded when the clo
3ce0: 73 75 72 65 20 69 73 0a 20 20 20 20 2f 2f 2f 20  sure is.    /// 
3cf0: 62 6f 72 72 6f 77 69 6e 67 20 6f 72 20 6d 75 74  borrowing or mut
3d00: 61 74 69 6e 67 20 61 20 6d 75 74 61 62 6c 65 20  ating a mutable 
3d10: 72 65 66 65 72 65 6e 74 2c 20 65 2e 67 2e 3a 0a  referent, e.g.:.
3d20: 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20      ///.    /// 
3d30: 20 20 20 20 6c 65 74 20 78 3a 20 26 6d 75 74 20      let x: &mut 
3d40: 69 73 69 7a 65 20 3d 20 2e 2e 2e 3b 0a 20 20 20  isize = ...;.   
3d50: 20 2f 2f 2f 20 20 20 20 20 6c 65 74 20 79 20 3d   ///     let y =
3d60: 20 7c 7c 20 2a 78 20 2b 3d 20 35 3b 0a 20 20 20   || *x += 5;.   
3d70: 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 49 66 20   ///.    /// If 
3d80: 77 65 20 77 65 72 65 20 74 6f 20 74 72 79 20 74  we were to try t
3d90: 6f 20 74 72 61 6e 73 6c 61 74 65 20 74 68 69 73  o translate this
3da0: 20 63 6c 6f 73 75 72 65 20 69 6e 74 6f 20 61 20   closure into a 
3db0: 6d 6f 72 65 20 65 78 70 6c 69 63 69 74 0a 20 20  more explicit.  
3dc0: 20 20 2f 2f 2f 20 66 6f 72 6d 2c 20 77 65 27 64    /// form, we'd
3dd0: 20 65 6e 63 6f 75 6e 74 65 72 20 61 6e 20 65 72   encounter an er
3de0: 72 6f 72 20 77 69 74 68 20 74 68 65 20 63 6f 64  ror with the cod
3df0: 65 20 61 73 20 77 72 69 74 74 65 6e 3a 0a 20 20  e as written:.  
3e00: 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 20 20    ///.    ///   
3e10: 20 20 73 74 72 75 63 74 20 45 6e 76 20 7b 20 78    struct Env { x
3e20: 3a 20 26 20 26 6d 75 74 20 69 73 69 7a 65 20 7d  : & &mut isize }
3e30: 0a 20 20 20 20 2f 2f 2f 20 20 20 20 20 6c 65 74  .    ///     let
3e40: 20 78 3a 20 26 6d 75 74 20 69 73 69 7a 65 20 3d   x: &mut isize =
3e50: 20 2e 2e 2e 3b 0a 20 20 20 20 2f 2f 2f 20 20 20   ...;.    ///   
3e60: 20 20 6c 65 74 20 79 20 3d 20 28 26 6d 75 74 20    let y = (&mut 
3e70: 45 6e 76 20 7b 20 26 78 20 7d 2c 20 66 6e 5f 70  Env { &x }, fn_p
3e80: 74 72 29 3b 20 20 2f 2f 20 43 6c 6f 73 75 72 65  tr);  // Closure
3e90: 20 69 73 20 70 61 69 72 20 6f 66 20 65 6e 76 20   is pair of env 
3ea0: 61 6e 64 20 66 6e 0a 20 20 20 20 2f 2f 2f 20 20  and fn.    ///  
3eb0: 20 20 20 66 6e 20 66 6e 5f 70 74 72 28 65 6e 76     fn fn_ptr(env
3ec0: 3a 20 26 6d 75 74 20 45 6e 76 29 20 7b 20 2a 2a  : &mut Env) { **
3ed0: 65 6e 76 2e 78 20 2b 3d 20 35 3b 20 7d 0a 20 20  env.x += 5; }.  
3ee0: 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 54 68    ///.    /// Th
3ef0: 69 73 20 69 73 20 74 68 65 6e 20 69 6c 6c 65 67  is is then illeg
3f00: 61 6c 20 62 65 63 61 75 73 65 20 79 6f 75 20 63  al because you c
3f10: 61 6e 6e 6f 74 20 6d 75 74 61 74 65 20 61 6e 20  annot mutate an 
3f20: 60 26 6d 75 74 60 20 66 6f 75 6e 64 0a 20 20 20  `&mut` found.   
3f30: 20 2f 2f 2f 20 69 6e 20 61 6e 20 61 6c 69 61 73   /// in an alias
3f40: 61 62 6c 65 20 6c 6f 63 61 74 69 6f 6e 2e 20 54  able location. T
3f50: 6f 20 73 6f 6c 76 65 2c 20 79 6f 75 27 64 20 68  o solve, you'd h
3f60: 61 76 65 20 74 6f 20 74 72 61 6e 73 6c 61 74 65  ave to translate
3f70: 20 77 69 74 68 0a 20 20 20 20 2f 2f 2f 20 61 6e   with.    /// an
3f80: 20 60 26 6d 75 74 60 20 62 6f 72 72 6f 77 3a 0a   `&mut` borrow:.
3f90: 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20      ///.    /// 
3fa0: 20 20 20 20 73 74 72 75 63 74 20 45 6e 76 20 7b      struct Env {
3fb0: 20 78 3a 20 26 20 26 6d 75 74 20 69 73 69 7a 65   x: & &mut isize
3fc0: 20 7d 0a 20 20 20 20 2f 2f 2f 20 20 20 20 20 6c   }.    ///     l
3fd0: 65 74 20 78 3a 20 26 6d 75 74 20 69 73 69 7a 65  et x: &mut isize
3fe0: 20 3d 20 2e 2e 2e 3b 0a 20 20 20 20 2f 2f 2f 20   = ...;.    /// 
3ff0: 20 20 20 20 6c 65 74 20 79 20 3d 20 28 26 6d 75      let y = (&mu
4000: 74 20 45 6e 76 20 7b 20 26 6d 75 74 20 78 20 7d  t Env { &mut x }
4010: 2c 20 66 6e 5f 70 74 72 29 3b 20 2f 2f 20 63 68  , fn_ptr); // ch
4020: 61 6e 67 65 64 20 66 72 6f 6d 20 26 78 20 74 6f  anged from &x to
4030: 20 26 6d 75 74 20 78 0a 20 20 20 20 2f 2f 2f 20   &mut x.    /// 
4040: 20 20 20 20 66 6e 20 66 6e 5f 70 74 72 28 65 6e      fn fn_ptr(en
4050: 76 3a 20 26 6d 75 74 20 45 6e 76 29 20 7b 20 2a  v: &mut Env) { *
4060: 2a 65 6e 76 2e 78 20 2b 3d 20 35 3b 20 7d 0a 20  *env.x += 5; }. 
4070: 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 4e     ///.    /// N
4080: 6f 77 20 74 68 65 20 61 73 73 69 67 6e 6d 65 6e  ow the assignmen
4090: 74 20 74 6f 20 60 2a 2a 65 6e 76 2e 78 60 20 69  t to `**env.x` i
40a0: 73 20 6c 65 67 61 6c 2c 20 62 75 74 20 63 72 65  s legal, but cre
40b0: 61 74 69 6e 67 20 61 0a 20 20 20 20 2f 2f 2f 20  ating a.    /// 
40c0: 6d 75 74 61 62 6c 65 20 70 6f 69 6e 74 65 72 20  mutable pointer 
40d0: 74 6f 20 60 78 60 20 69 73 20 6e 6f 74 20 62 65  to `x` is not be
40e0: 63 61 75 73 65 20 60 78 60 20 69 73 20 6e 6f 74  cause `x` is not
40f0: 20 6d 75 74 61 62 6c 65 2e 20 57 65 0a 20 20 20   mutable. We.   
4100: 20 2f 2f 2f 20 63 6f 75 6c 64 20 66 69 78 20 74   /// could fix t
4110: 68 69 73 20 62 79 20 64 65 63 6c 61 72 69 6e 67  his by declaring
4120: 20 60 78 60 20 61 73 20 60 6c 65 74 20 6d 75 74   `x` as `let mut
4130: 20 78 60 2e 20 54 68 69 73 20 69 73 20 6f 6b 20   x`. This is ok 
4140: 69 6e 0a 20 20 20 20 2f 2f 2f 20 75 73 65 72 20  in.    /// user 
4150: 63 6f 64 65 2c 20 69 66 20 61 77 6b 77 61 72 64  code, if awkward
4160: 2c 20 62 75 74 20 65 78 74 72 61 20 77 65 69 72  , but extra weir
4170: 64 20 66 6f 72 20 63 6c 6f 73 75 72 65 73 2c 20  d for closures, 
4180: 73 69 6e 63 65 20 74 68 65 0a 20 20 20 20 2f 2f  since the.    //
4190: 2f 20 62 6f 72 72 6f 77 20 69 73 20 68 69 64 64  / borrow is hidd
41a0: 65 6e 2e 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20  en..    ///.    
41b0: 2f 2f 2f 20 53 6f 20 77 65 20 69 6e 74 72 6f 64  /// So we introd
41c0: 75 63 65 20 61 20 22 75 6e 69 71 75 65 20 69 6d  uce a "unique im
41d0: 6d 22 20 62 6f 72 72 6f 77 20 2d 2d 20 74 68 65  m" borrow -- the
41e0: 20 72 65 66 65 72 65 6e 74 20 69 73 0a 20 20 20   referent is.   
41f0: 20 2f 2f 2f 20 69 6d 6d 75 74 61 62 6c 65 2c 20   /// immutable, 
4200: 62 75 74 20 6e 6f 74 20 61 6c 69 61 73 61 62 6c  but not aliasabl
4210: 65 2e 20 54 68 69 73 20 73 6f 6c 76 65 73 20 74  e. This solves t
4220: 68 65 20 70 72 6f 62 6c 65 6d 2e 20 46 6f 72 0a  he problem. For.
4230: 20 20 20 20 2f 2f 2f 20 73 69 6d 70 6c 69 63 69      /// simplici
4240: 74 79 2c 20 77 65 20 64 6f 6e 27 74 20 67 69 76  ty, we don't giv
4250: 65 20 75 73 65 72 73 20 74 68 65 20 77 61 79 20  e users the way 
4260: 74 6f 20 65 78 70 72 65 73 73 20 74 68 69 73 0a  to express this.
4270: 20 20 20 20 2f 2f 2f 20 62 6f 72 72 6f 77 2c 20      /// borrow, 
4280: 69 74 27 73 20 6a 75 73 74 20 75 73 65 64 20 77  it's just used w
4290: 68 65 6e 20 74 72 61 6e 73 6c 61 74 69 6e 67 20  hen translating 
42a0: 63 6c 6f 73 75 72 65 73 2e 0a 20 20 20 20 55 6e  closures..    Un
42b0: 69 71 75 65 2c 0a 0a 20 20 20 20 2f 2f 2f 20 44  ique,..    /// D
42c0: 61 74 61 20 69 73 20 6d 75 74 61 62 6c 65 20 61  ata is mutable a
42d0: 6e 64 20 6e 6f 74 20 61 6c 69 61 73 61 62 6c 65  nd not aliasable
42e0: 2e 0a 20 20 20 20 4d 75 74 20 7b 0a 20 20 20 20  ..    Mut {.    
42f0: 20 20 20 20 2f 2f 2f 20 60 74 72 75 65 60 20 69      /// `true` i
4300: 66 20 74 68 69 73 20 62 6f 72 72 6f 77 20 61 72  f this borrow ar
4310: 6f 73 65 20 66 72 6f 6d 20 6d 65 74 68 6f 64 2d  ose from method-
4320: 63 61 6c 6c 20 61 75 74 6f 2d 72 65 66 0a 20 20  call auto-ref.  
4330: 20 20 20 20 20 20 2f 2f 2f 20 28 69 2e 65 2e 2c        /// (i.e.,
4340: 20 60 61 64 6a 75 73 74 6d 65 6e 74 3a 3a 41 64   `adjustment::Ad
4350: 6a 75 73 74 3a 3a 42 6f 72 72 6f 77 60 29 2e 0a  just::Borrow`)..
4360: 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 5f 74 77          allow_tw
4370: 6f 5f 70 68 61 73 65 5f 62 6f 72 72 6f 77 3a 20  o_phase_borrow: 
4380: 62 6f 6f 6c 2c 0a 20 20 20 20 7d 2c 0a 7d 0a 0a  bool,.    },.}..
4390: 69 6d 70 6c 20 42 6f 72 72 6f 77 4b 69 6e 64 20  impl BorrowKind 
43a0: 7b 0a 20 20 20 20 70 75 62 20 66 6e 20 61 6c 6c  {.    pub fn all
43b0: 6f 77 73 5f 74 77 6f 5f 70 68 61 73 65 5f 62 6f  ows_two_phase_bo
43c0: 72 72 6f 77 28 26 73 65 6c 66 29 20 2d 3e 20 62  rrow(&self) -> b
43d0: 6f 6f 6c 20 7b 0a 20 20 20 20 20 20 20 20 6d 61  ool {.        ma
43e0: 74 63 68 20 2a 73 65 6c 66 20 7b 0a 20 20 20 20  tch *self {.    
43f0: 20 20 20 20 20 20 20 20 42 6f 72 72 6f 77 4b 69          BorrowKi
4400: 6e 64 3a 3a 53 68 61 72 65 64 20 7c 20 42 6f 72  nd::Shared | Bor
4410: 72 6f 77 4b 69 6e 64 3a 3a 53 68 61 6c 6c 6f 77  rowKind::Shallow
4420: 20 7c 20 42 6f 72 72 6f 77 4b 69 6e 64 3a 3a 55   | BorrowKind::U
4430: 6e 69 71 75 65 20 3d 3e 20 66 61 6c 73 65 2c 0a  nique => false,.
4440: 20 20 20 20 20 20 20 20 20 20 20 20 42 6f 72 72              Borr
4450: 6f 77 4b 69 6e 64 3a 3a 4d 75 74 20 7b 20 61 6c  owKind::Mut { al
4460: 6c 6f 77 5f 74 77 6f 5f 70 68 61 73 65 5f 62 6f  low_two_phase_bo
4470: 72 72 6f 77 20 7d 20 3d 3e 20 61 6c 6c 6f 77 5f  rrow } => allow_
4480: 74 77 6f 5f 70 68 61 73 65 5f 62 6f 72 72 6f 77  two_phase_borrow
4490: 2c 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ,.        }.    
44a0: 7d 0a 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  }.}..///////////
44b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
44c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
44d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
44e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
44f0: 0a 2f 2f 20 56 61 72 69 61 62 6c 65 73 20 61 6e  .// Variables an
4500: 64 20 74 65 6d 70 73 0a 0a 72 75 73 74 63 5f 69  d temps..rustc_i
4510: 6e 64 65 78 3a 3a 6e 65 77 74 79 70 65 5f 69 6e  ndex::newtype_in
4520: 64 65 78 21 20 7b 0a 20 20 20 20 70 75 62 20 73  dex! {.    pub s
4530: 74 72 75 63 74 20 4c 6f 63 61 6c 20 7b 0a 20 20  truct Local {.  
4540: 20 20 20 20 20 20 64 65 72 69 76 65 20 5b 48 61        derive [Ha
4550: 73 68 53 74 61 62 6c 65 5d 0a 20 20 20 20 20 20  shStable].      
4560: 20 20 44 45 42 55 47 5f 46 4f 52 4d 41 54 20 3d    DEBUG_FORMAT =
4570: 20 22 5f 7b 7d 22 2c 0a 20 20 20 20 20 20 20 20   "_{}",.        
4580: 63 6f 6e 73 74 20 52 45 54 55 52 4e 5f 50 4c 41  const RETURN_PLA
4590: 43 45 20 3d 20 30 2c 0a 20 20 20 20 7d 0a 7d 0a  CE = 0,.    }.}.
45a0: 0a 69 6d 70 6c 20 41 74 6f 6d 20 66 6f 72 20 4c  .impl Atom for L
45b0: 6f 63 61 6c 20 7b 0a 20 20 20 20 66 6e 20 69 6e  ocal {.    fn in
45c0: 64 65 78 28 73 65 6c 66 29 20 2d 3e 20 75 73 69  dex(self) -> usi
45d0: 7a 65 20 7b 0a 20 20 20 20 20 20 20 20 49 64 78  ze {.        Idx
45e0: 3a 3a 69 6e 64 65 78 28 73 65 6c 66 29 0a 20 20  ::index(self).  
45f0: 20 20 7d 0a 7d 0a 0a 2f 2f 2f 20 43 6c 61 73 73    }.}../// Class
4600: 69 66 69 65 73 20 6c 6f 63 61 6c 73 20 69 6e 74  ifies locals int
4610: 6f 20 63 61 74 65 67 6f 72 69 65 73 2e 20 53 65  o categories. Se
4620: 65 20 60 42 6f 64 79 3a 3a 6c 6f 63 61 6c 5f 6b  e `Body::local_k
4630: 69 6e 64 60 2e 0a 23 5b 64 65 72 69 76 65 28 50  ind`..#[derive(P
4640: 61 72 74 69 61 6c 45 71 2c 20 45 71 2c 20 44 65  artialEq, Eq, De
4650: 62 75 67 2c 20 48 61 73 68 53 74 61 62 6c 65 29  bug, HashStable)
4660: 5d 0a 70 75 62 20 65 6e 75 6d 20 4c 6f 63 61 6c  ].pub enum Local
4670: 4b 69 6e 64 20 7b 0a 20 20 20 20 2f 2f 2f 20 55  Kind {.    /// U
4680: 73 65 72 2d 64 65 63 6c 61 72 65 64 20 76 61 72  ser-declared var
4690: 69 61 62 6c 65 20 62 69 6e 64 69 6e 67 2e 0a 20  iable binding.. 
46a0: 20 20 20 56 61 72 2c 0a 20 20 20 20 2f 2f 2f 20     Var,.    /// 
46b0: 43 6f 6d 70 69 6c 65 72 2d 69 6e 74 72 6f 64 75  Compiler-introdu
46c0: 63 65 64 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20  ced temporary.. 
46d0: 20 20 20 54 65 6d 70 2c 0a 20 20 20 20 2f 2f 2f     Temp,.    ///
46e0: 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   Function argume
46f0: 6e 74 2e 0a 20 20 20 20 41 72 67 2c 0a 20 20 20  nt..    Arg,.   
4700: 20 2f 2f 2f 20 4c 6f 63 61 74 69 6f 6e 20 6f 66   /// Location of
4710: 20 66 75 6e 63 74 69 6f 6e 27 73 20 72 65 74 75   function's retu
4720: 72 6e 20 76 61 6c 75 65 2e 0a 20 20 20 20 52 65  rn value..    Re
4730: 74 75 72 6e 50 6f 69 6e 74 65 72 2c 0a 7d 0a 0a  turnPointer,.}..
4740: 23 5b 64 65 72 69 76 65 28 43 6c 6f 6e 65 2c 20  #[derive(Clone, 
4750: 44 65 62 75 67 2c 20 52 75 73 74 63 45 6e 63 6f  Debug, RustcEnco
4760: 64 61 62 6c 65 2c 20 52 75 73 74 63 44 65 63 6f  dable, RustcDeco
4770: 64 61 62 6c 65 2c 20 48 61 73 68 53 74 61 62 6c  dable, HashStabl
4780: 65 29 5d 0a 70 75 62 20 73 74 72 75 63 74 20 56  e)].pub struct V
4790: 61 72 42 69 6e 64 69 6e 67 46 6f 72 6d 3c 27 74  arBindingForm<'t
47a0: 63 78 3e 20 7b 0a 20 20 20 20 2f 2f 2f 20 49 73  cx> {.    /// Is
47b0: 20 76 61 72 69 61 62 6c 65 20 62 6f 75 6e 64 20   variable bound 
47c0: 76 69 61 20 60 78 60 2c 20 60 6d 75 74 20 78 60  via `x`, `mut x`
47d0: 2c 20 60 72 65 66 20 78 60 2c 20 6f 72 20 60 72  , `ref x`, or `r
47e0: 65 66 20 6d 75 74 20 78 60 3f 0a 20 20 20 20 70  ef mut x`?.    p
47f0: 75 62 20 62 69 6e 64 69 6e 67 5f 6d 6f 64 65 3a  ub binding_mode:
4800: 20 74 79 3a 3a 42 69 6e 64 69 6e 67 4d 6f 64 65   ty::BindingMode
4810: 2c 0a 20 20 20 20 2f 2f 2f 20 49 66 20 61 6e 20  ,.    /// If an 
4820: 65 78 70 6c 69 63 69 74 20 74 79 70 65 20 77 61  explicit type wa
4830: 73 20 70 72 6f 76 69 64 65 64 20 66 6f 72 20 74  s provided for t
4840: 68 69 73 20 76 61 72 69 61 62 6c 65 20 62 69 6e  his variable bin
4850: 64 69 6e 67 2c 0a 20 20 20 20 2f 2f 2f 20 74 68  ding,.    /// th
4860: 69 73 20 68 6f 6c 64 73 20 74 68 65 20 73 6f 75  is holds the sou
4870: 72 63 65 20 53 70 61 6e 20 6f 66 20 74 68 61 74  rce Span of that
4880: 20 74 79 70 65 2e 0a 20 20 20 20 2f 2f 2f 0a 20   type..    ///. 
4890: 20 20 20 2f 2f 2f 20 4e 4f 54 45 3a 20 69 66 20     /// NOTE: if 
48a0: 79 6f 75 20 77 61 6e 74 20 74 6f 20 63 68 61 6e  you want to chan
48b0: 67 65 20 74 68 69 73 20 74 6f 20 61 20 60 48 69  ge this to a `Hi
48c0: 72 49 64 60 2c 20 62 65 20 77 61 72 79 20 74 68  rId`, be wary th
48d0: 61 74 0a 20 20 20 20 2f 2f 2f 20 64 6f 69 6e 67  at.    /// doing
48e0: 20 73 6f 20 62 72 65 61 6b 73 20 69 6e 63 72 65   so breaks incre
48f0: 6d 65 6e 74 61 6c 20 63 6f 6d 70 69 6c 61 74 69  mental compilati
4900: 6f 6e 20 28 61 73 20 6f 66 20 74 68 69 73 20 77  on (as of this w
4910: 72 69 74 69 6e 67 29 2c 0a 20 20 20 20 2f 2f 2f  riting),.    ///
4920: 20 77 68 69 6c 65 20 61 20 60 53 70 61 6e 60 20   while a `Span` 
4930: 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 6f  does not cause o
4940: 75 72 20 74 65 73 74 73 20 74 6f 20 66 61 69 6c  ur tests to fail
4950: 2e 0a 20 20 20 20 70 75 62 20 6f 70 74 5f 74 79  ..    pub opt_ty
4960: 5f 69 6e 66 6f 3a 20 4f 70 74 69 6f 6e 3c 53 70  _info: Option<Sp
4970: 61 6e 3e 2c 0a 20 20 20 20 2f 2f 2f 20 50 6c 61  an>,.    /// Pla
4980: 63 65 20 6f 66 20 74 68 65 20 52 48 53 20 6f 66  ce of the RHS of
4990: 20 74 68 65 20 3d 2c 20 6f 72 20 74 68 65 20 73   the =, or the s
49a0: 75 62 6a 65 63 74 20 6f 66 20 74 68 65 20 60 6d  ubject of the `m
49b0: 61 74 63 68 60 20 77 68 65 72 65 20 74 68 69 73  atch` where this
49c0: 0a 20 20 20 20 2f 2f 2f 20 76 61 72 69 61 62 6c  .    /// variabl
49d0: 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
49e0: 2e 20 4e 6f 6e 65 20 69 6e 20 74 68 65 20 63 61  . None in the ca
49f0: 73 65 20 6f 66 20 60 6c 65 74 20 50 41 54 54 45  se of `let PATTE
4a00: 52 4e 3b 60 2e 0a 20 20 20 20 2f 2f 2f 20 53 6f  RN;`..    /// So
4a10: 6d 65 28 28 4e 6f 6e 65 2c 20 2e 2e 29 29 20 69  me((None, ..)) i
4a20: 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20 61 6e  n the case of an
4a30: 64 20 60 6c 65 74 20 5b 6d 75 74 5d 20 78 20 3d  d `let [mut] x =
4a40: 20 2e 2e 2e 60 20 62 65 63 61 75 73 65 0a 20 20   ...` because.  
4a50: 20 20 2f 2f 2f 20 28 61 29 20 74 68 65 20 72 69    /// (a) the ri
4a60: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
4a70: 6e 27 74 20 65 76 61 6c 75 61 74 65 64 20 61 73  n't evaluated as
4a80: 20 61 20 70 6c 61 63 65 20 65 78 70 72 65 73 73   a place express
4a90: 69 6f 6e 2e 0a 20 20 20 20 2f 2f 2f 20 28 62 29  ion..    /// (b)
4aa0: 20 69 74 20 67 69 76 65 73 20 61 20 77 61 79 20   it gives a way 
4ab0: 74 6f 20 73 65 70 61 72 61 74 65 20 74 68 69 73  to separate this
4ac0: 20 63 61 73 65 20 66 72 6f 6d 20 74 68 65 20 72   case from the r
4ad0: 65 6d 61 69 6e 69 6e 67 20 63 61 73 65 73 0a 20  emaining cases. 
4ae0: 20 20 20 2f 2f 2f 20 20 20 20 20 66 6f 72 20 64     ///     for d
4af0: 69 61 67 6e 6f 73 74 69 63 73 2e 0a 20 20 20 20  iagnostics..    
4b00: 70 75 62 20 6f 70 74 5f 6d 61 74 63 68 5f 70 6c  pub opt_match_pl
4b10: 61 63 65 3a 20 4f 70 74 69 6f 6e 3c 28 4f 70 74  ace: Option<(Opt
4b20: 69 6f 6e 3c 50 6c 61 63 65 3c 27 74 63 78 3e 3e  ion<Place<'tcx>>
4b30: 2c 20 53 70 61 6e 29 3e 2c 0a 20 20 20 20 2f 2f  , Span)>,.    //
4b40: 2f 20 54 68 65 20 73 70 61 6e 20 6f 66 20 74 68  / The span of th
4b50: 65 20 70 61 74 74 65 72 6e 20 69 6e 20 77 68 69  e pattern in whi
4b60: 63 68 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  ch this variable
4b70: 20 77 61 73 20 62 6f 75 6e 64 2e 0a 20 20 20 20   was bound..    
4b80: 70 75 62 20 70 61 74 5f 73 70 61 6e 3a 20 53 70  pub pat_span: Sp
4b90: 61 6e 2c 0a 7d 0a 0a 23 5b 64 65 72 69 76 65 28  an,.}..#[derive(
4ba0: 43 6c 6f 6e 65 2c 20 44 65 62 75 67 2c 20 52 75  Clone, Debug, Ru
4bb0: 73 74 63 45 6e 63 6f 64 61 62 6c 65 2c 20 52 75  stcEncodable, Ru
4bc0: 73 74 63 44 65 63 6f 64 61 62 6c 65 29 5d 0a 70  stcDecodable)].p
4bd0: 75 62 20 65 6e 75 6d 20 42 69 6e 64 69 6e 67 46  ub enum BindingF
4be0: 6f 72 6d 3c 27 74 63 78 3e 20 7b 0a 20 20 20 20  orm<'tcx> {.    
4bf0: 2f 2f 2f 20 54 68 69 73 20 69 73 20 61 20 62 69  /// This is a bi
4c00: 6e 64 69 6e 67 20 66 6f 72 20 61 20 6e 6f 6e 2d  nding for a non-
4c10: 60 73 65 6c 66 60 20 62 69 6e 64 69 6e 67 2c 20  `self` binding, 
4c20: 6f 72 20 61 20 60 73 65 6c 66 60 20 74 68 61 74  or a `self` that
4c30: 20 68 61 73 20 61 6e 20 65 78 70 6c 69 63 69 74   has an explicit
4c40: 20 74 79 70 65 2e 0a 20 20 20 20 56 61 72 28 56   type..    Var(V
4c50: 61 72 42 69 6e 64 69 6e 67 46 6f 72 6d 3c 27 74  arBindingForm<'t
4c60: 63 78 3e 29 2c 0a 20 20 20 20 2f 2f 2f 20 42 69  cx>),.    /// Bi
4c70: 6e 64 69 6e 67 20 66 6f 72 20 61 20 60 73 65 6c  nding for a `sel
4c80: 66 60 2f 60 26 73 65 6c 66 60 2f 60 26 6d 75 74  f`/`&self`/`&mut
4c90: 20 73 65 6c 66 60 20 62 69 6e 64 69 6e 67 20 77   self` binding w
4ca0: 68 65 72 65 20 74 68 65 20 74 79 70 65 20 69 73  here the type is
4cb0: 20 69 6d 70 6c 69 63 69 74 2e 0a 20 20 20 20 49   implicit..    I
4cc0: 6d 70 6c 69 63 69 74 53 65 6c 66 28 49 6d 70 6c  mplicitSelf(Impl
4cd0: 69 63 69 74 53 65 6c 66 4b 69 6e 64 29 2c 0a 20  icitSelfKind),. 
4ce0: 20 20 20 2f 2f 2f 20 52 65 66 65 72 65 6e 63 65     /// Reference
4cf0: 20 75 73 65 64 20 69 6e 20 61 20 67 75 61 72 64   used in a guard
4d00: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 65   expression to e
4d10: 6e 73 75 72 65 20 69 6d 6d 75 74 61 62 69 6c 69  nsure immutabili
4d20: 74 79 2e 0a 20 20 20 20 52 65 66 46 6f 72 47 75  ty..    RefForGu
4d30: 61 72 64 2c 0a 7d 0a 0a 2f 2f 2f 20 52 65 70 72  ard,.}../// Repr
4d40: 65 73 65 6e 74 73 20 77 68 61 74 20 74 79 70 65  esents what type
4d50: 20 6f 66 20 69 6d 70 6c 69 63 69 74 20 73 65 6c   of implicit sel
4d60: 66 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  f a function has
4d70: 2c 20 69 66 20 61 6e 79 2e 0a 23 5b 64 65 72 69  , if any..#[deri
4d80: 76 65 28 43 6c 6f 6e 65 2c 20 43 6f 70 79 2c 20  ve(Clone, Copy, 
4d90: 50 61 72 74 69 61 6c 45 71 2c 20 44 65 62 75 67  PartialEq, Debug
4da0: 2c 20 52 75 73 74 63 45 6e 63 6f 64 61 62 6c 65  , RustcEncodable
4db0: 2c 20 52 75 73 74 63 44 65 63 6f 64 61 62 6c 65  , RustcDecodable
4dc0: 2c 20 48 61 73 68 53 74 61 62 6c 65 29 5d 0a 70  , HashStable)].p
4dd0: 75 62 20 65 6e 75 6d 20 49 6d 70 6c 69 63 69 74  ub enum Implicit
4de0: 53 65 6c 66 4b 69 6e 64 20 7b 0a 20 20 20 20 2f  SelfKind {.    /
4df0: 2f 2f 20 52 65 70 72 65 73 65 6e 74 73 20 61 20  // Represents a 
4e00: 60 66 6e 20 78 28 73 65 6c 66 29 3b 60 2e 0a 20  `fn x(self);`.. 
4e10: 20 20 20 49 6d 6d 2c 0a 20 20 20 20 2f 2f 2f 20     Imm,.    /// 
4e20: 52 65 70 72 65 73 65 6e 74 73 20 61 20 60 66 6e  Represents a `fn
4e30: 20 78 28 6d 75 74 20 73 65 6c 66 29 3b 60 2e 0a   x(mut self);`..
4e40: 20 20 20 20 4d 75 74 2c 0a 20 20 20 20 2f 2f 2f      Mut,.    ///
4e50: 20 52 65 70 72 65 73 65 6e 74 73 20 61 20 60 66   Represents a `f
4e60: 6e 20 78 28 26 73 65 6c 66 29 3b 60 2e 0a 20 20  n x(&self);`..  
4e70: 20 20 49 6d 6d 52 65 66 2c 0a 20 20 20 20 2f 2f    ImmRef,.    //
4e80: 2f 20 52 65 70 72 65 73 65 6e 74 73 20 61 20 60  / Represents a `
4e90: 66 6e 20 78 28 26 6d 75 74 20 73 65 6c 66 29 3b  fn x(&mut self);
4ea0: 60 2e 0a 20 20 20 20 4d 75 74 52 65 66 2c 0a 20  `..    MutRef,. 
4eb0: 20 20 20 2f 2f 2f 20 52 65 70 72 65 73 65 6e 74     /// Represent
4ec0: 73 20 77 68 65 6e 20 61 20 66 75 6e 63 74 69 6f  s when a functio
4ed0: 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  n does not have 
4ee0: 61 20 73 65 6c 66 20 61 72 67 75 6d 65 6e 74 20  a self argument 
4ef0: 6f 72 0a 20 20 20 20 2f 2f 2f 20 77 68 65 6e 20  or.    /// when 
4f00: 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61  a function has a
4f10: 20 60 73 65 6c 66 3a 20 58 60 20 61 72 67 75 6d   `self: X` argum
4f20: 65 6e 74 2e 0a 20 20 20 20 4e 6f 6e 65 2c 0a 7d  ent..    None,.}
4f30: 0a 0a 43 6c 6f 6e 65 54 79 70 65 46 6f 6c 64 61  ..CloneTypeFolda
4f40: 62 6c 65 41 6e 64 4c 69 66 74 49 6d 70 6c 73 21  bleAndLiftImpls!
4f50: 20 7b 20 42 69 6e 64 69 6e 67 46 6f 72 6d 3c 27   { BindingForm<'
4f60: 74 63 78 3e 2c 20 7d 0a 0a 6d 6f 64 20 62 69 6e  tcx>, }..mod bin
4f70: 64 69 6e 67 5f 66 6f 72 6d 5f 69 6d 70 6c 20 7b  ding_form_impl {
4f80: 0a 20 20 20 20 75 73 65 20 63 72 61 74 65 3a 3a  .    use crate::
4f90: 69 63 68 3a 3a 53 74 61 62 6c 65 48 61 73 68 69  ich::StableHashi
4fa0: 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75  ngContext;.    u
4fb0: 73 65 20 72 75 73 74 63 5f 64 61 74 61 5f 73 74  se rustc_data_st
4fc0: 72 75 63 74 75 72 65 73 3a 3a 73 74 61 62 6c 65  ructures::stable
4fd0: 5f 68 61 73 68 65 72 3a 3a 7b 48 61 73 68 53 74  _hasher::{HashSt
4fe0: 61 62 6c 65 2c 20 53 74 61 62 6c 65 48 61 73 68  able, StableHash
4ff0: 65 72 7d 3b 0a 0a 20 20 20 20 69 6d 70 6c 3c 27  er};..    impl<'
5000: 61 2c 20 27 74 63 78 3e 20 48 61 73 68 53 74 61  a, 'tcx> HashSta
5010: 62 6c 65 3c 53 74 61 62 6c 65 48 61 73 68 69 6e  ble<StableHashin
5020: 67 43 6f 6e 74 65 78 74 3c 27 61 3e 3e 20 66 6f  gContext<'a>> fo
5030: 72 20 73 75 70 65 72 3a 3a 42 69 6e 64 69 6e 67  r super::Binding
5040: 46 6f 72 6d 3c 27 74 63 78 3e 20 7b 0a 20 20 20  Form<'tcx> {.   
5050: 20 20 20 20 20 66 6e 20 68 61 73 68 5f 73 74 61       fn hash_sta
5060: 62 6c 65 28 26 73 65 6c 66 2c 20 68 63 78 3a 20  ble(&self, hcx: 
5070: 26 6d 75 74 20 53 74 61 62 6c 65 48 61 73 68 69  &mut StableHashi
5080: 6e 67 43 6f 6e 74 65 78 74 3c 27 61 3e 2c 20 68  ngContext<'a>, h
5090: 61 73 68 65 72 3a 20 26 6d 75 74 20 53 74 61 62  asher: &mut Stab
50a0: 6c 65 48 61 73 68 65 72 29 20 7b 0a 20 20 20 20  leHasher) {.    
50b0: 20 20 20 20 20 20 20 20 75 73 65 20 73 75 70 65          use supe
50c0: 72 3a 3a 42 69 6e 64 69 6e 67 46 6f 72 6d 3a 3a  r::BindingForm::
50d0: 2a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 3a  *;.            :
50e0: 3a 73 74 64 3a 3a 6d 65 6d 3a 3a 64 69 73 63 72  :std::mem::discr
50f0: 69 6d 69 6e 61 6e 74 28 73 65 6c 66 29 2e 68 61  iminant(self).ha
5100: 73 68 5f 73 74 61 62 6c 65 28 68 63 78 2c 20 68  sh_stable(hcx, h
5110: 61 73 68 65 72 29 3b 0a 0a 20 20 20 20 20 20 20  asher);..       
5120: 20 20 20 20 20 6d 61 74 63 68 20 73 65 6c 66 20       match self 
5130: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
5140: 20 20 56 61 72 28 62 69 6e 64 69 6e 67 29 20 3d    Var(binding) =
5150: 3e 20 62 69 6e 64 69 6e 67 2e 68 61 73 68 5f 73  > binding.hash_s
5160: 74 61 62 6c 65 28 68 63 78 2c 20 68 61 73 68 65  table(hcx, hashe
5170: 72 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r),.            
5180: 20 20 20 20 49 6d 70 6c 69 63 69 74 53 65 6c 66      ImplicitSelf
5190: 28 6b 69 6e 64 29 20 3d 3e 20 6b 69 6e 64 2e 68  (kind) => kind.h
51a0: 61 73 68 5f 73 74 61 62 6c 65 28 68 63 78 2c 20  ash_stable(hcx, 
51b0: 68 61 73 68 65 72 29 2c 0a 20 20 20 20 20 20 20  hasher),.       
51c0: 20 20 20 20 20 20 20 20 20 52 65 66 46 6f 72 47           RefForG
51d0: 75 61 72 64 20 3d 3e 20 28 29 2c 0a 20 20 20 20  uard => (),.    
51e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
51f0: 20 20 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2f 2f    }.    }.}..///
5200: 20 60 42 6c 6f 63 6b 54 61 69 6c 49 6e 66 6f 60   `BlockTailInfo`
5210: 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20   is attached to 
5220: 74 68 65 20 60 4c 6f 63 61 6c 44 65 63 6c 60 20  the `LocalDecl` 
5230: 66 6f 72 20 74 65 6d 70 6f 72 61 72 69 65 73 0a  for temporaries.
5240: 2f 2f 2f 20 63 72 65 61 74 65 64 20 64 75 72 69  /// created duri
5250: 6e 67 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66  ng evaluation of
5260: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
5270: 61 20 62 6c 6f 63 6b 20 74 61 69 6c 0a 2f 2f 2f  a block tail.///
5280: 20 65 78 70 72 65 73 73 69 6f 6e 3b 20 74 68 61   expression; tha
5290: 74 20 69 73 2c 20 61 20 62 6c 6f 63 6b 20 6c 69  t is, a block li
52a0: 6b 65 20 60 7b 20 53 54 4d 54 5f 31 3b 20 53 54  ke `{ STMT_1; ST
52b0: 4d 54 5f 32 3b 20 45 58 50 52 20 7d 60 2e 0a 2f  MT_2; EXPR }`../
52c0: 2f 2f 0a 2f 2f 2f 20 49 74 20 69 73 20 75 73 65  //./// It is use
52d0: 64 20 74 6f 20 69 6d 70 72 6f 76 65 20 64 69 61  d to improve dia
52e0: 67 6e 6f 73 74 69 63 73 20 77 68 65 6e 20 73 75  gnostics when su
52f0: 63 68 20 74 65 6d 70 6f 72 61 72 69 65 73 20 61  ch temporaries a
5300: 72 65 0a 2f 2f 2f 20 69 6e 76 6f 6c 76 65 64 20  re./// involved 
5310: 69 6e 20 62 6f 72 72 6f 77 5f 63 68 65 63 6b 20  in borrow_check 
5320: 65 72 72 6f 72 73 2c 20 65 2e 67 2e 2c 20 65 78  errors, e.g., ex
5330: 70 6c 61 6e 61 74 69 6f 6e 73 20 6f 66 20 77 68  planations of wh
5340: 65 72 65 20 74 68 65 0a 2f 2f 2f 20 74 65 6d 70  ere the./// temp
5350: 6f 72 61 72 69 65 73 20 63 6f 6d 65 20 66 72 6f  oraries come fro
5360: 6d 2c 20 77 68 65 6e 20 74 68 65 69 72 20 64 65  m, when their de
5370: 73 74 72 75 63 74 6f 72 73 20 61 72 65 20 72 75  structors are ru
5380: 6e 2c 20 61 6e 64 2f 6f 72 20 68 6f 77 0a 2f 2f  n, and/or how.//
5390: 2f 20 6f 6e 65 20 6d 69 67 68 74 20 72 65 76 69  / one might revi
53a0: 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 73  se the code to s
53b0: 61 74 69 73 66 79 20 74 68 65 20 62 6f 72 72 6f  atisfy the borro
53c0: 77 20 63 68 65 63 6b 65 72 27 73 20 72 75 6c 65  w checker's rule
53d0: 73 2e 0a 23 5b 64 65 72 69 76 65 28 43 6c 6f 6e  s..#[derive(Clon
53e0: 65 2c 20 44 65 62 75 67 2c 20 52 75 73 74 63 45  e, Debug, RustcE
53f0: 6e 63 6f 64 61 62 6c 65 2c 20 52 75 73 74 63 44  ncodable, RustcD
5400: 65 63 6f 64 61 62 6c 65 2c 20 48 61 73 68 53 74  ecodable, HashSt
5410: 61 62 6c 65 29 5d 0a 70 75 62 20 73 74 72 75 63  able)].pub struc
5420: 74 20 42 6c 6f 63 6b 54 61 69 6c 49 6e 66 6f 20  t BlockTailInfo 
5430: 7b 0a 20 20 20 20 2f 2f 2f 20 49 66 20 60 74 72  {.    /// If `tr
5440: 75 65 60 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ue`, then the va
5450: 6c 75 65 20 72 65 73 75 6c 74 69 6e 67 20 66 72  lue resulting fr
5460: 6f 6d 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68  om evaluating th
5470: 69 73 20 74 61 69 6c 0a 20 20 20 20 2f 2f 2f 20  is tail.    /// 
5480: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 67  expression is ig
5490: 6e 6f 72 65 64 20 62 79 20 74 68 65 20 62 6c 6f  nored by the blo
54a0: 63 6b 27 73 20 65 78 70 72 65 73 73 69 6f 6e 20  ck's expression 
54b0: 63 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2f 2f 2f  context..    ///
54c0: 0a 20 20 20 20 2f 2f 2f 20 45 78 61 6d 70 6c 65  .    /// Example
54d0: 73 20 69 6e 63 6c 75 64 65 20 60 7b 20 2e 2e 2e  s include `{ ...
54e0: 3b 20 74 61 69 6c 20 7d 3b 60 20 61 6e 64 20 60  ; tail };` and `
54f0: 6c 65 74 20 5f 20 3d 20 7b 20 2e 2e 2e 3b 20 74  let _ = { ...; t
5500: 61 69 6c 20 7d 3b 60 0a 20 20 20 20 2f 2f 2f 20  ail };`.    /// 
5510: 62 75 74 20 6e 6f 74 20 65 2e 67 2e 2c 20 60 6c  but not e.g., `l
5520: 65 74 20 5f 78 20 3d 20 7b 20 2e 2e 2e 3b 20 74  et _x = { ...; t
5530: 61 69 6c 20 7d 3b 60 0a 20 20 20 20 70 75 62 20  ail };`.    pub 
5540: 74 61 69 6c 5f 72 65 73 75 6c 74 5f 69 73 5f 69  tail_result_is_i
5550: 67 6e 6f 72 65 64 3a 20 62 6f 6f 6c 2c 0a 7d 0a  gnored: bool,.}.
5560: 0a 2f 2f 2f 20 41 20 4d 49 52 20 6c 6f 63 61 6c  ./// A MIR local
5570: 2e 0a 2f 2f 2f 0a 2f 2f 2f 20 54 68 69 73 20 63  ..///./// This c
5580: 61 6e 20 62 65 20 61 20 62 69 6e 64 69 6e 67 20  an be a binding 
5590: 64 65 63 6c 61 72 65 64 20 62 79 20 74 68 65 20  declared by the 
55a0: 75 73 65 72 2c 20 61 20 74 65 6d 70 6f 72 61 72  user, a temporar
55b0: 79 20 69 6e 73 65 72 74 65 64 20 62 79 20 74 68  y inserted by th
55c0: 65 20 63 6f 6d 70 69 6c 65 72 2c 20 61 20 66 75  e compiler, a fu
55d0: 6e 63 74 69 6f 6e 0a 2f 2f 2f 20 61 72 67 75 6d  nction./// argum
55e0: 65 6e 74 2c 20 6f 72 20 74 68 65 20 72 65 74 75  ent, or the retu
55f0: 72 6e 20 70 6c 61 63 65 2e 0a 23 5b 64 65 72 69  rn place..#[deri
5600: 76 65 28 43 6c 6f 6e 65 2c 20 44 65 62 75 67 2c  ve(Clone, Debug,
5610: 20 52 75 73 74 63 45 6e 63 6f 64 61 62 6c 65 2c   RustcEncodable,
5620: 20 52 75 73 74 63 44 65 63 6f 64 61 62 6c 65 2c   RustcDecodable,
5630: 20 48 61 73 68 53 74 61 62 6c 65 2c 20 54 79 70   HashStable, Typ
5640: 65 46 6f 6c 64 61 62 6c 65 29 5d 0a 70 75 62 20  eFoldable)].pub 
5650: 73 74 72 75 63 74 20 4c 6f 63 61 6c 44 65 63 6c  struct LocalDecl
5660: 3c 27 74 63 78 3e 20 7b 0a 20 20 20 20 2f 2f 2f  <'tcx> {.    ///
5670: 20 57 68 65 74 68 65 72 20 74 68 69 73 20 69 73   Whether this is
5680: 20 61 20 6d 75 74 61 62 6c 65 20 6d 69 6e 64 69   a mutable mindi
5690: 6e 67 20 28 69 2e 65 2e 2c 20 60 6c 65 74 20 78  ng (i.e., `let x
56a0: 60 20 6f 72 20 60 6c 65 74 20 6d 75 74 20 78 60  ` or `let mut x`
56b0: 29 2e 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f  )..    ///.    /
56c0: 2f 2f 20 54 65 6d 70 6f 72 61 72 69 65 73 20 61  // Temporaries a
56d0: 6e 64 20 74 68 65 20 72 65 74 75 72 6e 20 70 6c  nd the return pl
56e0: 61 63 65 20 61 72 65 20 61 6c 77 61 79 73 20 6d  ace are always m
56f0: 75 74 61 62 6c 65 2e 0a 20 20 20 20 70 75 62 20  utable..    pub 
5700: 6d 75 74 61 62 69 6c 69 74 79 3a 20 4d 75 74 61  mutability: Muta
5710: 62 69 6c 69 74 79 2c 0a 0a 20 20 20 20 2f 2f 20  bility,..    // 
5720: 46 49 58 4d 45 28 6d 61 74 74 68 65 77 6a 61 73  FIXME(matthewjas
5730: 70 65 72 29 20 44 6f 6e 27 74 20 73 74 6f 72 65  per) Don't store
5740: 20 69 6e 20 74 68 69 73 20 69 6e 20 60 42 6f 64   in this in `Bod
5750: 79 60 0a 20 20 20 20 70 75 62 20 6c 6f 63 61 6c  y`.    pub local
5760: 5f 69 6e 66 6f 3a 20 4c 6f 63 61 6c 49 6e 66 6f  _info: LocalInfo
5770: 3c 27 74 63 78 3e 2c 0a 0a 20 20 20 20 2f 2f 2f  <'tcx>,..    ///
5780: 20 60 74 72 75 65 60 20 69 66 20 74 68 69 73 20   `true` if this 
5790: 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6c  is an internal l
57a0: 6f 63 61 6c 2e 0a 20 20 20 20 2f 2f 2f 0a 20 20  ocal..    ///.  
57b0: 20 20 2f 2f 2f 20 54 68 65 73 65 20 6c 6f 63 61    /// These loca
57c0: 6c 73 20 61 72 65 20 6e 6f 74 20 62 61 73 65 64  ls are not based
57d0: 20 6f 6e 20 74 79 70 65 73 20 69 6e 20 74 68 65   on types in the
57e0: 20 73 6f 75 72 63 65 20 63 6f 64 65 20 61 6e 64   source code and
57f0: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 0a 20   are only used. 
5800: 20 20 20 2f 2f 2f 20 66 6f 72 20 61 20 66 65 77     /// for a few
5810: 20 64 65 73 75 67 61 72 69 6e 67 73 20 61 74 20   desugarings at 
5820: 74 68 65 20 6d 6f 6d 65 6e 74 2e 0a 20 20 20 20  the moment..    
5830: 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20  ///.    /// The 
5840: 67 65 6e 65 72 61 74 6f 72 20 74 72 61 6e 73 66  generator transf
5850: 6f 72 6d 61 74 69 6f 6e 20 77 69 6c 6c 20 73 61  ormation will sa
5860: 6e 69 74 79 20 63 68 65 63 6b 20 74 68 65 20 6c  nity check the l
5870: 6f 63 61 6c 73 20 77 68 69 63 68 20 61 72 65 20  ocals which are 
5880: 6c 69 76 65 0a 20 20 20 20 2f 2f 2f 20 61 63 72  live.    /// acr
5890: 6f 73 73 20 61 20 73 75 73 70 65 6e 73 69 6f 6e  oss a suspension
58a0: 20 70 6f 69 6e 74 20 61 67 61 69 6e 73 74 20 74   point against t
58b0: 68 65 20 74 79 70 65 20 63 6f 6d 70 6f 6e 65 6e  he type componen
58c0: 74 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61  ts of the genera
58d0: 74 6f 72 0a 20 20 20 20 2f 2f 2f 20 77 68 69 63  tor.    /// whic
58e0: 68 20 74 79 70 65 20 63 68 65 63 6b 69 6e 67 20  h type checking 
58f0: 6b 6e 6f 77 73 20 61 72 65 20 6c 69 76 65 20 61  knows are live a
5900: 63 72 6f 73 73 20 61 20 73 75 73 70 65 6e 73 69  cross a suspensi
5910: 6f 6e 20 70 6f 69 6e 74 2e 20 57 65 20 6e 65 65  on point. We nee
5920: 64 20 74 6f 0a 20 20 20 20 2f 2f 2f 20 66 6c 61  d to.    /// fla
5930: 67 20 64 72 6f 70 20 66 6c 61 67 73 20 74 6f 20  g drop flags to 
5940: 61 76 6f 69 64 20 74 72 69 67 67 65 72 69 6e 67  avoid triggering
5950: 20 74 68 69 73 20 63 68 65 63 6b 20 61 73 20 74   this check as t
5960: 68 65 79 20 61 72 65 20 69 6e 74 72 6f 64 75 63  hey are introduc
5970: 65 64 0a 20 20 20 20 2f 2f 2f 20 61 66 74 65 72  ed.    /// after
5980: 20 74 79 70 65 63 6b 2e 0a 20 20 20 20 2f 2f 2f   typeck..    ///
5990: 0a 20 20 20 20 2f 2f 2f 20 55 6e 73 61 66 65 74  .    /// Unsafet
59a0: 79 20 63 68 65 63 6b 69 6e 67 20 77 69 6c 6c 20  y checking will 
59b0: 61 6c 73 6f 20 69 67 6e 6f 72 65 20 64 65 72 65  also ignore dere
59c0: 66 65 72 65 6e 63 65 73 20 6f 66 20 74 68 65 73  ferences of thes
59d0: 65 20 6c 6f 63 61 6c 73 2c 0a 20 20 20 20 2f 2f  e locals,.    //
59e0: 2f 20 73 6f 20 74 68 65 79 20 63 61 6e 20 62 65  / so they can be
59f0: 20 75 73 65 64 20 66 6f 72 20 72 61 77 20 70 6f   used for raw po
5a00: 69 6e 74 65 72 73 20 6f 6e 6c 79 20 75 73 65 64  inters only used
5a10: 20 69 6e 20 61 20 64 65 73 75 67 61 72 69 6e 67   in a desugaring
5a20: 2e 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f  ..    ///.    //
5a30: 2f 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  / This should be
5a40: 20 73 6f 75 6e 64 20 62 65 63 61 75 73 65 20 74   sound because t
5a50: 68 65 20 64 72 6f 70 20 66 6c 61 67 73 20 61 72  he drop flags ar
5a60: 65 20 66 75 6c 6c 79 20 61 6c 67 65 62 72 61 69  e fully algebrai
5a70: 63 2c 20 61 6e 64 0a 20 20 20 20 2f 2f 2f 20 74  c, and.    /// t
5a80: 68 65 72 65 66 6f 72 65 20 64 6f 6e 27 74 20 61  herefore don't a
5a90: 66 66 65 63 74 20 74 68 65 20 4f 49 42 49 54 20  ffect the OIBIT 
5aa0: 6f 72 20 6f 75 74 6c 69 76 65 73 20 70 72 6f 70  or outlives prop
5ab0: 65 72 74 69 65 73 20 6f 66 20 74 68 65 0a 20 20  erties of the.  
5ac0: 20 20 2f 2f 2f 20 67 65 6e 65 72 61 74 6f 72 2e    /// generator.
5ad0: 0a 20 20 20 20 70 75 62 20 69 6e 74 65 72 6e 61  .    pub interna
5ae0: 6c 3a 20 62 6f 6f 6c 2c 0a 0a 20 20 20 20 2f 2f  l: bool,..    //
5af0: 2f 20 49 66 20 74 68 69 73 20 6c 6f 63 61 6c 20  / If this local 
5b00: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 61  is a temporary a
5b10: 6e 64 20 60 69 73 5f 62 6c 6f 63 6b 5f 74 61 69  nd `is_block_tai
5b20: 6c 60 20 69 73 20 60 53 6f 6d 65 60 2c 0a 20 20  l` is `Some`,.  
5b30: 20 20 2f 2f 2f 20 74 68 65 6e 20 69 74 20 69 73    /// then it is
5b40: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 72 65   a temporary cre
5b50: 61 74 65 64 20 66 6f 72 20 65 76 61 6c 75 61 74  ated for evaluat
5b60: 69 6f 6e 20 6f 66 20 73 6f 6d 65 0a 20 20 20 20  ion of some.    
5b70: 2f 2f 2f 20 73 75 62 65 78 70 72 65 73 73 69 6f  /// subexpressio
5b80: 6e 20 6f 66 20 73 6f 6d 65 20 62 6c 6f 63 6b 27  n of some block'
5b90: 73 20 74 61 69 6c 20 65 78 70 72 65 73 73 69 6f  s tail expressio
5ba0: 6e 20 28 77 69 74 68 20 6e 6f 0a 20 20 20 20 2f  n (with no.    /
5bb0: 2f 2f 20 69 6e 74 65 72 76 65 6e 69 6e 67 20 73  // intervening s
5bc0: 74 61 74 65 6d 65 6e 74 20 63 6f 6e 74 65 78 74  tatement context
5bd0: 29 2e 0a 20 20 20 20 2f 2f 20 46 49 58 4d 45 28  )..    // FIXME(
5be0: 6d 61 74 74 68 65 77 6a 61 73 70 65 72 29 20 44  matthewjasper) D
5bf0: 6f 6e 27 74 20 73 74 6f 72 65 20 69 6e 20 74 68  on't store in th
5c00: 69 73 20 69 6e 20 60 42 6f 64 79 60 0a 20 20 20  is in `Body`.   
5c10: 20 70 75 62 20 69 73 5f 62 6c 6f 63 6b 5f 74 61   pub is_block_ta
5c20: 69 6c 3a 20 4f 70 74 69 6f 6e 3c 42 6c 6f 63 6b  il: Option<Block
5c30: 54 61 69 6c 49 6e 66 6f 3e 2c 0a 0a 20 20 20 20  TailInfo>,..    
5c40: 2f 2f 2f 20 54 68 65 20 74 79 70 65 20 6f 66 20  /// The type of 
5c50: 74 68 69 73 20 6c 6f 63 61 6c 2e 0a 20 20 20 20  this local..    
5c60: 70 75 62 20 74 79 3a 20 54 79 3c 27 74 63 78 3e  pub ty: Ty<'tcx>
5c70: 2c 0a 0a 20 20 20 20 2f 2f 2f 20 49 66 20 74 68  ,..    /// If th
5c80: 65 20 75 73 65 72 20 6d 61 6e 75 61 6c 6c 79 20  e user manually 
5c90: 61 73 63 72 69 62 65 64 20 61 20 74 79 70 65 20  ascribed a type 
5ca0: 74 6f 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  to this variable
5cb0: 2c 0a 20 20 20 20 2f 2f 2f 20 65 2e 67 2e 2c 20  ,.    /// e.g., 
5cc0: 76 69 61 20 60 6c 65 74 20 78 3a 20 54 60 2c 20  via `let x: T`, 
5cd0: 74 68 65 6e 20 77 65 20 63 61 72 72 79 20 74 68  then we carry th
5ce0: 61 74 20 74 79 70 65 20 68 65 72 65 2e 20 54 68  at type here. Th
5cf0: 65 20 4d 49 52 0a 20 20 20 20 2f 2f 2f 20 62 6f  e MIR.    /// bo
5d00: 72 72 6f 77 20 63 68 65 63 6b 65 72 20 6e 65 65  rrow checker nee
5d10: 64 73 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  ds this informat
5d20: 69 6f 6e 20 73 69 6e 63 65 20 69 74 20 63 61 6e  ion since it can
5d30: 20 61 66 66 65 63 74 0a 20 20 20 20 2f 2f 2f 20   affect.    /// 
5d40: 72 65 67 69 6f 6e 20 69 6e 66 65 72 65 6e 63 65  region inference
5d50: 2e 0a 20 20 20 20 2f 2f 20 46 49 58 4d 45 28 6d  ..    // FIXME(m
5d60: 61 74 74 68 65 77 6a 61 73 70 65 72 29 20 44 6f  atthewjasper) Do
5d70: 6e 27 74 20 73 74 6f 72 65 20 69 6e 20 74 68 69  n't store in thi
5d80: 73 20 69 6e 20 60 42 6f 64 79 60 0a 20 20 20 20  s in `Body`.    
5d90: 70 75 62 20 75 73 65 72 5f 74 79 3a 20 55 73 65  pub user_ty: Use
5da0: 72 54 79 70 65 50 72 6f 6a 65 63 74 69 6f 6e 73  rTypeProjections
5db0: 2c 0a 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 2a  ,..    /// The *
5dc0: 73 79 6e 74 61 63 74 69 63 2a 20 28 69 2e 65 2e  syntactic* (i.e.
5dd0: 2c 20 6e 6f 74 20 76 69 73 69 62 69 6c 69 74 79  , not visibility
5de0: 29 20 73 6f 75 72 63 65 20 73 63 6f 70 65 20 74  ) source scope t
5df0: 68 65 20 6c 6f 63 61 6c 20 69 73 20 64 65 66 69  he local is defi
5e00: 6e 65 64 0a 20 20 20 20 2f 2f 2f 20 69 6e 2e 20  ned.    /// in. 
5e10: 49 66 20 74 68 65 20 6c 6f 63 61 6c 20 77 61 73  If the local was
5e20: 20 64 65 66 69 6e 65 64 20 69 6e 20 61 20 6c 65   defined in a le
5e30: 74 2d 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 69  t-statement, thi
5e40: 73 0a 20 20 20 20 2f 2f 2f 20 69 73 20 2a 77 69  s.    /// is *wi
5e50: 74 68 69 6e 2a 20 74 68 65 20 6c 65 74 2d 73 74  thin* the let-st
5e60: 61 74 65 6d 65 6e 74 2c 20 72 61 74 68 65 72 20  atement, rather 
5e70: 74 68 61 6e 20 6f 75 74 73 69 64 65 0a 20 20 20  than outside.   
5e80: 20 2f 2f 2f 20 6f 66 20 69 74 2e 0a 20 20 20 20   /// of it..    
5e90: 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 54 68 69 73  ///.    /// This
5ea0: 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
5eb0: 73 65 20 74 68 65 20 76 69 73 69 62 69 6c 69 74  se the visibilit
5ec0: 79 20 73 6f 75 72 63 65 20 73 63 6f 70 65 20 6f  y source scope o
5ed0: 66 20 6c 6f 63 61 6c 73 20 77 69 74 68 69 6e 0a  f locals within.
5ee0: 20 20 20 20 2f 2f 2f 20 61 20 6c 65 74 2d 73 74      /// a let-st
5ef0: 61 74 65 6d 65 6e 74 20 69 73 20 77 65 69 72 64  atement is weird
5f00: 2e 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f  ..    ///.    //
5f10: 2f 20 54 68 65 20 72 65 61 73 6f 6e 20 69 73 20  / The reason is 
5f20: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 68 65  that we want the
5f30: 20 6c 6f 63 61 6c 20 74 6f 20 62 65 20 2a 77 69   local to be *wi
5f40: 74 68 69 6e 2a 20 74 68 65 20 6c 65 74 2d 73 74  thin* the let-st
5f50: 61 74 65 6d 65 6e 74 0a 20 20 20 20 2f 2f 2f 20  atement.    /// 
5f60: 66 6f 72 20 6c 69 6e 74 20 70 75 72 70 6f 73 65  for lint purpose
5f70: 73 2c 20 62 75 74 20 77 65 20 77 61 6e 74 20 74  s, but we want t
5f80: 68 65 20 6c 6f 63 61 6c 20 74 6f 20 62 65 20 2a  he local to be *
5f90: 61 66 74 65 72 2a 20 74 68 65 20 6c 65 74 2d 73  after* the let-s
5fa0: 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2f 2f 2f  tatement.    ///
5fb0: 20 66 6f 72 20 6e 61 6d 65 73 2d 69 6e 2d 73 63   for names-in-sc
5fc0: 6f 70 65 20 70 75 72 70 6f 73 65 73 2e 0a 20 20  ope purposes..  
5fd0: 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 54 68    ///.    /// Th
5fe0: 61 74 27 73 20 69 74 2c 20 69 66 20 77 65 20 68  at's it, if we h
5ff0: 61 76 65 20 61 20 6c 65 74 2d 73 74 61 74 65 6d  ave a let-statem
6000: 65 6e 74 20 6c 69 6b 65 20 74 68 65 20 6f 6e 65  ent like the one
6010: 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2f 2f 2f   in this.    ///
6020: 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 20 2f   function:.    /
6030: 2f 2f 0a 20 20 20 20 2f 2f 2f 20 60 60 60 0a 20  //.    /// ```. 
6040: 20 20 20 2f 2f 2f 20 66 6e 20 66 6f 6f 28 78 3a     /// fn foo(x:
6050: 20 26 73 74 72 29 20 7b 0a 20 20 20 20 2f 2f 2f   &str) {.    ///
6060: 20 20 20 20 20 23 5b 61 6c 6c 6f 77 28 75 6e 75       #[allow(unu
6070: 73 65 64 5f 6d 75 74 29 5d 0a 20 20 20 20 2f 2f  sed_mut)].    //
6080: 2f 20 20 20 20 20 6c 65 74 20 6d 75 74 20 78 3a  /     let mut x:
6090: 20 75 33 32 20 3d 20 7b 20 2f 2f 20 3c 2d 20 6f   u32 = { // <- o
60a0: 6e 65 20 75 6e 75 73 65 64 20 6d 75 74 0a 20 20  ne unused mut.  
60b0: 20 20 2f 2f 2f 20 20 20 20 20 20 20 20 20 6c 65    ///         le
60c0: 74 20 6d 75 74 20 79 3a 20 75 33 32 20 3d 20 78  t mut y: u32 = x
60d0: 2e 70 61 72 73 65 28 29 2e 75 6e 77 72 61 70 28  .parse().unwrap(
60e0: 29 3b 0a 20 20 20 20 2f 2f 2f 20 20 20 20 20 20  );.    ///      
60f0: 20 20 20 79 20 2b 20 32 0a 20 20 20 20 2f 2f 2f     y + 2.    ///
6100: 20 20 20 20 20 7d 3b 0a 20 20 20 20 2f 2f 2f 20       };.    /// 
6110: 20 20 20 20 64 72 6f 70 28 78 29 3b 0a 20 20 20      drop(x);.   
6120: 20 2f 2f 2f 20 7d 0a 20 20 20 20 2f 2f 2f 20 60   /// }.    /// `
6130: 60 60 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f  ``.    ///.    /
6140: 2f 2f 20 54 68 65 6e 2c 20 66 72 6f 6d 20 61 20  // Then, from a 
6150: 6c 69 6e 74 20 70 6f 69 6e 74 20 6f 66 20 76 69  lint point of vi
6160: 65 77 2c 20 74 68 65 20 64 65 63 6c 61 72 61 74  ew, the declarat
6170: 69 6f 6e 20 6f 66 20 60 78 3a 20 75 33 32 60 0a  ion of `x: u32`.
6180: 20 20 20 20 2f 2f 2f 20 28 61 6e 64 20 60 79 3a      /// (and `y:
6190: 20 75 33 32 60 29 20 61 72 65 20 77 69 74 68 69   u32`) are withi
61a0: 6e 20 74 68 65 20 60 23 5b 61 6c 6c 6f 77 28 75  n the `#[allow(u
61b0: 6e 75 73 65 64 5f 6d 75 74 29 5d 60 20 73 63 6f  nused_mut)]` sco
61c0: 70 65 20 2d 20 74 68 65 0a 20 20 20 20 2f 2f 2f  pe - the.    ///
61d0: 20 6c 69 6e 74 20 73 63 6f 70 65 73 20 61 72 65   lint scopes are
61e0: 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
61f0: 20 41 53 54 2f 48 49 52 20 6e 65 73 74 69 6e 67   AST/HIR nesting
6200: 2e 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f  ..    ///.    //
6210: 2f 20 48 6f 77 65 76 65 72 2c 20 66 72 6f 6d 20  / However, from 
6220: 61 20 6e 61 6d 65 20 6c 6f 6f 6b 75 70 20 70 6f  a name lookup po
6230: 69 6e 74 20 6f 66 20 76 69 65 77 2c 20 74 68 65  int of view, the
6240: 20 73 63 6f 70 65 73 20 6c 6f 6f 6b 20 6d 6f 72   scopes look mor
6250: 65 20 6c 69 6b 65 0a 20 20 20 20 2f 2f 2f 20 61  e like.    /// a
6260: 73 20 69 66 20 74 68 65 20 6c 65 74 2d 73 74 61  s if the let-sta
6270: 74 65 6d 65 6e 74 73 20 77 65 72 65 20 60 6d 61  tements were `ma
6280: 74 63 68 60 20 65 78 70 72 65 73 73 69 6f 6e 73  tch` expressions
6290: 3a 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f  :.    ///.    //
62a0: 2f 20 60 60 60 0a 20 20 20 20 2f 2f 2f 20 66 6e  / ```.    /// fn
62b0: 20 66 6f 6f 28 78 3a 20 26 73 74 72 29 20 7b 0a   foo(x: &str) {.
62c0: 20 20 20 20 2f 2f 2f 20 20 20 20 20 6d 61 74 63      ///     matc
62d0: 68 20 7b 0a 20 20 20 20 2f 2f 2f 20 20 20 20 20  h {.    ///     
62e0: 20 20 20 20 6d 61 74 63 68 20 78 2e 70 61 72 73      match x.pars
62f0: 65 28 29 2e 75 6e 77 72 61 70 28 29 20 7b 0a 20  e().unwrap() {. 
6300: 20 20 20 2f 2f 2f 20 20 20 20 20 20 20 20 20 20     ///          
6310: 20 20 20 79 20 3d 3e 20 79 20 2b 20 32 0a 20 20     y => y + 2.  
6320: 20 20 2f 2f 2f 20 20 20 20 20 20 20 20 20 7d 0a    ///         }.
6330: 20 20 20 20 2f 2f 2f 20 20 20 20 20 7d 20 7b 0a      ///     } {.
6340: 20 20 20 20 2f 2f 2f 20 20 20 20 20 20 20 20 20      ///         
6350: 78 20 3d 3e 20 64 72 6f 70 28 78 29 0a 20 20 20  x => drop(x).   
6360: 20 2f 2f 2f 20 20 20 20 20 7d 3b 0a 20 20 20 20   ///     };.    
6370: 2f 2f 2f 20 7d 0a 20 20 20 20 2f 2f 2f 20 60 60  /// }.    /// ``
6380: 60 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f  `.    ///.    //
6390: 2f 20 57 65 20 63 61 72 65 20 61 62 6f 75 74 20  / We care about 
63a0: 74 68 65 20 6e 61 6d 65 2d 6c 6f 6f 6b 75 70 20  the name-lookup 
63b0: 73 63 6f 70 65 73 20 66 6f 72 20 64 65 62 75 67  scopes for debug
63c0: 69 6e 66 6f 20 2d 20 69 66 20 74 68 65 0a 20 20  info - if the.  
63d0: 20 20 2f 2f 2f 20 64 65 62 75 67 69 6e 66 6f 20    /// debuginfo 
63e0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 70 6f 69 6e  instruction poin
63f0: 74 65 72 20 69 73 20 61 74 20 74 68 65 20 63 61  ter is at the ca
6400: 6c 6c 20 74 6f 20 60 78 2e 70 61 72 73 65 28 29  ll to `x.parse()
6410: 60 2c 20 77 65 0a 20 20 20 20 2f 2f 2f 20 77 61  `, we.    /// wa
6420: 6e 74 20 60 78 60 20 74 6f 20 72 65 66 65 72 20  nt `x` to refer 
6430: 74 6f 20 60 78 3a 20 26 73 74 72 60 2c 20 62 75  to `x: &str`, bu
6440: 74 20 69 66 20 69 74 20 69 73 20 61 74 20 74 68  t if it is at th
6450: 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2f 2f  e call to.    //
6460: 2f 20 60 64 72 6f 70 28 78 29 60 2c 20 77 65 20  / `drop(x)`, we 
6470: 77 61 6e 74 20 69 74 20 74 6f 20 72 65 66 65 72  want it to refer
6480: 20 74 6f 20 60 78 3a 20 75 33 32 60 2e 0a 20 20   to `x: u32`..  
6490: 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 54 6f    ///.    /// To
64a0: 20 61 6c 6c 6f 77 20 62 6f 74 68 20 75 73 65 73   allow both uses
64b0: 20 74 6f 20 77 6f 72 6b 2c 20 77 65 20 6e 65 65   to work, we nee
64c0: 64 20 74 6f 20 68 61 76 65 20 6d 6f 72 65 20 74  d to have more t
64d0: 68 61 6e 20 61 20 73 69 6e 67 6c 65 20 73 63 6f  han a single sco
64e0: 70 65 0a 20 20 20 20 2f 2f 2f 20 66 6f 72 20 61  pe.    /// for a
64f0: 20 6c 6f 63 61 6c 2e 20 57 65 20 68 61 76 65 20   local. We have 
6500: 74 68 65 20 60 73 6f 75 72 63 65 5f 69 6e 66 6f  the `source_info
6510: 2e 73 63 6f 70 65 60 20 72 65 70 72 65 73 65 6e  .scope` represen
6520: 74 20 74 68 65 20 22 73 79 6e 74 61 63 74 69 63  t the "syntactic
6530: 22 0a 20 20 20 20 2f 2f 2f 20 6c 69 6e 74 20 73  ".    /// lint s
6540: 63 6f 70 65 20 28 77 69 74 68 20 61 20 76 61 72  cope (with a var
6550: 69 61 62 6c 65 20 62 65 69 6e 67 20 75 6e 64 65  iable being unde
6560: 72 20 69 74 73 20 6c 65 74 20 62 6c 6f 63 6b 29  r its let block)
6570: 20 77 68 69 6c 65 20 74 68 65 0a 20 20 20 20 2f   while the.    /
6580: 2f 2f 20 60 76 61 72 5f 64 65 62 75 67 5f 69 6e  // `var_debug_in
6590: 66 6f 2e 73 6f 75 72 63 65 5f 69 6e 66 6f 2e 73  fo.source_info.s
65a0: 63 6f 70 65 60 20 72 65 70 72 65 73 65 6e 74 73  cope` represents
65b0: 20 74 68 65 20 22 6c 6f 63 61 6c 20 76 61 72 69   the "local vari
65c0: 61 62 6c 65 22 0a 20 20 20 20 2f 2f 2f 20 73 63  able".    /// sc
65d0: 6f 70 65 20 28 77 68 65 72 65 20 74 68 65 20 22  ope (where the "
65e0: 72 65 73 74 22 20 6f 66 20 61 20 62 6c 6f 63 6b  rest" of a block
65f0: 20 69 73 20 75 6e 64 65 72 20 61 6c 6c 20 70 72   is under all pr
6600: 69 6f 72 20 6c 65 74 2d 73 74 61 74 65 6d 65 6e  ior let-statemen
6610: 74 73 29 2e 0a 20 20 20 20 2f 2f 2f 0a 20 20 20  ts)..    ///.   
6620: 20 2f 2f 2f 20 54 68 65 20 65 6e 64 20 72 65 73   /// The end res
6630: 75 6c 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74  ult looks like t
6640: 68 69 73 3a 0a 20 20 20 20 2f 2f 2f 0a 20 20 20  his:.    ///.   
6650: 20 2f 2f 2f 20 60 60 60 74 65 78 74 0a 20 20 20   /// ```text.   
6660: 20 2f 2f 2f 20 52 4f 4f 54 20 53 43 4f 50 45 0a   /// ROOT SCOPE.
6670: 20 20 20 20 2f 2f 2f 20 20 e2 94 82 7b 20 61 72      ///  ...{ ar
6680: 67 75 6d 65 6e 74 20 78 3a 20 26 73 74 72 20 7d  gument x: &str }
6690: 0a 20 20 20 20 2f 2f 2f 20 20 e2 94 82 0a 20 20  .    ///  ....  
66a0: 20 20 2f 2f 2f 20 20 e2 94 82 20 e2 94 82 7b 20    ///  ... ...{ 
66b0: 23 5b 61 6c 6c 6f 77 28 75 6e 75 73 65 64 5f 6d  #[allow(unused_m
66c0: 75 74 29 5d 20 7d 20 2f 2f 20 54 68 69 73 20 69  ut)] } // This i
66d0: 73 20 61 63 74 75 61 6c 6c 79 20 73 70 6c 69 74  s actually split
66e0: 20 69 6e 74 6f 20 32 20 73 63 6f 70 65 73 0a 20   into 2 scopes. 
66f0: 20 20 20 2f 2f 2f 20 20 e2 94 82 20 e2 94 82 20     ///  ... ... 
6700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6710: 20 20 20 20 20 20 20 20 2f 2f 20 69 6e 20 70 72          // in pr
6720: 61 63 74 69 63 65 20 62 65 63 61 75 73 65 20 49  actice because I
6730: 27 6d 20 6c 61 7a 79 2e 0a 20 20 20 20 2f 2f 2f  'm lazy..    ///
6740: 20 20 e2 94 82 20 e2 94 82 0a 20 20 20 20 2f 2f    ... ....    //
6750: 2f 20 20 e2 94 82 20 e2 94 82 e2 86 90 20 78 2e  /  ... ...... x.
6760: 73 6f 75 72 63 65 5f 69 6e 66 6f 2e 73 63 6f 70  source_info.scop
6770: 65 0a 20 20 20 20 2f 2f 2f 20 20 e2 94 82 20 e2  e.    ///  ... .
6780: 94 82 e2 86 90 20 60 78 2e 70 61 72 73 65 28 29  ..... `x.parse()
6790: 2e 75 6e 77 72 61 70 28 29 60 0a 20 20 20 20 2f  .unwrap()`.    /
67a0: 2f 2f 20 20 e2 94 82 20 e2 94 82 0a 20 20 20 20  //  ... ....    
67b0: 2f 2f 2f 20 20 e2 94 82 20 e2 94 82 20 e2 94 82  ///  ... ... ...
67c0: e2 86 90 20 79 2e 73 6f 75 72 63 65 5f 69 6e 66  ... y.source_inf
67d0: 6f 2e 73 63 6f 70 65 0a 20 20 20 20 2f 2f 2f 20  o.scope.    /// 
67e0: 20 e2 94 82 20 e2 94 82 0a 20 20 20 20 2f 2f 2f   ... ....    ///
67f0: 20 20 e2 94 82 20 e2 94 82 20 e2 94 82 7b 20 6c    ... ... ...{ l
6800: 65 74 20 79 3a 20 75 33 32 20 7d 0a 20 20 20 20  et y: u32 }.    
6810: 2f 2f 2f 20 20 e2 94 82 20 e2 94 82 20 e2 94 82  ///  ... ... ...
6820: 0a 20 20 20 20 2f 2f 2f 20 20 e2 94 82 20 e2 94  .    ///  ... ..
6830: 82 20 e2 94 82 e2 86 90 20 79 2e 76 61 72 5f 64  . ...... y.var_d
6840: 65 62 75 67 5f 69 6e 66 6f 2e 73 6f 75 72 63 65  ebug_info.source
6850: 5f 69 6e 66 6f 2e 73 63 6f 70 65 0a 20 20 20 20  _info.scope.    
6860: 2f 2f 2f 20 20 e2 94 82 20 e2 94 82 20 e2 94 82  ///  ... ... ...
6870: e2 86 90 20 60 79 20 2b 20 32 60 0a 20 20 20 20  ... `y + 2`.    
6880: 2f 2f 2f 20 20 e2 94 82 0a 20 20 20 20 2f 2f 2f  ///  ....    ///
6890: 20 20 e2 94 82 20 e2 94 82 7b 20 6c 65 74 20 78    ... ...{ let x
68a0: 3a 20 75 33 32 20 7d 0a 20 20 20 20 2f 2f 2f 20  : u32 }.    /// 
68b0: 20 e2 94 82 20 e2 94 82 e2 86 90 20 78 2e 76 61   ... ...... x.va
68c0: 72 5f 64 65 62 75 67 5f 69 6e 66 6f 2e 73 6f 75  r_debug_info.sou
68d0: 72 63 65 5f 69 6e 66 6f 2e 73 63 6f 70 65 0a 20  rce_info.scope. 
68e0: 20 20 20 2f 2f 2f 20 20 e2 94 82 20 e2 94 82 e2     ///  ... ....
68f0: 86 90 20 60 64 72 6f 70 28 78 29 60 20 2f 2f 20  .. `drop(x)` // 
6900: 54 68 69 73 20 61 63 63 65 73 73 65 73 20 60 78  This accesses `x
6910: 3a 20 75 33 32 60 2e 0a 20 20 20 20 2f 2f 2f 20  : u32`..    /// 
6920: 60 60 60 0a 20 20 20 20 70 75 62 20 73 6f 75 72  ```.    pub sour
6930: 63 65 5f 69 6e 66 6f 3a 20 53 6f 75 72 63 65 49  ce_info: SourceI
6940: 6e 66 6f 2c 0a 7d 0a 0a 2f 2f 2f 20 45 78 74 72  nfo,.}../// Extr
6950: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  a information ab
6960: 6f 75 74 20 61 20 6c 6f 63 61 6c 20 74 68 61 74  out a local that
6970: 27 73 20 75 73 65 64 20 66 6f 72 20 64 69 61 67  's used for diag
6980: 6e 6f 73 74 69 63 73 2e 0a 23 5b 64 65 72 69 76  nostics..#[deriv
6990: 65 28 43 6c 6f 6e 65 2c 20 44 65 62 75 67 2c 20  e(Clone, Debug, 
69a0: 52 75 73 74 63 45 6e 63 6f 64 61 62 6c 65 2c 20  RustcEncodable, 
69b0: 52 75 73 74 63 44 65 63 6f 64 61 62 6c 65 2c 20  RustcDecodable, 
69c0: 48 61 73 68 53 74 61 62 6c 65 2c 20 54 79 70 65  HashStable, Type
69d0: 46 6f 6c 64 61 62 6c 65 29 5d 0a 70 75 62 20 65  Foldable)].pub e
69e0: 6e 75 6d 20 4c 6f 63 61 6c 49 6e 66 6f 3c 27 74  num LocalInfo<'t
69f0: 63 78 3e 20 7b 0a 20 20 20 20 2f 2f 2f 20 41 20  cx> {.    /// A 
6a00: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 6c 6f 63  user-defined loc
6a10: 61 6c 20 76 61 72 69 61 62 6c 65 20 6f 72 20 66  al variable or f
6a20: 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
6a30: 72 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f  r.    ///.    //
6a40: 2f 20 54 68 65 20 60 42 69 6e 64 69 6e 67 46 6f  / The `BindingFo
6a50: 72 6d 60 20 69 73 20 73 6f 6c 65 6c 79 20 75 73  rm` is solely us
6a60: 65 64 20 66 6f 72 20 6c 6f 63 61 6c 20 64 69 61  ed for local dia
6a70: 67 6e 6f 73 74 69 63 73 20 77 68 65 6e 20 67 65  gnostics when ge
6a80: 6e 65 72 61 74 69 6e 67 0a 20 20 20 20 2f 2f 2f  nerating.    ///
6a90: 20 77 61 72 6e 69 6e 67 73 2f 65 72 72 6f 72 73   warnings/errors
6aa0: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
6ab0: 74 68 65 20 63 75 72 72 65 6e 74 20 63 72 61 74  the current crat
6ac0: 65 2c 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65  e, and therefore
6ad0: 20 69 74 20 6e 65 65 64 0a 20 20 20 20 2f 2f 2f   it need.    ///
6ae0: 20 6e 6f 74 20 62 65 20 76 69 73 69 62 6c 65 20   not be visible 
6af0: 61 63 72 6f 73 73 20 63 72 61 74 65 73 2e 0a 20  across crates.. 
6b00: 20 20 20 55 73 65 72 28 43 6c 65 61 72 43 72 6f     User(ClearCro
6b10: 73 73 43 72 61 74 65 3c 42 69 6e 64 69 6e 67 46  ssCrate<BindingF
6b20: 6f 72 6d 3c 27 74 63 78 3e 3e 29 2c 0a 20 20 20  orm<'tcx>>),.   
6b30: 20 2f 2f 2f 20 41 20 74 65 6d 70 6f 72 61 72 79   /// A temporary
6b40: 20 63 72 65 61 74 65 64 20 74 68 61 74 20 72 65   created that re
6b50: 66 65 72 65 6e 63 65 73 20 74 68 65 20 73 74 61  ferences the sta
6b60: 74 69 63 20 77 69 74 68 20 74 68 65 20 67 69 76  tic with the giv
6b70: 65 6e 20 60 44 65 66 49 64 60 2e 0a 20 20 20 20  en `DefId`..    
6b80: 53 74 61 74 69 63 52 65 66 20 7b 20 64 65 66 5f  StaticRef { def_
6b90: 69 64 3a 20 44 65 66 49 64 2c 20 69 73 5f 74 68  id: DefId, is_th
6ba0: 72 65 61 64 5f 6c 6f 63 61 6c 3a 20 62 6f 6f 6c  read_local: bool
6bb0: 20 7d 2c 0a 20 20 20 20 2f 2f 2f 20 41 6e 79 20   },.    /// Any 
6bc0: 6f 74 68 65 72 20 74 65 6d 70 6f 72 61 72 79 2c  other temporary,
6bd0: 20 74 68 65 20 72 65 74 75 72 6e 20 70 6c 61 63   the return plac
6be0: 65 2c 20 6f 72 20 61 6e 20 61 6e 6f 6e 79 6d 6f  e, or an anonymo
6bf0: 75 73 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61  us function para
6c00: 6d 65 74 65 72 2e 0a 20 20 20 20 4f 74 68 65 72  meter..    Other
6c10: 2c 0a 7d 0a 0a 69 6d 70 6c 3c 27 74 63 78 3e 20  ,.}..impl<'tcx> 
6c20: 4c 6f 63 61 6c 44 65 63 6c 3c 27 74 63 78 3e 20  LocalDecl<'tcx> 
6c30: 7b 0a 20 20 20 20 2f 2f 2f 20 52 65 74 75 72 6e  {.    /// Return
6c40: 73 20 60 74 72 75 65 60 20 6f 6e 6c 79 20 69 66  s `true` only if
6c50: 20 6c 6f 63 61 6c 20 69 73 20 61 20 62 69 6e 64   local is a bind
6c60: 69 6e 67 20 74 68 61 74 20 63 61 6e 20 69 74 73  ing that can its
6c70: 65 6c 66 20 62 65 0a 20 20 20 20 2f 2f 2f 20 6d  elf be.    /// m
6c80: 61 64 65 20 6d 75 74 61 62 6c 65 20 76 69 61 20  ade mutable via 
6c90: 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20  the addition of 
6ca0: 74 68 65 20 60 6d 75 74 60 20 6b 65 79 77 6f 72  the `mut` keywor
6cb0: 64 2c 20 6e 61 6d 65 6c 79 0a 20 20 20 20 2f 2f  d, namely.    //
6cc0: 2f 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65  / something like
6cd0: 20 74 68 65 20 6f 63 63 75 72 72 65 6e 63 65 73   the occurrences
6ce0: 20 6f 66 20 60 78 60 20 69 6e 3a 0a 20 20 20 20   of `x` in:.    
6cf0: 2f 2f 2f 20 2d 20 60 66 6e 20 66 6f 6f 28 78 3a  /// - `fn foo(x:
6d00: 20 54 79 70 65 29 20 7b 20 2e 2e 2e 20 7d 60 2c   Type) { ... }`,
6d10: 0a 20 20 20 20 2f 2f 2f 20 2d 20 60 6c 65 74 20  .    /// - `let 
6d20: 78 20 3d 20 2e 2e 2e 60 2c 0a 20 20 20 20 2f 2f  x = ...`,.    //
6d30: 2f 20 2d 20 6f 72 20 60 6d 61 74 63 68 20 2e 2e  / - or `match ..
6d40: 2e 20 7b 20 43 28 78 29 20 3d 3e 20 2e 2e 2e 20  . { C(x) => ... 
6d50: 7d 60 0a 20 20 20 20 70 75 62 20 66 6e 20 63 61  }`.    pub fn ca
6d60: 6e 5f 62 65 5f 6d 61 64 65 5f 6d 75 74 61 62 6c  n_be_made_mutabl
6d70: 65 28 26 73 65 6c 66 29 20 2d 3e 20 62 6f 6f 6c  e(&self) -> bool
6d80: 20 7b 0a 20 20 20 20 20 20 20 20 6d 61 74 63 68   {.        match
6d90: 20 73 65 6c 66 2e 6c 6f 63 61 6c 5f 69 6e 66 6f   self.local_info
6da0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 4c   {.            L
6db0: 6f 63 61 6c 49 6e 66 6f 3a 3a 55 73 65 72 28 43  ocalInfo::User(C
6dc0: 6c 65 61 72 43 72 6f 73 73 43 72 61 74 65 3a 3a  learCrossCrate::
6dd0: 53 65 74 28 42 69 6e 64 69 6e 67 46 6f 72 6d 3a  Set(BindingForm:
6de0: 3a 56 61 72 28 56 61 72 42 69 6e 64 69 6e 67 46  :Var(VarBindingF
6df0: 6f 72 6d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  orm {.          
6e00: 20 20 20 20 20 20 62 69 6e 64 69 6e 67 5f 6d 6f        binding_mo
6e10: 64 65 3a 20 74 79 3a 3a 42 69 6e 64 69 6e 67 4d  de: ty::BindingM
6e20: 6f 64 65 3a 3a 42 69 6e 64 42 79 56 61 6c 75 65  ode::BindByValue
6e30: 28 5f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  (_),.           
6e40: 20 20 20 20 20 6f 70 74 5f 74 79 5f 69 6e 66 6f       opt_ty_info
6e50: 3a 20 5f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : _,.           
6e60: 20 20 20 20 20 6f 70 74 5f 6d 61 74 63 68 5f 70       opt_match_p
6e70: 6c 61 63 65 3a 20 5f 2c 0a 20 20 20 20 20 20 20  lace: _,.       
6e80: 20 20 20 20 20 20 20 20 20 70 61 74 5f 73 70 61           pat_spa
6e90: 6e 3a 20 5f 2c 0a 20 20 20 20 20 20 20 20 20 20  n: _,.          
6ea0: 20 20 7d 29 29 29 20 3d 3e 20 74 72 75 65 2c 0a    }))) => true,.
6eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 4c 6f 63  .            Loc
6ec0: 61 6c 49 6e 66 6f 3a 3a 55 73 65 72 28 0a 20 20  alInfo::User(.  
6ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6c                Cl
6ee0: 65 61 72 43 72 6f 73 73 43 72 61 74 65 3a 3a 53  earCrossCrate::S
6ef0: 65 74 28 42 69 6e 64 69 6e 67 46 6f 72 6d 3a 3a  et(BindingForm::
6f00: 49 6d 70 6c 69 63 69 74 53 65 6c 66 28 49 6d 70  ImplicitSelf(Imp
6f10: 6c 69 63 69 74 53 65 6c 66 4b 69 6e 64 3a 3a 49  licitSelfKind::I
6f20: 6d 6d 29 29 2c 0a 20 20 20 20 20 20 20 20 20 20  mm)),.          
6f30: 20 20 29 20 3d 3e 20 74 72 75 65 2c 0a 0a 20 20    ) => true,..  
6f40: 20 20 20 20 20 20 20 20 20 20 5f 20 3d 3e 20 66            _ => f
6f50: 61 6c 73 65 2c 0a 20 20 20 20 20 20 20 20 7d 0a  alse,.        }.
6f60: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 52      }..    /// R
6f70: 65 74 75 72 6e 73 20 60 74 72 75 65 60 20 69 66  eturns `true` if
6f80: 20 6c 6f 63 61 6c 20 69 73 20 64 65 66 69 6e 69   local is defini
6f90: 74 65 6c 79 20 6e 6f 74 20 61 20 60 72 65 66 20  tely not a `ref 
6fa0: 69 64 65 6e 74 60 20 6f 72 0a 20 20 20 20 2f 2f  ident` or.    //
6fb0: 2f 20 60 72 65 66 20 6d 75 74 20 69 64 65 6e 74  / `ref mut ident
6fc0: 60 20 62 69 6e 64 69 6e 67 2e 20 28 53 75 63 68  ` binding. (Such
6fd0: 20 62 69 6e 64 69 6e 67 73 20 63 61 6e 6e 6f 74   bindings cannot
6fe0: 20 62 65 20 6d 61 64 65 20 69 6e 74 6f 0a 20 20   be made into.  
6ff0: 20 20 2f 2f 2f 20 6d 75 74 61 62 6c 65 20 62 69    /// mutable bi
7000: 6e 64 69 6e 67 73 2c 20 62 75 74 20 74 68 65 20  ndings, but the 
7010: 69 6e 76 65 72 73 65 20 64 6f 65 73 20 6e 6f 74  inverse does not
7020: 20 6e 65 63 65 73 73 61 72 69 6c 79 20 68 6f 6c   necessarily hol
7030: 64 29 2e 0a 20 20 20 20 70 75 62 20 66 6e 20 69  d)..    pub fn i
7040: 73 5f 6e 6f 6e 72 65 66 5f 62 69 6e 64 69 6e 67  s_nonref_binding
7050: 28 26 73 65 6c 66 29 20 2d 3e 20 62 6f 6f 6c 20  (&self) -> bool 
7060: 7b 0a 20 20 20 20 20 20 20 20 6d 61 74 63 68 20  {.        match 
7070: 73 65 6c 66 2e 6c 6f 63 61 6c 5f 69 6e 66 6f 20  self.local_info 
7080: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 4c 6f  {.            Lo
7090: 63 61 6c 49 6e 66 6f 3a 3a 55 73 65 72 28 43 6c  calInfo::User(Cl
70a0: 65 61 72 43 72 6f 73 73 43 72 61 74 65 3a 3a 53  earCrossCrate::S
70b0: 65 74 28 42 69 6e 64 69 6e 67 46 6f 72 6d 3a 3a  et(BindingForm::
70c0: 56 61 72 28 56 61 72 42 69 6e 64 69 6e 67 46 6f  Var(VarBindingFo
70d0: 72 6d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  rm {.           
70e0: 20 20 20 20 20 62 69 6e 64 69 6e 67 5f 6d 6f 64       binding_mod
70f0: 65 3a 20 74 79 3a 3a 42 69 6e 64 69 6e 67 4d 6f  e: ty::BindingMo
7100: 64 65 3a 3a 42 69 6e 64 42 79 56 61 6c 75 65 28  de::BindByValue(
7110: 5f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  _),.            
7120: 20 20 20 20 6f 70 74 5f 74 79 5f 69 6e 66 6f 3a      opt_ty_info:
7130: 20 5f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   _,.            
7140: 20 20 20 20 6f 70 74 5f 6d 61 74 63 68 5f 70 6c      opt_match_pl
7150: 61 63 65 3a 20 5f 2c 0a 20 20 20 20 20 20 20 20  ace: _,.        
7160: 20 20 20 20 20 20 20 20 70 61 74 5f 73 70 61 6e          pat_span
7170: 3a 20 5f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : _,.           
7180: 20 7d 29 29 29 20 3d 3e 20 74 72 75 65 2c 0a 0a   }))) => true,..
7190: 20 20 20 20 20 20 20 20 20 20 20 20 4c 6f 63 61              Loca
71a0: 6c 49 6e 66 6f 3a 3a 55 73 65 72 28 43 6c 65 61  lInfo::User(Clea
71b0: 72 43 72 6f 73 73 43 72 61 74 65 3a 3a 53 65 74  rCrossCrate::Set
71c0: 28 42 69 6e 64 69 6e 67 46 6f 72 6d 3a 3a 49 6d  (BindingForm::Im
71d0: 70 6c 69 63 69 74 53 65 6c 66 28 5f 29 29 29 20  plicitSelf(_))) 
71e0: 3d 3e 20 74 72 75 65 2c 0a 0a 20 20 20 20 20 20  => true,..      
71f0: 20 20 20 20 20 20 5f 20 3d 3e 20 66 61 6c 73 65        _ => false
7200: 2c 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ,.        }.    
7210: 7d 0a 0a 20 20 20 20 2f 2f 2f 20 52 65 74 75 72  }..    /// Retur
7220: 6e 73 20 60 74 72 75 65 60 20 69 66 20 74 68 69  ns `true` if thi
7230: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 20  s variable is a 
7240: 6e 61 6d 65 64 20 76 61 72 69 61 62 6c 65 20 6f  named variable o
7250: 72 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 2f  r function.    /
7260: 2f 2f 20 70 61 72 61 6d 65 74 65 72 20 64 65 63  // parameter dec
7270: 6c 61 72 65 64 20 62 79 20 74 68 65 20 75 73 65  lared by the use
7280: 72 2e 0a 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d  r..    #[inline]
7290: 0a 20 20 20 20 70 75 62 20 66 6e 20 69 73 5f 75  .    pub fn is_u
72a0: 73 65 72 5f 76 61 72 69 61 62 6c 65 28 26 73 65  ser_variable(&se
72b0: 6c 66 29 20 2d 3e 20 62 6f 6f 6c 20 7b 0a 20 20  lf) -> bool {.  
72c0: 20 20 20 20 20 20 6d 61 74 63 68 20 73 65 6c 66        match self
72d0: 2e 6c 6f 63 61 6c 5f 69 6e 66 6f 20 7b 0a 20 20  .local_info {.  
72e0: 20 20 20 20 20 20 20 20 20 20 4c 6f 63 61 6c 49            LocalI
72f0: 6e 66 6f 3a 3a 55 73 65 72 28 5f 29 20 3d 3e 20  nfo::User(_) => 
7300: 74 72 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20  true,.          
7310: 20 20 5f 20 3d 3e 20 66 61 6c 73 65 2c 0a 20 20    _ => false,.  
7320: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
7330: 20 20 20 2f 2f 2f 20 52 65 74 75 72 6e 73 20 60     /// Returns `
7340: 74 72 75 65 60 20 69 66 20 74 68 69 73 20 69 73  true` if this is
7350: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
7360: 61 20 76 61 72 69 61 62 6c 65 20 62 6f 75 6e 64  a variable bound
7370: 20 69 6e 20 61 20 60 6d 61 74 63 68 60 0a 20 20   in a `match`.  
7380: 20 20 2f 2f 2f 20 65 78 70 72 65 73 73 69 6f 6e    /// expression
7390: 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f   that is used to
73a0: 20 61 63 63 65 73 73 20 73 61 69 64 20 76 61 72   access said var
73b0: 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 75  iable for the gu
73c0: 61 72 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2f  ard of the.    /
73d0: 2f 2f 20 6d 61 74 63 68 20 61 72 6d 2e 0a 20 20  // match arm..  
73e0: 20 20 70 75 62 20 66 6e 20 69 73 5f 72 65 66 5f    pub fn is_ref_
73f0: 66 6f 72 5f 67 75 61 72 64 28 26 73 65 6c 66 29  for_guard(&self)
7400: 20 2d 3e 20 62 6f 6f 6c 20 7b 0a 20 20 20 20 20   -> bool {.     
7410: 20 20 20 6d 61 74 63 68 20 73 65 6c 66 2e 6c 6f     match self.lo
7420: 63 61 6c 5f 69 6e 66 6f 20 7b 0a 20 20 20 20 20  cal_info {.     
7430: 20 20 20 20 20 20 20 4c 6f 63 61 6c 49 6e 66 6f         LocalInfo
7440: 3a 3a 55 73 65 72 28 43 6c 65 61 72 43 72 6f 73  ::User(ClearCros
7450: 73 43 72 61 74 65 3a 3a 53 65 74 28 42 69 6e 64  sCrate::Set(Bind
7460: 69 6e 67 46 6f 72 6d 3a 3a 52 65 66 46 6f 72 47  ingForm::RefForG
7470: 75 61 72 64 29 29 20 3d 3e 20 74 72 75 65 2c 0a  uard)) => true,.
7480: 20 20 20 20 20 20 20 20 20 20 20 20 5f 20 3d 3e              _ =>
7490: 20 66 61 6c 73 65 2c 0a 20 20 20 20 20 20 20 20   false,.        
74a0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f  }.    }..    ///
74b0: 20 52 65 74 75 72 6e 73 20 60 53 6f 6d 65 60 20   Returns `Some` 
74c0: 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65 66  if this is a ref
74d0: 65 72 65 6e 63 65 20 74 6f 20 61 20 73 74 61 74  erence to a stat
74e0: 69 63 20 69 74 65 6d 20 74 68 61 74 20 69 73 20  ic item that is 
74f0: 75 73 65 64 20 74 6f 0a 20 20 20 20 2f 2f 2f 20  used to.    /// 
7500: 61 63 63 65 73 73 20 74 68 61 74 20 73 74 61 74  access that stat
7510: 69 63 0a 20 20 20 20 70 75 62 20 66 6e 20 69 73  ic.    pub fn is
7520: 5f 72 65 66 5f 74 6f 5f 73 74 61 74 69 63 28 26  _ref_to_static(&
7530: 73 65 6c 66 29 20 2d 3e 20 62 6f 6f 6c 20 7b 0a  self) -> bool {.
7540: 20 20 20 20 20 20 20 20 6d 61 74 63 68 20 73 65          match se
7550: 6c 66 2e 6c 6f 63 61 6c 5f 69 6e 66 6f 20 7b 0a  lf.local_info {.
7560: 20 20 20 20 20 20 20 20 20 20 20 20 4c 6f 63 61              Loca
7570: 6c 49 6e 66 6f 3a 3a 53 74 61 74 69 63 52 65 66  lInfo::StaticRef
7580: 20 7b 20 2e 2e 20 7d 20 3d 3e 20 74 72 75 65 2c   { .. } => true,
7590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5f 20 3d  .            _ =
75a0: 3e 20 66 61 6c 73 65 2c 0a 20 20 20 20 20 20 20  > false,.       
75b0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f   }.    }..    //
75c0: 2f 20 52 65 74 75 72 6e 73 20 60 53 6f 6d 65 60  / Returns `Some`
75d0: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65   if this is a re
75e0: 66 65 72 65 6e 63 65 20 74 6f 20 61 20 73 74 61  ference to a sta
75f0: 74 69 63 20 69 74 65 6d 20 74 68 61 74 20 69 73  tic item that is
7600: 20 75 73 65 64 20 74 6f 0a 20 20 20 20 2f 2f 2f   used to.    ///
7610: 20 61 63 63 65 73 73 20 74 68 61 74 20 73 74 61   access that sta
7620: 74 69 63 0a 20 20 20 20 70 75 62 20 66 6e 20 69  tic.    pub fn i
7630: 73 5f 72 65 66 5f 74 6f 5f 74 68 72 65 61 64 5f  s_ref_to_thread_
7640: 6c 6f 63 61 6c 28 26 73 65 6c 66 29 20 2d 3e 20  local(&self) -> 
7650: 62 6f 6f 6c 20 7b 0a 20 20 20 20 20 20 20 20 6d  bool {.        m
7660: 61 74 63 68 20 73 65 6c 66 2e 6c 6f 63 61 6c 5f  atch self.local_
7670: 69 6e 66 6f 20 7b 0a 20 20 20 20 20 20 20 20 20  info {.         
7680: 20 20 20 4c 6f 63 61 6c 49 6e 66 6f 3a 3a 53 74     LocalInfo::St
7690: 61 74 69 63 52 65 66 20 7b 20 69 73 5f 74 68 72  aticRef { is_thr
76a0: 65 61 64 5f 6c 6f 63 61 6c 2c 20 2e 2e 20 7d 20  ead_local, .. } 
76b0: 3d 3e 20 69 73 5f 74 68 72 65 61 64 5f 6c 6f 63  => is_thread_loc
76c0: 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  al,.            
76d0: 5f 20 3d 3e 20 66 61 6c 73 65 2c 0a 20 20 20 20  _ => false,.    
76e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
76f0: 20 2f 2f 2f 20 52 65 74 75 72 6e 73 20 60 74 72   /// Returns `tr
7700: 75 65 60 20 69 73 20 74 68 65 20 6c 6f 63 61 6c  ue` is the local
7710: 20 69 73 20 66 72 6f 6d 20 61 20 63 6f 6d 70 69   is from a compi
7720: 6c 65 72 20 64 65 73 75 67 61 72 69 6e 67 2c 20  ler desugaring, 
7730: 65 2e 67 2e 2c 0a 20 20 20 20 2f 2f 2f 20 60 5f  e.g.,.    /// `_
7740: 5f 6e 65 78 74 60 20 66 72 6f 6d 20 61 20 60 66  _next` from a `f
7750: 6f 72 60 20 6c 6f 6f 70 2e 0a 20 20 20 20 23 5b  or` loop..    #[
7760: 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 70 75 62 20  inline].    pub 
7770: 66 6e 20 66 72 6f 6d 5f 63 6f 6d 70 69 6c 65 72  fn from_compiler
7780: 5f 64 65 73 75 67 61 72 69 6e 67 28 26 73 65 6c  _desugaring(&sel
7790: 66 29 20 2d 3e 20 62 6f 6f 6c 20 7b 0a 20 20 20  f) -> bool {.   
77a0: 20 20 20 20 20 73 65 6c 66 2e 73 6f 75 72 63 65       self.source
77b0: 5f 69 6e 66 6f 2e 73 70 61 6e 2e 64 65 73 75 67  _info.span.desug
77c0: 61 72 69 6e 67 5f 6b 69 6e 64 28 29 2e 69 73 5f  aring_kind().is_
77d0: 73 6f 6d 65 28 29 0a 20 20 20 20 7d 0a 0a 20 20  some().    }..  
77e0: 20 20 2f 2f 2f 20 43 72 65 61 74 65 73 20 61 20    /// Creates a 
77f0: 6e 65 77 20 60 4c 6f 63 61 6c 44 65 63 6c 60 20  new `LocalDecl` 
7800: 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 2e  for a temporary.
7810: 0a 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20  .    #[inline]. 
7820: 20 20 20 70 75 62 20 66 6e 20 6e 65 77 5f 74 65     pub fn new_te
7830: 6d 70 28 74 79 3a 20 54 79 3c 27 74 63 78 3e 2c  mp(ty: Ty<'tcx>,
7840: 20 73 70 61 6e 3a 20 53 70 61 6e 29 20 2d 3e 20   span: Span) -> 
7850: 53 65 6c 66 20 7b 0a 20 20 20 20 20 20 20 20 53  Self {.        S
7860: 65 6c 66 3a 3a 6e 65 77 5f 6c 6f 63 61 6c 28 74  elf::new_local(t
7870: 79 2c 20 4d 75 74 61 62 69 6c 69 74 79 3a 3a 4d  y, Mutability::M
7880: 75 74 2c 20 66 61 6c 73 65 2c 20 73 70 61 6e 29  ut, false, span)
7890: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20  .    }..    /// 
78a0: 43 6f 6e 76 65 72 74 73 20 60 73 65 6c 66 60 20  Converts `self` 
78b0: 69 6e 74 6f 20 73 61 6d 65 20 60 4c 6f 63 61 6c  into same `Local
78c0: 44 65 63 6c 60 20 65 78 63 65 70 74 20 74 61 67  Decl` except tag
78d0: 67 65 64 20 61 73 20 69 6d 6d 75 74 61 62 6c 65  ged as immutable
78e0: 2e 0a 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a  ..    #[inline].
78f0: 20 20 20 20 70 75 62 20 66 6e 20 69 6d 6d 75 74      pub fn immut
7900: 61 62 6c 65 28 6d 75 74 20 73 65 6c 66 29 20 2d  able(mut self) -
7910: 3e 20 53 65 6c 66 20 7b 0a 20 20 20 20 20 20 20  > Self {.       
7920: 20 73 65 6c 66 2e 6d 75 74 61 62 69 6c 69 74 79   self.mutability
7930: 20 3d 20 4d 75 74 61 62 69 6c 69 74 79 3a 3a 4e   = Mutability::N
7940: 6f 74 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 66  ot;.        self
7950: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20  .    }..    /// 
7960: 43 6f 6e 76 65 72 74 73 20 60 73 65 6c 66 60 20  Converts `self` 
7970: 69 6e 74 6f 20 73 61 6d 65 20 60 4c 6f 63 61 6c  into same `Local
7980: 44 65 63 6c 60 20 65 78 63 65 70 74 20 74 61 67  Decl` except tag
7990: 67 65 64 20 61 73 20 69 6e 74 65 72 6e 61 6c 20  ged as internal 
79a0: 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20 20 20 23  temporary..    #
79b0: 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 70 75 62  [inline].    pub
79c0: 20 66 6e 20 62 6c 6f 63 6b 5f 74 61 69 6c 28 6d   fn block_tail(m
79d0: 75 74 20 73 65 6c 66 2c 20 69 6e 66 6f 3a 20 42  ut self, info: B
79e0: 6c 6f 63 6b 54 61 69 6c 49 6e 66 6f 29 20 2d 3e  lockTailInfo) ->
79f0: 20 53 65 6c 66 20 7b 0a 20 20 20 20 20 20 20 20   Self {.        
7a00: 61 73 73 65 72 74 21 28 73 65 6c 66 2e 69 73 5f  assert!(self.is_
7a10: 62 6c 6f 63 6b 5f 74 61 69 6c 2e 69 73 5f 6e 6f  block_tail.is_no
7a20: 6e 65 28 29 29 3b 0a 20 20 20 20 20 20 20 20 73  ne());.        s
7a30: 65 6c 66 2e 69 73 5f 62 6c 6f 63 6b 5f 74 61 69  elf.is_block_tai
7a40: 6c 20 3d 20 53 6f 6d 65 28 69 6e 66 6f 29 3b 0a  l = Some(info);.
7a50: 20 20 20 20 20 20 20 20 73 65 6c 66 0a 20 20 20          self.   
7a60: 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 43 72 65 61   }..    /// Crea
7a70: 74 65 73 20 61 20 6e 65 77 20 60 4c 6f 63 61 6c  tes a new `Local
7a80: 44 65 63 6c 60 20 66 6f 72 20 61 20 69 6e 74 65  Decl` for a inte
7a90: 72 6e 61 6c 20 74 65 6d 70 6f 72 61 72 79 2e 0a  rnal temporary..
7aa0: 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20      #[inline].  
7ab0: 20 20 70 75 62 20 66 6e 20 6e 65 77 5f 69 6e 74    pub fn new_int
7ac0: 65 72 6e 61 6c 28 74 79 3a 20 54 79 3c 27 74 63  ernal(ty: Ty<'tc
7ad0: 78 3e 2c 20 73 70 61 6e 3a 20 53 70 61 6e 29 20  x>, span: Span) 
7ae0: 2d 3e 20 53 65 6c 66 20 7b 0a 20 20 20 20 20 20  -> Self {.      
7af0: 20 20 53 65 6c 66 3a 3a 6e 65 77 5f 6c 6f 63 61    Self::new_loca
7b00: 6c 28 74 79 2c 20 4d 75 74 61 62 69 6c 69 74 79  l(ty, Mutability
7b10: 3a 3a 4d 75 74 2c 20 74 72 75 65 2c 20 73 70 61  ::Mut, true, spa
7b20: 6e 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 5b  n).    }..    #[
7b30: 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 66 6e 20 6e  inline].    fn n
7b40: 65 77 5f 6c 6f 63 61 6c 28 74 79 3a 20 54 79 3c  ew_local(ty: Ty<
7b50: 27 74 63 78 3e 2c 20 6d 75 74 61 62 69 6c 69 74  'tcx>, mutabilit
7b60: 79 3a 20 4d 75 74 61 62 69 6c 69 74 79 2c 20 69  y: Mutability, i
7b70: 6e 74 65 72 6e 61 6c 3a 20 62 6f 6f 6c 2c 20 73  nternal: bool, s
7b80: 70 61 6e 3a 20 53 70 61 6e 29 20 2d 3e 20 53 65  pan: Span) -> Se
7b90: 6c 66 20 7b 0a 20 20 20 20 20 20 20 20 4c 6f 63  lf {.        Loc
7ba0: 61 6c 44 65 63 6c 20 7b 0a 20 20 20 20 20 20 20  alDecl {.       
7bb0: 20 20 20 20 20 6d 75 74 61 62 69 6c 69 74 79 2c       mutability,
7bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 79 2c  .            ty,
7bd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 73 65  .            use
7be0: 72 5f 74 79 3a 20 55 73 65 72 54 79 70 65 50 72  r_ty: UserTypePr
7bf0: 6f 6a 65 63 74 69 6f 6e 73 3a 3a 6e 6f 6e 65 28  ojections::none(
7c00: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ),.            s
7c10: 6f 75 72 63 65 5f 69 6e 66 6f 3a 20 53 6f 75 72  ource_info: Sour
7c20: 63 65 49 6e 66 6f 20 7b 20 73 70 61 6e 2c 20 73  ceInfo { span, s
7c30: 63 6f 70 65 3a 20 4f 55 54 45 52 4d 4f 53 54 5f  cope: OUTERMOST_
7c40: 53 4f 55 52 43 45 5f 53 43 4f 50 45 20 7d 2c 0a  SOURCE_SCOPE },.
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 65              inte
7c60: 72 6e 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  rnal,.          
7c70: 20 20 6c 6f 63 61 6c 5f 69 6e 66 6f 3a 20 4c 6f    local_info: Lo
7c80: 63 61 6c 49 6e 66 6f 3a 3a 4f 74 68 65 72 2c 0a  calInfo::Other,.
7c90: 20 20 20 20 20 20 20 20 20 20 20 20 69 73 5f 62              is_b
7ca0: 6c 6f 63 6b 5f 74 61 69 6c 3a 20 4e 6f 6e 65 2c  lock_tail: None,
7cb0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
7cc0: 0a 0a 20 20 20 20 2f 2f 2f 20 42 75 69 6c 64 73  ..    /// Builds
7cd0: 20 61 20 60 4c 6f 63 61 6c 44 65 63 6c 60 20 66   a `LocalDecl` f
7ce0: 6f 72 20 74 68 65 20 72 65 74 75 72 6e 20 70 6c  or the return pl
7cf0: 61 63 65 2e 0a 20 20 20 20 2f 2f 2f 0a 20 20 20  ace..    ///.   
7d00: 20 2f 2f 2f 20 54 68 69 73 20 6d 75 73 74 20 62   /// This must b
7d10: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  e inserted into 
7d20: 74 68 65 20 60 6c 6f 63 61 6c 5f 64 65 63 6c 73  the `local_decls
7d30: 60 20 6c 69 73 74 20 61 73 20 74 68 65 20 66 69  ` list as the fi
7d40: 72 73 74 20 6c 6f 63 61 6c 2e 0a 20 20 20 20 23  rst local..    #
7d50: 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 70 75 62  [inline].    pub
7d60: 20 66 6e 20 6e 65 77 5f 72 65 74 75 72 6e 5f 70   fn new_return_p
7d70: 6c 61 63 65 28 72 65 74 75 72 6e 5f 74 79 3a 20  lace(return_ty: 
7d80: 54 79 3c 27 5f 3e 2c 20 73 70 61 6e 3a 20 53 70  Ty<'_>, span: Sp
7d90: 61 6e 29 20 2d 3e 20 4c 6f 63 61 6c 44 65 63 6c  an) -> LocalDecl
7da0: 3c 27 5f 3e 20 7b 0a 20 20 20 20 20 20 20 20 4c  <'_> {.        L
7db0: 6f 63 61 6c 44 65 63 6c 20 7b 0a 20 20 20 20 20  ocalDecl {.     
7dc0: 20 20 20 20 20 20 20 6d 75 74 61 62 69 6c 69 74         mutabilit
7dd0: 79 3a 20 4d 75 74 61 62 69 6c 69 74 79 3a 3a 4d  y: Mutability::M
7de0: 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut,.            
7df0: 74 79 3a 20 72 65 74 75 72 6e 5f 74 79 2c 0a 20  ty: return_ty,. 
7e00: 20 20 20 20 20 20 20 20 20 20 20 75 73 65 72 5f             user_
7e10: 74 79 3a 20 55 73 65 72 54 79 70 65 50 72 6f 6a  ty: UserTypeProj
7e20: 65 63 74 69 6f 6e 73 3a 3a 6e 6f 6e 65 28 29 2c  ections::none(),
7e30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 75  .            sou
7e40: 72 63 65 5f 69 6e 66 6f 3a 20 53 6f 75 72 63 65  rce_info: Source
7e50: 49 6e 66 6f 20 7b 20 73 70 61 6e 2c 20 73 63 6f  Info { span, sco
7e60: 70 65 3a 20 4f 55 54 45 52 4d 4f 53 54 5f 53 4f  pe: OUTERMOST_SO
7e70: 55 52 43 45 5f 53 43 4f 50 45 20 7d 2c 0a 20 20  URCE_SCOPE },.  
7e80: 20 20 20 20 20 20 20 20 20 20 69 6e 74 65 72 6e            intern
7e90: 61 6c 3a 20 66 61 6c 73 65 2c 0a 20 20 20 20 20  al: false,.     
7ea0: 20 20 20 20 20 20 20 69 73 5f 62 6c 6f 63 6b 5f         is_block_
7eb0: 74 61 69 6c 3a 20 4e 6f 6e 65 2c 0a 20 20 20 20  tail: None,.    
7ec0: 20 20 20 20 20 20 20 20 6c 6f 63 61 6c 5f 69 6e          local_in
7ed0: 66 6f 3a 20 4c 6f 63 61 6c 49 6e 66 6f 3a 3a 4f  fo: LocalInfo::O
7ee0: 74 68 65 72 2c 0a 20 20 20 20 20 20 20 20 7d 0a  ther,.        }.
7ef0: 20 20 20 20 7d 0a 7d 0a 0a 2f 2f 2f 20 44 65 62      }.}../// Deb
7f00: 75 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70  ug information p
7f10: 65 72 74 61 69 6e 69 6e 67 20 74 6f 20 61 20 75  ertaining to a u
7f20: 73 65 72 20 76 61 72 69 61 62 6c 65 2e 0a 23 5b  ser variable..#[
7f30: 64 65 72 69 76 65 28 43 6c 6f 6e 65 2c 20 44 65  derive(Clone, De
7f40: 62 75 67 2c 20 52 75 73 74 63 45 6e 63 6f 64 61  bug, RustcEncoda
7f50: 62 6c 65 2c 20 52 75 73 74 63 44 65 63 6f 64 61  ble, RustcDecoda
7f60: 62 6c 65 2c 20 48 61 73 68 53 74 61 62 6c 65 2c  ble, HashStable,
7f70: 20 54 79 70 65 46 6f 6c 64 61 62 6c 65 29 5d 0a   TypeFoldable)].
7f80: 70 75 62 20 73 74 72 75 63 74 20 56 61 72 44 65  pub struct VarDe
7f90: 62 75 67 49 6e 66 6f 3c 27 74 63 78 3e 20 7b 0a  bugInfo<'tcx> {.
7fa0: 20 20 20 20 70 75 62 20 6e 61 6d 65 3a 20 4e 61      pub name: Na
7fb0: 6d 65 2c 0a 0a 20 20 20 20 2f 2f 2f 20 53 6f 75  me,..    /// Sou
7fc0: 72 63 65 20 69 6e 66 6f 20 6f 66 20 74 68 65 20  rce info of the 
7fd0: 75 73 65 72 20 76 61 72 69 61 62 6c 65 2c 20 69  user variable, i
7fe0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 73 63 6f  ncluding the sco
7ff0: 70 65 0a 20 20 20 20 2f 2f 2f 20 77 69 74 68 69  pe.    /// withi
8000: 6e 20 77 68 69 63 68 20 74 68 65 20 76 61 72 69  n which the vari
8010: 61 62 6c 65 20 69 73 20 76 69 73 69 62 6c 65 20  able is visible 
8020: 28 74 6f 20 64 65 62 75 67 69 6e 66 6f 29 0a 20  (to debuginfo). 
8030: 20 20 20 2f 2f 2f 20 28 73 65 65 20 60 4c 6f 63     /// (see `Loc
8040: 61 6c 44 65 63 6c 60 27 73 20 60 73 6f 75 72 63  alDecl`'s `sourc
8050: 65 5f 69 6e 66 6f 60 20 66 69 65 6c 64 20 66 6f  e_info` field fo
8060: 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 29 2e  r more details).
8070: 0a 20 20 20 20 70 75 62 20 73 6f 75 72 63 65 5f  .    pub source_
8080: 69 6e 66 6f 3a 20 53 6f 75 72 63 65 49 6e 66 6f  info: SourceInfo
8090: 2c 0a 0a 20 20 20 20 2f 2f 2f 20 57 68 65 72 65  ,..    /// Where
80a0: 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
80b0: 69 73 20 75 73 65 72 20 76 61 72 69 61 62 6c 65  is user variable
80c0: 20 69 73 20 74 6f 20 62 65 20 66 6f 75 6e 64 2e   is to be found.
80d0: 0a 20 20 20 20 2f 2f 2f 20 4e 4f 54 45 28 65 64  .    /// NOTE(ed
80e0: 64 79 62 29 20 54 68 65 72 65 27 73 20 61 6e 20  dyb) There's an 
80f0: 75 6e 65 6e 66 6f 72 63 65 64 20 69 6e 76 61 72  unenforced invar
8100: 69 61 6e 74 20 74 68 61 74 20 74 68 69 73 20 60  iant that this `
8110: 50 6c 61 63 65 60 20 69 73 0a 20 20 20 20 2f 2f  Place` is.    //
8120: 2f 20 62 61 73 65 64 20 6f 6e 20 61 20 60 4c 6f  / based on a `Lo
8130: 63 61 6c 60 2c 20 6e 6f 74 20 61 20 60 53 74 61  cal`, not a `Sta
8140: 74 69 63 60 2c 20 61 6e 64 20 63 6f 6e 74 61 69  tic`, and contai
8150: 6e 73 20 6e 6f 20 69 6e 64 65 78 69 6e 67 2e 0a  ns no indexing..
8160: 20 20 20 20 70 75 62 20 70 6c 61 63 65 3a 20 50      pub place: P
8170: 6c 61 63 65 3c 27 74 63 78 3e 2c 0a 7d 0a 0a 2f  lace<'tcx>,.}../
8180: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8190: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
81a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
81b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
81c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 20 42 61  //////////.// Ba
81d0: 73 69 63 42 6c 6f 63 6b 0a 0a 72 75 73 74 63 5f  sicBlock..rustc_
81e0: 69 6e 64 65 78 3a 3a 6e 65 77 74 79 70 65 5f 69  index::newtype_i
81f0: 6e 64 65 78 21 20 7b 0a 20 20 20 20 70 75 62 20  ndex! {.    pub 
8200: 73 74 72 75 63 74 20 42 61 73 69 63 42 6c 6f 63  struct BasicBloc
8210: 6b 20 7b 0a 20 20 20 20 20 20 20 20 64 65 72 69  k {.        deri
8220: 76 65 20 5b 48 61 73 68 53 74 61 62 6c 65 5d 0a  ve [HashStable].
8230: 20 20 20 20 20 20 20 20 44 45 42 55 47 5f 46 4f          DEBUG_FO
8240: 52 4d 41 54 20 3d 20 22 62 62 7b 7d 22 2c 0a 20  RMAT = "bb{}",. 
8250: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 53 54 41         const STA
8260: 52 54 5f 42 4c 4f 43 4b 20 3d 20 30 2c 0a 20 20  RT_BLOCK = 0,.  
8270: 20 20 7d 0a 7d 0a 0a 69 6d 70 6c 20 42 61 73 69    }.}..impl Basi
8280: 63 42 6c 6f 63 6b 20 7b 0a 20 20 20 20 70 75 62  cBlock {.    pub
8290: 20 66 6e 20 73 74 61 72 74 5f 6c 6f 63 61 74 69   fn start_locati
82a0: 6f 6e 28 73 65 6c 66 29 20 2d 3e 20 4c 6f 63 61  on(self) -> Loca
82b0: 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20 20 20 4c  tion {.        L
82c0: 6f 63 61 74 69 6f 6e 20 7b 20 62 6c 6f 63 6b 3a  ocation { block:
82d0: 20 73 65 6c 66 2c 20 73 74 61 74 65 6d 65 6e 74   self, statement
82e0: 5f 69 6e 64 65 78 3a 20 30 20 7d 0a 20 20 20 20  _index: 0 }.    
82f0: 7d 0a 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  }.}..///////////
8300: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8310: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8320: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8330: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8340: 0a 2f 2f 20 42 61 73 69 63 42 6c 6f 63 6b 44 61  .// BasicBlockDa
8350: 74 61 20 61 6e 64 20 54 65 72 6d 69 6e 61 74 6f  ta and Terminato
8360: 72 0a 0a 23 5b 64 65 72 69 76 65 28 43 6c 6f 6e  r..#[derive(Clon
8370: 65 2c 20 44 65 62 75 67 2c 20 52 75 73 74 63 45  e, Debug, RustcE
8380: 6e 63 6f 64 61 62 6c 65 2c 20 52 75 73 74 63 44  ncodable, RustcD
8390: 65 63 6f 64 61 62 6c 65 2c 20 48 61 73 68 53 74  ecodable, HashSt
83a0: 61 62 6c 65 2c 20 54 79 70 65 46 6f 6c 64 61 62  able, TypeFoldab
83b0: 6c 65 29 5d 0a 70 75 62 20 73 74 72 75 63 74 20  le)].pub struct 
83c0: 42 61 73 69 63 42 6c 6f 63 6b 44 61 74 61 3c 27  BasicBlockData<'
83d0: 74 63 78 3e 20 7b 0a 20 20 20 20 2f 2f 2f 20 4c  tcx> {.    /// L
83e0: 69 73 74 20 6f 66 20 73 74 61 74 65 6d 65 6e 74  ist of statement
83f0: 73 20 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 2e  s in this block.
8400: 0a 20 20 20 20 70 75 62 20 73 74 61 74 65 6d 65  .    pub stateme
8410: 6e 74 73 3a 20 56 65 63 3c 53 74 61 74 65 6d 65  nts: Vec<Stateme
8420: 6e 74 3c 27 74 63 78 3e 3e 2c 0a 0a 20 20 20 20  nt<'tcx>>,..    
8430: 2f 2f 2f 20 54 65 72 6d 69 6e 61 74 6f 72 20 66  /// Terminator f
8440: 6f 72 20 74 68 69 73 20 62 6c 6f 63 6b 2e 0a 20  or this block.. 
8450: 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 4e     ///.    /// N
8460: 2e 42 2e 2c 20 74 68 69 73 20 73 68 6f 75 6c 64  .B., this should
8470: 20 67 65 6e 65 72 61 6c 6c 79 20 4f 4e 4c 59 20   generally ONLY 
8480: 62 65 20 60 4e 6f 6e 65 60 20 64 75 72 69 6e 67  be `None` during
8490: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20   construction.. 
84a0: 20 20 20 2f 2f 2f 20 54 68 65 72 65 66 6f 72 65     /// Therefore
84b0: 2c 20 79 6f 75 20 73 68 6f 75 6c 64 20 67 65 6e  , you should gen
84c0: 65 72 61 6c 6c 79 20 61 63 63 65 73 73 20 69 74  erally access it
84d0: 20 76 69 61 20 74 68 65 0a 20 20 20 20 2f 2f 2f   via the.    ///
84e0: 20 60 74 65 72 6d 69 6e 61 74 6f 72 28 29 60 20   `terminator()` 
84f0: 6f 72 20 60 74 65 72 6d 69 6e 61 74 6f 72 5f 6d  or `terminator_m
8500: 75 74 28 29 60 20 6d 65 74 68 6f 64 73 2e 20 54  ut()` methods. T
8510: 68 65 20 6f 6e 6c 79 0a 20 20 20 20 2f 2f 2f 20  he only.    /// 
8520: 65 78 63 65 70 74 69 6f 6e 20 69 73 20 74 68 61  exception is tha
8530: 74 20 63 65 72 74 61 69 6e 20 70 61 73 73 65 73  t certain passes
8540: 2c 20 73 75 63 68 20 61 73 20 60 73 69 6d 70 6c  , such as `simpl
8550: 69 66 79 5f 63 66 67 60 2c 20 73 77 61 70 0a 20  ify_cfg`, swap. 
8560: 20 20 20 2f 2f 2f 20 6f 75 74 20 74 68 65 20 74     /// out the t
8570: 65 72 6d 69 6e 61 74 6f 72 20 74 65 6d 70 6f 72  erminator tempor
8580: 61 72 69 6c 79 20 77 69 74 68 20 60 4e 6f 6e 65  arily with `None
8590: 60 20 77 68 69 6c 65 20 74 68 65 79 20 63 6f 6e  ` while they con
85a0: 74 69 6e 75 65 0a 20 20 20 20 2f 2f 2f 20 74 6f  tinue.    /// to
85b0: 20 72 65 63 75 72 73 65 20 6f 76 65 72 20 74 68   recurse over th
85c0: 65 20 73 65 74 20 6f 66 20 62 61 73 69 63 20 62  e set of basic b
85d0: 6c 6f 63 6b 73 2e 0a 20 20 20 20 70 75 62 20 74  locks..    pub t
85e0: 65 72 6d 69 6e 61 74 6f 72 3a 20 4f 70 74 69 6f  erminator: Optio
85f0: 6e 3c 54 65 72 6d 69 6e 61 74 6f 72 3c 27 74 63  n<Terminator<'tc
8600: 78 3e 3e 2c 0a 0a 20 20 20 20 2f 2f 2f 20 49 66  x>>,..    /// If
8610: 20 74 72 75 65 2c 20 74 68 69 73 20 62 6c 6f 63   true, this bloc
8620: 6b 20 6c 69 65 73 20 6f 6e 20 61 6e 20 75 6e 77  k lies on an unw
8630: 69 6e 64 20 70 61 74 68 2e 20 54 68 69 73 20 69  ind path. This i
8640: 73 20 75 73 65 64 0a 20 20 20 20 2f 2f 2f 20 64  s used.    /// d
8650: 75 72 69 6e 67 20 63 6f 64 65 67 65 6e 20 77 68  uring codegen wh
8660: 65 72 65 20 64 69 73 74 69 6e 63 74 20 6b 69 6e  ere distinct kin
8670: 64 73 20 6f 66 20 62 61 73 69 63 20 62 6c 6f 63  ds of basic bloc
8680: 6b 73 20 6d 61 79 20 62 65 0a 20 20 20 20 2f 2f  ks may be.    //
8690: 2f 20 67 65 6e 65 72 61 74 65 64 20 28 70 61 72  / generated (par
86a0: 74 69 63 75 6c 61 72 6c 79 20 66 6f 72 20 4d 53  ticularly for MS
86b0: 56 43 20 63 6c 65 61 6e 75 70 29 2e 20 55 6e 77  VC cleanup). Unw
86c0: 69 6e 64 20 62 6c 6f 63 6b 73 20 6d 75 73 74 0a  ind blocks must.
86d0: 20 20 20 20 2f 2f 2f 20 6f 6e 6c 79 20 62 72 61      /// only bra
86e0: 6e 63 68 20 74 6f 20 6f 74 68 65 72 20 75 6e 77  nch to other unw
86f0: 69 6e 64 20 62 6c 6f 63 6b 73 2e 0a 20 20 20 20  ind blocks..    
8700: 70 75 62 20 69 73 5f 63 6c 65 61 6e 75 70 3a 20  pub is_cleanup: 
8710: 62 6f 6f 6c 2c 0a 7d 0a 0a 23 5b 64 65 72 69 76  bool,.}..#[deriv
8720: 65 28 43 6c 6f 6e 65 2c 20 44 65 62 75 67 2c 20  e(Clone, Debug, 
8730: 52 75 73 74 63 45 6e 63 6f 64 61 62 6c 65 2c 20  RustcEncodable, 
8740: 52 75 73 74 63 44 65 63 6f 64 61 62 6c 65 2c 20  RustcDecodable, 
8750: 48 61 73 68 53 74 61 62 6c 65 29 5d 0a 70 75 62  HashStable)].pub
8760: 20 73 74 72 75 63 74 20 54 65 72 6d 69 6e 61 74   struct Terminat
8770: 6f 72 3c 27 74 63 78 3e 20 7b 0a 20 20 20 20 70  or<'tcx> {.    p
8780: 75 62 20 73 6f 75 72 63 65 5f 69 6e 66 6f 3a 20  ub source_info: 
8790: 53 6f 75 72 63 65 49 6e 66 6f 2c 0a 20 20 20 20  SourceInfo,.    
87a0: 70 75 62 20 6b 69 6e 64 3a 20 54 65 72 6d 69 6e  pub kind: Termin
87b0: 61 74 6f 72 4b 69 6e 64 3c 27 74 63 78 3e 2c 0a  atorKind<'tcx>,.
87c0: 7d 0a 0a 23 5b 64 65 72 69 76 65 28 43 6c 6f 6e  }..#[derive(Clon
87d0: 65 2c 20 52 75 73 74 63 45 6e 63 6f 64 61 62 6c  e, RustcEncodabl
87e0: 65 2c 20 52 75 73 74 63 44 65 63 6f 64 61 62 6c  e, RustcDecodabl
87f0: 65 2c 20 48 61 73 68 53 74 61 62 6c 65 2c 20 50  e, HashStable, P
8800: 61 72 74 69 61 6c 45 71 29 5d 0a 70 75 62 20 65  artialEq)].pub e
8810: 6e 75 6d 20 54 65 72 6d 69 6e 61 74 6f 72 4b 69  num TerminatorKi
8820: 6e 64 3c 27 74 63 78 3e 20 7b 0a 20 20 20 20 2f  nd<'tcx> {.    /
8830: 2f 2f 20 42 6c 6f 63 6b 20 73 68 6f 75 6c 64 20  // Block should 
8840: 68 61 76 65 20 6f 6e 65 20 73 75 63 63 65 73 73  have one success
8850: 6f 72 20 69 6e 20 74 68 65 20 67 72 61 70 68 3b  or in the graph;
8860: 20 77 65 20 6a 75 6d 70 20 74 68 65 72 65 2e 0a   we jump there..
8870: 20 20 20 20 47 6f 74 6f 20 7b 20 74 61 72 67 65      Goto { targe
8880: 74 3a 20 42 61 73 69 63 42 6c 6f 63 6b 20 7d 2c  t: BasicBlock },
8890: 0a 0a 20 20 20 20 2f 2f 2f 20 4f 70 65 72 61 6e  ..    /// Operan
88a0: 64 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 61  d evaluates to a
88b0: 6e 20 69 6e 74 65 67 65 72 3b 20 6a 75 6d 70 20  n integer; jump 
88c0: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 74 73  depending on its
88d0: 20 76 61 6c 75 65 0a 20 20 20 20 2f 2f 2f 20 74   value.    /// t
88e0: 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 72  o one of the tar
88f0: 67 65 74 73 2c 20 61 6e 64 20 6f 74 68 65 72 77  gets, and otherw
8900: 69 73 65 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20  ise fallback to 
8910: 60 6f 74 68 65 72 77 69 73 65 60 2e 0a 20 20 20  `otherwise`..   
8920: 20 53 77 69 74 63 68 49 6e 74 20 7b 0a 20 20 20   SwitchInt {.   
8930: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 64 69 73       /// The dis
8940: 63 72 69 6d 69 6e 61 6e 74 20 76 61 6c 75 65 20  criminant value 
8950: 62 65 69 6e 67 20 74 65 73 74 65 64 2e 0a 20 20  being tested..  
8960: 20 20 20 20 20 20 64 69 73 63 72 3a 20 4f 70 65        discr: Ope
8970: 72 61 6e 64 3c 27 74 63 78 3e 2c 0a 0a 20 20 20  rand<'tcx>,..   
8980: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 74 79 70       /// The typ
8990: 65 20 6f 66 20 76 61 6c 75 65 20 62 65 69 6e 67  e of value being
89a0: 20 74 65 73 74 65 64 2e 0a 20 20 20 20 20 20 20   tested..       
89b0: 20 73 77 69 74 63 68 5f 74 79 3a 20 54 79 3c 27   switch_ty: Ty<'
89c0: 74 63 78 3e 2c 0a 0a 20 20 20 20 20 20 20 20 2f  tcx>,..        /
89d0: 2f 2f 20 50 6f 73 73 69 62 6c 65 20 76 61 6c 75  // Possible valu
89e0: 65 73 2e 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e  es. The location
89f0: 73 20 74 6f 20 62 72 61 6e 63 68 20 74 6f 20 69  s to branch to i
8a00: 6e 20 65 61 63 68 20 63 61 73 65 0a 20 20 20 20  n each case.    
8a10: 20 20 20 20 2f 2f 2f 20 61 72 65 20 66 6f 75 6e      /// are foun
8a20: 64 20 69 6e 20 74 68 65 20 63 6f 72 72 65 73 70  d in the corresp
8a30: 6f 6e 64 69 6e 67 20 69 6e 64 69 63 65 73 20 66  onding indices f
8a40: 72 6f 6d 20 74 68 65 20 60 74 61 72 67 65 74 73  rom the `targets
8a50: 60 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20  ` vector..      
8a60: 20 20 76 61 6c 75 65 73 3a 20 43 6f 77 3c 27 74    values: Cow<'t
8a70: 63 78 2c 20 5b 75 31 32 38 5d 3e 2c 0a 0a 20 20  cx, [u128]>,..  
8a80: 20 20 20 20 20 20 2f 2f 2f 20 50 6f 73 73 69 62        /// Possib
8a90: 6c 65 20 62 72 61 6e 63 68 20 73 69 74 65 73 2e  le branch sites.
8aa0: 20 54 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e   The last elemen
8ab0: 74 20 6f 66 20 74 68 69 73 20 76 65 63 74 6f 72  t of this vector
8ac0: 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20 20   is used.       
8ad0: 20 2f 2f 2f 20 66 6f 72 20 74 68 65 20 6f 74 68   /// for the oth
8ae0: 65 72 77 69 73 65 20 62 72 61 6e 63 68 2c 20 73  erwise branch, s
8af0: 6f 20 74 61 72 67 65 74 73 2e 6c 65 6e 28 29 20  o targets.len() 
8b00: 3d 3d 20 76 61 6c 75 65 73 2e 6c 65 6e 28 29 20  == values.len() 
8b10: 2b 20 31 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  + 1.        /// 
8b20: 73 68 6f 75 6c 64 20 68 6f 6c 64 2e 0a 20 20 20  should hold..   
8b30: 20 20 20 20 20 2f 2f 0a 20 20 20 20 20 20 20 20       //.        
8b40: 2f 2f 20 54 68 69 73 20 69 6e 76 61 72 69 61 6e  // This invarian
8b50: 74 20 69 73 20 71 75 69 74 65 20 6e 6f 6e 2d 6f  t is quite non-o
8b60: 62 76 69 6f 75 73 20 61 6e 64 20 61 6c 73 6f 20  bvious and also 
8b70: 63 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f 76 65  could be improve
8b80: 64 2e 0a 20 20 20 20 20 20 20 20 2f 2f 20 4f 6e  d..        // On
8b90: 65 20 77 61 79 20 74 6f 20 6d 61 6b 65 20 74 68  e way to make th
8ba0: 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  is invariant is 
8bb0: 74 6f 20 68 61 76 65 20 73 6f 6d 65 74 68 69 6e  to have somethin
8bc0: 67 20 6c 69 6b 65 20 74 68 69 73 20 69 6e 73 74  g like this inst
8bd0: 65 61 64 3a 0a 20 20 20 20 20 20 20 20 2f 2f 0a  ead:.        //.
8be0: 20 20 20 20 20 20 20 20 2f 2f 20 62 72 61 6e 63          // branc
8bf0: 68 65 73 3a 20 56 65 63 3c 28 43 6f 6e 73 74 49  hes: Vec<(ConstI
8c00: 6e 74 2c 20 42 61 73 69 63 42 6c 6f 63 6b 29 3e  nt, BasicBlock)>
8c10: 2c 0a 20 20 20 20 20 20 20 20 2f 2f 20 6f 74 68  ,.        // oth
8c20: 65 72 77 69 73 65 3a 20 4f 70 74 69 6f 6e 3c 42  erwise: Option<B
8c30: 61 73 69 63 42 6c 6f 63 6b 3e 20 2f 2f 20 65 78  asicBlock> // ex
8c40: 68 61 75 73 74 69 76 65 20 69 66 20 4e 6f 6e 65  haustive if None
8c50: 0a 20 20 20 20 20 20 20 20 2f 2f 0a 20 20 20 20  .        //.    
8c60: 20 20 20 20 2f 2f 20 48 6f 77 65 76 65 72 20 77      // However w
8c70: 65 e2 80 99 76 65 20 64 65 63 69 64 65 64 20 74  e...ve decided t
8c80: 6f 20 6b 65 65 70 20 74 68 69 73 20 61 73 2d 69  o keep this as-i
8c90: 73 20 75 6e 74 69 6c 20 77 65 20 66 69 67 75 72  s until we figur
8ca0: 65 20 61 20 63 61 73 65 0a 20 20 20 20 20 20 20  e a case.       
8cb0: 20 2f 2f 20 77 68 65 72 65 20 73 6f 6d 65 20 6f   // where some o
8cc0: 74 68 65 72 20 61 70 70 72 6f 61 63 68 20 73 65  ther approach se
8cd0: 65 6d 73 20 74 6f 20 62 65 20 73 74 72 69 63 74  ems to be strict
8ce0: 6c 79 20 62 65 74 74 65 72 20 74 68 61 6e 20 6f  ly better than o
8cf0: 74 68 65 72 2e 0a 20 20 20 20 20 20 20 20 74 61  ther..        ta
8d00: 72 67 65 74 73 3a 20 56 65 63 3c 42 61 73 69 63  rgets: Vec<Basic
8d10: 42 6c 6f 63 6b 3e 2c 0a 20 20 20 20 7d 2c 0a 0a  Block>,.    },..
8d20: 20 20 20 20 2f 2f 2f 20 49 6e 64 69 63 61 74 65      /// Indicate
8d30: 73 20 74 68 61 74 20 74 68 65 20 6c 61 6e 64 69  s that the landi
8d40: 6e 67 20 70 61 64 20 69 73 20 66 69 6e 69 73 68  ng pad is finish
8d50: 65 64 20 61 6e 64 20 75 6e 77 69 6e 64 69 6e 67  ed and unwinding
8d60: 20 73 68 6f 75 6c 64 0a 20 20 20 20 2f 2f 2f 20   should.    /// 
8d70: 63 6f 6e 74 69 6e 75 65 2e 20 45 6d 69 74 74 65  continue. Emitte
8d80: 64 20 62 79 20 60 62 75 69 6c 64 3a 3a 73 63 6f  d by `build::sco
8d90: 70 65 3a 3a 64 69 76 65 72 67 65 5f 63 6c 65 61  pe::diverge_clea
8da0: 6e 75 70 60 2e 0a 20 20 20 20 52 65 73 75 6d 65  nup`..    Resume
8db0: 2c 0a 0a 20 20 20 20 2f 2f 2f 20 49 6e 64 69 63  ,..    /// Indic
8dc0: 61 74 65 73 20 74 68 61 74 20 74 68 65 20 6c 61  ates that the la
8dd0: 6e 64 69 6e 67 20 70 61 64 20 69 73 20 66 69 6e  nding pad is fin
8de0: 69 73 68 65 64 20 61 6e 64 20 74 68 61 74 20 74  ished and that t
8df0: 68 65 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2f  he process.    /
8e00: 2f 2f 20 73 68 6f 75 6c 64 20 61 62 6f 72 74 2e  // should abort.
8e10: 20 55 73 65 64 20 74 6f 20 70 72 65 76 65 6e 74   Used to prevent
8e20: 20 75 6e 77 69 6e 64 69 6e 67 20 66 6f 72 20 66   unwinding for f
8e30: 6f 72 65 69 67 6e 20 69 74 65 6d 73 2e 0a 20 20  oreign items..  
8e40: 20 20 41 62 6f 72 74 2c 0a 0a 20 20 20 20 2f 2f    Abort,..    //
8e50: 2f 20 49 6e 64 69 63 61 74 65 73 20 61 20 6e 6f  / Indicates a no
8e60: 72 6d 61 6c 20 72 65 74 75 72 6e 2e 20 54 68 65  rmal return. The
8e70: 20 72 65 74 75 72 6e 20 70 6c 61 63 65 20 73 68   return place sh
8e80: 6f 75 6c 64 20 68 61 76 65 0a 20 20 20 20 2f 2f  ould have.    //
8e90: 2f 20 62 65 65 6e 20 66 69 6c 6c 65 64 20 69 6e  / been filled in
8ea0: 20 62 79 20 6e 6f 77 2e 20 54 68 69 73 20 73 68   by now. This sh
8eb0: 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 6d 6f  ould occur at mo
8ec0: 73 74 20 6f 6e 63 65 2e 0a 20 20 20 20 52 65 74  st once..    Ret
8ed0: 75 72 6e 2c 0a 0a 20 20 20 20 2f 2f 2f 20 49 6e  urn,..    /// In
8ee0: 64 69 63 61 74 65 73 20 61 20 74 65 72 6d 69 6e  dicates a termin
8ef0: 61 74 6f 72 20 74 68 61 74 20 63 61 6e 20 6e 65  ator that can ne
8f00: 76 65 72 20 62 65 20 72 65 61 63 68 65 64 2e 0a  ver be reached..
8f10: 20 20 20 20 55 6e 72 65 61 63 68 61 62 6c 65 2c      Unreachable,
8f20: 0a 0a 20 20 20 20 2f 2f 2f 20 44 72 6f 70 20 74  ..    /// Drop t
8f30: 68 65 20 60 50 6c 61 63 65 60 2e 0a 20 20 20 20  he `Place`..    
8f40: 44 72 6f 70 20 7b 20 6c 6f 63 61 74 69 6f 6e 3a  Drop { location:
8f50: 20 50 6c 61 63 65 3c 27 74 63 78 3e 2c 20 74 61   Place<'tcx>, ta
8f60: 72 67 65 74 3a 20 42 61 73 69 63 42 6c 6f 63 6b  rget: BasicBlock
8f70: 2c 20 75 6e 77 69 6e 64 3a 20 4f 70 74 69 6f 6e  , unwind: Option
8f80: 3c 42 61 73 69 63 42 6c 6f 63 6b 3e 20 7d 2c 0a  <BasicBlock> },.
8f90: 0a 20 20 20 20 2f 2f 2f 20 44 72 6f 70 20 74 68  .    /// Drop th
8fa0: 65 20 60 50 6c 61 63 65 60 20 61 6e 64 20 61 73  e `Place` and as
8fb0: 73 69 67 6e 20 74 68 65 20 6e 65 77 20 76 61 6c  sign the new val
8fc0: 75 65 20 6f 76 65 72 20 69 74 2e 20 54 68 69 73  ue over it. This
8fd0: 20 65 6e 73 75 72 65 73 0a 20 20 20 20 2f 2f 2f   ensures.    ///
8fe0: 20 74 68 61 74 20 74 68 65 20 61 73 73 69 67 6e   that the assign
8ff0: 6d 65 6e 74 20 74 6f 20 60 50 60 20 6f 63 63 75  ment to `P` occu
9000: 72 73 20 2a 65 76 65 6e 20 69 66 2a 20 74 68 65  rs *even if* the
9010: 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 0a   destructor for.
9020: 20 20 20 20 2f 2f 2f 20 70 6c 61 63 65 20 75 6e      /// place un
9030: 77 69 6e 64 73 2e 20 49 74 73 20 73 65 6d 61 6e  winds. Its seman
9040: 74 69 63 73 20 61 72 65 20 62 65 73 74 20 65 78  tics are best ex
9050: 70 6c 61 69 6e 65 64 20 62 79 20 74 68 65 0a 20  plained by the. 
9060: 20 20 20 2f 2f 2f 20 65 6c 61 62 6f 72 61 74 69     /// elaborati
9070: 6f 6e 3a 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20  on:.    ///.    
9080: 2f 2f 2f 20 60 60 60 0a 20 20 20 20 2f 2f 2f 20  /// ```.    /// 
9090: 42 42 30 20 7b 0a 20 20 20 20 2f 2f 2f 20 20 20  BB0 {.    ///   
90a0: 44 72 6f 70 41 6e 64 52 65 70 6c 61 63 65 28 50  DropAndReplace(P
90b0: 20 3c 2d 20 56 2c 20 67 6f 74 6f 20 42 42 31 2c   <- V, goto BB1,
90c0: 20 75 6e 77 69 6e 64 20 42 42 32 29 0a 20 20 20   unwind BB2).   
90d0: 20 2f 2f 2f 20 7d 0a 20 20 20 20 2f 2f 2f 20 60   /// }.    /// `
90e0: 60 60 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f  ``.    ///.    /
90f0: 2f 2f 20 62 65 63 6f 6d 65 73 0a 20 20 20 20 2f  // becomes.    /
9100: 2f 2f 0a 20 20 20 20 2f 2f 2f 20 60 60 60 0a 20  //.    /// ```. 
9110: 20 20 20 2f 2f 2f 20 42 42 30 20 7b 0a 20 20 20     /// BB0 {.   
9120: 20 2f 2f 2f 20 20 20 44 72 6f 70 28 50 2c 20 67   ///   Drop(P, g
9130: 6f 74 6f 20 42 42 31 2c 20 75 6e 77 69 6e 64 20  oto BB1, unwind 
9140: 42 42 32 29 0a 20 20 20 20 2f 2f 2f 20 7d 0a 20  BB2).    /// }. 
9150: 20 20 20 2f 2f 2f 20 42 42 31 20 7b 0a 20 20 20     /// BB1 {.   
9160: 20 2f 2f 2f 20 20 20 2f 2f 20 50 20 69 73 20 6e   ///   // P is n
9170: 6f 77 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ow uninitialized
9180: 0a 20 20 20 20 2f 2f 2f 20 20 20 50 20 3c 2d 20  .    ///   P <- 
9190: 56 0a 20 20 20 20 2f 2f 2f 20 7d 0a 20 20 20 20  V.    /// }.    
91a0: 2f 2f 2f 20 42 42 32 20 7b 0a 20 20 20 20 2f 2f  /// BB2 {.    //
91b0: 2f 20 20 20 2f 2f 20 50 20 69 73 20 6e 6f 77 20  /   // P is now 
91c0: 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 2d 2d  uninitialized --
91d0: 20 69 74 73 20 64 74 6f 72 20 70 61 6e 69 63 6b   its dtor panick
91e0: 65 64 0a 20 20 20 20 2f 2f 2f 20 20 20 50 20 3c  ed.    ///   P <
91f0: 2d 20 56 0a 20 20 20 20 2f 2f 2f 20 7d 0a 20 20  - V.    /// }.  
9200: 20 20 2f 2f 2f 20 60 60 60 0a 20 20 20 20 44 72    /// ```.    Dr
9210: 6f 70 41 6e 64 52 65 70 6c 61 63 65 20 7b 0a 20  opAndReplace {. 
9220: 20 20 20 20 20 20 20 6c 6f 63 61 74 69 6f 6e 3a         location:
9230: 20 50 6c 61 63 65 3c 27 74 63 78 3e 2c 0a 20 20   Place<'tcx>,.  
9240: 20 20 20 20 20 20 76 61 6c 75 65 3a 20 4f 70 65        value: Ope
9250: 72 61 6e 64 3c 27 74 63 78 3e 2c 0a 20 20 20 20  rand<'tcx>,.    
9260: 20 20 20 20 74 61 72 67 65 74 3a 20 42 61 73 69      target: Basi
9270: 63 42 6c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  cBlock,.        
9280: 75 6e 77 69 6e 64 3a 20 4f 70 74 69 6f 6e 3c 42  unwind: Option<B
9290: 61 73 69 63 42 6c 6f 63 6b 3e 2c 0a 20 20 20 20  asicBlock>,.    
92a0: 7d 2c 0a 0a 20 20 20 20 2f 2f 2f 20 42 6c 6f 63  },..    /// Bloc
92b0: 6b 20 65 6e 64 73 20 77 69 74 68 20 61 20 63 61  k ends with a ca
92c0: 6c 6c 20 6f 66 20 61 20 63 6f 6e 76 65 72 67 69  ll of a convergi
92d0: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  ng function..   
92e0: 20 43 61 6c 6c 20 7b 0a 20 20 20 20 20 20 20 20   Call {.        
92f0: 2f 2f 2f 20 54 68 65 20 66 75 6e 63 74 69 6f 6e  /// The function
9300: 20 74 68 61 74 e2 80 99 73 20 62 65 69 6e 67 20   that...s being 
9310: 63 61 6c 6c 65 64 2e 0a 20 20 20 20 20 20 20 20  called..        
9320: 66 75 6e 63 3a 20 4f 70 65 72 61 6e 64 3c 27 74  func: Operand<'t
9330: 63 78 3e 2c 0a 20 20 20 20 20 20 20 20 2f 2f 2f  cx>,.        ///
9340: 20 41 72 67 75 6d 65 6e 74 73 20 74 68 65 20 66   Arguments the f
9350: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
9360: 64 20 77 69 74 68 2e 0a 20 20 20 20 20 20 20 20  d with..        
9370: 2f 2f 2f 20 54 68 65 73 65 20 61 72 65 20 6f 77  /// These are ow
9380: 6e 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  ned by the calle
9390: 65 2c 20 77 68 69 63 68 20 69 73 20 66 72 65 65  e, which is free
93a0: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 6d 2e   to modify them.
93b0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 69  .        /// Thi
93c0: 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 6d 65 6d  s allows the mem
93d0: 6f 72 79 20 6f 63 63 75 70 69 65 64 20 62 79 20  ory occupied by 
93e0: 22 62 79 2d 76 61 6c 75 65 22 20 61 72 67 75 6d  "by-value" argum
93f0: 65 6e 74 73 20 74 6f 20 62 65 0a 20 20 20 20 20  ents to be.     
9400: 20 20 20 2f 2f 2f 20 72 65 75 73 65 64 20 61 63     /// reused ac
9410: 72 6f 73 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  ross function ca
9420: 6c 6c 73 20 77 69 74 68 6f 75 74 20 64 75 70 6c  lls without dupl
9430: 69 63 61 74 69 6e 67 20 74 68 65 20 63 6f 6e 74  icating the cont
9440: 65 6e 74 73 2e 0a 20 20 20 20 20 20 20 20 61 72  ents..        ar
9450: 67 73 3a 20 56 65 63 3c 4f 70 65 72 61 6e 64 3c  gs: Vec<Operand<
9460: 27 74 63 78 3e 3e 2c 0a 20 20 20 20 20 20 20 20  'tcx>>,.        
9470: 2f 2f 2f 20 44 65 73 74 69 6e 61 74 69 6f 6e 20  /// Destination 
9480: 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 20 76  for the return v
9490: 61 6c 75 65 2e 20 49 66 20 73 6f 6d 65 2c 20 74  alue. If some, t
94a0: 68 65 20 63 61 6c 6c 20 69 73 20 63 6f 6e 76 65  he call is conve
94b0: 72 67 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 64  rging..        d
94c0: 65 73 74 69 6e 61 74 69 6f 6e 3a 20 4f 70 74 69  estination: Opti
94d0: 6f 6e 3c 28 50 6c 61 63 65 3c 27 74 63 78 3e 2c  on<(Place<'tcx>,
94e0: 20 42 61 73 69 63 42 6c 6f 63 6b 29 3e 2c 0a 20   BasicBlock)>,. 
94f0: 20 20 20 20 20 20 20 2f 2f 2f 20 43 6c 65 61 6e         /// Clean
9500: 75 70 73 20 74 6f 20 62 65 20 64 6f 6e 65 20 69  ups to be done i
9510: 66 20 74 68 65 20 63 61 6c 6c 20 75 6e 77 69 6e  f the call unwin
9520: 64 73 2e 0a 20 20 20 20 20 20 20 20 63 6c 65 61  ds..        clea
9530: 6e 75 70 3a 20 4f 70 74 69 6f 6e 3c 42 61 73 69  nup: Option<Basi
9540: 63 42 6c 6f 63 6b 3e 2c 0a 20 20 20 20 20 20 20  cBlock>,.       
9550: 20 2f 2f 2f 20 60 74 72 75 65 60 20 69 66 20 74   /// `true` if t
9560: 68 69 73 20 69 73 20 66 72 6f 6d 20 61 20 63 61  his is from a ca
9570: 6c 6c 20 69 6e 20 48 49 52 20 72 61 74 68 65 72  ll in HIR rather
9580: 20 74 68 61 6e 20 66 72 6f 6d 20 61 6e 20 6f 76   than from an ov
9590: 65 72 6c 6f 61 64 65 64 0a 20 20 20 20 20 20 20  erloaded.       
95a0: 20 2f 2f 2f 20 6f 70 65 72 61 74 6f 72 2e 20 54   /// operator. T
95b0: 72 75 65 20 66 6f 72 20 6f 76 65 72 6c 6f 61 64  rue for overload
95c0: 65 64 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ed function call
95d0: 2e 0a 20 20 20 20 20 20 20 20 66 72 6f 6d 5f 68  ..        from_h
95e0: 69 72 5f 63 61 6c 6c 3a 20 62 6f 6f 6c 2c 0a 20  ir_call: bool,. 
95f0: 20 20 20 7d 2c 0a 0a 20 20 20 20 2f 2f 2f 20 4a     },..    /// J
9600: 75 6d 70 20 74 6f 20 74 68 65 20 74 61 72 67 65  ump to the targe
9610: 74 20 69 66 20 74 68 65 20 63 6f 6e 64 69 74 69  t if the conditi
9620: 6f 6e 20 68 61 73 20 74 68 65 20 65 78 70 65 63  on has the expec
9630: 74 65 64 20 76 61 6c 75 65 2c 0a 20 20 20 20 2f  ted value,.    /
9640: 2f 2f 20 6f 74 68 65 72 77 69 73 65 20 70 61 6e  // otherwise pan
9650: 69 63 20 77 69 74 68 20 61 20 6d 65 73 73 61 67  ic with a messag
9660: 65 20 61 6e 64 20 61 20 63 6c 65 61 6e 75 70 20  e and a cleanup 
9670: 74 61 72 67 65 74 2e 0a 20 20 20 20 41 73 73 65  target..    Asse
9680: 72 74 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  rt {.        con
9690: 64 3a 20 4f 70 65 72 61 6e 64 3c 27 74 63 78 3e  d: Operand<'tcx>
96a0: 2c 0a 20 20 20 20 20 20 20 20 65 78 70 65 63 74  ,.        expect
96b0: 65 64 3a 20 62 6f 6f 6c 2c 0a 20 20 20 20 20 20  ed: bool,.      
96c0: 20 20 6d 73 67 3a 20 41 73 73 65 72 74 4d 65 73    msg: AssertMes
96d0: 73 61 67 65 3c 27 74 63 78 3e 2c 0a 20 20 20 20  sage<'tcx>,.    
96e0: 20 20 20 20 74 61 72 67 65 74 3a 20 42 61 73 69      target: Basi
96f0: 63 42 6c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  cBlock,.        
9700: 63 6c 65 61 6e 75 70 3a 20 4f 70 74 69 6f 6e 3c  cleanup: Option<
9710: 42 61 73 69 63 42 6c 6f 63 6b 3e 2c 0a 20 20 20  BasicBlock>,.   
9720: 20 7d 2c 0a 0a 20 20 20 20 2f 2f 2f 20 41 20 73   },..    /// A s
9730: 75 73 70 65 6e 64 20 70 6f 69 6e 74 2e 0a 20 20  uspend point..  
9740: 20 20 59 69 65 6c 64 20 7b 0a 20 20 20 20 20 20    Yield {.      
9750: 20 20 2f 2f 2f 20 54 68 65 20 76 61 6c 75 65 20    /// The value 
9760: 74 6f 20 72 65 74 75 72 6e 2e 0a 20 20 20 20 20  to return..     
9770: 20 20 20 76 61 6c 75 65 3a 20 4f 70 65 72 61 6e     value: Operan
9780: 64 3c 27 74 63 78 3e 2c 0a 20 20 20 20 20 20 20  d<'tcx>,.       
9790: 20 2f 2f 2f 20 57 68 65 72 65 20 74 6f 20 72 65   /// Where to re
97a0: 73 75 6d 65 20 74 6f 2e 0a 20 20 20 20 20 20 20  sume to..       
97b0: 20 72 65 73 75 6d 65 3a 20 42 61 73 69 63 42 6c   resume: BasicBl
97c0: 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ock,.        ///
97d0: 20 43 6c 65 61 6e 75 70 20 74 6f 20 62 65 20 64   Cleanup to be d
97e0: 6f 6e 65 20 69 66 20 74 68 65 20 67 65 6e 65 72  one if the gener
97f0: 61 74 6f 72 20 69 73 20 64 72 6f 70 70 65 64 20  ator is dropped 
9800: 61 74 20 74 68 69 73 20 73 75 73 70 65 6e 64 20  at this suspend 
9810: 70 6f 69 6e 74 2e 0a 20 20 20 20 20 20 20 20 64  point..        d
9820: 72 6f 70 3a 20 4f 70 74 69 6f 6e 3c 42 61 73 69  rop: Option<Basi
9830: 63 42 6c 6f 63 6b 3e 2c 0a 20 20 20 20 7d 2c 0a  cBlock>,.    },.
9840: 0a 20 20 20 20 2f 2f 2f 20 49 6e 64 69 63 61 74  .    /// Indicat
9850: 65 73 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  es the end of th
9860: 65 20 64 72 6f 70 70 69 6e 67 20 6f 66 20 61 20  e dropping of a 
9870: 67 65 6e 65 72 61 74 6f 72 2e 0a 20 20 20 20 47  generator..    G
9880: 65 6e 65 72 61 74 6f 72 44 72 6f 70 2c 0a 0a 20  eneratorDrop,.. 
9890: 20 20 20 2f 2f 2f 20 41 20 62 6c 6f 63 6b 20 77     /// A block w
98a0: 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f  here control flo
98b0: 77 20 6f 6e 6c 79 20 65 76 65 72 20 74 61 6b 65  w only ever take
98c0: 73 20 6f 6e 65 20 72 65 61 6c 20 70 61 74 68 2c  s one real path,
98d0: 20 62 75 74 20 62 6f 72 72 6f 77 63 6b 0a 20 20   but borrowck.  
98e0: 20 20 2f 2f 2f 20 6e 65 65 64 73 20 74 6f 20 62    /// needs to b
98f0: 65 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74  e more conservat
9900: 69 76 65 2e 0a 20 20 20 20 46 61 6c 73 65 45 64  ive..    FalseEd
9910: 67 65 73 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f  ges {.        //
9920: 2f 20 54 68 65 20 74 61 72 67 65 74 20 6e 6f 72  / The target nor
9930: 6d 61 6c 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77  mal control flow
9940: 20 77 69 6c 6c 20 74 61 6b 65 2e 0a 20 20 20 20   will take..    
9950: 20 20 20 20 72 65 61 6c 5f 74 61 72 67 65 74 3a      real_target:
9960: 20 42 61 73 69 63 42 6c 6f 63 6b 2c 0a 20 20 20   BasicBlock,.   
9970: 20 20 20 20 20 2f 2f 2f 20 41 20 62 6c 6f 63 6b       /// A block
9980: 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 20 63 6f   control flow co
9990: 75 6c 64 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79  uld conceptually
99a0: 20 6a 75 6d 70 20 74 6f 2c 20 62 75 74 20 77 6f   jump to, but wo
99b0: 6e 27 74 20 69 6e 0a 20 20 20 20 20 20 20 20 2f  n't in.        /
99c0: 2f 2f 20 70 72 61 63 74 69 63 65 2e 0a 20 20 20  // practice..   
99d0: 20 20 20 20 20 69 6d 61 67 69 6e 61 72 79 5f 74       imaginary_t
99e0: 61 72 67 65 74 3a 20 42 61 73 69 63 42 6c 6f 63  arget: BasicBloc
99f0: 6b 2c 0a 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2f  k,.    },.    //
9a00: 2f 20 41 20 74 65 72 6d 69 6e 61 74 6f 72 20 66  / A terminator f
9a10: 6f 72 20 62 6c 6f 63 6b 73 20 74 68 61 74 20 6f  or blocks that o
9a20: 6e 6c 79 20 74 61 6b 65 20 6f 6e 65 20 70 61 74  nly take one pat
9a30: 68 20 69 6e 20 72 65 61 6c 69 74 79 2c 20 62 75  h in reality, bu
9a40: 74 20 77 68 65 72 65 20 77 65 0a 20 20 20 20 2f  t where we.    /
9a50: 2f 2f 20 72 65 73 65 72 76 65 20 74 68 65 20 72  // reserve the r
9a60: 69 67 68 74 20 74 6f 20 75 6e 77 69 6e 64 20 69  ight to unwind i
9a70: 6e 20 62 6f 72 72 6f 77 63 6b 2c 20 65 76 65 6e  n borrowck, even
9a80: 20 69 66 20 69 74 20 77 6f 6e 27 74 20 68 61 70   if it won't hap
9a90: 70 65 6e 20 69 6e 20 70 72 61 63 74 69 63 65 2e  pen in practice.
9aa0: 0a 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 63 61  .    /// This ca
9ab0: 6e 20 61 72 69 73 65 20 69 6e 20 69 6e 66 69 6e  n arise in infin
9ac0: 69 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 6e  ite loops with n
9ad0: 6f 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  o function calls
9ae0: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 0a 20 20   for example..  
9af0: 20 20 46 61 6c 73 65 55 6e 77 69 6e 64 20 7b 0a    FalseUnwind {.
9b00: 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20          /// The 
9b10: 74 61 72 67 65 74 20 6e 6f 72 6d 61 6c 20 63 6f  target normal co
9b20: 6e 74 72 6f 6c 20 66 6c 6f 77 20 77 69 6c 6c 20  ntrol flow will 
9b30: 74 61 6b 65 2e 0a 20 20 20 20 20 20 20 20 72 65  take..        re
9b40: 61 6c 5f 74 61 72 67 65 74 3a 20 42 61 73 69 63  al_target: Basic
9b50: 42 6c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 2f  Block,.        /
9b60: 2f 2f 20 54 68 65 20 69 6d 61 67 69 6e 61 72 79  // The imaginary
9b70: 20 63 6c 65 61 6e 75 70 20 62 6c 6f 63 6b 20 6c   cleanup block l
9b80: 69 6e 6b 2e 20 54 68 69 73 20 70 61 72 74 69 63  ink. This partic
9b90: 75 6c 61 72 20 70 61 74 68 20 77 69 6c 6c 20 6e  ular path will n
9ba0: 65 76 65 72 20 62 65 20 74 61 6b 65 6e 0a 20 20  ever be taken.  
9bb0: 20 20 20 20 20 20 2f 2f 2f 20 69 6e 20 70 72 61        /// in pra
9bc0: 63 74 69 63 65 2c 20 62 75 74 20 69 6e 20 6f 72  ctice, but in or
9bd0: 64 65 72 20 74 6f 20 61 76 6f 69 64 20 66 72 61  der to avoid fra
9be0: 67 69 6c 69 74 79 20 77 65 20 77 61 6e 74 20 74  gility we want t
9bf0: 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20 20  o always.       
9c00: 20 2f 2f 2f 20 63 6f 6e 73 69 64 65 72 20 69 74   /// consider it
9c10: 20 69 6e 20 62 6f 72 72 6f 77 63 6b 2e 20 57 65   in borrowck. We
9c20: 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 61   don't want to a
9c30: 63 63 65 70 74 20 70 72 6f 67 72 61 6d 73 20 77  ccept programs w
9c40: 68 69 63 68 0a 20 20 20 20 20 20 20 20 2f 2f 2f  hich.        ///
9c50: 20 70 61 73 73 20 62 6f 72 72 6f 77 63 6b 20 6f   pass borrowck o
9c60: 6e 6c 79 20 77 68 65 6e 20 60 70 61 6e 69 63 3d  nly when `panic=
9c70: 61 62 6f 72 74 60 20 6f 72 20 73 6f 6d 65 20 61  abort` or some a
9c80: 73 73 65 72 74 69 6f 6e 73 20 61 72 65 20 64 69  ssertions are di
9c90: 73 61 62 6c 65 64 0a 20 20 20 20 20 20 20 20 2f  sabled.        /
9ca0: 2f 2f 20 64 75 65 20 74 6f 20 72 65 6c 65 61 73  // due to releas
9cb0: 65 20 76 73 2e 20 64 65 62 75 67 20 6d 6f 64 65  e vs. debug mode
9cc0: 20 62 75 69 6c 64 73 2e 20 54 68 69 73 20 6e 65   builds. This ne
9cd0: 65 64 73 20 74 6f 20 62 65 20 61 6e 20 60 4f 70  eds to be an `Op
9ce0: 74 69 6f 6e 60 20 62 65 63 61 75 73 65 0a 20 20  tion` because.  
9cf0: 20 20 20 20 20 20 2f 2f 2f 20 6f 66 20 74 68 65        /// of the
9d00: 20 60 72 65 6d 6f 76 65 5f 6e 6f 6f 70 5f 6c 61   `remove_noop_la
9d10: 6e 64 69 6e 67 5f 70 61 64 73 60 20 61 6e 64 20  nding_pads` and 
9d20: 60 6e 6f 5f 6c 61 6e 64 69 6e 67 5f 70 61 64 73  `no_landing_pads
9d30: 60 20 70 61 73 73 65 73 2e 0a 20 20 20 20 20 20  ` passes..      
9d40: 20 20 75 6e 77 69 6e 64 3a 20 4f 70 74 69 6f 6e    unwind: Option
9d50: 3c 42 61 73 69 63 42 6c 6f 63 6b 3e 2c 0a 20 20  <BasicBlock>,.  
9d60: 20 20 7d 2c 0a 7d 0a 0a 70 75 62 20 74 79 70 65    },.}..pub type
9d70: 20 53 75 63 63 65 73 73 6f 72 73 3c 27 61 3e 20   Successors<'a> 
9d80: 3d 0a 20 20 20 20 69 74 65 72 3a 3a 43 68 61 69  =.    iter::Chai
9d90: 6e 3c 6f 70 74 69 6f 6e 3a 3a 49 6e 74 6f 49 74  n<option::IntoIt
9da0: 65 72 3c 26 27 61 20 42 61 73 69 63 42 6c 6f 63  er<&'a BasicBloc
9db0: 6b 3e 2c 20 73 6c 69 63 65 3a 3a 49 74 65 72 3c  k>, slice::Iter<
9dc0: 27 61 2c 20 42 61 73 69 63 42 6c 6f 63 6b 3e 3e  'a, BasicBlock>>
9dd0: 3b 0a 70 75 62 20 74 79 70 65 20 53 75 63 63 65  ;.pub type Succe
9de0: 73 73 6f 72 73 4d 75 74 3c 27 61 3e 20 3d 0a 20  ssorsMut<'a> =. 
9df0: 20 20 20 69 74 65 72 3a 3a 43 68 61 69 6e 3c 6f     iter::Chain<o
9e00: 70 74 69 6f 6e 3a 3a 49 6e 74 6f 49 74 65 72 3c  ption::IntoIter<
9e10: 26 27 61 20 6d 75 74 20 42 61 73 69 63 42 6c 6f  &'a mut BasicBlo
9e20: 63 6b 3e 2c 20 73 6c 69 63 65 3a 3a 49 74 65 72  ck>, slice::Iter
9e30: 4d 75 74 3c 27 61 2c 20 42 61 73 69 63 42 6c 6f  Mut<'a, BasicBlo
9e40: 63 6b 3e 3e 3b 0a 0a 69 6d 70 6c 3c 27 74 63 78  ck>>;..impl<'tcx
9e50: 3e 20 54 65 72 6d 69 6e 61 74 6f 72 3c 27 74 63  > Terminator<'tc
9e60: 78 3e 20 7b 0a 20 20 20 20 70 75 62 20 66 6e 20  x> {.    pub fn 
9e70: 73 75 63 63 65 73 73 6f 72 73 28 26 73 65 6c 66  successors(&self
9e80: 29 20 2d 3e 20 53 75 63 63 65 73 73 6f 72 73 3c  ) -> Successors<
9e90: 27 5f 3e 20 7b 0a 20 20 20 20 20 20 20 20 73 65  '_> {.        se
9ea0: 6c 66 2e 6b 69 6e 64 2e 73 75 63 63 65 73 73 6f  lf.kind.successo
9eb0: 72 73 28 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rs().    }..    
9ec0: 70 75 62 20 66 6e 20 73 75 63 63 65 73 73 6f 72  pub fn successor
9ed0: 73 5f 6d 75 74 28 26 6d 75 74 20 73 65 6c 66 29  s_mut(&mut self)
9ee0: 20 2d 3e 20 53 75 63 63 65 73 73 6f 72 73 4d 75   -> SuccessorsMu
9ef0: 74 3c 27 5f 3e 20 7b 0a 20 20 20 20 20 20 20 20  t<'_> {.        
9f00: 73 65 6c 66 2e 6b 69 6e 64 2e 73 75 63 63 65 73  self.kind.succes
9f10: 73 6f 72 73 5f 6d 75 74 28 29 0a 20 20 20 20 7d  sors_mut().    }
9f20: 0a 0a 20 20 20 20 70 75 62 20 66 6e 20 75 6e 77  ..    pub fn unw
9f30: 69 6e 64 28 26 73 65 6c 66 29 20 2d 3e 20 4f 70  ind(&self) -> Op
9f40: 74 69 6f 6e 3c 26 4f 70 74 69 6f 6e 3c 42 61 73  tion<&Option<Bas
9f50: 69 63 42 6c 6f 63 6b 3e 3e 20 7b 0a 20 20 20 20  icBlock>> {.    
9f60: 20 20 20 20 73 65 6c 66 2e 6b 69 6e 64 2e 75 6e      self.kind.un
9f70: 77 69 6e 64 28 29 0a 20 20 20 20 7d 0a 0a 20 20  wind().    }..  
9f80: 20 20 70 75 62 20 66 6e 20 75 6e 77 69 6e 64 5f    pub fn unwind_
9f90: 6d 75 74 28 26 6d 75 74 20 73 65 6c 66 29 20 2d  mut(&mut self) -
9fa0: 3e 20 4f 70 74 69 6f 6e 3c 26 6d 75 74 20 4f 70  > Option<&mut Op
9fb0: 74 69 6f 6e 3c 42 61 73 69 63 42 6c 6f 63 6b 3e  tion<BasicBlock>
9fc0: 3e 20 7b 0a 20 20 20 20 20 20 20 20 73 65 6c 66  > {.        self
9fd0: 2e 6b 69 6e 64 2e 75 6e 77 69 6e 64 5f 6d 75 74  .kind.unwind_mut
9fe0: 28 29 0a 20 20 20 20 7d 0a 7d 0a 0a 69 6d 70 6c  ().    }.}..impl
9ff0: 3c 27 74 63 78 3e 20 54 65 72 6d 69 6e 61 74 6f  <'tcx> Terminato
a000: 72 4b 69 6e 64 3c 27 74 63 78 3e 20 7b 0a 20 20  rKind<'tcx> {.  
a010: 20 20 70 75 62 20 66 6e 20 69 66 5f 28 0a 20 20    pub fn if_(.  
a020: 20 20 20 20 20 20 74 63 78 3a 20 54 79 43 74 78        tcx: TyCtx
a030: 74 3c 27 74 63 78 3e 2c 0a 20 20 20 20 20 20 20  t<'tcx>,.       
a040: 20 63 6f 6e 64 3a 20 4f 70 65 72 61 6e 64 3c 27   cond: Operand<'
a050: 74 63 78 3e 2c 0a 20 20 20 20 20 20 20 20 74 3a  tcx>,.        t:
a060: 20 42 61 73 69 63 42 6c 6f 63 6b 2c 0a 20 20 20   BasicBlock,.   
a070: 20 20 20 20 20 66 3a 20 42 61 73 69 63 42 6c 6f       f: BasicBlo
a080: 63 6b 2c 0a 20 20 20 20 29 20 2d 3e 20 54 65 72  ck,.    ) -> Ter
a090: 6d 69 6e 61 74 6f 72 4b 69 6e 64 3c 27 74 63 78  minatorKind<'tcx
a0a0: 3e 20 7b 0a 20 20 20 20 20 20 20 20 73 74 61 74  > {.        stat
a0b0: 69 63 20 42 4f 4f 4c 5f 53 57 49 54 43 48 5f 46  ic BOOL_SWITCH_F
a0c0: 41 4c 53 45 3a 20 26 27 73 74 61 74 69 63 20 5b  ALSE: &'static [
a0d0: 75 31 32 38 5d 20 3d 20 26 5b 30 5d 3b 0a 20 20  u128] = &[0];.  
a0e0: 20 20 20 20 20 20 54 65 72 6d 69 6e 61 74 6f 72        Terminator
a0f0: 4b 69 6e 64 3a 3a 53 77 69 74 63 68 49 6e 74 20  Kind::SwitchInt 
a100: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69  {.            di
a110: 73 63 72 3a 20 63 6f 6e 64 2c 0a 20 20 20 20 20  scr: cond,.     
a120: 20 20 20 20 20 20 20 73 77 69 74 63 68 5f 74 79         switch_ty
a130: 3a 20 74 63 78 2e 74 79 70 65 73 2e 62 6f 6f 6c  : tcx.types.bool
a140: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 61  ,.            va
a150: 6c 75 65 73 3a 20 46 72 6f 6d 3a 3a 66 72 6f 6d  lues: From::from
a160: 28 42 4f 4f 4c 5f 53 57 49 54 43 48 5f 46 41 4c  (BOOL_SWITCH_FAL
a170: 53 45 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  SE),.           
a180: 20 74 61 72 67 65 74 73 3a 20 76 65 63 21 5b 66   targets: vec![f
a190: 2c 20 74 5d 2c 0a 20 20 20 20 20 20 20 20 7d 0a  , t],.        }.
a1a0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 75 62 20 66      }..    pub f
a1b0: 6e 20 73 75 63 63 65 73 73 6f 72 73 28 26 73 65  n successors(&se
a1c0: 6c 66 29 20 2d 3e 20 53 75 63 63 65 73 73 6f 72  lf) -> Successor
a1d0: 73 3c 27 5f 3e 20 7b 0a 20 20 20 20 20 20 20 20  s<'_> {.        
a1e0: 75 73 65 20 73 65 6c 66 3a 3a 54 65 72 6d 69 6e  use self::Termin
a1f0: 61 74 6f 72 4b 69 6e 64 3a 3a 2a 3b 0a 20 20 20  atorKind::*;.   
a200: 20 20 20 20 20 6d 61 74 63 68 20 2a 73 65 6c 66       match *self
a210: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 52   {.            R
a220: 65 73 75 6d 65 0a 20 20 20 20 20 20 20 20 20 20  esume.          
a230: 20 20 7c 20 41 62 6f 72 74 0a 20 20 20 20 20 20    | Abort.      
a240: 20 20 20 20 20 20 7c 20 47 65 6e 65 72 61 74 6f        | Generato
a250: 72 44 72 6f 70 0a 20 20 20 20 20 20 20 20 20 20  rDrop.          
a260: 20 20 7c 20 52 65 74 75 72 6e 0a 20 20 20 20 20    | Return.     
a270: 20 20 20 20 20 20 20 7c 20 55 6e 72 65 61 63 68         | Unreach
a280: 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  able.           
a290: 20 7c 20 43 61 6c 6c 20 7b 20 64 65 73 74 69 6e   | Call { destin
a2a0: 61 74 69 6f 6e 3a 20 4e 6f 6e 65 2c 20 63 6c 65  ation: None, cle
a2b0: 61 6e 75 70 3a 20 4e 6f 6e 65 2c 20 2e 2e 20 7d  anup: None, .. }
a2c0: 20 3d 3e 20 4e 6f 6e 65 2e 69 6e 74 6f 5f 69 74   => None.into_it
a2d0: 65 72 28 29 2e 63 68 61 69 6e 28 26 5b 5d 29 2c  er().chain(&[]),
a2e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 47 6f 74  .            Got
a2f0: 6f 20 7b 20 74 61 72 67 65 74 3a 20 72 65 66 20  o { target: ref 
a300: 74 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t }.            
a310: 7c 20 43 61 6c 6c 20 7b 20 64 65 73 74 69 6e 61  | Call { destina
a320: 74 69 6f 6e 3a 20 4e 6f 6e 65 2c 20 63 6c 65 61  tion: None, clea
a330: 6e 75 70 3a 20 53 6f 6d 65 28 72 65 66 20 74 29  nup: Some(ref t)
a340: 2c 20 2e 2e 20 7d 0a 20 20 20 20 20 20 20 20 20  , .. }.         
a350: 20 20 20 7c 20 43 61 6c 6c 20 7b 20 64 65 73 74     | Call { dest
a360: 69 6e 61 74 69 6f 6e 3a 20 53 6f 6d 65 28 28 5f  ination: Some((_
a370: 2c 20 72 65 66 20 74 29 29 2c 20 63 6c 65 61 6e  , ref t)), clean
a380: 75 70 3a 20 4e 6f 6e 65 2c 20 2e 2e 20 7d 0a 20  up: None, .. }. 
a390: 20 20 20 20 20 20 20 20 20 20 20 7c 20 59 69 65             | Yie
a3a0: 6c 64 20 7b 20 72 65 73 75 6d 65 3a 20 72 65 66  ld { resume: ref
a3b0: 20 74 2c 20 64 72 6f 70 3a 20 4e 6f 6e 65 2c 20   t, drop: None, 
a3c0: 2e 2e 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20  .. }.           
a3d0: 20 7c 20 44 72 6f 70 41 6e 64 52 65 70 6c 61 63   | DropAndReplac
a3e0: 65 20 7b 20 74 61 72 67 65 74 3a 20 72 65 66 20  e { target: ref 
a3f0: 74 2c 20 75 6e 77 69 6e 64 3a 20 4e 6f 6e 65 2c  t, unwind: None,
a400: 20 2e 2e 20 7d 0a 20 20 20 20 20 20 20 20 20 20   .. }.          
a410: 20 20 7c 20 44 72 6f 70 20 7b 20 74 61 72 67 65    | Drop { targe
a420: 74 3a 20 72 65 66 20 74 2c 20 75 6e 77 69 6e 64  t: ref t, unwind
a430: 3a 20 4e 6f 6e 65 2c 20 2e 2e 20 7d 0a 20 20 20  : None, .. }.   
a440: 20 20 20 20 20 20 20 20 20 7c 20 41 73 73 65 72           | Asser
a450: 74 20 7b 20 74 61 72 67 65 74 3a 20 72 65 66 20  t { target: ref 
a460: 74 2c 20 63 6c 65 61 6e 75 70 3a 20 4e 6f 6e 65  t, cleanup: None
a470: 2c 20 2e 2e 20 7d 0a 20 20 20 20 20 20 20 20 20  , .. }.         
a480: 20 20 20 7c 20 46 61 6c 73 65 55 6e 77 69 6e 64     | FalseUnwind
a490: 20 7b 20 72 65 61 6c 5f 74 61 72 67 65 74 3a 20   { real_target: 
a4a0: 72 65 66 20 74 2c 20 75 6e 77 69 6e 64 3a 20 4e  ref t, unwind: N
a4b0: 6f 6e 65 20 7d 20 3d 3e 20 53 6f 6d 65 28 74 29  one } => Some(t)
a4c0: 2e 69 6e 74 6f 5f 69 74 65 72 28 29 2e 63 68 61  .into_iter().cha
a4d0: 69 6e 28 26 5b 5d 29 2c 0a 20 20 20 20 20 20 20  in(&[]),.       
a4e0: 20 20 20 20 20 43 61 6c 6c 20 7b 20 64 65 73 74       Call { dest
a4f0: 69 6e 61 74 69 6f 6e 3a 20 53 6f 6d 65 28 28 5f  ination: Some((_
a500: 2c 20 72 65 66 20 74 29 29 2c 20 63 6c 65 61 6e  , ref t)), clean
a510: 75 70 3a 20 53 6f 6d 65 28 72 65 66 20 75 29 2c  up: Some(ref u),
a520: 20 2e 2e 20 7d 0a 20 20 20 20 20 20 20 20 20 20   .. }.          
a530: 20 20 7c 20 59 69 65 6c 64 20 7b 20 72 65 73 75    | Yield { resu
a540: 6d 65 3a 20 72 65 66 20 74 2c 20 64 72 6f 70 3a  me: ref t, drop:
a550: 20 53 6f 6d 65 28 72 65 66 20 75 29 2c 20 2e 2e   Some(ref u), ..
a560: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c   }.            |
a570: 20 44 72 6f 70 41 6e 64 52 65 70 6c 61 63 65 20   DropAndReplace 
a580: 7b 20 74 61 72 67 65 74 3a 20 72 65 66 20 74 2c  { target: ref t,
a590: 20 75 6e 77 69 6e 64 3a 20 53 6f 6d 65 28 72 65   unwind: Some(re
a5a0: 66 20 75 29 2c 20 2e 2e 20 7d 0a 20 20 20 20 20  f u), .. }.     
a5b0: 20 20 20 20 20 20 20 7c 20 44 72 6f 70 20 7b 20         | Drop { 
a5c0: 74 61 72 67 65 74 3a 20 72 65 66 20 74 2c 20 75  target: ref t, u
a5d0: 6e 77 69 6e 64 3a 20 53 6f 6d 65 28 72 65 66 20  nwind: Some(ref 
a5e0: 75 29 2c 20 2e 2e 20 7d 0a 20 20 20 20 20 20 20  u), .. }.       
a5f0: 20 20 20 20 20 7c 20 41 73 73 65 72 74 20 7b 20       | Assert { 
a600: 74 61 72 67 65 74 3a 20 72 65 66 20 74 2c 20 63  target: ref t, c
a610: 6c 65 61 6e 75 70 3a 20 53 6f 6d 65 28 72 65 66  leanup: Some(ref
a620: 20 75 29 2c 20 2e 2e 20 7d 0a 20 20 20 20 20 20   u), .. }.      
a630: 20 20 20 20 20 20 7c 20 46 61 6c 73 65 55 6e 77        | FalseUnw
a640: 69 6e 64 20 7b 20 72 65 61 6c 5f 74 61 72 67 65  ind { real_targe
a650: 74 3a 20 72 65 66 20 74 2c 20 75 6e 77 69 6e 64  t: ref t, unwind
a660: 3a 20 53 6f 6d 65 28 72 65 66 20 75 29 20 7d 20  : Some(ref u) } 
a670: 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  => {.           
a680: 20 20 20 20 20 53 6f 6d 65 28 74 29 2e 69 6e 74       Some(t).int
a690: 6f 5f 69 74 65 72 28 29 2e 63 68 61 69 6e 28 73  o_iter().chain(s
a6a0: 6c 69 63 65 3a 3a 66 72 6f 6d 5f 72 65 66 28 75  lice::from_ref(u
a6b0: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  )).            }
a6c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 77 69  .            Swi
a6d0: 74 63 68 49 6e 74 20 7b 20 72 65 66 20 74 61 72  tchInt { ref tar
a6e0: 67 65 74 73 2c 20 2e 2e 20 7d 20 3d 3e 20 4e 6f  gets, .. } => No
a6f0: 6e 65 2e 69 6e 74 6f 5f 69 74 65 72 28 29 2e 63  ne.into_iter().c
a700: 68 61 69 6e 28 26 74 61 72 67 65 74 73 5b 2e 2e  hain(&targets[..
a710: 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]),.            
a720: 46 61 6c 73 65 45 64 67 65 73 20 7b 20 72 65 66  FalseEdges { ref
a730: 20 72 65 61 6c 5f 74 61 72 67 65 74 2c 20 72 65   real_target, re
a740: 66 20 69 6d 61 67 69 6e 61 72 79 5f 74 61 72 67  f imaginary_targ
a750: 65 74 20 7d 20 3d 3e 20 7b 0a 20 20 20 20 20 20  et } => {.      
a760: 20 20 20 20 20 20 20 20 20 20 53 6f 6d 65 28 72            Some(r
a770: 65 61 6c 5f 74 61 72 67 65 74 29 2e 69 6e 74 6f  eal_target).into
a780: 5f 69 74 65 72 28 29 2e 63 68 61 69 6e 28 73 6c  _iter().chain(sl
a790: 69 63 65 3a 3a 66 72 6f 6d 5f 72 65 66 28 69 6d  ice::from_ref(im
a7a0: 61 67 69 6e 61 72 79 5f 74 61 72 67 65 74 29 29  aginary_target))
a7b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
a7c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a         }.    }..
a7d0: 20 20 20 20 70 75 62 20 66 6e 20 73 75 63 63 65      pub fn succe
a7e0: 73 73 6f 72 73 5f 6d 75 74 28 26 6d 75 74 20 73  ssors_mut(&mut s
a7f0: 65 6c 66 29 20 2d 3e 20 53 75 63 63 65 73 73 6f  elf) -> Successo
a800: 72 73 4d 75 74 3c 27 5f 3e 20 7b 0a 20 20 20 20  rsMut<'_> {.    
a810: 20 20 20 20 75 73 65 20 73 65 6c 66 3a 3a 54 65      use self::Te
a820: 72 6d 69 6e 61 74 6f 72 4b 69 6e 64 3a 3a 2a 3b  rminatorKind::*;
a830: 0a 20 20 20 20 20 20 20 20 6d 61 74 63 68 20 2a  .        match *
a840: 73 65 6c 66 20 7b 0a 20 20 20 20 20 20 20 20 20  self {.         
a850: 20 20 20 52 65 73 75 6d 65 0a 20 20 20 20 20 20     Resume.      
a860: 20 20 20 20 20 20 7c 20 41 62 6f 72 74 0a 20 20        | Abort.  
a870: 20 20 20 20 20 20 20 20 20 20 7c 20 47 65 6e 65            | Gene
a880: 72 61 74 6f 72 44 72 6f 70 0a 20 20 20 20 20 20  ratorDrop.      
a890: 20 20 20 20 20 20 7c 20 52 65 74 75 72 6e 0a 20        | Return. 
a8a0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 55 6e 72             | Unr
a8b0: 65 61 63 68 61 62 6c 65 0a 20 20 20 20 20 20 20  eachable.       
a8c0: 20 20 20 20 20 7c 20 43 61 6c 6c 20 7b 20 64 65       | Call { de
a8d0: 73 74 69 6e 61 74 69 6f 6e 3a 20 4e 6f 6e 65 2c  stination: None,
a8e0: 20 63 6c 65 61 6e 75 70 3a 20 4e 6f 6e 65 2c 20   cleanup: None, 
a8f0: 2e 2e 20 7d 20 3d 3e 20 4e 6f 6e 65 2e 69 6e 74  .. } => None.int
a900: 6f 5f 69 74 65 72 28 29 2e 63 68 61 69 6e 28 26  o_iter().chain(&
a910: 6d 75 74 20 5b 5d 29 2c 0a 20 20 20 20 20 20 20  mut []),.       
a920: 20 20 20 20 20 47 6f 74 6f 20 7b 20 74 61 72 67       Goto { targ
a930: 65 74 3a 20 72 65 66 20 6d 75 74 20 74 20 7d 0a  et: ref mut t }.
a940: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 43 61              | Ca
a950: 6c 6c 20 7b 20 64 65 73 74 69 6e 61 74 69 6f 6e  ll { destination
a960: 3a 20 4e 6f 6e 65 2c 20 63 6c 65 61 6e 75 70 3a  : None, cleanup:
a970: 20 53 6f 6d 65 28 72 65 66 20 6d 75 74 20 74 29   Some(ref mut t)
a980: 2c 20 2e 2e 20 7d 0a 20 20 20 20 20 20 20 20 20  , .. }.         
a990: 20 20 20 7c 20 43 61 6c 6c 20 7b 20 64 65 73 74     | Call { dest
a9a0: 69 6e 61 74 69 6f 6e 3a 20 53 6f 6d 65 28 28 5f  ination: Some((_
a9b0: 2c 20 72 65 66 20 6d 75 74 20 74 29 29 2c 20 63  , ref mut t)), c
a9c0: 6c 65 61 6e 75 70 3a 20 4e 6f 6e 65 2c 20 2e 2e  leanup: None, ..
a9d0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c   }.            |
a9e0: 20 59 69 65 6c 64 20 7b 20 72 65 73 75 6d 65 3a   Yield { resume:
a9f0: 20 72 65 66 20 6d 75 74 20 74 2c 20 64 72 6f 70   ref mut t, drop
aa00: 3a 20 4e 6f 6e 65 2c 20 2e 2e 20 7d 0a 20 20 20  : None, .. }.   
aa10: 20 20 20 20 20 20 20 20 20 7c 20 44 72 6f 70 41           | DropA
aa20: 6e 64 52 65 70 6c 61 63 65 20 7b 20 74 61 72 67  ndReplace { targ
aa30: 65 74 3a 20 72 65 66 20 6d 75 74 20 74 2c 20 75  et: ref mut t, u
aa40: 6e 77 69 6e 64 3a 20 4e 6f 6e 65 2c 20 2e 2e 20  nwind: None, .. 
aa50: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 20  }.            | 
aa60: 44 72 6f 70 20 7b 20 74 61 72 67 65 74 3a 20 72  Drop { target: r
aa70: 65 66 20 6d 75 74 20 74 2c 20 75 6e 77 69 6e 64  ef mut t, unwind
aa80: 3a 20 4e 6f 6e 65 2c 20 2e 2e 20 7d 0a 20 20 20  : None, .. }.   
aa90: 20 20 20 20 20 20 20 20 20 7c 20 41 73 73 65 72           | Asser
aaa0: 74 20 7b 20 74 61 72 67 65 74 3a 20 72 65 66 20  t { target: ref 
aab0: 6d 75 74 20 74 2c 20 63 6c 65 61 6e 75 70 3a 20  mut t, cleanup: 
aac0: 4e 6f 6e 65 2c 20 2e 2e 20 7d 0a 20 20 20 20 20  None, .. }.     
aad0: 20 20 20 20 20 20 20 7c 20 46 61 6c 73 65 55 6e         | FalseUn
aae0: 77 69 6e 64 20 7b 20 72 65 61 6c 5f 74 61 72 67  wind { real_targ
aaf0: 65 74 3a 20 72 65 66 20 6d 75 74 20 74 2c 20 75  et: ref mut t, u
ab00: 6e 77 69 6e 64 3a 20 4e 6f 6e 65 20 7d 20 3d 3e  nwind: None } =>
ab10: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
ab20: 20 20 20 53 6f 6d 65 28 74 29 2e 69 6e 74 6f 5f     Some(t).into_
ab30: 69 74 65 72 28 29 2e 63 68 61 69 6e 28 26 6d 75  iter().chain(&mu
ab40: 74 20 5b 5d 29 0a 20 20 20 20 20 20 20 20 20 20  t []).          
ab50: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
ab60: 43 61 6c 6c 20 7b 20 64 65 73 74 69 6e 61 74 69  Call { destinati
ab70: 6f 6e 3a 20 53 6f 6d 65 28 28 5f 2c 20 72 65 66  on: Some((_, ref
ab80: 20 6d 75 74 20 74 29 29 2c 20 63 6c 65 61 6e 75   mut t)), cleanu
ab90: 70 3a 20 53 6f 6d 65 28 72 65 66 20 6d 75 74 20  p: Some(ref mut 
aba0: 75 29 2c 20 2e 2e 20 7d 0a 20 20 20 20 20 20 20  u), .. }.       
abb0: 20 20 20 20 20 7c 20 59 69 65 6c 64 20 7b 20 72       | Yield { r
abc0: 65 73 75 6d 65 3a 20 72 65 66 20 6d 75 74 20 74  esume: ref mut t
abd0: 2c 20 64 72 6f 70 3a 20 53 6f 6d 65 28 72 65 66  , drop: Some(ref
abe0: 20 6d 75 74 20 75 29 2c 20 2e 2e 20 7d 0a 20 20   mut u), .. }.  
abf0: 20 20 20 20 20 20 20 20 20 20 7c 20 44 72 6f 70            | Drop
ac00: 41 6e 64 52 65 70 6c 61 63 65 20 7b 20 74 61 72  AndReplace { tar
ac10: 67 65 74 3a 20 72 65 66 20 6d 75 74 20 74 2c 20  get: ref mut t, 
ac20: 75 6e 77 69 6e 64 3a 20 53 6f 6d 65 28 72 65 66  unwind: Some(ref
ac30: 20 6d 75 74 20 75 29 2c 20 2e 2e 20 7d 0a 20 20   mut u), .. }.  
ac40: 20 20 20 20 20 20 20 20 20 20 7c 20 44 72 6f 70            | Drop
ac50: 20 7b 20 74 61 72 67 65 74 3a 20 72 65 66 20 6d   { target: ref m
ac60: 75 74 20 74 2c 20 75 6e 77 69 6e 64 3a 20 53 6f  ut t, unwind: So
ac70: 6d 65 28 72 65 66 20 6d 75 74 20 75 29 2c 20 2e  me(ref mut u), .
ac80: 2e 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20  . }.            
ac90: 7c 20 41 73 73 65 72 74 20 7b 20 74 61 72 67 65  | Assert { targe
aca0: 74 3a 20 72 65 66 20 6d 75 74 20 74 2c 20 63 6c  t: ref mut t, cl
acb0: 65 61 6e 75 70 3a 20 53 6f 6d 65 28 72 65 66 20  eanup: Some(ref 
acc0: 6d 75 74 20 75 29 2c 20 2e 2e 20 7d 0a 20 20 20  mut u), .. }.   
acd0: 20 20 20 20 20 20 20 20 20 7c 20 46 61 6c 73 65           | False
ace0: 55 6e 77 69 6e 64 20 7b 20 72 65 61 6c 5f 74 61  Unwind { real_ta
acf0: 72 67 65 74 3a 20 72 65 66 20 6d 75 74 20 74 2c  rget: ref mut t,
ad00: 20 75 6e 77 69 6e 64 3a 20 53 6f 6d 65 28 72 65   unwind: Some(re
ad10: 66 20 6d 75 74 20 75 29 20 7d 20 3d 3e 20 7b 0a  f mut u) } => {.
ad20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad30: 53 6f 6d 65 28 74 29 2e 69 6e 74 6f 5f 69 74 65  Some(t).into_ite
ad40: 72 28 29 2e 63 68 61 69 6e 28 73 6c 69 63 65 3a  r().chain(slice:
ad50: 3a 66 72 6f 6d 5f 6d 75 74 28 75 29 29 0a 20 20  :from_mut(u)).  
ad60: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ad70: 20 20 20 20 20 20 20 20 53 77 69 74 63 68 49 6e          SwitchIn
ad80: 74 20 7b 20 72 65 66 20 6d 75 74 20 74 61 72 67  t { ref mut targ
ad90: 65 74 73 2c 20 2e 2e 20 7d 20 3d 3e 20 4e 6f 6e  ets, .. } => Non
ada0: 65 2e 69 6e 74 6f 5f 69 74 65 72 28 29 2e 63 68  e.into_iter().ch
adb0: 61 69 6e 28 26 6d 75 74 20 74 61 72 67 65 74 73  ain(&mut targets
adc0: 5b 2e 2e 5d 29 2c 0a 20 20 20 20 20 20 20 20 20  [..]),.         
add0: 20 20 20 46 61 6c 73 65 45 64 67 65 73 20 7b 20     FalseEdges { 
ade0: 72 65 66 20 6d 75 74 20 72 65 61 6c 5f 74 61 72  ref mut real_tar
adf0: 67 65 74 2c 20 72 65 66 20 6d 75 74 20 69 6d 61  get, ref mut ima
ae00: 67 69 6e 61 72 79 5f 74 61 72 67 65 74 20 7d 20  ginary_target } 
ae10: 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  => {.           
ae20: 20 20 20 20 20 53 6f 6d 65 28 72 65 61 6c 5f 74       Some(real_t
ae30: 61 72 67 65 74 29 2e 69 6e 74 6f 5f 69 74 65 72  arget).into_iter
ae40: 28 29 2e 63 68 61 69 6e 28 73 6c 69 63 65 3a 3a  ().chain(slice::
ae50: 66 72 6f 6d 5f 6d 75 74 28 69 6d 61 67 69 6e 61  from_mut(imagina
ae60: 72 79 5f 74 61 72 67 65 74 29 29 0a 20 20 20 20  ry_target)).    
ae70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ae80: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
ae90: 75 62 20 66 6e 20 75 6e 77 69 6e 64 28 26 73 65  ub fn unwind(&se
aea0: 6c 66 29 20 2d 3e 20 4f 70 74 69 6f 6e 3c 26 4f  lf) -> Option<&O
aeb0: 70 74 69 6f 6e 3c 42 61 73 69 63 42 6c 6f 63 6b  ption<BasicBlock
aec0: 3e 3e 20 7b 0a 20 20 20 20 20 20 20 20 6d 61 74  >> {.        mat
aed0: 63 68 20 2a 73 65 6c 66 20 7b 0a 20 20 20 20 20  ch *self {.     
aee0: 20 20 20 20 20 20 20 54 65 72 6d 69 6e 61 74 6f         Terminato
aef0: 72 4b 69 6e 64 3a 3a 47 6f 74 6f 20 7b 20 2e 2e  rKind::Goto { ..
af00: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c   }.            |
af10: 20 54 65 72 6d 69 6e 61 74 6f 72 4b 69 6e 64 3a   TerminatorKind:
af20: 3a 52 65 73 75 6d 65 0a 20 20 20 20 20 20 20 20  :Resume.        
af30: 20 20 20 20 7c 20 54 65 72 6d 69 6e 61 74 6f 72      | Terminator
af40: 4b 69 6e 64 3a 3a 41 62 6f 72 74 0a 20 20 20 20  Kind::Abort.    
af50: 20 20 20 20 20 20 20 20 7c 20 54 65 72 6d 69 6e          | Termin
af60: 61 74 6f 72 4b 69 6e 64 3a 3a 52 65 74 75 72 6e  atorKind::Return
af70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 54  .            | T
af80: 65 72 6d 69 6e 61 74 6f 72 4b 69 6e 64 3a 3a 55  erminatorKind::U
af90: 6e 72 65 61 63 68 61 62 6c 65 0a 20 20 20 20 20  nreachable.     
afa0: 20 20 20 20 20 20 20 7c 20 54 65 72 6d 69 6e 61         | Termina
afb0: 74 6f 72 4b 69 6e 64 3a 3a 47 65 6e 65 72 61 74  torKind::Generat
afc0: 6f 72 44 72 6f 70 0a 20 20 20 20 20 20 20 20 20  orDrop.         
afd0: 20 20 20 7c 20 54 65 72 6d 69 6e 61 74 6f 72 4b     | TerminatorK
afe0: 69 6e 64 3a 3a 59 69 65 6c 64 20 7b 20 2e 2e 20  ind::Yield { .. 
aff0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 20  }.            | 
b000: 54 65 72 6d 69 6e 61 74 6f 72 4b 69 6e 64 3a 3a  TerminatorKind::
b010: 53 77 69 74 63 68 49 6e 74 20 7b 20 2e 2e 20 7d  SwitchInt { .. }
b020: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 54  .            | T
b030: 65 72 6d 69 6e 61 74 6f 72 4b 69 6e 64 3a 3a 46  erminatorKind::F
b040: 61 6c 73 65 45 64 67 65 73 20 7b 20 2e 2e 20 7d  alseEdges { .. }
b050: 20 3d 3e 20 4e 6f 6e 65 2c 0a 20 20 20 20 20 20   => None,.      
b060: 20 20 20 20 20 20 54 65 72 6d 69 6e 61 74 6f 72        Terminator
b070: 4b 69 6e 64 3a 3a 43 61 6c 6c 20 7b 20 63 6c 65  Kind::Call { cle
b080: 61 6e 75 70 3a 20 72 65 66 20 75 6e 77 69 6e 64  anup: ref unwind
b090: 2c 20 2e 2e 20 7d 0a 20 20 20 20 20 20 20 20 20  , .. }.         
b0a0: 20 20 20 7c 20 54 65 72 6d 69 6e 61 74 6f 72 4b     | TerminatorK
b0b0: 69 6e 64 3a 3a 41 73 73 65 72 74 20 7b 20 63 6c  ind::Assert { cl
b0c0: 65 61 6e 75 70 3a 20 72 65 66 20 75 6e 77 69 6e  eanup: ref unwin
b0d0: 64 2c 20 2e 2e 20 7d 0a 20 20 20 20 20 20 20 20  d, .. }.        
b0e0: 20 20 20 20 7c 20 54 65 72 6d 69 6e 61 74 6f 72      | Terminator
b0f0: 4b 69 6e 64 3a 3a 44 72 6f 70 41 6e 64 52 65 70  Kind::DropAndRep
b100: 6c 61 63 65 20 7b 20 72 65 66 20 75 6e 77 69 6e  lace { ref unwin
b110: 64 2c 20 2e 2e 20 7d 0a 20 20 20 20 20 20 20 20  d, .. }.        
b120: 20 20 20 20 7c 20 54 65 72 6d 69 6e 61 74 6f 72      | Terminator
b130: 4b 69 6e 64 3a 3a 44 72 6f 70 20 7b 20 72 65 66  Kind::Drop { ref
b140: 20 75 6e 77 69 6e 64 2c 20 2e 2e 20 7d 0a 20 20   unwind, .. }.  
b150: 20 20 20 20 20 20 20 20 20 20 7c 20 54 65 72 6d            | Term
b160: 69 6e 61 74 6f 72 4b 69 6e 64 3a 3a 46 61 6c 73  inatorKind::Fals
b170: 65 55 6e 77 69 6e 64 20 7b 20 72 65 66 20 75 6e  eUnwind { ref un
b180: 77 69 6e 64 2c 20 2e 2e 20 7d 20 3d 3e 20 53 6f  wind, .. } => So
b190: 6d 65 28 75 6e 77 69 6e 64 29 2c 0a 20 20 20 20  me(unwind),.    
b1a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
b1b0: 20 70 75 62 20 66 6e 20 75 6e 77 69 6e 64 5f 6d   pub fn unwind_m
b1c0: 75 74 28 26 6d 75 74 20 73 65 6c 66 29 20 2d 3e  ut(&mut self) ->
b1d0: 20 4f 70 74 69 6f 6e 3c 26 6d 75 74 20 4f 70 74   Option<&mut Opt
b1e0: 69 6f 6e 3c 42 61 73 69 63 42 6c 6f 63 6b 3e 3e  ion<BasicBlock>>
b1f0: 20 7b 0a 20 20 20 20 20 20 20 20 6d 61 74 63 68   {.        match
b200: 20 2a 73 65 6c 66 20 7b 0a 20 20 20 20 20 20 20   *self {.       
b210: 20 20 20 20 20 54 65 72 6d 69 6e 61 74 6f 72 4b       TerminatorK
b220: 69 6e 64 3a 3a 47 6f 74 6f 20 7b 20 2e 2e 20 7d  ind::Goto { .. }
b230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 54  .            | T
b240: 65 72 6d 69 6e 61 74 6f 72 4b 69 6e 64 3a 3a 52  erminatorKind::R
b250: 65 73 75 6d 65 0a 20 20 20 20 20 20 20 20 20 20  esume.          
b260: 20 20 7c 20 54 65 72 6d 69 6e 61 74 6f 72 4b 69    | TerminatorKi
b270: 6e 64 3a 3a 41 62 6f 72 74 0a 20 20 20 20 20 20  nd::Abort.      
b280: 20 20 20 20 20 20 7c 20 54 65 72 6d 69 6e 61 74        | Terminat
b290: 6f 72 4b 69 6e 64 3a 3a 52 65 74 75 72 6e 0a 20  orKind::Return. 
b2a0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 54 65 72             | Ter
b2b0: 6d 69 6e 61 74 6f 72 4b 69 6e 64 3a 3a 55 6e 72  minatorKind::Unr
b2c0: 65 61 63 68 61 62 6c 65 0a 20 20 20 20 20 20 20  eachable.       
b2d0: 20 20 20 20 20 7c 20 54 65 72 6d 69 6e 61 74 6f       | Terminato
b2e0: 72 4b 69 6e 64 3a 3a 47 65 6e 65 72 61 74 6f 72  rKind::Generator
b2f0: 44 72 6f 70 0a 20 20 20 20 20 20 20 20 20 20 20  Drop.           
b300: 20 7c 20 54 65 72 6d 69 6e 61 74 6f 72 4b 69 6e   | TerminatorKin
b310: 64 3a 3a 59 69 65 6c 64 20 7b 20 2e 2e 20 7d 0a  d::Yield { .. }.
b320: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 54 65              | Te
b330: 72 6d 69 6e 61 74 6f 72 4b 69 6e 64 3a 3a 53 77  rminatorKind::Sw
b340: 69 74 63 68 49 6e 74 20 7b 20 2e 2e 20 7d 0a 20  itchInt { .. }. 
b350: 20 20 20 20 20 20 20 20 20 20 20 7c 20 54 65 72             | Ter
b360: 6d 69 6e 61 74 6f 72 4b 69 6e 64 3a 3a 46 61 6c  minatorKind::Fal
b370: 73 65 45 64 67 65 73 20 7b 20 2e 2e 20 7d 20 3d  seEdges { .. } =
b380: 3e 20 4e 6f 6e 65 2c 0a 20 20 20 20 20 20 20 20  > None,.        
b390: 20 20 20 20 54 65 72 6d 69 6e 61 74 6f 72 4b 69      TerminatorKi
b3a0: 6e 64 3a 3a 43 61 6c 6c 20 7b 20 63 6c 65 61 6e  nd::Call { clean
b3b0: 75 70 3a 20 72 65 66 20 6d 75 74 20 75 6e 77 69  up: ref mut unwi
b3c0: 6e 64 2c 20 2e 2e 20 7d 0a 20 20 20 20 20 20 20  nd, .. }.       
b3d0: 20 20 20 20 20 7c 20 54 65 72 6d 69 6e 61 74 6f       | Terminato
b3e0: 72 4b 69 6e 64 3a 3a 41 73 73 65 72 74 20 7b 20  rKind::Assert { 
b3f0: 63 6c 65 61 6e 75 70 3a 20 72 65 66 20 6d 75 74  cleanup: ref mut
b400: 20 75 6e 77 69 6e 64 2c 20 2e 2e 20 7d 0a 20 20   unwind, .. }.  
b410: 20 20 20 20 20 20 20 20 20 20 7c 20 54 65 72 6d            | Term
b420: 69 6e 61 74 6f 72 4b 69 6e 64 3a 3a 44 72 6f 70  inatorKind::Drop
b430: 41 6e 64 52 65 70 6c 61 63 65 20 7b 20 72 65 66  AndReplace { ref
b440: 20 6d 75 74 20 75 6e 77 69 6e 64 2c 20 2e 2e 20   mut unwind, .. 
b450: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 20  }.            | 
b460: 54 65 72 6d 69 6e 61 74 6f 72 4b 69 6e 64 3a 3a  TerminatorKind::
b470: 44 72 6f 70 20 7b 20 72 65 66 20 6d 75 74 20 75  Drop { ref mut u
b480: 6e 77 69 6e 64 2c 20 2e 2e 20 7d 0a 20 20 20 20  nwind, .. }.    
b490: 20 20 20 20 20 20 20 20 7c 20 54 65 72 6d 69 6e          | Termin
b4a0: 61 74 6f 72 4b 69 6e 64 3a 3a 46 61 6c 73 65 55  atorKind::FalseU
b4b0: 6e 77 69 6e 64 20 7b 20 72 65 66 20 6d 75 74 20  nwind { ref mut 
b4c0: 75 6e 77 69 6e 64 2c 20 2e 2e 20 7d 20 3d 3e 20  unwind, .. } => 
b4d0: 53 6f 6d 65 28 75 6e 77 69 6e 64 29 2c 0a 20 20  Some(unwind),.  
b4e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 7d 0a        }.    }.}.
b4f0: 0a 69 6d 70 6c 3c 27 74 63 78 3e 20 42 61 73 69  .impl<'tcx> Basi
b500: 63 42 6c 6f 63 6b 44 61 74 61 3c 27 74 63 78 3e  cBlockData<'tcx>
b510: 20 7b 0a 20 20 20 20 70 75 62 20 66 6e 20 6e 65   {.    pub fn ne
b520: 77 28 74 65 72 6d 69 6e 61 74 6f 72 3a 20 4f 70  w(terminator: Op
b530: 74 69 6f 6e 3c 54 65 72 6d 69 6e 61 74 6f 72 3c  tion<Terminator<
b540: 27 74 63 78 3e 3e 29 20 2d 3e 20 42 61 73 69 63  'tcx>>) -> Basic
b550: 42 6c 6f 63 6b 44 61 74 61 3c 27 74 63 78 3e 20  BlockData<'tcx> 
b560: 7b 0a 20 20 20 20 20 20 20 20 42 61 73 69 63 42  {.        BasicB
b570: 6c 6f 63 6b 44 61 74 61 20 7b 20 73 74 61 74 65  lockData { state
b580: 6d 65 6e 74 73 3a 20 76 65 63 21 5b 5d 2c 20 74  ments: vec![], t
b590: 65 72 6d 69 6e 61 74 6f 72 2c 20 69 73 5f 63 6c  erminator, is_cl
b5a0: 65 61 6e 75 70 3a 20 66 61 6c 73 65 20 7d 0a 20  eanup: false }. 
b5b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 41 63     }..    /// Ac
b5c0: 63 65 73 73 6f 72 20 66 6f 72 20 74 65 72 6d 69  cessor for termi
b5d0: 6e 61 74 6f 72 2e 0a 20 20 20 20 2f 2f 2f 0a 20  nator..    ///. 
b5e0: 20 20 20 2f 2f 2f 20 54 65 72 6d 69 6e 61 74 6f     /// Terminato
b5f0: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 4e 6f 6e  r may not be Non
b600: 65 20 61 66 74 65 72 20 63 6f 6e 73 74 72 75 63  e after construc
b610: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 61 73 69  tion of the basi
b620: 63 20 62 6c 6f 63 6b 20 69 73 20 63 6f 6d 70 6c  c block is compl
b630: 65 74 65 2e 20 54 68 69 73 20 61 63 63 65 73 73  ete. This access
b640: 6f 72 0a 20 20 20 20 2f 2f 2f 20 70 72 6f 76 69  or.    /// provi
b650: 64 65 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63  des a convenienc
b660: 65 20 77 61 79 20 74 6f 20 72 65 61 63 68 20 74  e way to reach t
b670: 68 65 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 20  he terminator.. 
b680: 20 20 20 70 75 62 20 66 6e 20 74 65 72 6d 69 6e     pub fn termin
b690: 61 74 6f 72 28 26 73 65 6c 66 29 20 2d 3e 20 26  ator(&self) -> &
b6a0: 54 65 72 6d 69 6e 61 74 6f 72 3c 27 74 63 78 3e  Terminator<'tcx>
b6b0: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e   {.        self.
b6c0: 74 65 72 6d 69 6e 61 74 6f 72 2e 61 73 5f 72 65  terminator.as_re
b6d0: 66 28 29 2e 65 78 70 65 63 74 28 22 69 6e 76 61  f().expect("inva
b6e0: 6c 69 64 20 74 65 72 6d 69 6e 61 74 6f 72 20 73  lid terminator s
b6f0: 74 61 74 65 22 29 0a 20 20 20 20 7d 0a 0a 20 20  tate").    }..  
b700: 20 20 70 75 62 20 66 6e 20 74 65 72 6d 69 6e 61    pub fn termina
b710: 74 6f 72 5f 6d 75 74 28 26 6d 75 74 20 73 65 6c  tor_mut(&mut sel
b720: 66 29 20 2d 3e 20 26 6d 75 74 20 54 65 72 6d 69  f) -> &mut Termi
b730: 6e 61 74 6f 72 3c 27 74 63 78 3e 20 7b 0a 20 20  nator<'tcx> {.  
b740: 20 20 20 20 20 20 73 65 6c 66 2e 74 65 72 6d 69        self.termi
b750: 6e 61 74 6f 72 2e 61 73 5f 6d 75 74 28 29 2e 65  nator.as_mut().e
b760: 78 70 65 63 74 28 22 69 6e 76 61 6c 69 64 20 74  xpect("invalid t
b770: 65 72 6d 69 6e 61 74 6f 72 20 73 74 61 74 65 22  erminator state"
b780: 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 75 62  ).    }..    pub
b790: 20 66 6e 20 72 65 74 61 69 6e 5f 73 74 61 74 65   fn retain_state
b7a0: 6d 65 6e 74 73 3c 46 3e 28 26 6d 75 74 20 73 65  ments<F>(&mut se
b7b0: 6c 66 2c 20 6d 75 74 20 66 3a 20 46 29 0a 20 20  lf, mut f: F).  
b7c0: 20 20 77 68 65 72 65 0a 20 20 20 20 20 20 20 20    where.        
b7d0: 46 3a 20 46 6e 4d 75 74 28 26 6d 75 74 20 53 74  F: FnMut(&mut St
b7e0: 61 74 65 6d 65 6e 74 3c 27 5f 3e 29 20 2d 3e 20  atement<'_>) -> 
b7f0: 62 6f 6f 6c 2c 0a 20 20 20 20 7b 0a 20 20 20 20  bool,.    {.    
b800: 20 20 20 20 66 6f 72 20 73 20 69 6e 20 26 6d 75      for s in &mu
b810: 74 20 73 65 6c 66 2e 73 74 61 74 65 6d 65 6e 74  t self.statement
b820: 73 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  s {.            
b830: 69 66 20 21 66 28 73 29 20 7b 0a 20 20 20 20 20  if !f(s) {.     
b840: 20 20 20 20 20 20 20 20 20 20 20 73 2e 6d 61 6b             s.mak
b850: 65 5f 6e 6f 70 28 29 3b 0a 20 20 20 20 20 20 20  e_nop();.       
b860: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
b870: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 75 62 20  .    }..    pub 
b880: 66 6e 20 65 78 70 61 6e 64 5f 73 74 61 74 65 6d  fn expand_statem
b890: 65 6e 74 73 3c 46 2c 20 49 3e 28 26 6d 75 74 20  ents<F, I>(&mut 
b8a0: 73 65 6c 66 2c 20 6d 75 74 20 66 3a 20 46 29 0a  self, mut f: F).
b8b0: 20 20 20 20 77 68 65 72 65 0a 20 20 20 20 20 20      where.      
b8c0: 20 20 46 3a 20 46 6e 4d 75 74 28 26 6d 75 74 20    F: FnMut(&mut 
b8d0: 53 74 61 74 65 6d 65 6e 74 3c 27 74 63 78 3e 29  Statement<'tcx>)
b8e0: 20 2d 3e 20 4f 70 74 69 6f 6e 3c 49 3e 2c 0a 20   -> Option<I>,. 
b8f0: 20 20 20 20 20 20 20 49 3a 20 69 74 65 72 3a 3a         I: iter::
b900: 54 72 75 73 74 65 64 4c 65 6e 3c 49 74 65 6d 20  TrustedLen<Item 
b910: 3d 20 53 74 61 74 65 6d 65 6e 74 3c 27 74 63 78  = Statement<'tcx
b920: 3e 3e 2c 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  >>,.    {.      
b930: 20 20 2f 2f 20 47 61 74 68 65 72 20 61 6c 6c 20    // Gather all 
b940: 74 68 65 20 69 74 65 72 61 74 6f 72 73 20 77 65  the iterators we
b950: 27 6c 6c 20 6e 65 65 64 20 74 6f 20 73 70 6c 69  'll need to spli
b960: 63 65 20 69 6e 2c 20 61 6e 64 20 74 68 65 69 72  ce in, and their
b970: 20 70 6f 73 69 74 69 6f 6e 73 2e 0a 20 20 20 20   positions..    
b980: 20 20 20 20 6c 65 74 20 6d 75 74 20 73 70 6c 69      let mut spli
b990: 63 65 73 3a 20 56 65 63 3c 28 75 73 69 7a 65 2c  ces: Vec<(usize,
b9a0: 20 49 29 3e 20 3d 20 76 65 63 21 5b 5d 3b 0a 20   I)> = vec![];. 
b9b0: 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74 20 65         let mut e
b9c0: 78 74 72 61 5f 73 74 6d 74 73 20 3d 20 30 3b 0a  xtra_stmts = 0;.
b9d0: 20 20 20 20 20 20 20 20 66 6f 72 20 28 69 2c 20          for (i, 
b9e0: 73 29 20 69 6e 20 73 65 6c 66 2e 73 74 61 74 65  s) in self.state
b9f0: 6d 65 6e 74 73 2e 69 74 65 72 5f 6d 75 74 28 29  ments.iter_mut()
ba00: 2e 65 6e 75 6d 65 72 61 74 65 28 29 20 7b 0a 20  .enumerate() {. 
ba10: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 6c 65             if le
ba20: 74 20 53 6f 6d 65 28 6d 75 74 20 6e 65 77 5f 73  t Some(mut new_s
ba30: 74 6d 74 73 29 20 3d 20 66 28 73 29 20 7b 0a 20  tmts) = f(s) {. 
ba40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
ba50: 66 20 6c 65 74 20 53 6f 6d 65 28 66 69 72 73 74  f let Some(first
ba60: 29 20 3d 20 6e 65 77 5f 73 74 6d 74 73 2e 6e 65  ) = new_stmts.ne
ba70: 78 74 28 29 20 7b 0a 20 20 20 20 20 20 20 20 20  xt() {.         
ba80: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 57 65             // We
ba90: 20 63 61 6e 20 61 6c 72 65 61 64 79 20 73 74 6f   can already sto
baa0: 72 65 20 74 68 65 20 66 69 72 73 74 20 6e 65 77  re the first new
bab0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
bac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bad0: 2a 73 20 3d 20 66 69 72 73 74 3b 0a 0a 20 20 20  *s = first;..   
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baf0: 20 2f 2f 20 53 61 76 65 20 74 68 65 20 6f 74 68   // Save the oth
bb00: 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20 66 6f  er statements fo
bb10: 72 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 6c 69  r optimized spli
bb20: 63 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 20 20  cing..          
bb30: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 72 65            let re
bb40: 6d 61 69 6e 69 6e 67 20 3d 20 6e 65 77 5f 73 74  maining = new_st
bb50: 6d 74 73 2e 73 69 7a 65 5f 68 69 6e 74 28 29 2e  mts.size_hint().
bb60: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
bb70: 20 20 20 20 20 20 20 69 66 20 72 65 6d 61 69 6e         if remain
bb80: 69 6e 67 20 3e 20 30 20 7b 0a 20 20 20 20 20 20  ing > 0 {.      
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bba0: 20 20 73 70 6c 69 63 65 73 2e 70 75 73 68 28 28    splices.push((
bbb0: 69 20 2b 20 31 20 2b 20 65 78 74 72 61 5f 73 74  i + 1 + extra_st
bbc0: 6d 74 73 2c 20 6e 65 77 5f 73 74 6d 74 73 29 29  mts, new_stmts))
bbd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
bbe0: 20 20 20 20 20 20 20 20 20 20 65 78 74 72 61 5f            extra_
bbf0: 73 74 6d 74 73 20 2b 3d 20 72 65 6d 61 69 6e 69  stmts += remaini
bc00: 6e 67 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ng;.            
bc10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
bc20: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
bc30: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
bc40: 20 20 20 20 20 20 20 73 2e 6d 61 6b 65 5f 6e 6f         s.make_no
bc50: 70 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  p();.           
bc60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
bc70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a     }.        }..
bc80: 20 20 20 20 20 20 20 20 2f 2f 20 53 70 6c 69 63          // Splic
bc90: 65 20 69 6e 20 74 68 65 20 6e 65 77 20 73 74 61  e in the new sta
bca0: 74 65 6d 65 6e 74 73 2c 20 66 72 6f 6d 20 74 68  tements, from th
bcb0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 6c 6f  e end of the blo
bcc0: 63 6b 2e 0a 20 20 20 20 20 20 20 20 2f 2f 20 46  ck..        // F
bcd0: 49 58 4d 45 28 65 64 64 79 62 29 20 54 68 69 73  IXME(eddyb) This
bce0: 20 63 6f 75 6c 64 20 62 65 20 6d 6f 72 65 20 65   could be more e
bcf0: 66 66 69 63 69 65 6e 74 20 77 69 74 68 20 61 20  fficient with a 
bd00: 22 67 61 70 20 62 75 66 66 65 72 22 0a 20 20 20  "gap buffer".   
bd10: 20 20 20 20 20 2f 2f 20 77 68 65 72 65 20 61 20       // where a 
bd20: 72 61 6e 67 65 20 6f 66 20 65 6c 65 6d 65 6e 74  range of element
bd30: 73 20 28 22 67 61 70 22 29 20 69 73 20 6c 65 66  s ("gap") is lef
bd40: 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c  t uninitialized,
bd50: 20 77 69 74 68 0a 20 20 20 20 20 20 20 20 2f 2f   with.        //
bd60: 20 73 70 6c 69 63 69 6e 67 20 61 64 64 69 6e 67   splicing adding
bd70: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 73 20 74 6f   new elements to
bd80: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74   the end of that
bd90: 20 67 61 70 20 61 6e 64 20 6d 6f 76 69 6e 67 0a   gap and moving.
bda0: 20 20 20 20 20 20 20 20 2f 2f 20 65 78 69 73 74          // exist
bdb0: 69 6e 67 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f  ing elements fro
bdc0: 6d 20 62 65 66 6f 72 65 20 74 68 65 20 67 61 70  m before the gap
bdd0: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
bde0: 68 65 20 67 61 70 2e 0a 20 20 20 20 20 20 20 20  he gap..        
bdf0: 2f 2f 20 46 6f 72 20 6e 6f 77 2c 20 74 68 69 73  // For now, this
be00: 20 69 73 20 73 61 66 65 20 63 6f 64 65 2c 20 65   is safe code, e
be10: 6d 75 6c 61 74 69 6e 67 20 61 20 67 61 70 20 62  mulating a gap b
be20: 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  ut initializing 
be30: 69 74 2e 0a 20 20 20 20 20 20 20 20 6c 65 74 20  it..        let 
be40: 6d 75 74 20 67 61 70 20 3d 20 73 65 6c 66 2e 73  mut gap = self.s
be50: 74 61 74 65 6d 65 6e 74 73 2e 6c 65 6e 28 29 2e  tatements.len().
be60: 2e 73 65 6c 66 2e 73 74 61 74 65 6d 65 6e 74 73  .self.statements
be70: 2e 6c 65 6e 28 29 20 2b 20 65 78 74 72 61 5f 73  .len() + extra_s
be80: 74 6d 74 73 3b 0a 20 20 20 20 20 20 20 20 73 65  tmts;.        se
be90: 6c 66 2e 73 74 61 74 65 6d 65 6e 74 73 2e 72 65  lf.statements.re
bea0: 73 69 7a 65 28 0a 20 20 20 20 20 20 20 20 20 20  size(.          
beb0: 20 20 67 61 70 2e 65 6e 64 2c 0a 20 20 20 20 20    gap.end,.     
bec0: 20 20 20 20 20 20 20 53 74 61 74 65 6d 65 6e 74         Statement
bed0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
bee0: 20 20 20 73 6f 75 72 63 65 5f 69 6e 66 6f 3a 20     source_info: 
bef0: 53 6f 75 72 63 65 49 6e 66 6f 20 7b 20 73 70 61  SourceInfo { spa
bf00: 6e 3a 20 44 55 4d 4d 59 5f 53 50 2c 20 73 63 6f  n: DUMMY_SP, sco
bf10: 70 65 3a 20 4f 55 54 45 52 4d 4f 53 54 5f 53 4f  pe: OUTERMOST_SO
bf20: 55 52 43 45 5f 53 43 4f 50 45 20 7d 2c 0a 20 20  URCE_SCOPE },.  
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 69                ki
bf40: 6e 64 3a 20 53 74 61 74 65 6d 65 6e 74 4b 69 6e  nd: StatementKin
bf50: 64 3a 3a 4e 6f 70 2c 0a 20 20 20 20 20 20 20 20  d::Nop,.        
bf60: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 29      },.        )
bf70: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28 73  ;.        for (s
bf80: 70 6c 69 63 65 5f 73 74 61 72 74 2c 20 6e 65 77  plice_start, new
bf90: 5f 73 74 6d 74 73 29 20 69 6e 20 73 70 6c 69 63  _stmts) in splic
bfa0: 65 73 2e 69 6e 74 6f 5f 69 74 65 72 28 29 2e 72  es.into_iter().r
bfb0: 65 76 28 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ev() {.         
bfc0: 20 20 20 6c 65 74 20 73 70 6c 69 63 65 5f 65 6e     let splice_en
bfd0: 64 20 3d 20 73 70 6c 69 63 65 5f 73 74 61 72 74  d = splice_start
bfe0: 20 2b 20 6e 65 77 5f 73 74 6d 74 73 2e 73 69 7a   + new_stmts.siz
bff0: 65 5f 68 69 6e 74 28 29 2e 30 3b 0a 20 20 20 20  e_hint().0;.    
c000: 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 67 61          while ga
c010: 70 2e 65 6e 64 20 3e 20 73 70 6c 69 63 65 5f 65  p.end > splice_e
c020: 6e 64 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  nd {.           
c030: 20 20 20 20 20 67 61 70 2e 73 74 61 72 74 20 2d       gap.start -
c040: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
c050: 20 20 20 20 20 67 61 70 2e 65 6e 64 20 2d 3d 20       gap.end -= 
c060: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
c070: 20 20 20 73 65 6c 66 2e 73 74 61 74 65 6d 65 6e     self.statemen
c080: 74 73 2e 73 77 61 70 28 67 61 70 2e 73 74 61 72  ts.swap(gap.star
c090: 74 2c 20 67 61 70 2e 65 6e 64 29 3b 0a 20 20 20  t, gap.end);.   
c0a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
c0b0: 20 20 20 20 20 20 20 73 65 6c 66 2e 73 74 61 74         self.stat
c0c0: 65 6d 65 6e 74 73 2e 73 70 6c 69 63 65 28 73 70  ements.splice(sp
c0d0: 6c 69 63 65 5f 73 74 61 72 74 2e 2e 73 70 6c 69  lice_start..spli
c0e0: 63 65 5f 65 6e 64 2c 20 6e 65 77 5f 73 74 6d 74  ce_end, new_stmt
c0f0: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  s);.            
c100: 67 61 70 2e 65 6e 64 20 3d 20 73 70 6c 69 63 65  gap.end = splice
c110: 5f 73 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20  _start;.        
c120: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 75 62  }.    }..    pub
c130: 20 66 6e 20 76 69 73 69 74 61 62 6c 65 28 26 73   fn visitable(&s
c140: 65 6c 66 2c 20 69 6e 64 65 78 3a 20 75 73 69 7a  elf, index: usiz
c150: 65 29 20 2d 3e 20 26 64 79 6e 20 4d 69 72 56 69  e) -> &dyn MirVi
c160: 73 69 74 61 62 6c 65 3c 27 74 63 78 3e 20 7b 0a  sitable<'tcx> {.
c170: 20 20 20 20 20 20 20 20 69 66 20 69 6e 64 65 78          if index
c180: 20 3c 20 73 65 6c 66 2e 73 74 61 74 65 6d 65 6e   < self.statemen
c190: 74 73 2e 6c 65 6e 28 29 20 7b 0a 20 20 20 20 20  ts.len() {.     
c1a0: 20 20 20 20 20 20 20 26 73 65 6c 66 2e 73 74 61         &self.sta
c1b0: 74 65 6d 65 6e 74 73 5b 69 6e 64 65 78 5d 0a 20  tements[index]. 
c1c0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 26 73 65 6c              &sel
c1e0: 66 2e 74 65 72 6d 69 6e 61 74 6f 72 0a 20 20 20  f.terminator.   
c1f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 7d 0a 0a       }.    }.}..
c200: 69 6d 70 6c 3c 27 74 63 78 3e 20 44 65 62 75 67  impl<'tcx> Debug
c210: 20 66 6f 72 20 54 65 72 6d 69 6e 61 74 6f 72 4b   for TerminatorK
c220: 69 6e 64 3c 27 74 63 78 3e 20 7b 0a 20 20 20 20  ind<'tcx> {.    
c230: 66 6e 20 66 6d 74 28 26 73 65 6c 66 2c 20 66 6d  fn fmt(&self, fm
c240: 74 3a 20 26 6d 75 74 20 46 6f 72 6d 61 74 74 65  t: &mut Formatte
c250: 72 3c 27 5f 3e 29 20 2d 3e 20 66 6d 74 3a 3a 52  r<'_>) -> fmt::R
c260: 65 73 75 6c 74 20 7b 0a 20 20 20 20 20 20 20 20  esult {.        
c270: 73 65 6c 66 2e 66 6d 74 5f 68 65 61 64 28 66 6d  self.fmt_head(fm
c280: 74 29 3f 3b 0a 20 20 20 20 20 20 20 20 6c 65 74  t)?;.        let
c290: 20 73 75 63 63 65 73 73 6f 72 5f 63 6f 75 6e 74   successor_count
c2a0: 20 3d 20 73 65 6c 66 2e 73 75 63 63 65 73 73 6f   = self.successo
c2b0: 72 73 28 29 2e 63 6f 75 6e 74 28 29 3b 0a 20 20  rs().count();.  
c2c0: 20 20 20 20 20 20 6c 65 74 20 6c 61 62 65 6c 73        let labels
c2d0: 20 3d 20 73 65 6c 66 2e 66 6d 74 5f 73 75 63 63   = self.fmt_succ
c2e0: 65 73 73 6f 72 5f 6c 61 62 65 6c 73 28 29 3b 0a  essor_labels();.
c2f0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 65          assert_e
c300: 71 21 28 73 75 63 63 65 73 73 6f 72 5f 63 6f 75  q!(successor_cou
c310: 6e 74 2c 20 6c 61 62 65 6c 73 2e 6c 65 6e 28 29  nt, labels.len()
c320: 29 3b 0a 0a 20 20 20 20 20 20 20 20 6d 61 74 63  );..        matc
c330: 68 20 73 75 63 63 65 73 73 6f 72 5f 63 6f 75 6e  h successor_coun
c340: 74 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t {.            
c350: 30 20 3d 3e 20 4f 6b 28 28 29 29 2c 0a 0a 20 20  0 => Ok(()),..  
c360: 20 20 20 20 20 20 20 20 20 20 31 20 3d 3e 20 77            1 => w
c370: 72 69 74 65 21 28 66 6d 74 2c 20 22 20 2d 3e 20  rite!(fmt, " -> 
c380: 7b 3a 3f 7d 22 2c 20 73 65 6c 66 2e 73 75 63 63  {:?}", self.succ
c390: 65 73 73 6f 72 73 28 29 2e 6e 74 68 28 30 29 2e  essors().nth(0).
c3a0: 75 6e 77 72 61 70 28 29 29 2c 0a 0a 20 20 20 20  unwrap()),..    
c3b0: 20 20 20 20 20 20 20 20 5f 20 3d 3e 20 7b 0a 20          _ => {. 
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
c3d0: 72 69 74 65 21 28 66 6d 74 2c 20 22 20 2d 3e 20  rite!(fmt, " -> 
c3e0: 5b 22 29 3f 3b 0a 20 20 20 20 20 20 20 20 20 20  [")?;.          
c3f0: 20 20 20 20 20 20 66 6f 72 20 28 69 2c 20 74 61        for (i, ta
c400: 72 67 65 74 29 20 69 6e 20 73 65 6c 66 2e 73 75  rget) in self.su
c410: 63 63 65 73 73 6f 72 73 28 29 2e 65 6e 75 6d 65  ccessors().enume
c420: 72 61 74 65 28 29 20 7b 0a 20 20 20 20 20 20 20  rate() {.       
c430: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
c440: 69 20 3e 20 30 20 7b 0a 20 20 20 20 20 20 20 20  i > 0 {.        
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c460: 77 72 69 74 65 21 28 66 6d 74 2c 20 22 2c 20 22  write!(fmt, ", "
c470: 29 3f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  )?;.            
c480: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 72                wr
c4a0: 69 74 65 21 28 66 6d 74 2c 20 22 7b 7d 3a 20 7b  ite!(fmt, "{}: {
c4b0: 3a 3f 7d 22 2c 20 6c 61 62 65 6c 73 5b 69 5d 2c  :?}", labels[i],
c4c0: 20 74 61 72 67 65 74 29 3f 3b 0a 20 20 20 20 20   target)?;.     
c4d0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69               wri
c4f0: 74 65 21 28 66 6d 74 2c 20 22 5d 22 29 0a 20 20  te!(fmt, "]").  
c500: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
c510: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 69      }.    }.}..i
c520: 6d 70 6c 3c 27 74 63 78 3e 20 54 65 72 6d 69 6e  mpl<'tcx> Termin
c530: 61 74 6f 72 4b 69 6e 64 3c 27 74 63 78 3e 20 7b  atorKind<'tcx> {
c540: 0a 20 20 20 20 2f 2f 2f 20 57 72 69 74 65 73 20  .    /// Writes 
c550: 74 68 65 20 22 68 65 61 64 22 20 70 61 72 74 20  the "head" part 
c560: 6f 66 20 74 68 65 20 74 65 72 6d 69 6e 61 74 6f  of the terminato
c570: 72 3b 20 74 68 61 74 20 69 73 2c 20 69 74 73 20  r; that is, its 
c580: 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
c590: 61 20 69 74 20 75 73 65 73 20 74 6f 20 70 69 63  a it uses to pic
c5a0: 6b 20 74 68 65 0a 20 20 20 20 2f 2f 2f 20 73 75  k the.    /// su
c5b0: 63 63 65 73 73 6f 72 20 62 61 73 69 63 20 62 6c  ccessor basic bl
c5c0: 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20 54 68 65  ock, if any. The
c5d0: 20 6f 6e 6c 79 20 69 6e 66 6f 72 6d 61 74 69 6f   only informatio
c5e0: 6e 20 6e 6f 74 20 69 6e 63 6c 75 64 65 64 20 69  n not included i
c5f0: 73 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 6f  s the list of po
c600: 73 73 69 62 6c 65 0a 20 20 20 20 2f 2f 2f 20 73  ssible.    /// s
c610: 75 63 63 65 73 73 6f 72 73 2c 20 77 68 69 63 68  uccessors, which
c620: 20 6d 61 79 20 62 65 20 72 65 6e 64 65 72 65 64   may be rendered
c630: 20 64 69 66 66 65 72 65 6e 74 6c 79 20 62 65 74   differently bet
c640: 77 65 65 6e 20 74 68 65 20 74 65 78 74 20 61 6e  ween the text an
c650: 64 20 74 68 65 20 67 72 61 70 68 76 69 7a 20 66  d the graphviz f
c660: 6f 72 6d 61 74 2e 0a 20 20 20 20 70 75 62 20 66  ormat..    pub f
c670: 6e 20 66 6d 74 5f 68 65 61 64 3c 57 3a 20 57 72  n fmt_head<W: Wr
c680: 69 74 65 3e 28 26 73 65 6c 66 2c 20 66 6d 74 3a  ite>(&self, fmt:
c690: 20 26 6d 75 74 20 57 29 20 2d 3e 20 66 6d 74 3a   &mut W) -> fmt:
c6a0: 3a 52 65 73 75 6c 74 20 7b 0a 20 20 20 20 20 20  :Result {.      
c6b0: 20 20 75 73 65 20 73 65 6c 66 3a 3a 54 65 72 6d    use self::Term
c6c0: 69 6e 61 74 6f 72 4b 69 6e 64 3a 3a 2a 3b 0a 20  inatorKind::*;. 
c6d0: 20 20 20 20 20 20 20 6d 61 74 63 68 20 2a 73 65         match *se
c6e0: 6c 66 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lf {.           
c6f0: 20 47 6f 74 6f 20 7b 20 2e 2e 20 7d 20 3d 3e 20   Goto { .. } => 
c700: 77 72 69 74 65 21 28 66 6d 74 2c 20 22 67 6f 74  write!(fmt, "got
c710: 6f 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  o"),.           
c720: 20 53 77 69 74 63 68 49 6e 74 20 7b 20 64 69 73   SwitchInt { dis
c730: 63 72 3a 20 72 65 66 20 70 6c 61 63 65 2c 20 2e  cr: ref place, .
c740: 2e 20 7d 20 3d 3e 20 77 72 69 74 65 21 28 66 6d  . } => write!(fm
c750: 74 2c 20 22 73 77 69 74 63 68 49 6e 74 28 7b 3a  t, "switchInt({:
c760: 3f 7d 29 22 2c 20 70 6c 61 63 65 29 2c 0a 20 20  ?})", place),.  
c770: 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e            Return
c780: 20 3d 3e 20 77 72 69 74 65 21 28 66 6d 74 2c 20   => write!(fmt, 
c790: 22 72 65 74 75 72 6e 22 29 2c 0a 20 20 20 20 20  "return"),.     
c7a0: 20 20 20 20 20 20 20 47 65 6e 65 72 61 74 6f 72         Generator
c7b0: 44 72 6f 70 20 3d 3e 20 77 72 69 74 65 21 28 66  Drop => write!(f
c7c0: 6d 74 2c 20 22 67 65 6e 65 72 61 74 6f 72 5f 64  mt, "generator_d
c7d0: 72 6f 70 22 29 2c 0a 20 20 20 20 20 20 20 20 20  rop"),.         
c7e0: 20 20 20 52 65 73 75 6d 65 20 3d 3e 20 77 72 69     Resume => wri
c7f0: 74 65 21 28 66 6d 74 2c 20 22 72 65 73 75 6d 65  te!(fmt, "resume
c800: 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  "),.            
c810: 41 62 6f 72 74 20 3d 3e 20 77 72 69 74 65 21 28  Abort => write!(
c820: 66 6d 74 2c 20 22 61 62 6f 72 74 22 29 2c 0a 20  fmt, "abort"),. 
c830: 20 20 20 20 20 20 20 20 20 20 20 59 69 65 6c 64             Yield
c840: 20 7b 20 72 65 66 20 76 61 6c 75 65 2c 20 2e 2e   { ref value, ..
c850: 20 7d 20 3d 3e 20 77 72 69 74 65 21 28 66 6d 74   } => write!(fmt
c860: 2c 20 22 5f 31 20 3d 20 73 75 73 70 65 6e 64 28  , "_1 = suspend(
c870: 7b 3a 3f 7d 29 22 2c 20 76 61 6c 75 65 29 2c 0a  {:?})", value),.
c880: 20 20 20 20 20 20 20 20 20 20 20 20 55 6e 72 65              Unre
c890: 61 63 68 61 62 6c 65 20 3d 3e 20 77 72 69 74 65  achable => write
c8a0: 21 28 66 6d 74 2c 20 22 75 6e 72 65 61 63 68 61  !(fmt, "unreacha
c8b0: 62 6c 65 22 29 2c 0a 20 20 20 20 20 20 20 20 20  ble"),.         
c8c0: 20 20 20 44 72 6f 70 20 7b 20 72 65 66 20 6c 6f     Drop { ref lo
c8d0: 63 61 74 69 6f 6e 2c 20 2e 2e 20 7d 20 3d 3e 20  cation, .. } => 
c8e0: 77 72 69 74 65 21 28 66 6d 74 2c 20 22 64 72 6f  write!(fmt, "dro
c8f0: 70 28 7b 3a 3f 7d 29 22 2c 20 6c 6f 63 61 74 69  p({:?})", locati
c900: 6f 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  on),.           
c910: 20 44 72 6f 70 41 6e 64 52 65 70 6c 61 63 65 20   DropAndReplace 
c920: 7b 20 72 65 66 20 6c 6f 63 61 74 69 6f 6e 2c 20  { ref location, 
c930: 72 65 66 20 76 61 6c 75 65 2c 20 2e 2e 20 7d 20  ref value, .. } 
c940: 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  => {.           
c950: 20 20 20 20 20 77 72 69 74 65 21 28 66 6d 74 2c       write!(fmt,
c960: 20 22 72 65 70 6c 61 63 65 28 7b 3a 3f 7d 20 3c   "replace({:?} <
c970: 2d 20 7b 3a 3f 7d 29 22 2c 20 6c 6f 63 61 74 69  - {:?})", locati
c980: 6f 6e 2c 20 76 61 6c 75 65 29 0a 20 20 20 20 20  on, value).     
c990: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c9a0: 20 20 20 20 20 43 61 6c 6c 20 7b 20 72 65 66 20       Call { ref 
c9b0: 66 75 6e 63 2c 20 72 65 66 20 61 72 67 73 2c 20  func, ref args, 
c9c0: 72 65 66 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c  ref destination,
c9d0: 20 2e 2e 20 7d 20 3d 3e 20 7b 0a 20 20 20 20 20   .. } => {.     
c9e0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 6c 65             if le
c9f0: 74 20 53 6f 6d 65 28 28 72 65 66 20 64 65 73 74  t Some((ref dest
ca00: 69 6e 61 74 69 6f 6e 2c 20 5f 29 29 20 3d 20 2a  ination, _)) = *
ca10: 64 65 73 74 69 6e 61 74 69 6f 6e 20 7b 0a 20 20  destination {.  
ca20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca30: 20 20 77 72 69 74 65 21 28 66 6d 74 2c 20 22 7b    write!(fmt, "{
ca40: 3a 3f 7d 20 3d 20 22 2c 20 64 65 73 74 69 6e 61  :?} = ", destina
ca50: 74 69 6f 6e 29 3f 3b 0a 20 20 20 20 20 20 20 20  tion)?;.        
ca60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ca70: 20 20 20 20 20 20 20 20 20 20 77 72 69 74 65 21            write!
ca80: 28 66 6d 74 2c 20 22 7b 3a 3f 7d 28 22 2c 20 66  (fmt, "{:?}(", f
ca90: 75 6e 63 29 3f 3b 0a 20 20 20 20 20 20 20 20 20  unc)?;.         
caa0: 20 20 20 20 20 20 20 66 6f 72 20 28 69 6e 64 65         for (inde
cab0: 78 2c 20 61 72 67 29 20 69 6e 20 61 72 67 73 2e  x, arg) in args.
cac0: 69 74 65 72 28 29 2e 65 6e 75 6d 65 72 61 74 65  iter().enumerate
cad0: 28 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  () {.           
cae0: 20 20 20 20 20 20 20 20 20 69 66 20 69 6e 64 65           if inde
caf0: 78 20 3e 20 30 20 7b 0a 20 20 20 20 20 20 20 20  x > 0 {.        
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb10: 77 72 69 74 65 21 28 66 6d 74 2c 20 22 2c 20 22  write!(fmt, ", "
cb20: 29 3f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  )?;.            
cb30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 72                wr
cb50: 69 74 65 21 28 66 6d 74 2c 20 22 7b 3a 3f 7d 22  ite!(fmt, "{:?}"
cb60: 2c 20 61 72 67 29 3f 3b 0a 20 20 20 20 20 20 20  , arg)?;.       
cb70: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
cb80: 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74 65             write
cb90: 21 28 66 6d 74 2c 20 22 29 22 29 0a 20 20 20 20  !(fmt, ")").    
cba0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cbb0: 20 20 20 20 20 20 41 73 73 65 72 74 20 7b 20 72        Assert { r
cbc0: 65 66 20 63 6f 6e 64 2c 20 65 78 70 65 63 74 65  ef cond, expecte
cbd0: 64 2c 20 72 65 66 20 6d 73 67 2c 20 2e 2e 20 7d  d, ref msg, .. }
cbe0: 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20   => {.          
cbf0: 20 20 20 20 20 20 77 72 69 74 65 21 28 66 6d 74        write!(fmt
cc00: 2c 20 22 61 73 73 65 72 74 28 22 29 3f 3b 0a 20  , "assert(")?;. 
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
cc20: 66 20 21 65 78 70 65 63 74 65 64 20 7b 0a 20 20  f !expected {.  
cc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc40: 20 20 77 72 69 74 65 21 28 66 6d 74 2c 20 22 21    write!(fmt, "!
cc50: 22 29 3f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ")?;.           
cc60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
cc70: 20 20 20 20 20 20 20 77 72 69 74 65 21 28 66 6d         write!(fm
cc80: 74 2c 20 22 7b 3a 3f 7d 2c 20 5c 22 7b 3a 3f 7d  t, "{:?}, \"{:?}
cc90: 5c 22 29 22 2c 20 63 6f 6e 64 2c 20 6d 73 67 29  \")", cond, msg)
cca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
ccb0: 20 20 20 20 20 20 20 20 20 20 20 46 61 6c 73 65             False
ccc0: 45 64 67 65 73 20 7b 20 2e 2e 20 7d 20 3d 3e 20  Edges { .. } => 
ccd0: 77 72 69 74 65 21 28 66 6d 74 2c 20 22 66 61 6c  write!(fmt, "fal
cce0: 73 65 45 64 67 65 73 22 29 2c 0a 20 20 20 20 20  seEdges"),.     
ccf0: 20 20 20 20 20 20 20 46 61 6c 73 65 55 6e 77 69         FalseUnwi
cd00: 6e 64 20 7b 20 2e 2e 20 7d 20 3d 3e 20 77 72 69  nd { .. } => wri
cd10: 74 65 21 28 66 6d 74 2c 20 22 66 61 6c 73 65 55  te!(fmt, "falseU
cd20: 6e 77 69 6e 64 22 29 2c 0a 20 20 20 20 20 20 20  nwind"),.       
cd30: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f   }.    }..    //
cd40: 2f 20 52 65 74 75 72 6e 73 20 74 68 65 20 6c 69  / Returns the li
cd50: 73 74 20 6f 66 20 6c 61 62 65 6c 73 20 66 6f 72  st of labels for
cd60: 20 74 68 65 20 65 64 67 65 73 20 74 6f 20 74 68   the edges to th
cd70: 65 20 73 75 63 63 65 73 73 6f 72 20 62 61 73 69  e successor basi
cd80: 63 20 62 6c 6f 63 6b 73 2e 0a 20 20 20 20 70 75  c blocks..    pu
cd90: 62 20 66 6e 20 66 6d 74 5f 73 75 63 63 65 73 73  b fn fmt_success
cda0: 6f 72 5f 6c 61 62 65 6c 73 28 26 73 65 6c 66 29  or_labels(&self)
cdb0: 20 2d 3e 20 56 65 63 3c 43 6f 77 3c 27 73 74 61   -> Vec<Cow<'sta
cdc0: 74 69 63 2c 20 73 74 72 3e 3e 20 7b 0a 20 20 20  tic, str>> {.   
cdd0: 20 20 20 20 20 75 73 65 20 73 65 6c 66 3a 3a 54       use self::T
cde0: 65 72 6d 69 6e 61 74 6f 72 4b 69 6e 64 3a 3a 2a  erminatorKind::*
cdf0: 3b 0a 20 20 20 20 20 20 20 20 6d 61 74 63 68 20  ;.        match 
ce00: 2a 73 65 6c 66 20 7b 0a 20 20 20 20 20 20 20 20  *self {.        
ce10: 20 20 20 20 52 65 74 75 72 6e 20 7c 20 52 65 73      Return | Res
ce20: 75 6d 65 20 7c 20 41 62 6f 72 74 20 7c 20 55 6e  ume | Abort | Un
ce30: 72 65 61 63 68 61 62 6c 65 20 7c 20 47 65 6e 65  reachable | Gene
ce40: 72 61 74 6f 72 44 72 6f 70 20 3d 3e 20 76 65 63  ratorDrop => vec
ce50: 21 5b 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ![],.           
ce60: 20 47 6f 74 6f 20 7b 20 2e 2e 20 7d 20 3d 3e 20   Goto { .. } => 
ce70: 76 65 63 21 5b 22 22 2e 69 6e 74 6f 28 29 5d 2c  vec!["".into()],
ce80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 77 69  .            Swi
ce90: 74 63 68 49 6e 74 20 7b 20 72 65 66 20 76 61 6c  tchInt { ref val
cea0: 75 65 73 2c 20 73 77 69 74 63 68 5f 74 79 2c 20  ues, switch_ty, 
ceb0: 2e 2e 20 7d 20 3d 3e 20 74 79 3a 3a 74 6c 73 3a  .. } => ty::tls:
cec0: 3a 77 69 74 68 28 7c 74 63 78 7c 20 7b 0a 20 20  :with(|tcx| {.  
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65                le
cee0: 74 20 70 61 72 61 6d 5f 65 6e 76 20 3d 20 74 79  t param_env = ty
cef0: 3a 3a 50 61 72 61 6d 45 6e 76 3a 3a 65 6d 70 74  ::ParamEnv::empt
cf00: 79 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  y();.           
cf10: 20 20 20 20 20 6c 65 74 20 73 77 69 74 63 68 5f       let switch_
cf20: 74 79 20 3d 20 74 63 78 2e 6c 69 66 74 28 26 73  ty = tcx.lift(&s
cf30: 77 69 74 63 68 5f 74 79 29 2e 75 6e 77 72 61 70  witch_ty).unwrap
cf40: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ();.            
cf50: 20 20 20 20 6c 65 74 20 73 69 7a 65 20 3d 20 74      let size = t
cf60: 63 78 2e 6c 61 79 6f 75 74 5f 6f 66 28 70 61 72  cx.layout_of(par
cf70: 61 6d 5f 65 6e 76 2e 61 6e 64 28 73 77 69 74 63  am_env.and(switc
cf80: 68 5f 74 79 29 29 2e 75 6e 77 72 61 70 28 29 2e  h_ty)).unwrap().
cf90: 73 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  size;.          
cfa0: 20 20 20 20 20 20 76 61 6c 75 65 73 0a 20 20 20        values.   
cfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfc0: 20 2e 69 74 65 72 28 29 0a 20 20 20 20 20 20 20   .iter().       
cfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2e 6d 61               .ma
cfe0: 70 28 7c 26 75 7c 20 7b 0a 20 20 20 20 20 20 20  p(|&u| {.       
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d000: 20 74 79 3a 3a 43 6f 6e 73 74 3a 3a 66 72 6f 6d   ty::Const::from
d010: 5f 73 63 61 6c 61 72 28 0a 20 20 20 20 20 20 20  _scalar(.       
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d030: 20 20 20 20 20 74 63 78 2c 0a 20 20 20 20 20 20       tcx,.      
d040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d050: 20 20 20 20 20 20 53 63 61 6c 61 72 3a 3a 66 72        Scalar::fr
d060: 6f 6d 5f 75 69 6e 74 28 75 2c 20 73 69 7a 65 29  om_uint(u, size)
d070: 2e 69 6e 74 6f 28 29 2c 0a 20 20 20 20 20 20 20  .into(),.       
d080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d090: 20 20 20 20 20 73 77 69 74 63 68 5f 74 79 2c 0a       switch_ty,.
d0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0b0: 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20          ).      
d0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0d0: 20 20 2e 74 6f 5f 73 74 72 69 6e 67 28 29 0a 20    .to_string(). 
d0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0f0: 20 20 20 20 20 20 20 2e 69 6e 74 6f 28 29 0a 20         .into(). 
d100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d110: 20 20 20 7d 29 0a 20 20 20 20 20 20 20 20 20 20     }).          
d120: 20 20 20 20 20 20 20 20 20 20 2e 63 68 61 69 6e            .chain
d130: 28 69 74 65 72 3a 3a 6f 6e 63 65 28 22 6f 74 68  (iter::once("oth
d140: 65 72 77 69 73 65 22 2e 69 6e 74 6f 28 29 29 29  erwise".into()))
d150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d160: 20 20 20 20 20 2e 63 6f 6c 6c 65 63 74 28 29 0a       .collect().
d170: 20 20 20 20 20 20 20 20 20 20 20 20 7d 29 2c 0a              }),.
d180: 20 20 20 20 20 20 20 20 20 20 20 20 43 61 6c 6c              Call
d190: 20 7b 20 64 65 73 74 69 6e 61 74 69 6f 6e 3a 20   { destination: 
d1a0: 53 6f 6d 65 28 5f 29 2c 20 63 6c 65 61 6e 75 70  Some(_), cleanup
d1b0: 3a 20 53 6f 6d 65 28 5f 29 2c 20 2e 2e 20 7d 20  : Some(_), .. } 
d1c0: 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  => {.           
d1d0: 20 20 20 20 20 76 65 63 21 5b 22 72 65 74 75 72       vec!["retur
d1e0: 6e 22 2e 69 6e 74 6f 28 29 2c 20 22 75 6e 77 69  n".into(), "unwi
d1f0: 6e 64 22 2e 69 6e 74 6f 28 29 5d 0a 20 20 20 20  nd".into()].    
d200: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d210: 20 20 20 20 20 20 43 61 6c 6c 20 7b 20 64 65 73        Call { des
d220: 74 69 6e 61 74 69 6f 6e 3a 20 53 6f 6d 65 28 5f  tination: Some(_
d230: 29 2c 20 63 6c 65 61 6e 75 70 3a 20 4e 6f 6e 65  ), cleanup: None
d240: 2c 20 2e 2e 20 7d 20 3d 3e 20 76 65 63 21 5b 22  , .. } => vec!["
d250: 72 65 74 75 72 6e 22 2e 69 6e 74 6f 28 29 5d 2c  return".into()],
d260: 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 61 6c  .            Cal
d270: 6c 20 7b 20 64 65 73 74 69 6e 61 74 69 6f 6e 3a  l { destination:
d280: 20 4e 6f 6e 65 2c 20 63 6c 65 61 6e 75 70 3a 20   None, cleanup: 
d290: 53 6f 6d 65 28 5f 29 2c 20 2e 2e 20 7d 20 3d 3e  Some(_), .. } =>
d2a0: 20 76 65 63 21 5b 22 75 6e 77 69 6e 64 22 2e 69   vec!["unwind".i
d2b0: 6e 74 6f 28 29 5d 2c 0a 20 20 20 20 20 20 20 20  nto()],.        
d2c0: 20 20 20 20 43 61 6c 6c 20 7b 20 64 65 73 74 69      Call { desti
d2d0: 6e 61 74 69 6f 6e 3a 20 4e 6f 6e 65 2c 20 63 6c  nation: None, cl
d2e0: 65 61 6e 75 70 3a 20 4e 6f 6e 65 2c 20 2e 2e 20  eanup: None, .. 
d2f0: 7d 20 3d 3e 20 76 65 63 21 5b 5d 2c 0a 20 20 20  } => vec![],.   
d300: 20 20 20 20 20 20 20 20 20 59 69 65 6c 64 20 7b           Yield {
d310: 20 64 72 6f 70 3a 20 53 6f 6d 65 28 5f 29 2c 20   drop: Some(_), 
d320: 2e 2e 20 7d 20 3d 3e 20 76 65 63 21 5b 22 72 65  .. } => vec!["re
d330: 73 75 6d 65 22 2e 69 6e 74 6f 28 29 2c 20 22 64  sume".into(), "d
d340: 72 6f 70 22 2e 69 6e 74 6f 28 29 5d 2c 0a 20 20  rop".into()],.  
d350: 20 20 20 20 20 20 20 20 20 20 59 69 65 6c 64 20            Yield 
d360: 7b 20 64 72 6f 70 3a 20 4e 6f 6e 65 2c 20 2e 2e  { drop: None, ..
d370: 20 7d 20 3d 3e 20 76 65 63 21 5b 22 72 65 73 75   } => vec!["resu
d380: 6d 65 22 2e 69 6e 74 6f 28 29 5d 2c 0a 20 20 20  me".into()],.   
d390: 20 20 20 20 20 20 20 20 20 44 72 6f 70 41 6e 64           DropAnd
d3a0: 52 65 70 6c 61 63 65 20 7b 20 75 6e 77 69 6e 64  Replace { unwind
d3b0: 3a 20 4e 6f 6e 65 2c 20 2e 2e 20 7d 20 7c 20 44  : None, .. } | D
d3c0: 72 6f 70 20 7b 20 75 6e 77 69 6e 64 3a 20 4e 6f  rop { unwind: No
d3d0: 6e 65 2c 20 2e 2e 20 7d 20 3d 3e 20 7b 0a 20 20  ne, .. } => {.  
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 65                ve
d3f0: 63 21 5b 22 72 65 74 75 72 6e 22 2e 69 6e 74 6f  c!["return".into
d400: 28 29 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ()].            
d410: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 44 72  }.            Dr
d420: 6f 70 41 6e 64 52 65 70 6c 61 63 65 20 7b 20 75  opAndReplace { u
d430: 6e 77 69 6e 64 3a 20 53 6f 6d 65 28 5f 29 2c 20  nwind: Some(_), 
d440: 2e 2e 20 7d 20 7c 20 44 72 6f 70 20 7b 20 75 6e  .. } | Drop { un
d450: 77 69 6e 64 3a 20 53 6f 6d 65 28 5f 29 2c 20 2e  wind: Some(_), .
d460: 2e 20 7d 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20  . } => {.       
d470: 20 20 20 20 20 20 20 20 20 76 65 63 21 5b 22 72           vec!["r
d480: 65 74 75 72 6e 22 2e 69 6e 74 6f 28 29 2c 20 22  eturn".into(), "
d490: 75 6e 77 69 6e 64 22 2e 69 6e 74 6f 28 29 5d 0a  unwind".into()].
d4a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
d4b0: 20 20 20 20 20 20 20 20 20 20 41 73 73 65 72 74            Assert
d4c0: 20 7b 20 63 6c 65 61 6e 75 70 3a 20 4e 6f 6e 65   { cleanup: None
d4d0: 2c 20 2e 2e 20 7d 20 3d 3e 20 76 65 63 21 5b 22  , .. } => vec!["
d4e0: 22 2e 69 6e 74 6f 28 29 5d 2c 0a 20 20 20 20 20  ".into()],.     
d4f0: 20 20 20 20 20 20 20 41 73 73 65 72 74 20 7b 20         Assert { 
d500: 2e 2e 20 7d 20 3d 3e 20 76 65 63 21 5b 22 73 75  .. } => vec!["su
d510: 63 63 65 73 73 22 2e 69 6e 74 6f 28 29 2c 20 22  ccess".into(), "
d520: 75 6e 77 69 6e 64 22 2e 69 6e 74 6f 28 29 5d 2c  unwind".into()],
d530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 61 6c  .            Fal
d540: 73 65 45 64 67 65 73 20 7b 20 2e 2e 20 7d 20 3d  seEdges { .. } =
d550: 3e 20 76 65 63 21 5b 22 72 65 61 6c 22 2e 69 6e  > vec!["real".in
d560: 74 6f 28 29 2c 20 22 69 6d 61 67 69 6e 61 72 79  to(), "imaginary
d570: 22 2e 69 6e 74 6f 28 29 5d 2c 0a 20 20 20 20 20  ".into()],.     
d580: 20 20 20 20 20 20 20 46 61 6c 73 65 55 6e 77 69         FalseUnwi
d590: 6e 64 20 7b 20 75 6e 77 69 6e 64 3a 20 53 6f 6d  nd { unwind: Som
d5a0: 65 28 5f 29 2c 20 2e 2e 20 7d 20 3d 3e 20 76 65  e(_), .. } => ve
d5b0: 63 21 5b 22 72 65 61 6c 22 2e 69 6e 74 6f 28 29  c!["real".into()
d5c0: 2c 20 22 63 6c 65 61 6e 75 70 22 2e 69 6e 74 6f  , "cleanup".into
d5d0: 28 29 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ()],.           
d5e0: 20 46 61 6c 73 65 55 6e 77 69 6e 64 20 7b 20 75   FalseUnwind { u
d5f0: 6e 77 69 6e 64 3a 20 4e 6f 6e 65 2c 20 2e 2e 20  nwind: None, .. 
d600: 7d 20 3d 3e 20 76 65 63 21 5b 22 72 65 61 6c 22  } => vec!["real"
d610: 2e 69 6e 74 6f 28 29 5d 2c 0a 20 20 20 20 20 20  .into()],.      
d620: 20 20 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2f 2f    }.    }.}..///
d630: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d640: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d650: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d660: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d670: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 20 53 74 61 74  ////////.// Stat
d680: 65 6d 65 6e 74 73 0a 0a 23 5b 64 65 72 69 76 65  ements..#[derive
d690: 28 43 6c 6f 6e 65 2c 20 52 75 73 74 63 45 6e 63  (Clone, RustcEnc
d6a0: 6f 64 61 62 6c 65 2c 20 52 75 73 74 63 44 65 63  odable, RustcDec
d6b0: 6f 64 61 62 6c 65 2c 20 48 61 73 68 53 74 61 62  odable, HashStab
d6c0: 6c 65 2c 20 54 79 70 65 46 6f 6c 64 61 62 6c 65  le, TypeFoldable
d6d0: 29 5d 0a 70 75 62 20 73 74 72 75 63 74 20 53 74  )].pub struct St
d6e0: 61 74 65 6d 65 6e 74 3c 27 74 63 78 3e 20 7b 0a  atement<'tcx> {.
d6f0: 20 20 20 20 70 75 62 20 73 6f 75 72 63 65 5f 69      pub source_i
d700: 6e 66 6f 3a 20 53 6f 75 72 63 65 49 6e 66 6f 2c  nfo: SourceInfo,
d710: 0a 20 20 20 20 70 75 62 20 6b 69 6e 64 3a 20 53  .    pub kind: S
d720: 74 61 74 65 6d 65 6e 74 4b 69 6e 64 3c 27 74 63  tatementKind<'tc
d730: 78 3e 2c 0a 7d 0a 0a 2f 2f 20 60 53 74 61 74 65  x>,.}..// `State
d740: 6d 65 6e 74 60 20 69 73 20 75 73 65 64 20 61 20  ment` is used a 
d750: 6c 6f 74 2e 20 4d 61 6b 65 20 73 75 72 65 20 69  lot. Make sure i
d760: 74 20 64 6f 65 73 6e 27 74 20 75 6e 69 6e 74 65  t doesn't uninte
d770: 6e 74 69 6f 6e 61 6c 6c 79 20 67 65 74 20 62 69  ntionally get bi
d780: 67 67 65 72 2e 0a 23 5b 63 66 67 28 74 61 72 67  gger..#[cfg(targ
d790: 65 74 5f 61 72 63 68 20 3d 20 22 78 38 36 5f 36  et_arch = "x86_6
d7a0: 34 22 29 5d 0a 73 74 61 74 69 63 5f 61 73 73 65  4")].static_asse
d7b0: 72 74 5f 73 69 7a 65 21 28 53 74 61 74 65 6d 65  rt_size!(Stateme
d7c0: 6e 74 3c 27 5f 3e 2c 20 33 32 29 3b 0a 0a 69 6d  nt<'_>, 32);..im
d7d0: 70 6c 20 53 74 61 74 65 6d 65 6e 74 3c 27 5f 3e  pl Statement<'_>
d7e0: 20 7b 0a 20 20 20 20 2f 2f 2f 20 43 68 61 6e 67   {.    /// Chang
d7f0: 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  es a statement t
d800: 6f 20 61 20 6e 6f 70 2e 20 54 68 69 73 20 69 73  o a nop. This is
d810: 20 62 6f 74 68 20 66 61 73 74 65 72 20 74 68 61   both faster tha
d820: 6e 20 64 65 6c 65 74 69 6e 67 20 69 6e 73 74 72  n deleting instr
d830: 75 63 74 69 6f 6e 73 20 61 6e 64 20 61 76 6f 69  uctions and avoi
d840: 64 73 0a 20 20 20 20 2f 2f 2f 20 69 6e 76 61 6c  ds.    /// inval
d850: 69 64 61 74 69 6e 67 20 73 74 61 74 65 6d 65 6e  idating statemen
d860: 74 20 69 6e 64 69 63 65 73 20 69 6e 20 60 4c 6f  t indices in `Lo
d870: 63 61 74 69 6f 6e 60 73 2e 0a 20 20 20 20 70 75  cation`s..    pu
d880: 62 20 66 6e 20 6d 61 6b 65 5f 6e 6f 70 28 26 6d  b fn make_nop(&m
d890: 75 74 20 73 65 6c 66 29 20 7b 0a 20 20 20 20 20  ut self) {.     
d8a0: 20 20 20 73 65 6c 66 2e 6b 69 6e 64 20 3d 20 53     self.kind = S
d8b0: 74 61 74 65 6d 65 6e 74 4b 69 6e 64 3a 3a 4e 6f  tatementKind::No
d8c0: 70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f  p.    }..    ///
d8d0: 20 43 68 61 6e 67 65 73 20 61 20 73 74 61 74 65   Changes a state
d8e0: 6d 65 6e 74 20 74 6f 20 61 20 6e 6f 70 20 61 6e  ment to a nop an
d8f0: 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 6f 72  d returns the or
d900: 69 67 69 6e 61 6c 20 73 74 61 74 65 6d 65 6e 74  iginal statement
d910: 2e 0a 20 20 20 20 70 75 62 20 66 6e 20 72 65 70  ..    pub fn rep
d920: 6c 61 63 65 5f 6e 6f 70 28 26 6d 75 74 20 73 65  lace_nop(&mut se
d930: 6c 66 29 20 2d 3e 20 53 65 6c 66 20 7b 0a 20 20  lf) -> Self {.  
d940: 20 20 20 20 20 20 53 74 61 74 65 6d 65 6e 74 20        Statement 
d950: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 6f  {.            so
d960: 75 72 63 65 5f 69 6e 66 6f 3a 20 73 65 6c 66 2e  urce_info: self.
d970: 73 6f 75 72 63 65 5f 69 6e 66 6f 2c 0a 20 20 20  source_info,.   
d980: 20 20 20 20 20 20 20 20 20 6b 69 6e 64 3a 20 6d           kind: m
d990: 65 6d 3a 3a 72 65 70 6c 61 63 65 28 26 6d 75 74  em::replace(&mut
d9a0: 20 73 65 6c 66 2e 6b 69 6e 64 2c 20 53 74 61 74   self.kind, Stat
d9b0: 65 6d 65 6e 74 4b 69 6e 64 3a 3a 4e 6f 70 29 2c  ementKind::Nop),
d9c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
d9d0: 0a 7d 0a 0a 23 5b 64 65 72 69 76 65 28 43 6c 6f  .}..#[derive(Clo
d9e0: 6e 65 2c 20 44 65 62 75 67 2c 20 50 61 72 74 69  ne, Debug, Parti
d9f0: 61 6c 45 71 2c 20 52 75 73 74 63 45 6e 63 6f 64  alEq, RustcEncod
da00: 61 62 6c 65 2c 20 52 75 73 74 63 44 65 63 6f 64  able, RustcDecod
da10: 61 62 6c 65 2c 20 48 61 73 68 53 74 61 62 6c 65  able, HashStable
da20: 2c 20 54 79 70 65 46 6f 6c 64 61 62 6c 65 29 5d  , TypeFoldable)]
da30: 0a 70 75 62 20 65 6e 75 6d 20 53 74 61 74 65 6d  .pub enum Statem
da40: 65 6e 74 4b 69 6e 64 3c 27 74 63 78 3e 20 7b 0a  entKind<'tcx> {.
da50: 20 20 20 20 2f 2f 2f 20 57 72 69 74 65 20 74 68      /// Write th
da60: 65 20 52 48 53 20 52 76 61 6c 75 65 20 74 6f 20  e RHS Rvalue to 
da70: 74 68 65 20 4c 48 53 20 50 6c 61 63 65 2e 0a 20  the LHS Place.. 
da80: 20 20 20 41 73 73 69 67 6e 28 42 6f 78 3c 28 50     Assign(Box<(P
da90: 6c 61 63 65 3c 27 74 63 78 3e 2c 20 52 76 61 6c  lace<'tcx>, Rval
daa0: 75 65 3c 27 74 63 78 3e 29 3e 29 2c 0a 0a 20 20  ue<'tcx>)>),..  
dab0: 20 20 2f 2f 2f 20 54 68 69 73 20 72 65 70 72 65    /// This repre
dac0: 73 65 6e 74 73 20 61 6c 6c 20 74 68 65 20 72 65  sents all the re
dad0: 61 64 69 6e 67 20 74 68 61 74 20 61 20 70 61 74  ading that a pat
dae0: 74 65 72 6e 20 6d 61 74 63 68 20 6d 61 79 20 64  tern match may d
daf0: 6f 0a 20 20 20 20 2f 2f 2f 20 28 65 2e 67 2e 2c  o.    /// (e.g.,
db00: 20 69 6e 73 70 65 63 74 69 6e 67 20 63 6f 6e 73   inspecting cons
db10: 74 61 6e 74 73 20 61 6e 64 20 64 69 73 63 72 69  tants and discri
db20: 6d 69 6e 61 6e 74 20 76 61 6c 75 65 73 29 2c 20  minant values), 
db30: 61 6e 64 20 74 68 65 0a 20 20 20 20 2f 2f 2f 20  and the.    /// 
db40: 6b 69 6e 64 20 6f 66 20 70 61 74 74 65 72 6e 20  kind of pattern 
db50: 69 74 20 63 6f 6d 65 73 20 66 72 6f 6d 2e 20 54  it comes from. T
db60: 68 69 73 20 69 73 20 69 6e 20 6f 72 64 65 72 20  his is in order 
db70: 74 6f 20 61 64 61 70 74 20 70 6f 74 65 6e 74 69  to adapt potenti
db80: 61 6c 0a 20 20 20 20 2f 2f 2f 20 65 72 72 6f 72  al.    /// error
db90: 20 6d 65 73 73 61 67 65 73 20 74 6f 20 74 68 65   messages to the
dba0: 73 65 20 73 70 65 63 69 66 69 63 20 70 61 74 74  se specific patt
dbb0: 65 72 6e 73 2e 0a 20 20 20 20 2f 2f 2f 0a 20 20  erns..    ///.  
dbc0: 20 20 2f 2f 2f 20 4e 6f 74 65 20 74 68 61 74 20    /// Note that 
dbd0: 74 68 69 73 20 61 6c 73 6f 20 69 73 20 65 6d 69  this also is emi
dbe0: 74 74 65 64 20 66 6f 72 20 72 65 67 75 6c 61 72  tted for regular
dbf0: 20 60 6c 65 74 60 20 62 69 6e 64 69 6e 67 73 20   `let` bindings 
dc00: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 6c  to ensure that l
dc10: 6f 63 61 6c 73 20 74 68 61 74 20 61 72 65 0a 20  ocals that are. 
dc20: 20 20 20 2f 2f 2f 20 6e 65 76 65 72 20 61 63 63     /// never acc
dc30: 65 73 73 65 64 20 73 74 69 6c 6c 20 67 65 74 20  essed still get 
dc40: 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63  some sanity chec
dc50: 6b 73 20 66 6f 72 2c 20 65 2e 67 2e 2c 20 60 6c  ks for, e.g., `l
dc60: 65 74 20 78 3a 20 21 20 3d 20 2e 2e 3b 60 0a 20  et x: ! = ..;`. 
dc70: 20 20 20 46 61 6b 65 52 65 61 64 28 46 61 6b 65     FakeRead(Fake
dc80: 52 65 61 64 43 61 75 73 65 2c 20 42 6f 78 3c 50  ReadCause, Box<P
dc90: 6c 61 63 65 3c 27 74 63 78 3e 3e 29 2c 0a 0a 20  lace<'tcx>>),.. 
dca0: 20 20 20 2f 2f 2f 20 57 72 69 74 65 20 74 68 65     /// Write the
dcb0: 20 64 69 73 63 72 69 6d 69 6e 61 6e 74 20 66 6f   discriminant fo
dcc0: 72 20 61 20 76 61 72 69 61 6e 74 20 74 6f 20 74  r a variant to t
dcd0: 68 65 20 65 6e 75 6d 20 50 6c 61 63 65 2e 0a 20  he enum Place.. 
dce0: 20 20 20 53 65 74 44 69 73 63 72 69 6d 69 6e 61     SetDiscrimina
dcf0: 6e 74 20 7b 20 70 6c 61 63 65 3a 20 42 6f 78 3c  nt { place: Box<
dd00: 50 6c 61 63 65 3c 27 74 63 78 3e 3e 2c 20 76 61  Place<'tcx>>, va
dd10: 72 69 61 6e 74 5f 69 6e 64 65 78 3a 20 56 61 72  riant_index: Var
dd20: 69 61 6e 74 49 64 78 20 7d 2c 0a 0a 20 20 20 20  iantIdx },..    
dd30: 2f 2f 2f 20 53 74 61 72 74 20 61 20 6c 69 76 65  /// Start a live
dd40: 20 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 73   range for the s
dd50: 74 6f 72 61 67 65 20 6f 66 20 74 68 65 20 6c 6f  torage of the lo
dd60: 63 61 6c 2e 0a 20 20 20 20 53 74 6f 72 61 67 65  cal..    Storage
dd70: 4c 69 76 65 28 4c 6f 63 61 6c 29 2c 0a 0a 20 20  Live(Local),..  
dd80: 20 20 2f 2f 2f 20 45 6e 64 20 74 68 65 20 63 75    /// End the cu
dd90: 72 72 65 6e 74 20 6c 69 76 65 20 72 61 6e 67 65  rrent live range
dda0: 20 66 6f 72 20 74 68 65 20 73 74 6f 72 61 67 65   for the storage
ddb0: 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 2e 0a 20   of the local.. 
ddc0: 20 20 20 53 74 6f 72 61 67 65 44 65 61 64 28 4c     StorageDead(L
ddd0: 6f 63 61 6c 29 2c 0a 0a 20 20 20 20 2f 2f 2f 20  ocal),..    /// 
dde0: 45 78 65 63 75 74 65 73 20 61 20 70 69 65 63 65  Executes a piece
ddf0: 20 6f 66 20 69 6e 6c 69 6e 65 20 41 73 73 65 6d   of inline Assem
de00: 62 6c 79 2e 20 53 74 6f 72 65 64 20 69 6e 20 61  bly. Stored in a
de10: 20 42 6f 78 20 74 6f 20 6b 65 65 70 20 74 68 65   Box to keep the
de20: 20 73 69 7a 65 0a 20 20 20 20 2f 2f 2f 20 6f 66   size.    /// of
de30: 20 60 53 74 61 74 65 6d 65 6e 74 4b 69 6e 64 60   `StatementKind`
de40: 20 6c 6f 77 2e 0a 20 20 20 20 49 6e 6c 69 6e 65   low..    Inline
de50: 41 73 6d 28 42 6f 78 3c 49 6e 6c 69 6e 65 41 73  Asm(Box<InlineAs
de60: 6d 3c 27 74 63 78 3e 3e 29 2c 0a 0a 20 20 20 20  m<'tcx>>),..    
de70: 2f 2f 2f 20 52 65 74 61 67 20 72 65 66 65 72 65  /// Retag refere
de80: 6e 63 65 73 20 69 6e 20 74 68 65 20 67 69 76 65  nces in the give
de90: 6e 20 70 6c 61 63 65 2c 20 65 6e 73 75 72 69 6e  n place, ensurin
dea0: 67 20 74 68 65 79 20 67 6f 74 20 66 72 65 73 68  g they got fresh
deb0: 20 74 61 67 73 2e 20 54 68 69 73 20 69 73 0a 20   tags. This is. 
dec0: 20 20 20 2f 2f 2f 20 70 61 72 74 20 6f 66 20 74     /// part of t
ded0: 68 65 20 53 74 61 63 6b 65 64 20 42 6f 72 72 6f  he Stacked Borro
dee0: 77 73 20 6d 6f 64 65 6c 2e 20 54 68 65 73 65 20  ws model. These 
def0: 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 63  statements are c
df00: 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 69 6e  urrently only in
df10: 74 65 72 70 72 65 74 65 64 0a 20 20 20 20 2f 2f  terpreted.    //
df20: 2f 20 62 79 20 6d 69 72 69 20 61 6e 64 20 6f 6e  / by miri and on
df30: 6c 79 20 67 65 6e 65 72 61 74 65 64 20 77 68 65  ly generated whe
df40: 6e 20 22 2d 5a 20 6d 69 72 2d 65 6d 69 74 2d 72  n "-Z mir-emit-r
df50: 65 74 61 67 22 20 69 73 20 70 61 73 73 65 64 2e  etag" is passed.
df60: 0a 20 20 20 20 2f 2f 2f 20 53 65 65 20 3c 68 74  .    /// See <ht
df70: 74 70 73 3a 2f 2f 69 6e 74 65 72 6e 61 6c 73 2e  tps://internals.
df80: 72 75 73 74 2d 6c 61 6e 67 2e 6f 72 67 2f 74 2f  rust-lang.org/t/
df90: 73 74 61 63 6b 65 64 2d 62 6f 72 72 6f 77 73 2d  stacked-borrows-
dfa0: 61 6e 2d 61 6c 69 61 73 69 6e 67 2d 6d 6f 64 65  an-aliasing-mode
dfb0: 6c 2d 66 6f 72 2d 72 75 73 74 2f 38 31 35 33 2f  l-for-rust/8153/
dfc0: 3e 0a 20 20 20 20 2f 2f 2f 20 66 6f 72 20 6d 6f  >.    /// for mo
dfd0: 72 65 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20  re details..    
dfe0: 52 65 74 61 67 28 52 65 74 61 67 4b 69 6e 64 2c  Retag(RetagKind,
dff0: 20 42 6f 78 3c 50 6c 61 63 65 3c 27 74 63 78 3e   Box<Place<'tcx>
e000: 3e 29 2c 0a 0a 20 20 20 20 2f 2f 2f 20 45 6e 63  >),..    /// Enc
e010: 6f 64 65 73 20 61 20 75 73 65 72 27 73 20 74 79  odes a user's ty
e020: 70 65 20 61 73 63 72 69 70 74 69 6f 6e 2e 20 54  pe ascription. T
e030: 68 65 73 65 20 6e 65 65 64 20 74 6f 20 62 65 20  hese need to be 
e040: 70 72 65 73 65 72 76 65 64 0a 20 20 20 20 2f 2f  preserved.    //
e050: 2f 20 69 6e 74 61 63 74 20 73 6f 20 74 68 61 74  / intact so that
e060: 20 4e 4c 4c 20 63 61 6e 20 72 65 73 70 65 63 74   NLL can respect
e070: 20 74 68 65 6d 2e 20 46 6f 72 20 65 78 61 6d 70   them. For examp
e080: 6c 65 3a 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20  le:.    ///.    
e090: 2f 2f 2f 20 20 20 20 20 6c 65 74 20 61 3a 20 54  ///     let a: T
e0a0: 20 3d 20 79 3b 0a 20 20 20 20 2f 2f 2f 0a 20 20   = y;.    ///.  
e0b0: 20 20 2f 2f 2f 20 54 68 65 20 65 66 66 65 63 74    /// The effect
e0c0: 20 6f 66 20 74 68 69 73 20 61 6e 6e 6f 74 61 74   of this annotat
e0d0: 69 6f 6e 20 69 73 20 74 6f 20 72 65 6c 61 74 65  ion is to relate
e0e0: 20 74 68 65 20 74 79 70 65 20 60 54 5f 79 60 20   the type `T_y` 
e0f0: 6f 66 20 74 68 65 20 70 6c 61 63 65 20 60 79 60  of the place `y`
e100: 0a 20 20 20 20 2f 2f 2f 20 74 6f 20 74 68 65 20  .    /// to the 
e110: 75 73 65 72 2d 67 69 76 65 6e 20 74 79 70 65 20  user-given type 
e120: 60 54 60 2e 20 54 68 65 20 65 66 66 65 63 74 20  `T`. The effect 
e130: 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 73  depends on the s
e140: 70 65 63 69 66 69 65 64 20 76 61 72 69 61 6e 63  pecified varianc
e150: 65 3a 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f  e:.    ///.    /
e160: 2f 2f 20 2d 20 60 43 6f 76 61 72 69 61 6e 74 60  // - `Covariant`
e170: 20 2d 2d 20 72 65 71 75 69 72 65 73 20 74 68 61   -- requires tha
e180: 74 20 60 54 5f 79 20 3c 3a 20 54 60 0a 20 20 20  t `T_y <: T`.   
e190: 20 2f 2f 2f 20 2d 20 60 43 6f 6e 74 72 61 76 61   /// - `Contrava
e1a0: 72 69 61 6e 74 60 20 2d 2d 20 72 65 71 75 69 72  riant` -- requir
e1b0: 65 73 20 74 68 61 74 20 60 54 5f 79 20 3a 3e 20  es that `T_y :> 
e1c0: 54 60 0a 20 20 20 20 2f 2f 2f 20 2d 20 60 49 6e  T`.    /// - `In
e1d0: 76 61 72 69 61 6e 74 60 20 2d 2d 20 72 65 71 75  variant` -- requ
e1e0: 69 72 65 73 20 74 68 61 74 20 60 54 5f 79 20 3d  ires that `T_y =
e1f0: 3d 20 54 60 0a 20 20 20 20 2f 2f 2f 20 2d 20 60  = T`.    /// - `
e200: 42 69 76 61 72 69 61 6e 74 60 20 2d 2d 20 6e 6f  Bivariant` -- no
e210: 20 65 66 66 65 63 74 0a 20 20 20 20 41 73 63 72   effect.    Ascr
e220: 69 62 65 55 73 65 72 54 79 70 65 28 42 6f 78 3c  ibeUserType(Box<
e230: 28 50 6c 61 63 65 3c 27 74 63 78 3e 2c 20 55 73  (Place<'tcx>, Us
e240: 65 72 54 79 70 65 50 72 6f 6a 65 63 74 69 6f 6e  erTypeProjection
e250: 29 3e 2c 20 74 79 3a 3a 56 61 72 69 61 6e 63 65  )>, ty::Variance
e260: 29 2c 0a 0a 20 20 20 20 2f 2f 2f 20 4e 6f 2d 6f  ),..    /// No-o
e270: 70 2e 20 55 73 65 66 75 6c 20 66 6f 72 20 64 65  p. Useful for de
e280: 6c 65 74 69 6e 67 20 69 6e 73 74 72 75 63 74 69  leting instructi
e290: 6f 6e 73 20 77 69 74 68 6f 75 74 20 61 66 66 65  ons without affe
e2a0: 63 74 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20  cting statement 
e2b0: 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 4e 6f 70  indices..    Nop
e2c0: 2c 0a 7d 0a 0a 2f 2f 2f 20 44 65 73 63 72 69 62  ,.}../// Describ
e2d0: 65 73 20 77 68 61 74 20 6b 69 6e 64 20 6f 66 20  es what kind of 
e2e0: 72 65 74 61 67 20 69 73 20 74 6f 20 62 65 20 70  retag is to be p
e2f0: 65 72 66 6f 72 6d 65 64 2e 0a 23 5b 64 65 72 69  erformed..#[deri
e300: 76 65 28 43 6f 70 79 2c 20 43 6c 6f 6e 65 2c 20  ve(Copy, Clone, 
e310: 52 75 73 74 63 45 6e 63 6f 64 61 62 6c 65 2c 20  RustcEncodable, 
e320: 52 75 73 74 63 44 65 63 6f 64 61 62 6c 65 2c 20  RustcDecodable, 
e330: 44 65 62 75 67 2c 20 50 61 72 74 69 61 6c 45 71  Debug, PartialEq
e340: 2c 20 45 71 2c 20 48 61 73 68 53 74 61 62 6c 65  , Eq, HashStable
e350: 29 5d 0a 70 75 62 20 65 6e 75 6d 20 52 65 74 61  )].pub enum Reta
e360: 67 4b 69 6e 64 20 7b 0a 20 20 20 20 2f 2f 2f 20  gKind {.    /// 
e370: 54 68 65 20 69 6e 69 74 69 61 6c 20 72 65 74 61  The initial reta
e380: 67 20 77 68 65 6e 20 65 6e 74 65 72 69 6e 67 20  g when entering 
e390: 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  a function..    
e3a0: 46 6e 45 6e 74 72 79 2c 0a 20 20 20 20 2f 2f 2f  FnEntry,.    ///
e3b0: 20 52 65 74 61 67 20 70 72 65 70 61 72 69 6e 67   Retag preparing
e3c0: 20 66 6f 72 20 61 20 74 77 6f 2d 70 68 61 73 65   for a two-phase
e3d0: 20 62 6f 72 72 6f 77 2e 0a 20 20 20 20 54 77 6f   borrow..    Two
e3e0: 50 68 61 73 65 2c 0a 20 20 20 20 2f 2f 2f 20 52  Phase,.    /// R
e3f0: 65 74 61 67 67 69 6e 67 20 72 61 77 20 70 6f 69  etagging raw poi
e400: 6e 74 65 72 73 2e 0a 20 20 20 20 52 61 77 2c 0a  nters..    Raw,.
e410: 20 20 20 20 2f 2f 2f 20 41 20 22 6e 6f 72 6d 61      /// A "norma
e420: 6c 22 20 72 65 74 61 67 2e 0a 20 20 20 20 44 65  l" retag..    De
e430: 66 61 75 6c 74 2c 0a 7d 0a 0a 2f 2f 2f 20 54 68  fault,.}../// Th
e440: 65 20 60 46 61 6b 65 52 65 61 64 43 61 75 73 65  e `FakeReadCause
e450: 60 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  ` describes the 
e460: 74 79 70 65 20 6f 66 20 70 61 74 74 65 72 6e 20  type of pattern 
e470: 77 68 79 20 61 20 46 61 6b 65 52 65 61 64 20 73  why a FakeRead s
e480: 74 61 74 65 6d 65 6e 74 20 65 78 69 73 74 73 2e  tatement exists.
e490: 0a 23 5b 64 65 72 69 76 65 28 43 6f 70 79 2c 20  .#[derive(Copy, 
e4a0: 43 6c 6f 6e 65 2c 20 52 75 73 74 63 45 6e 63 6f  Clone, RustcEnco
e4b0: 64 61 62 6c 65 2c 20 52 75 73 74 63 44 65 63 6f  dable, RustcDeco
e4c0: 64 61 62 6c 65 2c 20 44 65 62 75 67 2c 20 48 61  dable, Debug, Ha
e4d0: 73 68 53 74 61 62 6c 65 2c 20 50 61 72 74 69 61  shStable, Partia
e4e0: 6c 45 71 29 5d 0a 70 75 62 20 65 6e 75 6d 20 46  lEq)].pub enum F
e4f0: 61 6b 65 52 65 61 64 43 61 75 73 65 20 7b 0a 20  akeReadCause {. 
e500: 20 20 20 2f 2f 2f 20 49 6e 6a 65 63 74 20 61 20     /// Inject a 
e510: 66 61 6b 65 20 72 65 61 64 20 6f 66 20 74 68 65  fake read of the
e520: 20 62 6f 72 72 6f 77 65 64 20 69 6e 70 75 74 20   borrowed input 
e530: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61  at the end of ea
e540: 63 68 20 67 75 61 72 64 73 0a 20 20 20 20 2f 2f  ch guards.    //
e550: 2f 20 63 6f 64 65 2e 0a 20 20 20 20 2f 2f 2f 0a  / code..    ///.
e560: 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 73 68 6f      /// This sho
e570: 75 6c 64 20 65 6e 73 75 72 65 20 74 68 61 74 20  uld ensure that 
e580: 79 6f 75 20 63 61 6e 6e 6f 74 20 63 68 61 6e 67  you cannot chang
e590: 65 20 74 68 65 20 76 61 72 69 61 6e 74 20 66 6f  e the variant fo
e5a0: 72 20 61 6e 20 65 6e 75 6d 20 77 68 69 6c 65 0a  r an enum while.
e5b0: 20 20 20 20 2f 2f 2f 20 79 6f 75 20 61 72 65 20      /// you are 
e5c0: 69 6e 20 74 68 65 20 6d 69 64 73 74 20 6f 66 20  in the midst of 
e5d0: 6d 61 74 63 68 69 6e 67 20 6f 6e 20 69 74 2e 0a  matching on it..
e5e0: 20 20 20 20 46 6f 72 4d 61 74 63 68 47 75 61 72      ForMatchGuar
e5f0: 64 2c 0a 0a 20 20 20 20 2f 2f 2f 20 60 6c 65 74  d,..    /// `let
e600: 20 78 3a 20 21 3b 20 6d 61 74 63 68 20 78 20 7b   x: !; match x {
e610: 7d 60 20 64 6f 65 73 6e 27 74 20 67 65 6e 65 72  }` doesn't gener
e620: 61 74 65 20 61 6e 79 20 72 65 61 64 20 6f 66 20  ate any read of 
e630: 78 20 73 6f 20 77 65 20 6e 65 65 64 20 74 6f 0a  x so we need to.
e640: 20 20 20 20 2f 2f 2f 20 67 65 6e 65 72 61 74 65      /// generate
e650: 20 61 20 72 65 61 64 20 6f 66 20 78 20 74 6f 20   a read of x to 
e660: 63 68 65 63 6b 20 74 68 61 74 20 69 74 20 69 73  check that it is
e670: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64   initialized and
e680: 20 73 61 66 65 2e 0a 20 20 20 20 46 6f 72 4d 61   safe..    ForMa
e690: 74 63 68 65 64 50 6c 61 63 65 2c 0a 0a 20 20 20  tchedPlace,..   
e6a0: 20 2f 2f 2f 20 41 20 66 61 6b 65 20 72 65 61 64   /// A fake read
e6b0: 20 6f 66 20 74 68 65 20 52 65 66 57 69 74 68 69   of the RefWithi
e6c0: 6e 47 75 61 72 64 20 76 65 72 73 69 6f 6e 20 6f  nGuard version o
e6d0: 66 20 61 20 62 69 6e 64 2d 62 79 2d 76 61 6c 75  f a bind-by-valu
e6e0: 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2f  e variable.    /
e6f0: 2f 2f 20 69 6e 20 61 20 6d 61 74 63 68 20 67 75  // in a match gu
e700: 61 72 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ard to ensure th
e710: 61 74 20 69 74 27 73 20 76 61 6c 75 65 20 68 61  at it's value ha
e720: 73 6e 27 74 20 63 68 61 6e 67 65 20 62 79 20 74  sn't change by t
e730: 68 65 20 74 69 6d 65 0a 20 20 20 20 2f 2f 2f 20  he time.    /// 
e740: 77 65 20 63 72 65 61 74 65 20 74 68 65 20 4f 75  we create the Ou
e750: 74 73 69 64 65 47 75 61 72 64 20 76 65 72 73 69  tsideGuard versi
e760: 6f 6e 2e 0a 20 20 20 20 46 6f 72 47 75 61 72 64  on..    ForGuard
e770: 42 69 6e 64 69 6e 67 2c 0a 0a 20 20 20 20 2f 2f  Binding,..    //
e780: 2f 20 4f 66 66 69 63 69 61 6c 6c 79 2c 20 74 68  / Officially, th
e790: 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 0a 20  e semantics of. 
e7a0: 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 60     ///.    /// `
e7b0: 6c 65 74 20 70 61 74 74 65 72 6e 20 3d 20 3c 65  let pattern = <e
e7c0: 78 70 72 3e 3b 60 0a 20 20 20 20 2f 2f 2f 0a 20  xpr>;`.    ///. 
e7d0: 20 20 20 2f 2f 2f 20 69 73 20 74 68 61 74 20 60     /// is that `
e7e0: 3c 65 78 70 72 3e 60 20 69 73 20 65 76 61 6c 75  <expr>` is evalu
e7f0: 61 74 65 64 20 69 6e 74 6f 20 61 20 74 65 6d 70  ated into a temp
e800: 6f 72 61 72 79 20 61 6e 64 20 74 68 65 6e 20 74  orary and then t
e810: 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 69 73  his temporary is
e820: 0a 20 20 20 20 2f 2f 2f 20 69 6e 74 6f 20 74 68  .    /// into th
e830: 65 20 70 61 74 74 65 72 6e 2e 0a 20 20 20 20 2f  e pattern..    /
e840: 2f 2f 0a 20 20 20 20 2f 2f 2f 20 48 6f 77 65 76  //.    /// Howev
e850: 65 72 2c 20 69 66 20 77 65 20 73 65 65 20 74 68  er, if we see th
e860: 65 20 73 69 6d 70 6c 65 20 70 61 74 74 65 72 6e  e simple pattern
e870: 20 60 6c 65 74 20 76 61 72 20 3d 20 3c 65 78 70   `let var = <exp
e880: 72 3e 60 2c 20 77 65 20 6f 70 74 69 6d 69 7a 65  r>`, we optimize
e890: 20 74 68 69 73 20 74 6f 0a 20 20 20 20 2f 2f 2f   this to.    ///
e8a0: 20 65 76 61 6c 75 61 74 65 20 60 3c 65 78 70 72   evaluate `<expr
e8b0: 3e 60 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f  >` directly into
e8c0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 60 76   the variable `v
e8d0: 61 72 60 2e 20 54 68 69 73 20 69 73 20 6d 6f 73  ar`. This is mos
e8e0: 74 6c 79 20 75 6e 6f 62 73 65 72 76 61 62 6c 65  tly unobservable
e8f0: 2c 0a 20 20 20 20 2f 2f 2f 20 62 75 74 20 69 6e  ,.    /// but in
e900: 20 73 6f 6d 65 20 63 61 73 65 73 20 69 74 20 63   some cases it c
e910: 61 6e 20 61 66 66 65 63 74 20 74 68 65 20 62 6f  an affect the bo
e920: 72 72 6f 77 20 63 68 65 63 6b 65 72 2c 20 61 73  rrow checker, as
e930: 20 69 6e 20 23 35 33 36 39 35 2e 0a 20 20 20 20   in #53695..    
e940: 2f 2f 2f 20 54 68 65 72 65 66 6f 72 65 2c 20 77  /// Therefore, w
e950: 65 20 69 6e 73 65 72 74 20 61 20 22 66 61 6b 65  e insert a "fake
e960: 20 72 65 61 64 22 20 68 65 72 65 20 74 6f 20 65   read" here to e
e970: 6e 73 75 72 65 20 74 68 61 74 20 77 65 20 67 65  nsure that we ge
e980: 74 0a 20 20 20 20 2f 2f 2f 20 61 70 70 72 6f 70  t.    /// approp
e990: 72 69 61 74 65 20 65 72 72 6f 72 73 2e 0a 20 20  riate errors..  
e9a0: 20 20 46 6f 72 4c 65 74 2c 0a 0a 20 20 20 20 2f    ForLet,..    /
e9b0: 2f 2f 20 49 66 20 77 65 20 68 61 76 65 20 61 6e  // If we have an
e9c0: 20 69 6e 64 65 78 20 65 78 70 72 65 73 73 69 6f   index expressio
e9d0: 6e 20 6c 69 6b 65 0a 20 20 20 20 2f 2f 2f 0a 20  n like.    ///. 
e9e0: 20 20 20 2f 2f 2f 20 28 2a 78 29 5b 31 5d 5b 7b     /// (*x)[1][{
e9f0: 20 78 20 3d 20 79 3b 20 34 7d 5d 0a 20 20 20 20   x = y; 4}].    
ea00: 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 74 68 65 6e  ///.    /// then
ea10: 20 74 68 65 20 66 69 72 73 74 20 62 6f 75 6e 64   the first bound
ea20: 73 20 63 68 65 63 6b 20 69 73 20 69 6e 76 61 6c  s check is inval
ea30: 69 64 61 74 65 64 20 77 68 65 6e 20 77 65 20 65  idated when we e
ea40: 76 61 6c 75 61 74 65 20 74 68 65 20 73 65 63 6f  valuate the seco
ea50: 6e 64 0a 20 20 20 20 2f 2f 2f 20 69 6e 64 65 78  nd.    /// index
ea60: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 75   expression. Thu
ea70: 73 20 77 65 20 63 72 65 61 74 65 20 61 20 66 61  s we create a fa
ea80: 6b 65 20 62 6f 72 72 6f 77 20 6f 66 20 60 78 60  ke borrow of `x`
ea90: 20 61 63 72 6f 73 73 20 74 68 65 20 73 65 63 6f   across the seco
eaa0: 6e 64 0a 20 20 20 20 2f 2f 2f 20 69 6e 64 65 78  nd.    /// index
eab0: 65 72 2c 20 77 68 69 63 68 20 77 69 6c 6c 20 63  er, which will c
eac0: 61 75 73 65 20 61 20 62 6f 72 72 6f 77 20 63 68  ause a borrow ch
ead0: 65 63 6b 20 65 72 72 6f 72 2e 0a 20 20 20 20 46  eck error..    F
eae0: 6f 72 49 6e 64 65 78 2c 0a 7d 0a 0a 23 5b 64 65  orIndex,.}..#[de
eaf0: 72 69 76 65 28 43 6c 6f 6e 65 2c 20 44 65 62 75  rive(Clone, Debu
eb00: 67 2c 20 50 61 72 74 69 61 6c 45 71 2c 20 52 75  g, PartialEq, Ru
eb10: 73 74 63 45 6e 63 6f 64 61 62 6c 65 2c 20 52 75  stcEncodable, Ru
eb20: 73 74 63 44 65 63 6f 64 61 62 6c 65 2c 20 48 61  stcDecodable, Ha
eb30: 73 68 53 74 61 62 6c 65 2c 20 54 79 70 65 46 6f  shStable, TypeFo
eb40: 6c 64 61 62 6c 65 29 5d 0a 70 75 62 20 73 74 72  ldable)].pub str
eb50: 75 63 74 20 49 6e 6c 69 6e 65 41 73 6d 3c 27 74  uct InlineAsm<'t
eb60: 63 78 3e 20 7b 0a 20 20 20 20 70 75 62 20 61 73  cx> {.    pub as
eb70: 6d 3a 20 68 69 72 3a 3a 49 6e 6c 69 6e 65 41 73  m: hir::InlineAs
eb80: 6d 49 6e 6e 65 72 2c 0a 20 20 20 20 70 75 62 20  mInner,.    pub 
eb90: 6f 75 74 70 75 74 73 3a 20 42 6f 78 3c 5b 50 6c  outputs: Box<[Pl
eba0: 61 63 65 3c 27 74 63 78 3e 5d 3e 2c 0a 20 20 20  ace<'tcx>]>,.   
ebb0: 20 70 75 62 20 69 6e 70 75 74 73 3a 20 42 6f 78   pub inputs: Box
ebc0: 3c 5b 28 53 70 61 6e 2c 20 4f 70 65 72 61 6e 64  <[(Span, Operand
ebd0: 3c 27 74 63 78 3e 29 5d 3e 2c 0a 7d 0a 0a 69 6d  <'tcx>)]>,.}..im
ebe0: 70 6c 20 44 65 62 75 67 20 66 6f 72 20 53 74 61  pl Debug for Sta
ebf0: 74 65 6d 65 6e 74 3c 27 5f 3e 20 7b 0a 20 20 20  tement<'_> {.   
ec00: 20 66 6e 20 66 6d 74 28 26 73 65 6c 66 2c 20 66   fn fmt(&self, f
ec10: 6d 74 3a 20 26 6d 75 74 20 46 6f 72 6d 61 74 74  mt: &mut Formatt
ec20: 65 72 3c 27 5f 3e 29 20 2d 3e 20 66 6d 74 3a 3a  er<'_>) -> fmt::
ec30: 52 65 73 75 6c 74 20 7b 0a 20 20 20 20 20 20 20  Result {.       
ec40: 20 75 73 65 20 73 65 6c 66 3a 3a 53 74 61 74 65   use self::State
ec50: 6d 65 6e 74 4b 69 6e 64 3a 3a 2a 3b 0a 20 20 20  mentKind::*;.   
ec60: 20 20 20 20 20 6d 61 74 63 68 20 73 65 6c 66 2e       match self.
ec70: 6b 69 6e 64 20 7b 0a 20 20 20 20 20 20 20 20 20  kind {.         
ec80: 20 20 20 41 73 73 69 67 6e 28 62 6f 78 28 72 65     Assign(box(re
ec90: 66 20 70 6c 61 63 65 2c 20 72 65 66 20 72 76 29  f place, ref rv)
eca0: 29 20 3d 3e 20 77 72 69 74 65 21 28 66 6d 74 2c  ) => write!(fmt,
ecb0: 20 22 7b 3a 3f 7d 20 3d 20 7b 3a 3f 7d 22 2c 20   "{:?} = {:?}", 
ecc0: 70 6c 61 63 65 2c 20 72 76 29 2c 0a 20 20 20 20  place, rv),.    
ecd0: 20 20 20 20 20 20 20 20 46 61 6b 65 52 65 61 64          FakeRead
ece0: 28 72 65 66 20 63 61 75 73 65 2c 20 72 65 66 20  (ref cause, ref 
ecf0: 70 6c 61 63 65 29 20 3d 3e 20 77 72 69 74 65 21  place) => write!
ed00: 28 66 6d 74 2c 20 22 46 61 6b 65 52 65 61 64 28  (fmt, "FakeRead(
ed10: 7b 3a 3f 7d 2c 20 7b 3a 3f 7d 29 22 2c 20 63 61  {:?}, {:?})", ca
ed20: 75 73 65 2c 20 70 6c 61 63 65 29 2c 0a 20 20 20  use, place),.   
ed30: 20 20 20 20 20 20 20 20 20 52 65 74 61 67 28 72           Retag(r
ed40: 65 66 20 6b 69 6e 64 2c 20 72 65 66 20 70 6c 61  ef kind, ref pla
ed50: 63 65 29 20 3d 3e 20 77 72 69 74 65 21 28 0a 20  ce) => write!(. 
ed60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
ed70: 6d 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  mt,.            
ed80: 20 20 20 20 22 52 65 74 61 67 28 7b 7d 7b 3a 3f      "Retag({}{:?
ed90: 7d 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  })",.           
eda0: 20 20 20 20 20 6d 61 74 63 68 20 6b 69 6e 64 20       match kind 
edb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
edc0: 20 20 20 20 20 20 52 65 74 61 67 4b 69 6e 64 3a        RetagKind:
edd0: 3a 46 6e 45 6e 74 72 79 20 3d 3e 20 22 5b 66 6e  :FnEntry => "[fn
ede0: 20 65 6e 74 72 79 5d 20 22 2c 0a 20 20 20 20 20   entry] ",.     
edf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52                 R
ee00: 65 74 61 67 4b 69 6e 64 3a 3a 54 77 6f 50 68 61  etagKind::TwoPha
ee10: 73 65 20 3d 3e 20 22 5b 32 70 68 61 73 65 5d 20  se => "[2phase] 
ee20: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
ee30: 20 20 20 20 20 20 20 52 65 74 61 67 4b 69 6e 64         RetagKind
ee40: 3a 3a 52 61 77 20 3d 3e 20 22 5b 72 61 77 5d 20  ::Raw => "[raw] 
ee50: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
ee60: 20 20 20 20 20 20 20 52 65 74 61 67 4b 69 6e 64         RetagKind
ee70: 3a 3a 44 65 66 61 75 6c 74 20 3d 3e 20 22 22 2c  ::Default => "",
ee80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ee90: 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
eea0: 20 20 20 20 70 6c 61 63 65 2c 0a 20 20 20 20 20      place,.     
eeb0: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 20 20         ),.      
eec0: 20 20 20 20 20 20 53 74 6f 72 61 67 65 4c 69 76        StorageLiv
eed0: 65 28 72 65 66 20 70 6c 61 63 65 29 20 3d 3e 20  e(ref place) => 
eee0: 77 72 69 74 65 21 28 66 6d 74 2c 20 22 53 74 6f  write!(fmt, "Sto
eef0: 72 61 67 65 4c 69 76 65 28 7b 3a 3f 7d 29 22 2c  rageLive({:?})",
ef00: 20 70 6c 61 63 65 29 2c 0a 20 20 20 20 20 20 20   place),.       
ef10: 20 20 20 20 20 53 74 6f 72 61 67 65 44 65 61 64       StorageDead
ef20: 28 72 65 66 20 70 6c 61 63 65 29 20 3d 3e 20 77  (ref place) => w
ef30: 72 69 74 65 21 28 66 6d 74 2c 20 22 53 74 6f 72  rite!(fmt, "Stor
ef40: 61 67 65 44 65 61 64 28 7b 3a 3f 7d 29 22 2c 20  ageDead({:?})", 
ef50: 70 6c 61 63 65 29 2c 0a 20 20 20 20 20 20 20 20  place),.        
ef60: 20 20 20 20 53 65 74 44 69 73 63 72 69 6d 69 6e      SetDiscrimin
ef70: 61 6e 74 20 7b 20 72 65 66 20 70 6c 61 63 65 2c  ant { ref place,
ef80: 20 76 61 72 69 61 6e 74 5f 69 6e 64 65 78 20 7d   variant_index }
ef90: 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20   => {.          
efa0: 20 20 20 20 20 20 77 72 69 74 65 21 28 66 6d 74        write!(fmt
efb0: 2c 20 22 64 69 73 63 72 69 6d 69 6e 61 6e 74 28  , "discriminant(
efc0: 7b 3a 3f 7d 29 20 3d 20 7b 3a 3f 7d 22 2c 20 70  {:?}) = {:?}", p
efd0: 6c 61 63 65 2c 20 76 61 72 69 61 6e 74 5f 69 6e  lace, variant_in
efe0: 64 65 78 29 0a 20 20 20 20 20 20 20 20 20 20 20  dex).           
eff0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49   }.            I
f000: 6e 6c 69 6e 65 41 73 6d 28 72 65 66 20 61 73 6d  nlineAsm(ref asm
f010: 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20  ) => {.         
f020: 20 20 20 20 20 20 20 77 72 69 74 65 21 28 66 6d         write!(fm
f030: 74 2c 20 22 61 73 6d 21 28 7b 3a 3f 7d 20 3a 20  t, "asm!({:?} : 
f040: 7b 3a 3f 7d 20 3a 20 7b 3a 3f 7d 29 22 2c 20 61  {:?} : {:?})", a
f050: 73 6d 2e 61 73 6d 2c 20 61 73 6d 2e 6f 75 74 70  sm.asm, asm.outp
f060: 75 74 73 2c 20 61 73 6d 2e 69 6e 70 75 74 73 29  uts, asm.inputs)
f070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
f080: 20 20 20 20 20 20 20 20 20 20 20 41 73 63 72 69             Ascri
f090: 62 65 55 73 65 72 54 79 70 65 28 62 6f 78 28 72  beUserType(box(r
f0a0: 65 66 20 70 6c 61 63 65 2c 20 72 65 66 20 63 5f  ef place, ref c_
f0b0: 74 79 29 2c 20 72 65 66 20 76 61 72 69 61 6e 63  ty), ref varianc
f0c0: 65 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20  e) => {.        
f0d0: 20 20 20 20 20 20 20 20 77 72 69 74 65 21 28 66          write!(f
f0e0: 6d 74 2c 20 22 41 73 63 72 69 62 65 55 73 65 72  mt, "AscribeUser
f0f0: 54 79 70 65 28 7b 3a 3f 7d 2c 20 7b 3a 3f 7d 2c  Type({:?}, {:?},
f100: 20 7b 3a 3f 7d 29 22 2c 20 70 6c 61 63 65 2c 20   {:?})", place, 
f110: 76 61 72 69 61 6e 63 65 2c 20 63 5f 74 79 29 0a  variance, c_ty).
f120: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
f130: 20 20 20 20 20 20 20 20 20 20 4e 6f 70 20 3d 3e            Nop =>
f140: 20 77 72 69 74 65 21 28 66 6d 74 2c 20 22 6e 6f   write!(fmt, "no
f150: 70 22 29 2c 0a 20 20 20 20 20 20 20 20 7d 0a 20  p"),.        }. 
f160: 20 20 20 7d 0a 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f     }.}..////////
f170: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f180: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f190: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f1a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f1b0: 2f 2f 2f 0a 2f 2f 20 50 6c 61 63 65 73 0a 0a 2f  ///.// Places../
f1c0: 2f 2f 20 41 20 70 61 74 68 20 74 6f 20 61 20 76  // A path to a v
f1d0: 61 6c 75 65 3b 20 73 6f 6d 65 74 68 69 6e 67 20  alue; something 
f1e0: 74 68 61 74 20 63 61 6e 20 62 65 20 65 76 61 6c  that can be eval
f1f0: 75 61 74 65 64 20 77 69 74 68 6f 75 74 0a 2f 2f  uated without.//
f200: 2f 20 63 68 61 6e 67 69 6e 67 20 6f 72 20 64 69  / changing or di
f210: 73 74 75 72 62 69 6e 67 20 70 72 6f 67 72 61 6d  sturbing program
f220: 20 73 74 61 74 65 2e 0a 23 5b 64 65 72 69 76 65   state..#[derive
f230: 28 0a 20 20 20 20 43 6c 6f 6e 65 2c 20 50 61 72  (.    Clone, Par
f240: 74 69 61 6c 45 71 2c 20 45 71 2c 20 50 61 72 74  tialEq, Eq, Part
f250: 69 61 6c 4f 72 64 2c 20 4f 72 64 2c 20 48 61 73  ialOrd, Ord, Has
f260: 68 2c 20 52 75 73 74 63 45 6e 63 6f 64 61 62 6c  h, RustcEncodabl
f270: 65 2c 20 48 61 73 68 53 74 61 62 6c 65 2c 0a 29  e, HashStable,.)
f280: 5d 0a 70 75 62 20 73 74 72 75 63 74 20 50 6c 61  ].pub struct Pla
f290: 63 65 3c 27 74 63 78 3e 20 7b 0a 20 20 20 20 70  ce<'tcx> {.    p
f2a0: 75 62 20 62 61 73 65 3a 20 50 6c 61 63 65 42 61  ub base: PlaceBa
f2b0: 73 65 3c 27 74 63 78 3e 2c 0a 0a 20 20 20 20 2f  se<'tcx>,..    /
f2c0: 2f 2f 20 70 72 6f 6a 65 63 74 69 6f 6e 20 6f 75  // projection ou
f2d0: 74 20 6f 66 20 61 20 70 6c 61 63 65 20 28 61 63  t of a place (ac
f2e0: 63 65 73 73 20 61 20 66 69 65 6c 64 2c 20 64 65  cess a field, de
f2f0: 72 65 66 20 61 20 70 6f 69 6e 74 65 72 2c 20 65  ref a pointer, e
f300: 74 63 29 0a 20 20 20 20 70 75 62 20 70 72 6f 6a  tc).    pub proj
f310: 65 63 74 69 6f 6e 3a 20 26 27 74 63 78 20 4c 69  ection: &'tcx Li
f320: 73 74 3c 50 6c 61 63 65 45 6c 65 6d 3c 27 74 63  st<PlaceElem<'tc
f330: 78 3e 3e 2c 0a 7d 0a 0a 69 6d 70 6c 3c 27 74 63  x>>,.}..impl<'tc
f340: 78 3e 20 72 75 73 74 63 5f 73 65 72 69 61 6c 69  x> rustc_seriali
f350: 7a 65 3a 3a 55 73 65 53 70 65 63 69 61 6c 69 7a  ze::UseSpecializ
f360: 65 64 44 65 63 6f 64 61 62 6c 65 20 66 6f 72 20  edDecodable for 
f370: 50 6c 61 63 65 3c 27 74 63 78 3e 20 7b 7d 0a 0a  Place<'tcx> {}..
f380: 23 5b 64 65 72 69 76 65 28 0a 20 20 20 20 43 6c  #[derive(.    Cl
f390: 6f 6e 65 2c 20 50 61 72 74 69 61 6c 45 71 2c 20  one, PartialEq, 
f3a0: 45 71 2c 20 50 61 72 74 69 61 6c 4f 72 64 2c 20  Eq, PartialOrd, 
f3b0: 4f 72 64 2c 20 48 61 73 68 2c 20 52 75 73 74 63  Ord, Hash, Rustc
f3c0: 45 6e 63 6f 64 61 62 6c 65 2c 20 52 75 73 74 63  Encodable, Rustc
f3d0: 44 65 63 6f 64 61 62 6c 65 2c 20 48 61 73 68 53  Decodable, HashS
f3e0: 74 61 62 6c 65 2c 0a 29 5d 0a 70 75 62 20 65 6e  table,.)].pub en
f3f0: 75 6d 20 50 6c 61 63 65 42 61 73 65 3c 27 74 63  um PlaceBase<'tc
f400: 78 3e 20 7b 0a 20 20 20 20 2f 2f 2f 20 6c 6f 63  x> {.    /// loc
f410: 61 6c 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  al variable.    
f420: 4c 6f 63 61 6c 28 4c 6f 63 61 6c 29 2c 0a 0a 20  Local(Local),.. 
f430: 20 20 20 2f 2f 2f 20 73 74 61 74 69 63 20 6f 72     /// static or
f440: 20 73 74 61 74 69 63 20 6d 75 74 20 76 61 72 69   static mut vari
f450: 61 62 6c 65 0a 20 20 20 20 53 74 61 74 69 63 28  able.    Static(
f460: 42 6f 78 3c 53 74 61 74 69 63 3c 27 74 63 78 3e  Box<Static<'tcx>
f470: 3e 29 2c 0a 7d 0a 0a 2f 2f 2f 20 57 65 20 73 74  >),.}../// We st
f480: 6f 72 65 20 74 68 65 20 6e 6f 72 6d 61 6c 69 7a  ore the normaliz
f490: 65 64 20 74 79 70 65 20 74 6f 20 61 76 6f 69 64  ed type to avoid
f4a0: 20 72 65 71 75 69 72 69 6e 67 20 6e 6f 72 6d 61   requiring norma
f4b0: 6c 69 7a 61 74 69 6f 6e 20 77 68 65 6e 20 72 65  lization when re
f4c0: 61 64 69 6e 67 20 4d 49 52 0a 23 5b 64 65 72 69  ading MIR.#[deri
f4d0: 76 65 28 43 6c 6f 6e 65 2c 20 44 65 62 75 67 2c  ve(Clone, Debug,
f4e0: 20 50 61 72 74 69 61 6c 45 71 2c 20 45 71 2c 20   PartialEq, Eq, 
f4f0: 50 61 72 74 69 61 6c 4f 72 64 2c 20 4f 72 64 2c  PartialOrd, Ord,
f500: 20 48 61 73 68 2c 0a 20 20 20 20 20 20 20 20 20   Hash,.         
f510: 52 75 73 74 63 45 6e 63 6f 64 61 62 6c 65 2c 20  RustcEncodable, 
f520: 52 75 73 74 63 44 65 63 6f 64 61 62 6c 65 2c 20  RustcDecodable, 
f530: 48 61 73 68 53 74 61 62 6c 65 29 5d 0a 70 75 62  HashStable)].pub
f540: 20 73 74 72 75 63 74 20 53 74 61 74 69 63 3c 27   struct Static<'
f550: 74 63 78 3e 20 7b 0a 20 20 20 20 70 75 62 20 74  tcx> {.    pub t
f560: 79 3a 20 54 79 3c 27 74 63 78 3e 2c 0a 20 20 20  y: Ty<'tcx>,.   
f570: 20 70 75 62 20 6b 69 6e 64 3a 20 53 74 61 74 69   pub kind: Stati
f580: 63 4b 69 6e 64 3c 27 74 63 78 3e 2c 0a 20 20 20  cKind<'tcx>,.   
f590: 20 2f 2f 2f 20 54 68 65 20 60 44 65 66 49 64 60   /// The `DefId`
f5a0: 20 6f 66 20 74 68 65 20 69 74 65 6d 20 74 68 69   of the item thi
f5b0: 73 20 73 74 61 74 69 63 20 77 61 73 20 64 65 63  s static was dec
f5c0: 6c 61 72 65 64 20 69 6e 2e 20 46 6f 72 20 70 72  lared in. For pr
f5d0: 6f 6d 6f 74 65 64 20 76 61 6c 75 65 73 2c 20 75  omoted values, u
f5e0: 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 0a  sually, this is.
f5f0: 20 20 20 20 2f 2f 2f 20 74 68 65 20 73 61 6d 65      /// the same
f600: 20 61 73 20 74 68 65 20 60 44 65 66 49 64 60 20   as the `DefId` 
f610: 6f 66 20 74 68 65 20 60 6d 69 72 3a 3a 42 6f 64  of the `mir::Bod
f620: 79 60 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  y` containing th
f630: 65 20 60 50 6c 61 63 65 60 20 74 68 69 73 20 70  e `Place` this p
f640: 72 6f 6d 6f 74 65 64 20 61 70 70 65 61 72 73 20  romoted appears 
f650: 69 6e 2e 0a 20 20 20 20 2f 2f 2f 20 48 6f 77 65  in..    /// Howe
f660: 76 65 72 2c 20 61 66 74 65 72 20 69 6e 6c 69 6e  ver, after inlin
f670: 69 6e 67 2c 20 74 68 61 74 20 6d 69 67 68 74 20  ing, that might 
f680: 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 74 68 65  no longer be the
f690: 20 63 61 73 65 20 61 73 20 69 6e 6c 69 6e 65 64   case as inlined
f6a0: 20 60 50 6c 61 63 65 60 73 20 61 72 65 20 63 6f   `Place`s are co
f6b0: 70 69 65 64 0a 20 20 20 20 2f 2f 2f 20 69 6e 74  pied.    /// int
f6c0: 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 72  o the calling fr
f6d0: 61 6d 65 2e 0a 20 20 20 20 70 75 62 20 64 65 66  ame..    pub def
f6e0: 5f 69 64 3a 20 44 65 66 49 64 2c 0a 7d 0a 0a 23  _id: DefId,.}..#
f6f0: 5b 64 65 72 69 76 65 28 0a 20 20 20 20 43 6c 6f  [derive(.    Clo
f700: 6e 65 2c 20 44 65 62 75 67 2c 20 50 61 72 74 69  ne, Debug, Parti
f710: 61 6c 45 71 2c 20 45 71 2c 20 50 61 72 74 69 61  alEq, Eq, Partia
f720: 6c 4f 72 64 2c 20 4f 72 64 2c 20 48 61 73 68 2c  lOrd, Ord, Hash,
f730: 20 48 61 73 68 53 74 61 62 6c 65 2c 20 52 75 73   HashStable, Rus
f740: 74 63 45 6e 63 6f 64 61 62 6c 65 2c 20 52 75 73  tcEncodable, Rus
f750: 74 63 44 65 63 6f 64 61 62 6c 65 2c 0a 29 5d 0a  tcDecodable,.)].
f760: 70 75 62 20 65 6e 75 6d 20 53 74 61 74 69 63 4b  pub enum StaticK
f770: 69 6e 64 3c 27 74 63 78 3e 20 7b 0a 20 20 20 20  ind<'tcx> {.    
f780: 2f 2f 2f 20 50 72 6f 6d 6f 74 65 64 20 72 65 66  /// Promoted ref
f790: 65 72 65 6e 63 65 73 20 63 6f 6e 73 69 73 74 20  erences consist 
f7a0: 6f 66 20 61 6e 20 69 64 20 28 60 50 72 6f 6d 6f  of an id (`Promo
f7b0: 74 65 64 60 29 20 61 6e 64 20 74 68 65 20 73 75  ted`) and the su
f7c0: 62 73 74 73 20 6e 65 63 65 73 73 61 72 79 20 74  bsts necessary t
f7d0: 6f 20 6d 6f 6e 6f 6d 6f 72 70 68 69 7a 65 0a 20  o monomorphize. 
f7e0: 20 20 20 2f 2f 2f 20 69 74 2e 20 55 73 75 61 6c     /// it. Usual
f7f0: 6c 79 2c 20 74 68 65 73 65 20 73 75 62 73 74 73  ly, these substs
f800: 20 61 72 65 20 6a 75 73 74 20 74 68 65 20 69 64   are just the id
f810: 65 6e 74 69 74 79 20 73 75 62 73 74 73 20 66 6f  entity substs fo
f820: 72 20 74 68 65 20 69 74 65 6d 2e 20 48 6f 77 65  r the item. Howe
f830: 76 65 72 2c 20 74 68 65 20 69 6e 6c 69 6e 65 72  ver, the inliner
f840: 0a 20 20 20 20 2f 2f 2f 20 77 69 6c 6c 20 61 64  .    /// will ad
f850: 6a 75 73 74 20 74 68 65 73 65 20 73 75 62 73 74  just these subst
f860: 73 20 77 68 65 6e 20 69 74 20 69 6e 6c 69 6e 65  s when it inline
f870: 73 20 61 20 66 75 6e 63 74 69 6f 6e 20 62 61 73  s a function bas
f880: 65 64 20 6f 6e 20 74 68 65 20 73 75 62 73 74 73  ed on the substs
f890: 20 61 74 20 74 68 65 20 63 61 6c 6c 73 69 74 65   at the callsite
f8a0: 2e 0a 20 20 20 20 50 72 6f 6d 6f 74 65 64 28 50  ..    Promoted(P
f8b0: 72 6f 6d 6f 74 65 64 2c 20 53 75 62 73 74 73 52  romoted, SubstsR
f8c0: 65 66 3c 27 74 63 78 3e 29 2c 0a 20 20 20 20 53  ef<'tcx>),.    S
f8d0: 74 61 74 69 63 2c 0a 7d 0a 0a 23 5b 64 65 72 69  tatic,.}..#[deri
f8e0: 76 65 28 43 6f 70 79 2c 20 43 6c 6f 6e 65 2c 20  ve(Copy, Clone, 
f8f0: 44 65 62 75 67 2c 20 50 61 72 74 69 61 6c 45 71  Debug, PartialEq
f900: 2c 20 45 71 2c 20 50 61 72 74 69 61 6c 4f 72 64  , Eq, PartialOrd
f910: 2c 20 4f 72 64 2c 20 48 61 73 68 29 5d 0a 23 5b  , Ord, Hash)].#[
f920: 64 65 72 69 76 65 28 52 75 73 74 63 45 6e 63 6f  derive(RustcEnco
f930: 64 61 62 6c 65 2c 20 52 75 73 74 63 44 65 63 6f  dable, RustcDeco
f940: 64 61 62 6c 65 2c 20 48 61 73 68 53 74 61 62 6c  dable, HashStabl
f950: 65 29 5d 0a 70 75 62 20 65 6e 75 6d 20 50 72 6f  e)].pub enum Pro
f960: 6a 65 63 74 69 6f 6e 45 6c 65 6d 3c 56 2c 20 54  jectionElem<V, T
f970: 3e 20 7b 0a 20 20 20 20 44 65 72 65 66 2c 0a 20  > {.    Deref,. 
f980: 20 20 20 46 69 65 6c 64 28 46 69 65 6c 64 2c 20     Field(Field, 
f990: 54 29 2c 0a 20 20 20 20 49 6e 64 65 78 28 56 29  T),.    Index(V)
f9a0: 2c 0a 0a 20 20 20 20 2f 2f 2f 20 54 68 65 73 65  ,..    /// These
f9b0: 20 69 6e 64 69 63 65 73 20 61 72 65 20 67 65 6e   indices are gen
f9c0: 65 72 61 74 65 64 20 62 79 20 73 6c 69 63 65 20  erated by slice 
f9d0: 70 61 74 74 65 72 6e 73 2e 20 45 61 73 69 65 73  patterns. Easies
f9e0: 74 20 74 6f 20 65 78 70 6c 61 69 6e 0a 20 20 20  t to explain.   
f9f0: 20 2f 2f 2f 20 62 79 20 65 78 61 6d 70 6c 65 3a   /// by example:
fa00: 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f  .    ///.    ///
fa10: 20 60 60 60 0a 20 20 20 20 2f 2f 2f 20 5b 58 2c   ```.    /// [X,
fa20: 20 5f 2c 20 2e 2e 5f 2c 20 5f 2c 20 5f 5d 20 3d   _, .._, _, _] =
fa30: 3e 20 7b 20 6f 66 66 73 65 74 3a 20 30 2c 20 6d  > { offset: 0, m
fa40: 69 6e 5f 6c 65 6e 67 74 68 3a 20 34 2c 20 66 72  in_length: 4, fr
fa50: 6f 6d 5f 65 6e 64 3a 20 66 61 6c 73 65 20 7d 2c  om_end: false },
fa60: 0a 20 20 20 20 2f 2f 2f 20 5b 5f 2c 20 58 2c 20  .    /// [_, X, 
fa70: 2e 2e 5f 2c 20 5f 2c 20 5f 5d 20 3d 3e 20 7b 20  .._, _, _] => { 
fa80: 6f 66 66 73 65 74 3a 20 31 2c 20 6d 69 6e 5f 6c  offset: 1, min_l
fa90: 65 6e 67 74 68 3a 20 34 2c 20 66 72 6f 6d 5f 65  ength: 4, from_e
faa0: 6e 64 3a 20 66 61 6c 73 65 20 7d 2c 0a 20 20 20  nd: false },.   
fab0: 20 2f 2f 2f 20 5b 5f 2c 20 5f 2c 20 2e 2e 5f 2c   /// [_, _, .._,
fac0: 20 58 2c 20 5f 5d 20 3d 3e 20 7b 20 6f 66 66 73   X, _] => { offs
fad0: 65 74 3a 20 32 2c 20 6d 69 6e 5f 6c 65 6e 67 74  et: 2, min_lengt
fae0: 68 3a 20 34 2c 20 66 72 6f 6d 5f 65 6e 64 3a 20  h: 4, from_end: 
faf0: 74 72 75 65 20 7d 2c 0a 20 20 20 20 2f 2f 2f 20  true },.    /// 
fb00: 5b 5f 2c 20 5f 2c 20 2e 2e 5f 2c 20 5f 2c 20 58  [_, _, .._, _, X
fb10: 5d 20 3d 3e 20 7b 20 6f 66 66 73 65 74 3a 20 31  ] => { offset: 1
fb20: 2c 20 6d 69 6e 5f 6c 65 6e 67 74 68 3a 20 34 2c  , min_length: 4,
fb30: 20 66 72 6f 6d 5f 65 6e 64 3a 20 74 72 75 65 20   from_end: true 
fb40: 7d 2c 0a 20 20 20 20 2f 2f 2f 20 60 60 60 0a 20  },.    /// ```. 
fb50: 20 20 20 43 6f 6e 73 74 61 6e 74 49 6e 64 65 78     ConstantIndex
fb60: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 69   {.        /// i
fb70: 6e 64 65 78 20 6f 72 20 2d 69 6e 64 65 78 20 28  ndex or -index (
fb80: 69 6e 20 50 79 74 68 6f 6e 20 74 65 72 6d 73 29  in Python terms)
fb90: 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 66  , depending on f
fba0: 72 6f 6d 5f 65 6e 64 0a 20 20 20 20 20 20 20 20  rom_end.        
fbb0: 6f 66 66 73 65 74 3a 20 75 33 32 2c 0a 20 20 20  offset: u32,.   
fbc0: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 74 68 69       /// The thi
fbd0: 6e 67 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64  ng being indexed
fbe0: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
fbf0: 74 20 74 68 69 73 20 6c 6f 6e 67 2e 20 46 6f 72  t this long. For
fc00: 20 61 72 72 61 79 73 20 74 68 69 73 0a 20 20 20   arrays this.   
fc10: 20 20 20 20 20 2f 2f 2f 20 69 73 20 61 6c 77 61       /// is alwa
fc20: 79 73 20 74 68 65 20 65 78 61 63 74 20 6c 65 6e  ys the exact len
fc30: 67 74 68 2e 0a 20 20 20 20 20 20 20 20 6d 69 6e  gth..        min
fc40: 5f 6c 65 6e 67 74 68 3a 20 75 33 32 2c 0a 20 20  _length: u32,.  
fc50: 20 20 20 20 20 20 2f 2f 2f 20 43 6f 75 6e 74 69        /// Counti
fc60: 6e 67 20 62 61 63 6b 77 61 72 64 73 20 66 72 6f  ng backwards fro
fc70: 6d 20 65 6e 64 3f 20 54 68 69 73 20 69 73 20 61  m end? This is a
fc80: 6c 77 61 79 73 20 66 61 6c 73 65 20 77 68 65 6e  lways false when
fc90: 20 69 6e 64 65 78 69 6e 67 20 61 6e 0a 20 20 20   indexing an.   
fca0: 20 20 20 20 20 2f 2f 2f 20 61 72 72 61 79 2e 0a       /// array..
fcb0: 20 20 20 20 20 20 20 20 66 72 6f 6d 5f 65 6e 64          from_end
fcc0: 3a 20 62 6f 6f 6c 2c 0a 20 20 20 20 7d 2c 0a 0a  : bool,.    },..
fcd0: 20 20 20 20 2f 2f 2f 20 54 68 65 73 65 20 69 6e      /// These in
fce0: 64 69 63 65 73 20 61 72 65 20 67 65 6e 65 72 61  dices are genera
fcf0: 74 65 64 20 62 79 20 73 6c 69 63 65 20 70 61 74  ted by slice pat
fd00: 74 65 72 6e 73 2e 0a 20 20 20 20 2f 2f 2f 0a 20  terns..    ///. 
fd10: 20 20 20 2f 2f 2f 20 49 66 20 60 66 72 6f 6d 5f     /// If `from_
fd20: 65 6e 64 60 20 69 73 20 74 72 75 65 20 60 73 6c  end` is true `sl
fd30: 69 63 65 5b 66 72 6f 6d 2e 2e 73 6c 69 63 65 2e  ice[from..slice.
fd40: 6c 65 6e 28 29 20 2d 20 74 6f 5d 60 2e 0a 20 20  len() - to]`..  
fd50: 20 20 2f 2f 2f 20 4f 74 68 65 72 77 69 73 65 20    /// Otherwise 
fd60: 60 61 72 72 61 79 5b 66 72 6f 6d 2e 2e 74 6f 5d  `array[from..to]
fd70: 60 2e 0a 20 20 20 20 53 75 62 73 6c 69 63 65 20  `..    Subslice 
fd80: 7b 0a 20 20 20 20 20 20 20 20 66 72 6f 6d 3a 20  {.        from: 
fd90: 75 33 32 2c 0a 20 20 20 20 20 20 20 20 74 6f 3a  u32,.        to:
fda0: 20 75 33 32 2c 0a 20 20 20 20 20 20 20 20 2f 2f   u32,.        //
fdb0: 2f 20 57 68 65 74 68 65 72 20 60 74 6f 60 20 63  / Whether `to` c
fdc0: 6f 75 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73  ounts from the s
fdd0: 74 61 72 74 20 6f 72 20 65 6e 64 20 6f 66 20 74  tart or end of t
fde0: 68 65 20 61 72 72 61 79 2f 73 6c 69 63 65 2e 0a  he array/slice..
fdf0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 46 6f 72 20          /// For 
fe00: 60 50 6c 61 63 65 45 6c 65 6d 60 73 20 74 68 69  `PlaceElem`s thi
fe10: 73 20 69 73 20 60 74 72 75 65 60 20 69 66 20 61  s is `true` if a
fe20: 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 62  nd only if the b
fe30: 61 73 65 20 69 73 20 61 20 73 6c 69 63 65 2e 0a  ase is a slice..
fe40: 20 20 20 20 20 20 20 20 2f 2f 2f 20 46 6f 72 20          /// For 
fe50: 60 50 72 6f 6a 65 63 74 69 6f 6e 4b 69 6e 64 60  `ProjectionKind`
fe60: 2c 20 74 68 69 73 20 63 61 6e 20 61 6c 73 6f 20  , this can also 
fe70: 62 65 20 60 74 72 75 65 60 20 66 6f 72 20 61 72  be `true` for ar
fe80: 72 61 79 73 2e 0a 20 20 20 20 20 20 20 20 66 72  rays..        fr
fe90: 6f 6d 5f 65 6e 64 3a 20 62 6f 6f 6c 2c 0a 20 20  om_end: bool,.  
fea0: 20 20 7d 2c 0a 0a 20 20 20 20 2f 2f 2f 20 22 44    },..    /// "D
feb0: 6f 77 6e 63 61 73 74 22 20 74 6f 20 61 20 76 61  owncast" to a va
fec0: 72 69 61 6e 74 20 6f 66 20 61 6e 20 41 44 54 2e  riant of an ADT.
fed0: 20 43 75 72 72 65 6e 74 6c 79 2c 20 77 65 20 6f   Currently, we o
fee0: 6e 6c 79 20 69 6e 74 72 6f 64 75 63 65 0a 20 20  nly introduce.  
fef0: 20 20 2f 2f 2f 20 74 68 69 73 20 66 6f 72 20 41    /// this for A
ff00: 44 54 73 20 77 69 74 68 20 6d 6f 72 65 20 74 68  DTs with more th
ff10: 61 6e 20 6f 6e 65 20 76 61 72 69 61 6e 74 2e 20  an one variant. 
ff20: 49 74 20 6d 61 79 20 62 65 20 62 65 74 74 65 72  It may be better
ff30: 20 74 6f 0a 20 20 20 20 2f 2f 2f 20 6a 75 73 74   to.    /// just
ff40: 20 69 6e 74 72 6f 64 75 63 65 20 69 74 20 61 6c   introduce it al
ff50: 77 61 79 73 2c 20 6f 72 20 61 6c 77 61 79 73 20  ways, or always 
ff60: 66 6f 72 20 65 6e 75 6d 73 2e 0a 20 20 20 20 2f  for enums..    /
ff70: 2f 2f 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 69  //.    /// The i
ff80: 6e 63 6c 75 64 65 64 20 53 79 6d 62 6f 6c 20 69  ncluded Symbol i
ff90: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
ffa0: 65 20 76 61 72 69 61 6e 74 2c 20 75 73 65 64 20  e variant, used 
ffb0: 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 4d 49 52  for printing MIR
ffc0: 2e 0a 20 20 20 20 44 6f 77 6e 63 61 73 74 28 4f  ..    Downcast(O
ffd0: 70 74 69 6f 6e 3c 53 79 6d 62 6f 6c 3e 2c 20 56  ption<Symbol>, V
ffe0: 61 72 69 61 6e 74 49 64 78 29 2c 0a 7d 0a 0a 69  ariantIdx),.}..i
fff0: 6d 70 6c 3c 56 2c 20 54 3e 20 50 72 6f 6a 65 63  mpl<V, T> Projec
10000 74 69 6f 6e 45 6c 65 6d 3c 56 2c 20 54 3e 20 7b  tionElem<V, T> {
10010 0a 20 20 20 20 2f 2f 2f 20 52 65 74 75 72 6e 73  .    /// Returns
10020 20 60 74 72 75 65 60 20 69 66 20 74 68 65 20 74   `true` if the t
10030 61 72 67 65 74 20 6f 66 20 74 68 69 73 20 70 72  arget of this pr
10040 6f 6a 65 63 74 69 6f 6e 20 6d 61 79 20 72 65 66  ojection may ref
10050 65 72 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  er to a differen
10060 74 20 72 65 67 69 6f 6e 20 6f 66 20 6d 65 6d 6f  t region of memo
10070 72 79 0a 20 20 20 20 2f 2f 2f 20 74 68 61 6e 20  ry.    /// than 
10080 74 68 65 20 62 61 73 65 2e 0a 20 20 20 20 66 6e  the base..    fn
10090 20 69 73 5f 69 6e 64 69 72 65 63 74 28 26 73 65   is_indirect(&se
100a0 6c 66 29 20 2d 3e 20 62 6f 6f 6c 20 7b 0a 20 20  lf) -> bool {.  
100b0 20 20 20 20 20 20 6d 61 74 63 68 20 73 65 6c 66        match self
100c0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53   {.            S
100d0 65 6c 66 3a 3a 44 65 72 65 66 20 3d 3e 20 74 72  elf::Deref => tr
100e0 75 65 2c 0a 0a 20 20 20 20 20 20 20 20 20 20 20  ue,..           
100f0 20 7c 20 53 65 6c 66 3a 3a 46 69 65 6c 64 28 5f   | Self::Field(_
10100 2c 20 5f 29 0a 20 20 20 20 20 20 20 20 20 20 20  , _).           
10110 20 7c 20 53 65 6c 66 3a 3a 49 6e 64 65 78 28 5f   | Self::Index(_
10120 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 20  ).            | 
10130 53 65 6c 66 3a 3a 43 6f 6e 73 74 61 6e 74 49 6e  Self::ConstantIn
10140 64 65 78 20 7b 20 2e 2e 20 7d 0a 20 20 20 20 20  dex { .. }.     
10150 20 20 20 20 20 20 20 7c 20 53 65 6c 66 3a 3a 53         | Self::S
10160 75 62 73 6c 69 63 65 20 7b 20 2e 2e 20 7d 0a 20  ubslice { .. }. 
10170 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 65 6c             | Sel
10180 66 3a 3a 44 6f 77 6e 63 61 73 74 28 5f 2c 20 5f  f::Downcast(_, _
10190 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e  ).            =>
101a0 20 66 61 6c 73 65 0a 20 20 20 20 20 20 20 20 7d   false.        }
101b0 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2f 2f 20 41 6c  .    }.}../// Al
101c0 69 61 73 20 66 6f 72 20 70 72 6f 6a 65 63 74 69  ias for projecti
101d0 6f 6e 73 20 61 73 20 74 68 65 79 20 61 70 70 65  ons as they appe
101e0 61 72 20 69 6e 20 70 6c 61 63 65 73 2c 20 77 68  ar in places, wh
101f0 65 72 65 20 74 68 65 20 62 61 73 65 20 69 73 20  ere the base is 
10200 61 20 70 6c 61 63 65 0a 2f 2f 2f 20 61 6e 64 20  a place./// and 
10210 74 68 65 20 69 6e 64 65 78 20 69 73 20 61 20 6c  the index is a l
10220 6f 63 61 6c 2e 0a 70 75 62 20 74 79 70 65 20 50  ocal..pub type P
10230 6c 61 63 65 45 6c 65 6d 3c 27 74 63 78 3e 20 3d  laceElem<'tcx> =
10240 20 50 72 6f 6a 65 63 74 69 6f 6e 45 6c 65 6d 3c   ProjectionElem<
10250 4c 6f 63 61 6c 2c 20 54 79 3c 27 74 63 78 3e 3e  Local, Ty<'tcx>>
10260 3b 0a 0a 69 6d 70 6c 3c 27 74 63 78 3e 20 43 6f  ;..impl<'tcx> Co
10270 70 79 20 66 6f 72 20 50 6c 61 63 65 45 6c 65 6d  py for PlaceElem
10280 3c 27 74 63 78 3e 20 7b 20 7d 0a 0a 2f 2f 20 41  <'tcx> { }..// A
10290 74 20 6c 65 61 73 74 20 6f 6e 20 36 34 20 62 69  t least on 64 bi
102a0 74 20 73 79 73 74 65 6d 73 2c 20 60 50 6c 61 63  t systems, `Plac
102b0 65 45 6c 65 6d 60 20 73 68 6f 75 6c 64 20 6e 6f  eElem` should no
102c0 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  t be larger than
102d0 20 74 77 6f 20 70 6f 69 6e 74 65 72 73 2e 0a 23   two pointers..#
102e0 5b 63 66 67 28 74 61 72 67 65 74 5f 61 72 63 68  [cfg(target_arch
102f0 20 3d 20 22 78 38 36 5f 36 34 22 29 5d 0a 73 74   = "x86_64")].st
10300 61 74 69 63 5f 61 73 73 65 72 74 5f 73 69 7a 65  atic_assert_size
10310 21 28 50 6c 61 63 65 45 6c 65 6d 3c 27 5f 3e 2c  !(PlaceElem<'_>,
10320 20 31 36 29 3b 0a 0a 2f 2f 2f 20 41 6c 69 61 73   16);../// Alias
10330 20 66 6f 72 20 70 72 6f 6a 65 63 74 69 6f 6e 73   for projections
10340 20 61 73 20 74 68 65 79 20 61 70 70 65 61 72 20   as they appear 
10350 69 6e 20 60 55 73 65 72 54 79 70 65 50 72 6f 6a  in `UserTypeProj
10360 65 63 74 69 6f 6e 60 2c 20 77 68 65 72 65 20 77  ection`, where w
10370 65 0a 2f 2f 2f 20 6e 65 65 64 20 6e 65 69 74 68  e./// need neith
10380 65 72 20 74 68 65 20 60 56 60 20 70 61 72 61 6d  er the `V` param
10390 65 74 65 72 20 66 6f 72 20 60 49 6e 64 65 78 60  eter for `Index`
103a0 20 6e 6f 72 20 74 68 65 20 60 54 60 20 66 6f 72   nor the `T` for
103b0 20 60 46 69 65 6c 64 60 2e 0a 70 75 62 20 74 79   `Field`..pub ty
103c0 70 65 20 50 72 6f 6a 65 63 74 69 6f 6e 4b 69 6e  pe ProjectionKin
103d0 64 20 3d 20 50 72 6f 6a 65 63 74 69 6f 6e 45 6c  d = ProjectionEl
103e0 65 6d 3c 28 29 2c 20 28 29 3e 3b 0a 0a 72 75 73  em<(), ()>;..rus
103f0 74 63 5f 69 6e 64 65 78 3a 3a 6e 65 77 74 79 70  tc_index::newtyp
10400 65 5f 69 6e 64 65 78 21 20 7b 0a 20 20 20 20 70  e_index! {.    p
10410 75 62 20 73 74 72 75 63 74 20 46 69 65 6c 64 20  ub struct Field 
10420 7b 0a 20 20 20 20 20 20 20 20 64 65 72 69 76 65  {.        derive
10430 20 5b 48 61 73 68 53 74 61 62 6c 65 5d 0a 20 20   [HashStable].  
10440 20 20 20 20 20 20 44 45 42 55 47 5f 46 4f 52 4d        DEBUG_FORM
10450 41 54 20 3d 20 22 66 69 65 6c 64 5b 7b 7d 5d 22  AT = "field[{}]"
10460 0a 20 20 20 20 7d 0a 7d 0a 0a 23 5b 64 65 72 69  .    }.}..#[deri
10470 76 65 28 43 6c 6f 6e 65 2c 20 43 6f 70 79 2c 20  ve(Clone, Copy, 
10480 44 65 62 75 67 2c 20 50 61 72 74 69 61 6c 45 71  Debug, PartialEq
10490 2c 20 45 71 2c 20 50 61 72 74 69 61 6c 4f 72 64  , Eq, PartialOrd
104a0 2c 20 4f 72 64 2c 20 48 61 73 68 29 5d 0a 70 75  , Ord, Hash)].pu
104b0 62 20 73 74 72 75 63 74 20 50 6c 61 63 65 52 65  b struct PlaceRe
104c0 66 3c 27 61 2c 20 27 74 63 78 3e 20 7b 0a 20 20  f<'a, 'tcx> {.  
104d0 20 20 70 75 62 20 62 61 73 65 3a 20 26 27 61 20    pub base: &'a 
104e0 50 6c 61 63 65 42 61 73 65 3c 27 74 63 78 3e 2c  PlaceBase<'tcx>,
104f0 0a 20 20 20 20 70 75 62 20 70 72 6f 6a 65 63 74  .    pub project
10500 69 6f 6e 3a 20 26 27 61 20 5b 50 6c 61 63 65 45  ion: &'a [PlaceE
10510 6c 65 6d 3c 27 74 63 78 3e 5d 2c 0a 7d 0a 0a 69  lem<'tcx>],.}..i
10520 6d 70 6c 3c 27 74 63 78 3e 20 50 6c 61 63 65 3c  mpl<'tcx> Place<
10530 27 74 63 78 3e 20 7b 0a 20 20 20 20 2f 2f 20 46  'tcx> {.    // F
10540 49 58 4d 45 20 63 68 61 6e 67 65 20 74 68 69 73  IXME change this
10550 20 74 6f 20 61 20 63 6f 6e 73 74 20 66 6e 20 62   to a const fn b
10560 79 20 61 6c 73 6f 20 6d 61 6b 69 6e 67 20 4c 69  y also making Li
10570 73 74 3a 3a 65 6d 70 74 79 20 61 20 63 6f 6e 73  st::empty a cons
10580 74 20 66 6e 2e 0a 20 20 20 20 70 75 62 20 66 6e  t fn..    pub fn
10590 20 72 65 74 75 72 6e 5f 70 6c 61 63 65 28 29 20   return_place() 
105a0 2d 3e 20 50 6c 61 63 65 3c 27 74 63 78 3e 20 7b  -> Place<'tcx> {
105b0 0a 20 20 20 20 20 20 20 20 50 6c 61 63 65 20 7b  .        Place {
105c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 61 73  .            bas
105d0 65 3a 20 50 6c 61 63 65 42 61 73 65 3a 3a 4c 6f  e: PlaceBase::Lo
105e0 63 61 6c 28 52 45 54 55 52 4e 5f 50 4c 41 43 45  cal(RETURN_PLACE
105f0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ),.            p
10600 72 6f 6a 65 63 74 69 6f 6e 3a 20 4c 69 73 74 3a  rojection: List:
10610 3a 65 6d 70 74 79 28 29 2c 0a 20 20 20 20 20 20  :empty(),.      
10620 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
10630 2f 2f 20 52 65 74 75 72 6e 73 20 60 74 72 75 65  // Returns `true
10640 60 20 69 66 20 74 68 69 73 20 60 50 6c 61 63 65  ` if this `Place
10650 60 20 63 6f 6e 74 61 69 6e 73 20 61 20 60 44 65  ` contains a `De
10660 72 65 66 60 20 70 72 6f 6a 65 63 74 69 6f 6e 2e  ref` projection.
10670 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f  .    ///.    ///
10680 20 49 66 20 60 50 6c 61 63 65 3a 3a 69 73 5f 69   If `Place::is_i
10690 6e 64 69 72 65 63 74 60 20 72 65 74 75 72 6e 73  ndirect` returns
106a0 20 66 61 6c 73 65 2c 20 74 68 65 20 63 61 6c 6c   false, the call
106b0 65 72 20 6b 6e 6f 77 73 20 74 68 61 74 20 74 68  er knows that th
106c0 65 20 60 50 6c 61 63 65 60 20 72 65 66 65 72 73  e `Place` refers
106d0 20 74 6f 20 74 68 65 0a 20 20 20 20 2f 2f 2f 20   to the.    /// 
106e0 73 61 6d 65 20 72 65 67 69 6f 6e 20 6f 66 20 6d  same region of m
106f0 65 6d 6f 72 79 20 61 73 20 69 74 73 20 62 61 73  emory as its bas
10700 65 2e 0a 20 20 20 20 70 75 62 20 66 6e 20 69 73  e..    pub fn is
10710 5f 69 6e 64 69 72 65 63 74 28 26 73 65 6c 66 29  _indirect(&self)
10720 20 2d 3e 20 62 6f 6f 6c 20 7b 0a 20 20 20 20 20   -> bool {.     
10730 20 20 20 73 65 6c 66 2e 70 72 6f 6a 65 63 74 69     self.projecti
10740 6f 6e 2e 69 74 65 72 28 29 2e 61 6e 79 28 7c 65  on.iter().any(|e
10750 6c 65 6d 7c 20 65 6c 65 6d 2e 69 73 5f 69 6e 64  lem| elem.is_ind
10760 69 72 65 63 74 28 29 29 0a 20 20 20 20 7d 0a 0a  irect()).    }..
10770 20 20 20 20 2f 2f 2f 20 46 69 6e 64 73 20 74 68      /// Finds th
10780 65 20 69 6e 6e 65 72 6d 6f 73 74 20 60 4c 6f 63  e innermost `Loc
10790 61 6c 60 20 66 72 6f 6d 20 74 68 69 73 20 60 50  al` from this `P
107a0 6c 61 63 65 60 2c 20 2a 69 66 2a 20 69 74 20 69  lace`, *if* it i
107b0 73 20 65 69 74 68 65 72 20 61 20 6c 6f 63 61 6c  s either a local
107c0 20 69 74 73 65 6c 66 20 6f 72 0a 20 20 20 20 2f   itself or.    /
107d0 2f 2f 20 61 20 73 69 6e 67 6c 65 20 64 65 72 65  // a single dere
107e0 66 20 6f 66 20 61 20 6c 6f 63 61 6c 2e 0a 20 20  f of a local..  
107f0 20 20 2f 2f 0a 20 20 20 20 2f 2f 20 46 49 58 4d    //.    // FIXM
10800 45 3a 20 63 61 6e 20 77 65 20 73 61 66 65 6c 79  E: can we safely
10810 20 73 77 61 70 20 74 68 65 20 73 65 6d 61 6e 74   swap the semant
10820 69 63 73 20 6f 66 20 60 66 6e 20 62 61 73 65 5f  ics of `fn base_
10830 6c 6f 63 61 6c 60 20 62 65 6c 6f 77 20 69 6e 20  local` below in 
10840 68 65 72 65 20 69 6e 73 74 65 61 64 3f 0a 20 20  here instead?.  
10850 20 20 70 75 62 20 66 6e 20 6c 6f 63 61 6c 5f 6f    pub fn local_o
10860 72 5f 64 65 72 65 66 5f 6c 6f 63 61 6c 28 26 73  r_deref_local(&s
10870 65 6c 66 29 20 2d 3e 20 4f 70 74 69 6f 6e 3c 4c  elf) -> Option<L
10880 6f 63 61 6c 3e 20 7b 0a 20 20 20 20 20 20 20 20  ocal> {.        
10890 6d 61 74 63 68 20 73 65 6c 66 2e 61 73 5f 72 65  match self.as_re
108a0 66 28 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  f() {.          
108b0 20 20 50 6c 61 63 65 52 65 66 20 7b 0a 20 20 20    PlaceRef {.   
108c0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 61 73               bas
108d0 65 3a 20 26 50 6c 61 63 65 42 61 73 65 3a 3a 4c  e: &PlaceBase::L
108e0 6f 63 61 6c 28 6c 6f 63 61 6c 29 2c 0a 20 20 20  ocal(local),.   
108f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f               pro
10900 6a 65 63 74 69 6f 6e 3a 20 26 5b 5d 2c 0a 20 20  jection: &[],.  
10910 20 20 20 20 20 20 20 20 20 20 7d 20 7c 0a 20 20            } |.  
10920 20 20 20 20 20 20 20 20 20 20 50 6c 61 63 65 52            PlaceR
10930 65 66 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ef {.           
10940 20 20 20 20 20 62 61 73 65 3a 20 26 50 6c 61 63       base: &Plac
10950 65 42 61 73 65 3a 3a 4c 6f 63 61 6c 28 6c 6f 63  eBase::Local(loc
10960 61 6c 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  al),.           
10970 20 20 20 20 20 70 72 6f 6a 65 63 74 69 6f 6e 3a       projection:
10980 20 26 5b 50 72 6f 6a 65 63 74 69 6f 6e 45 6c 65   &[ProjectionEle
10990 6d 3a 3a 44 65 72 65 66 5d 2c 0a 20 20 20 20 20  m::Deref],.     
109a0 20 20 20 20 20 20 20 7d 20 3d 3e 20 53 6f 6d 65         } => Some
109b0 28 6c 6f 63 61 6c 29 2c 0a 20 20 20 20 20 20 20  (local),.       
109c0 20 20 20 20 20 5f 20 3d 3e 20 4e 6f 6e 65 2c 0a       _ => None,.
109d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
109e0 0a 20 20 20 20 2f 2f 2f 20 49 66 20 74 68 69 73  .    /// If this
109f0 20 70 6c 61 63 65 20 72 65 70 72 65 73 65 6e 74   place represent
10a00 73 20 61 20 6c 6f 63 61 6c 20 76 61 72 69 61 62  s a local variab
10a10 6c 65 20 6c 69 6b 65 20 60 5f 58 60 20 77 69 74  le like `_X` wit
10a20 68 20 6e 6f 0a 20 20 20 20 2f 2f 2f 20 70 72 6f  h no.    /// pro
10a30 6a 65 63 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e  jections, return
10a40 20 60 53 6f 6d 65 28 5f 58 29 60 2e 0a 20 20 20   `Some(_X)`..   
10a50 20 70 75 62 20 66 6e 20 61 73 5f 6c 6f 63 61 6c   pub fn as_local
10a60 28 26 73 65 6c 66 29 20 2d 3e 20 4f 70 74 69 6f  (&self) -> Optio
10a70 6e 3c 4c 6f 63 61 6c 3e 20 7b 0a 20 20 20 20 20  n<Local> {.     
10a80 20 20 20 73 65 6c 66 2e 61 73 5f 72 65 66 28 29     self.as_ref()
10a90 2e 61 73 5f 6c 6f 63 61 6c 28 29 0a 20 20 20 20  .as_local().    
10aa0 7d 0a 0a 20 20 20 20 70 75 62 20 66 6e 20 61 73  }..    pub fn as
10ab0 5f 72 65 66 28 26 73 65 6c 66 29 20 2d 3e 20 50  _ref(&self) -> P
10ac0 6c 61 63 65 52 65 66 3c 27 5f 2c 20 27 74 63 78  laceRef<'_, 'tcx
10ad0 3e 20 7b 0a 20 20 20 20 20 20 20 20 50 6c 61 63  > {.        Plac
10ae0 65 52 65 66 20 7b 0a 20 20 20 20 20 20 20 20 20  eRef {.         
10af0 20 20 20 62 61 73 65 3a 20 26 73 65 6c 66 2e 62     base: &self.b
10b00 61 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ase,.           
10b10 20 70 72 6f 6a 65 63 74 69 6f 6e 3a 20 26 73 65   projection: &se
10b20 6c 66 2e 70 72 6f 6a 65 63 74 69 6f 6e 2c 0a 20  lf.projection,. 
10b30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 7d         }.    }.}
10b40 0a 0a 69 6d 70 6c 20 46 72 6f 6d 3c 4c 6f 63 61  ..impl From<Loca
10b50 6c 3e 20 66 6f 72 20 50 6c 61 63 65 3c 27 5f 3e  l> for Place<'_>
10b60 20 7b 0a 20 20 20 20 66 6e 20 66 72 6f 6d 28 6c   {.    fn from(l
10b70 6f 63 61 6c 3a 20 4c 6f 63 61 6c 29 20 2d 3e 20  ocal: Local) -> 
10b80 53 65 6c 66 20 7b 0a 20 20 20 20 20 20 20 20 50  Self {.        P
10b90 6c 61 63 65 20 7b 0a 20 20 20 20 20 20 20 20 20  lace {.         
10ba0 20 20 20 62 61 73 65 3a 20 6c 6f 63 61 6c 2e 69     base: local.i
10bb0 6e 74 6f 28 29 2c 0a 20 20 20 20 20 20 20 20 20  nto(),.         
10bc0 20 20 20 70 72 6f 6a 65 63 74 69 6f 6e 3a 20 4c     projection: L
10bd0 69 73 74 3a 3a 65 6d 70 74 79 28 29 2c 0a 20 20  ist::empty(),.  
10be0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 7d 0a        }.    }.}.
10bf0 0a 69 6d 70 6c 20 46 72 6f 6d 3c 4c 6f 63 61 6c  .impl From<Local
10c00 3e 20 66 6f 72 20 50 6c 61 63 65 42 61 73 65 3c  > for PlaceBase<
10c10 27 5f 3e 20 7b 0a 20 20 20 20 66 6e 20 66 72 6f  '_> {.    fn fro
10c20 6d 28 6c 6f 63 61 6c 3a 20 4c 6f 63 61 6c 29 20  m(local: Local) 
10c30 2d 3e 20 53 65 6c 66 20 7b 0a 20 20 20 20 20 20  -> Self {.      
10c40 20 20 50 6c 61 63 65 42 61 73 65 3a 3a 4c 6f 63    PlaceBase::Loc
10c50 61 6c 28 6c 6f 63 61 6c 29 0a 20 20 20 20 7d 0a  al(local).    }.
10c60 7d 0a 0a 69 6d 70 6c 3c 27 61 2c 20 27 74 63 78  }..impl<'a, 'tcx
10c70 3e 20 50 6c 61 63 65 52 65 66 3c 27 61 2c 20 27  > PlaceRef<'a, '
10c80 74 63 78 3e 20 7b 0a 20 20 20 20 2f 2f 2f 20 46  tcx> {.    /// F
10c90 69 6e 64 73 20 74 68 65 20 69 6e 6e 65 72 6d 6f  inds the innermo
10ca0 73 74 20 60 4c 6f 63 61 6c 60 20 66 72 6f 6d 20  st `Local` from 
10cb0 74 68 69 73 20 60 50 6c 61 63 65 60 2c 20 2a 69  this `Place`, *i
10cc0 66 2a 20 69 74 20 69 73 20 65 69 74 68 65 72 20  f* it is either 
10cd0 61 20 6c 6f 63 61 6c 20 69 74 73 65 6c 66 20 6f  a local itself o
10ce0 72 0a 20 20 20 20 2f 2f 2f 20 61 20 73 69 6e 67  r.    /// a sing
10cf0 6c 65 20 64 65 72 65 66 20 6f 66 20 61 20 6c 6f  le deref of a lo
10d00 63 61 6c 2e 0a 20 20 20 20 2f 2f 0a 20 20 20 20  cal..    //.    
10d10 2f 2f 20 46 49 58 4d 45 3a 20 63 61 6e 20 77 65  // FIXME: can we
10d20 20 73 61 66 65 6c 79 20 73 77 61 70 20 74 68 65   safely swap the
10d30 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 60 66   semantics of `f
10d40 6e 20 62 61 73 65 5f 6c 6f 63 61 6c 60 20 62 65  n base_local` be
10d50 6c 6f 77 20 69 6e 20 68 65 72 65 20 69 6e 73 74  low in here inst
10d60 65 61 64 3f 0a 20 20 20 20 70 75 62 20 66 6e 20  ead?.    pub fn 
10d70 6c 6f 63 61 6c 5f 6f 72 5f 64 65 72 65 66 5f 6c  local_or_deref_l
10d80 6f 63 61 6c 28 26 73 65 6c 66 29 20 2d 3e 20 4f  ocal(&self) -> O
10d90 70 74 69 6f 6e 3c 4c 6f 63 61 6c 3e 20 7b 0a 20  ption<Local> {. 
10da0 20 20 20 20 20 20 20 6d 61 74 63 68 20 73 65 6c         match sel
10db0 66 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  f {.            
10dc0 50 6c 61 63 65 52 65 66 20 7b 0a 20 20 20 20 20  PlaceRef {.     
10dd0 20 20 20 20 20 20 20 20 20 20 20 62 61 73 65 3a             base:
10de0 20 50 6c 61 63 65 42 61 73 65 3a 3a 4c 6f 63 61   PlaceBase::Loca
10df0 6c 28 6c 6f 63 61 6c 29 2c 0a 20 20 20 20 20 20  l(local),.      
10e00 20 20 20 20 20 20 20 20 20 20 70 72 6f 6a 65 63            projec
10e10 74 69 6f 6e 3a 20 5b 5d 2c 0a 20 20 20 20 20 20  tion: [],.      
10e20 20 20 20 20 20 20 7d 20 7c 0a 20 20 20 20 20 20        } |.      
10e30 20 20 20 20 20 20 50 6c 61 63 65 52 65 66 20 7b        PlaceRef {
10e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10e50 20 62 61 73 65 3a 20 50 6c 61 63 65 42 61 73 65   base: PlaceBase
10e60 3a 3a 4c 6f 63 61 6c 28 6c 6f 63 61 6c 29 2c 0a  ::Local(local),.
10e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e80 70 72 6f 6a 65 63 74 69 6f 6e 3a 20 5b 50 72 6f  projection: [Pro
10e90 6a 65 63 74 69 6f 6e 45 6c 65 6d 3a 3a 44 65 72  jectionElem::Der
10ea0 65 66 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ef],.           
10eb0 20 7d 20 3d 3e 20 53 6f 6d 65 28 2a 6c 6f 63 61   } => Some(*loca
10ec0 6c 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  l),.            
10ed0 5f 20 3d 3e 20 4e 6f 6e 65 2c 0a 20 20 20 20 20  _ => None,.     
10ee0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
10ef0 2f 2f 2f 20 49 66 20 74 68 69 73 20 70 6c 61 63  /// If this plac
10f00 65 20 72 65 70 72 65 73 65 6e 74 73 20 61 20 6c  e represents a l
10f10 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20 6c 69  ocal variable li
10f20 6b 65 20 60 5f 58 60 20 77 69 74 68 20 6e 6f 0a  ke `_X` with no.
10f30 20 20 20 20 2f 2f 2f 20 70 72 6f 6a 65 63 74 69      /// projecti
10f40 6f 6e 73 2c 20 72 65 74 75 72 6e 20 60 53 6f 6d  ons, return `Som
10f50 65 28 5f 58 29 60 2e 0a 20 20 20 20 70 75 62 20  e(_X)`..    pub 
10f60 66 6e 20 61 73 5f 6c 6f 63 61 6c 28 26 73 65 6c  fn as_local(&sel
10f70 66 29 20 2d 3e 20 4f 70 74 69 6f 6e 3c 4c 6f 63  f) -> Option<Loc
10f80 61 6c 3e 20 7b 0a 20 20 20 20 20 20 20 20 6d 61  al> {.        ma
10f90 74 63 68 20 73 65 6c 66 20 7b 0a 20 20 20 20 20  tch self {.     
10fa0 20 20 20 20 20 20 20 50 6c 61 63 65 52 65 66 20         PlaceRef 
10fb0 7b 20 62 61 73 65 3a 20 50 6c 61 63 65 42 61 73  { base: PlaceBas
10fc0 65 3a 3a 4c 6f 63 61 6c 28 6c 29 2c 20 70 72 6f  e::Local(l), pro
10fd0 6a 65 63 74 69 6f 6e 3a 20 5b 5d 20 7d 20 3d 3e  jection: [] } =>
10fe0 20 53 6f 6d 65 28 2a 6c 29 2c 0a 20 20 20 20 20   Some(*l),.     
10ff0 20 20 20 20 20 20 20 5f 20 3d 3e 20 4e 6f 6e 65         _ => None
11000 2c 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ,.        }.    
11010 7d 0a 7d 0a 0a 69 6d 70 6c 20 44 65 62 75 67 20  }.}..impl Debug 
11020 66 6f 72 20 50 6c 61 63 65 3c 27 5f 3e 20 7b 0a  for Place<'_> {.
11030 20 20 20 20 66 6e 20 66 6d 74 28 26 73 65 6c 66      fn fmt(&self
11040 2c 20 66 6d 74 3a 20 26 6d 75 74 20 46 6f 72 6d  , fmt: &mut Form
11050 61 74 74 65 72 3c 27 5f 3e 29 20 2d 3e 20 66 6d  atter<'_>) -> fm
11060 74 3a 3a 52 65 73 75 6c 74 20 7b 0a 20 20 20 20  t::Result {.    
11070 20 20 20 20 66 6f 72 20 65 6c 65 6d 20 69 6e 20      for elem in 
11080 73 65 6c 66 2e 70 72 6f 6a 65 63 74 69 6f 6e 2e  self.projection.
11090 69 74 65 72 28 29 2e 72 65 76 28 29 20 7b 0a 20  iter().rev() {. 
110a0 20 20 20 20 20 20 20 20 20 20 20 6d 61 74 63 68             match
110b0 20 65 6c 65 6d 20 7b 0a 20 20 20 20 20 20 20 20   elem {.        
110c0 20 20 20 20 20 20 20 20 50 72 6f 6a 65 63 74 69          Projecti
110d0 6f 6e 45 6c 65 6d 3a 3a 44 6f 77 6e 63 61 73 74  onElem::Downcast
110e0 28 5f 2c 20 5f 29 20 7c 20 50 72 6f 6a 65 63 74  (_, _) | Project
110f0 69 6f 6e 45 6c 65 6d 3a 3a 46 69 65 6c 64 28 5f  ionElem::Field(_
11100 2c 20 5f 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20  , _) => {.      
11110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 72                wr
11120 69 74 65 21 28 66 6d 74 2c 20 22 28 22 29 2e 75  ite!(fmt, "(").u
11130 6e 77 72 61 70 28 29 3b 0a 20 20 20 20 20 20 20  nwrap();.       
11140 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
11150 20 20 20 20 20 20 20 20 20 20 20 50 72 6f 6a 65             Proje
11160 63 74 69 6f 6e 45 6c 65 6d 3a 3a 44 65 72 65 66  ctionElem::Deref
11170 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20   => {.          
11180 20 20 20 20 20 20 20 20 20 20 77 72 69 74 65 21            write!
11190 28 66 6d 74 2c 20 22 28 2a 22 29 2e 75 6e 77 72  (fmt, "(*").unwr
111a0 61 70 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ap();.          
111b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
111c0 20 20 20 20 20 20 20 20 50 72 6f 6a 65 63 74 69          Projecti
111d0 6f 6e 45 6c 65 6d 3a 3a 49 6e 64 65 78 28 5f 29  onElem::Index(_)
111e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
111f0 20 7c 20 50 72 6f 6a 65 63 74 69 6f 6e 45 6c 65   | ProjectionEle
11200 6d 3a 3a 43 6f 6e 73 74 61 6e 74 49 6e 64 65 78  m::ConstantIndex
11210 20 7b 20 2e 2e 20 7d 0a 20 20 20 20 20 20 20 20   { .. }.        
11220 20 20 20 20 20 20 20 20 7c 20 50 72 6f 6a 65 63          | Projec
11230 74 69 6f 6e 45 6c 65 6d 3a 3a 53 75 62 73 6c 69  tionElem::Subsli
11240 63 65 20 7b 20 2e 2e 20 7d 20 3d 3e 20 7b 7d 0a  ce { .. } => {}.
11250 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
11260 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
11270 20 77 72 69 74 65 21 28 66 6d 74 2c 20 22 7b 3a   write!(fmt, "{:
11280 3f 7d 22 2c 20 73 65 6c 66 2e 62 61 73 65 29 3f  ?}", self.base)?
11290 3b 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 20 65  ;..        for e
112a0 6c 65 6d 20 69 6e 20 73 65 6c 66 2e 70 72 6f 6a  lem in self.proj
112b0 65 63 74 69 6f 6e 2e 69 74 65 72 28 29 20 7b 0a  ection.iter() {.
112c0 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 74 63              matc
112d0 68 20 65 6c 65 6d 20 7b 0a 20 20 20 20 20 20 20  h elem {.       
112e0 20 20 20 20 20 20 20 20 20 50 72 6f 6a 65 63 74           Project
112f0 69 6f 6e 45 6c 65 6d 3a 3a 44 6f 77 6e 63 61 73  ionElem::Downcas
11300 74 28 53 6f 6d 65 28 6e 61 6d 65 29 2c 20 5f 69  t(Some(name), _i
11310 6e 64 65 78 29 20 3d 3e 20 7b 0a 20 20 20 20 20  ndex) => {.     
11320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
11330 72 69 74 65 21 28 66 6d 74 2c 20 22 20 61 73 20  rite!(fmt, " as 
11340 7b 7d 29 22 2c 20 6e 61 6d 65 29 3f 3b 0a 20 20  {})", name)?;.  
11350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
11360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11370 50 72 6f 6a 65 63 74 69 6f 6e 45 6c 65 6d 3a 3a  ProjectionElem::
11380 44 6f 77 6e 63 61 73 74 28 4e 6f 6e 65 2c 20 69  Downcast(None, i
11390 6e 64 65 78 29 20 3d 3e 20 7b 0a 20 20 20 20 20  ndex) => {.     
113a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
113b0 72 69 74 65 21 28 66 6d 74 2c 20 22 20 61 73 20  rite!(fmt, " as 
113c0 76 61 72 69 61 6e 74 23 7b 3a 3f 7d 29 22 2c 20  variant#{:?})", 
113d0 69 6e 64 65 78 29 3f 3b 0a 20 20 20 20 20 20 20  index)?;.       
113e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
113f0 20 20 20 20 20 20 20 20 20 20 20 50 72 6f 6a 65             Proje
11400 63 74 69 6f 6e 45 6c 65 6d 3a 3a 44 65 72 65 66  ctionElem::Deref
11410 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20   => {.          
11420 20 20 20 20 20 20 20 20 20 20 77 72 69 74 65 21            write!
11430 28 66 6d 74 2c 20 22 29 22 29 3f 3b 0a 20 20 20  (fmt, ")")?;.   
11440 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
11450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
11460 72 6f 6a 65 63 74 69 6f 6e 45 6c 65 6d 3a 3a 46  rojectionElem::F
11470 69 65 6c 64 28 66 69 65 6c 64 2c 20 74 79 29 20  ield(field, ty) 
11480 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  => {.           
11490 20 20 20 20 20 20 20 20 20 77 72 69 74 65 21 28           write!(
114a0 66 6d 74 2c 20 22 2e 7b 3a 3f 7d 3a 20 7b 3a 3f  fmt, ".{:?}: {:?
114b0 7d 29 22 2c 20 66 69 65 6c 64 2e 69 6e 64 65 78  })", field.index
114c0 28 29 2c 20 74 79 29 3f 3b 0a 20 20 20 20 20 20  (), ty)?;.      
114d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
114e0 20 20 20 20 20 20 20 20 20 20 20 20 50 72 6f 6a              Proj
114f0 65 63 74 69 6f 6e 45 6c 65 6d 3a 3a 49 6e 64 65  ectionElem::Inde
11500 78 28 72 65 66 20 69 6e 64 65 78 29 20 3d 3e 20  x(ref index) => 
11510 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
11520 20 20 20 20 20 20 77 72 69 74 65 21 28 66 6d 74        write!(fmt
11530 2c 20 22 5b 7b 3a 3f 7d 5d 22 2c 20 69 6e 64 65  , "[{:?}]", inde
11540 78 29 3f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  x)?;.           
11550 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
11560 20 20 20 20 20 20 20 50 72 6f 6a 65 63 74 69 6f         Projectio
11570 6e 45 6c 65 6d 3a 3a 43 6f 6e 73 74 61 6e 74 49  nElem::ConstantI
11580 6e 64 65 78 20 7b 20 6f 66 66 73 65 74 2c 20 6d  ndex { offset, m
11590 69 6e 5f 6c 65 6e 67 74 68 2c 20 66 72 6f 6d 5f  in_length, from_
115a0 65 6e 64 3a 20 66 61 6c 73 65 20 7d 20 3d 3e 20  end: false } => 
115b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
115c0 20 20 20 20 20 20 77 72 69 74 65 21 28 66 6d 74        write!(fmt
115d0 2c 20 22 5b 7b 3a 3f 7d 20 6f 66 20 7b 3a 3f 7d  , "[{:?} of {:?}
115e0 5d 22 2c 20 6f 66 66 73 65 74 2c 20 6d 69 6e 5f  ]", offset, min_
115f0 6c 65 6e 67 74 68 29 3f 3b 0a 20 20 20 20 20 20  length)?;.      
11600 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
11610 20 20 20 20 20 20 20 20 20 20 20 20 50 72 6f 6a              Proj
11620 65 63 74 69 6f 6e 45 6c 65 6d 3a 3a 43 6f 6e 73  ectionElem::Cons
11630 74 61 6e 74 49 6e 64 65 78 20 7b 20 6f 66 66 73  tantIndex { offs
11640 65 74 2c 20 6d 69 6e 5f 6c 65 6e 67 74 68 2c 20  et, min_length, 
11650 66 72 6f 6d 5f 65 6e 64 3a 20 74 72 75 65 20 7d  from_end: true }
11660 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20   => {.          
11670 20 20 20 20 20 20 20 20 20 20 77 72 69 74 65 21            write!
11680 28 66 6d 74 2c 20 22 5b 2d 7b 3a 3f 7d 20 6f 66  (fmt, "[-{:?} of
11690 20 7b 3a 3f 7d 5d 22 2c 20 6f 66 66 73 65 74 2c   {:?}]", offset,
116a0 20 6d 69 6e 5f 6c 65 6e 67 74 68 29 3f 3b 0a 20   min_length)?;. 
116b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
116c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
116d0 20 50 72 6f 6a 65 63 74 69 6f 6e 45 6c 65 6d 3a   ProjectionElem:
116e0 3a 53 75 62 73 6c 69 63 65 20 7b 20 66 72 6f 6d  :Subslice { from
116f0 2c 20 74 6f 2c 20 66 72 6f 6d 5f 65 6e 64 3a 20  , to, from_end: 
11700 74 72 75 65 20 7d 20 69 66 20 2a 74 6f 20 3d 3d  true } if *to ==
11710 20 30 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20   0 => {.        
11720 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74              writ
11730 65 21 28 66 6d 74 2c 20 22 5b 7b 3a 3f 7d 3a 5d  e!(fmt, "[{:?}:]
11740 22 2c 20 66 72 6f 6d 29 3f 3b 0a 20 20 20 20 20  ", from)?;.     
11750 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
11760 20 20 20 20 20 20 20 20 20 20 20 20 20 50 72 6f               Pro
11770 6a 65 63 74 69 6f 6e 45 6c 65 6d 3a 3a 53 75 62  jectionElem::Sub
11780 73 6c 69 63 65 20 7b 20 66 72 6f 6d 2c 20 74 6f  slice { from, to
11790 2c 20 66 72 6f 6d 5f 65 6e 64 3a 20 74 72 75 65  , from_end: true
117a0 20 7d 20 69 66 20 2a 66 72 6f 6d 20 3d 3d 20 30   } if *from == 0
117b0 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20   => {.          
117c0 20 20 20 20 20 20 20 20 20 20 77 72 69 74 65 21            write!
117d0 28 66 6d 74 2c 20 22 5b 3a 2d 7b 3a 3f 7d 5d 22  (fmt, "[:-{:?}]"
117e0 2c 20 74 6f 29 3f 3b 0a 20 20 20 20 20 20 20 20  , to)?;.        
117f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11800 20 20 20 20 20 20 20 20 20 20 50 72 6f 6a 65 63            Projec
11810 74 69 6f 6e 45 6c 65 6d 3a 3a 53 75 62 73 6c 69  tionElem::Subsli
11820 63 65 20 7b 20 66 72 6f 6d 2c 20 74 6f 2c 20 66  ce { from, to, f
11830 72 6f 6d 5f 65 6e 64 3a 20 74 72 75 65 20 7d 20  rom_end: true } 
11840 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  => {.           
11850 20 20 20 20 20 20 20 20 20 77 72 69 74 65 21 28           write!(
11860 66 6d 74 2c 20 22 5b 7b 3a 3f 7d 3a 2d 7b 3a 3f  fmt, "[{:?}:-{:?
11870 7d 5d 22 2c 20 66 72 6f 6d 2c 20 74 6f 29 3f 3b  }]", from, to)?;
11880 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11890 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
118a0 20 20 20 50 72 6f 6a 65 63 74 69 6f 6e 45 6c 65     ProjectionEle
118b0 6d 3a 3a 53 75 62 73 6c 69 63 65 20 7b 20 66 72  m::Subslice { fr
118c0 6f 6d 2c 20 74 6f 2c 20 66 72 6f 6d 5f 65 6e 64  om, to, from_end
118d0 3a 20 66 61 6c 73 65 20 7d 20 3d 3e 20 7b 0a 20  : false } => {. 
118e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118f0 20 20 20 77 72 69 74 65 21 28 66 6d 74 2c 20 22     write!(fmt, "
11900 5b 7b 3a 3f 7d 2e 2e 7b 3a 3f 7d 5d 22 2c 20 66  [{:?}..{:?}]", f
11910 72 6f 6d 2c 20 74 6f 29 3f 3b 0a 20 20 20 20 20  rom, to)?;.     
11920 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
11930 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
11940 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 4f 6b     }..        Ok
11950 28 28 29 29 0a 20 20 20 20 7d 0a 7d 0a 0a 69 6d  (()).    }.}..im
11960 70 6c 20 44 65 62 75 67 20 66 6f 72 20 50 6c 61  pl Debug for Pla
11970 63 65 42 61 73 65 3c 27 5f 3e 20 7b 0a 20 20 20  ceBase<'_> {.   
11980 20 66 6e 20 66 6d 74 28 26 73 65 6c 66 2c 20 66   fn fmt(&self, f
11990 6d 74 3a 20 26 6d 75 74 20 46 6f 72 6d 61 74 74  mt: &mut Formatt
119a0 65 72 3c 27 5f 3e 29 20 2d 3e 20 66 6d 74 3a 3a  er<'_>) -> fmt::
119b0 52 65 73 75 6c 74 20 7b 0a 20 20 20 20 20 20 20  Result {.       
119c0 20 6d 61 74 63 68 20 2a 73 65 6c 66 20 7b 0a 20   match *self {. 
119d0 20 20 20 20 20 20 20 20 20 20 20 50 6c 61 63 65             Place
119e0 42 61 73 65 3a 3a 4c 6f 63 61 6c 28 69 64 29 20  Base::Local(id) 
119f0 3d 3e 20 77 72 69 74 65 21 28 66 6d 74 2c 20 22  => write!(fmt, "
11a00 7b 3a 3f 7d 22 2c 20 69 64 29 2c 0a 20 20 20 20  {:?}", id),.    
11a10 20 20 20 20 20 20 20 20 50 6c 61 63 65 42 61 73          PlaceBas
11a20 65 3a 3a 53 74 61 74 69 63 28 62 6f 78 20 73 65  e::Static(box se
11a30 6c 66 3a 3a 53 74 61 74 69 63 20 7b 20 74 79 2c  lf::Static { ty,
11a40 20 6b 69 6e 64 3a 20 53 74 61 74 69 63 4b 69 6e   kind: StaticKin
11a50 64 3a 3a 53 74 61 74 69 63 2c 20 64 65 66 5f 69  d::Static, def_i
11a60 64 20 7d 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20  d }) => {.      
11a70 20 20 20 20 20 20 20 20 20 20 77 72 69 74 65 21            write!
11a80 28 66 6d 74 2c 20 22 28 7b 7d 3a 20 7b 3a 3f 7d  (fmt, "({}: {:?}
11a90 29 22 2c 20 74 79 3a 3a 74 6c 73 3a 3a 77 69 74  )", ty::tls::wit
11aa0 68 28 7c 74 63 78 7c 20 74 63 78 2e 64 65 66 5f  h(|tcx| tcx.def_
11ab0 70 61 74 68 5f 73 74 72 28 64 65 66 5f 69 64 29  path_str(def_id)
11ac0 29 2c 20 74 79 29 0a 20 20 20 20 20 20 20 20 20  ), ty).         
11ad0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
11ae0 20 50 6c 61 63 65 42 61 73 65 3a 3a 53 74 61 74   PlaceBase::Stat
11af0 69 63 28 62 6f 78 20 73 65 6c 66 3a 3a 53 74 61  ic(box self::Sta
11b00 74 69 63 20 7b 0a 20 20 20 20 20 20 20 20 20 20  tic {.          
11b10 20 20 20 20 20 20 74 79 2c 20 6b 69 6e 64 3a 20        ty, kind: 
11b20 53 74 61 74 69 63 4b 69 6e 64 3a 3a 50 72 6f 6d  StaticKind::Prom
11b30 6f 74 65 64 28 70 72 6f 6d 6f 74 65 64 2c 20 5f  oted(promoted, _
11b40 29 2c 20 64 65 66 5f 69 64 3a 20 5f 0a 20 20 20  ), def_id: _.   
11b50 20 20 20 20 20 20 20 20 20 7d 29 20 3d 3e 20 7b           }) => {
11b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11b70 20 77 72 69 74 65 21 28 66 6d 74 2c 20 22 28 7b   write!(fmt, "({
11b80 3a 3f 7d 3a 20 7b 3a 3f 7d 29 22 2c 20 70 72 6f  :?}: {:?})", pro
11b90 6d 6f 74 65 64 2c 20 74 79 29 0a 20 20 20 20 20  moted, ty).     
11ba0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11bb0 20 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2f 2f 2f   }.    }.}..////
11bc0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11bd0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11be0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11bf0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11c00 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 20 53 63 6f 70 65  ///////.// Scope
11c10 73 0a 0a 72 75 73 74 63 5f 69 6e 64 65 78 3a 3a  s..rustc_index::
11c20 6e 65 77 74 79 70 65 5f 69 6e 64 65 78 21 20 7b  newtype_index! {
11c30 0a 20 20 20 20 70 75 62 20 73 74 72 75 63 74 20  .    pub struct 
11c40 53 6f 75 72 63 65 53 63 6f 70 65 20 7b 0a 20 20  SourceScope {.  
11c50 20 20 20 20 20 20 64 65 72 69 76 65 20 5b 48 61        derive [Ha
11c60 73 68 53 74 61 62 6c 65 5d 0a 20 20 20 20 20 20  shStable].      
11c70 20 20 44 45 42 55 47 5f 46 4f 52 4d 41 54 20 3d    DEBUG_FORMAT =
11c80 20 22 73 63 6f 70 65 5b 7b 7d 5d 22 2c 0a 20 20   "scope[{}]",.  
11c90 20 20 20 20 20 20 63 6f 6e 73 74 20 4f 55 54 45        const OUTE
11ca0 52 4d 4f 53 54 5f 53 4f 55 52 43 45 5f 53 43 4f  RMOST_SOURCE_SCO
11cb0 50 45 20 3d 20 30 2c 0a 20 20 20 20 7d 0a 7d 0a  PE = 0,.    }.}.
11cc0 0a 23 5b 64 65 72 69 76 65 28 43 6c 6f 6e 65 2c  .#[derive(Clone,
11cd0 20 44 65 62 75 67 2c 20 52 75 73 74 63 45 6e 63   Debug, RustcEnc
11ce0 6f 64 61 62 6c 65 2c 20 52 75 73 74 63 44 65 63  odable, RustcDec
11cf0 6f 64 61 62 6c 65 2c 20 48 61 73 68 53 74 61 62  odable, HashStab
11d00 6c 65 29 5d 0a 70 75 62 20 73 74 72 75 63 74 20  le)].pub struct 
11d10 53 6f 75 72 63 65 53 63 6f 70 65 44 61 74 61 20  SourceScopeData 
11d20 7b 0a 20 20 20 20 70 75 62 20 73 70 61 6e 3a 20  {.    pub span: 
11d30 53 70 61 6e 2c 0a 20 20 20 20 70 75 62 20 70 61  Span,.    pub pa
11d40 72 65 6e 74 5f 73 63 6f 70 65 3a 20 4f 70 74 69  rent_scope: Opti
11d50 6f 6e 3c 53 6f 75 72 63 65 53 63 6f 70 65 3e 2c  on<SourceScope>,
11d60 0a 0a 20 20 20 20 2f 2f 2f 20 43 72 61 74 65 2d  ..    /// Crate-
11d70 6c 6f 63 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  local informatio
11d80 6e 20 66 6f 72 20 74 68 69 73 20 73 6f 75 72 63  n for this sourc
11d90 65 20 73 63 6f 70 65 2c 20 74 68 61 74 20 63 61  e scope, that ca
11da0 6e 27 74 20 28 61 6e 64 0a 20 20 20 20 2f 2f 2f  n't (and.    ///
11db0 20 6e 65 65 64 6e 27 74 29 20 62 65 20 74 72 61   needn't) be tra
11dc0 63 6b 65 64 20 61 63 72 6f 73 73 20 63 72 61 74  cked across crat
11dd0 65 73 2e 0a 20 20 20 20 70 75 62 20 6c 6f 63 61  es..    pub loca
11de0 6c 5f 64 61 74 61 3a 20 43 6c 65 61 72 43 72 6f  l_data: ClearCro
11df0 73 73 43 72 61 74 65 3c 53 6f 75 72 63 65 53 63  ssCrate<SourceSc
11e00 6f 70 65 4c 6f 63 61 6c 44 61 74 61 3e 2c 0a 7d  opeLocalData>,.}
11e10 0a 0a 23 5b 64 65 72 69 76 65 28 43 6c 6f 6e 65  ..#[derive(Clone
11e20 2c 20 44 65 62 75 67 2c 20 52 75 73 74 63 45 6e  , Debug, RustcEn
11e30 63 6f 64 61 62 6c 65 2c 20 52 75 73 74 63 44 65  codable, RustcDe
11e40 63 6f 64 61 62 6c 65 2c 20 48 61 73 68 53 74 61  codable, HashSta
11e50 62 6c 65 29 5d 0a 70 75 62 20 73 74 72 75 63 74  ble)].pub struct
11e60 20 53 6f 75 72 63 65 53 63 6f 70 65 4c 6f 63 61   SourceScopeLoca
11e70 6c 44 61 74 61 20 7b 0a 20 20 20 20 2f 2f 2f 20  lData {.    /// 
11e80 41 6e 20 60 48 69 72 49 64 60 20 77 69 74 68 20  An `HirId` with 
11e90 6c 69 6e 74 20 6c 65 76 65 6c 73 20 65 71 75 69  lint levels equi
11ea0 76 61 6c 65 6e 74 20 74 6f 20 74 68 69 73 20 73  valent to this s
11eb0 63 6f 70 65 27 73 20 6c 69 6e 74 20 6c 65 76 65  cope's lint leve
11ec0 6c 73 2e 0a 20 20 20 20 70 75 62 20 6c 69 6e 74  ls..    pub lint
11ed0 5f 72 6f 6f 74 3a 20 68 69 72 3a 3a 48 69 72 49  _root: hir::HirI
11ee0 64 2c 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 75  d,.    /// The u
11ef0 6e 73 61 66 65 20 62 6c 6f 63 6b 20 74 68 61 74  nsafe block that
11f00 20 63 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 6e   contains this n
11f10 6f 64 65 2e 0a 20 20 20 20 70 75 62 20 73 61 66  ode..    pub saf
11f20 65 74 79 3a 20 53 61 66 65 74 79 2c 0a 7d 0a 0a  ety: Safety,.}..
11f30 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11f40 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11f50 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11f60 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11f70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 20 4f  ///////////.// O
11f80 70 65 72 61 6e 64 73 0a 0a 2f 2f 2f 20 54 68 65  perands../// The
11f90 73 65 20 61 72 65 20 76 61 6c 75 65 73 20 74 68  se are values th
11fa0 61 74 20 63 61 6e 20 61 70 70 65 61 72 20 69 6e  at can appear in
11fb0 73 69 64 65 20 61 6e 20 72 76 61 6c 75 65 2e 20  side an rvalue. 
11fc0 54 68 65 79 20 61 72 65 20 69 6e 74 65 6e 74 69  They are intenti
11fd0 6f 6e 61 6c 6c 79 0a 2f 2f 2f 20 6c 69 6d 69 74  onally./// limit
11fe0 65 64 20 74 6f 20 70 72 65 76 65 6e 74 20 72 76  ed to prevent rv
11ff0 61 6c 75 65 73 20 66 72 6f 6d 20 62 65 69 6e 67  alues from being
12000 20 6e 65 73 74 65 64 20 69 6e 20 6f 6e 65 20 61   nested in one a
12010 6e 6f 74 68 65 72 2e 0a 23 5b 64 65 72 69 76 65  nother..#[derive
12020 28 43 6c 6f 6e 65 2c 20 50 61 72 74 69 61 6c 45  (Clone, PartialE
12030 71 2c 20 52 75 73 74 63 45 6e 63 6f 64 61 62 6c  q, RustcEncodabl
12040 65 2c 20 52 75 73 74 63 44 65 63 6f 64 61 62 6c  e, RustcDecodabl
12050 65 2c 20 48 61 73 68 53 74 61 62 6c 65 29 5d 0a  e, HashStable)].
12060 70 75 62 20 65 6e 75 6d 20 4f 70 65 72 61 6e 64  pub enum Operand
12070 3c 27 74 63 78 3e 20 7b 0a 20 20 20 20 2f 2f 2f  <'tcx> {.    ///
12080 20 43 6f 70 79 3a 20 54 68 65 20 76 61 6c 75 65   Copy: The value
12090 20 6d 75 73 74 20 62 65 20 61 76 61 69 6c 61 62   must be availab
120a0 6c 65 20 66 6f 72 20 75 73 65 20 61 66 74 65 72  le for use after
120b0 77 61 72 64 73 2e 0a 20 20 20 20 2f 2f 2f 0a 20  wards..    ///. 
120c0 20 20 20 2f 2f 2f 20 54 68 69 73 20 69 6d 70 6c     /// This impl
120d0 69 65 73 20 74 68 61 74 20 74 68 65 20 74 79 70  ies that the typ
120e0 65 20 6f 66 20 74 68 65 20 70 6c 61 63 65 20 6d  e of the place m
120f0 75 73 74 20 62 65 20 60 43 6f 70 79 60 3b 20 74  ust be `Copy`; t
12100 68 69 73 20 69 73 20 74 72 75 65 0a 20 20 20 20  his is true.    
12110 2f 2f 2f 20 62 79 20 63 6f 6e 73 74 72 75 63 74  /// by construct
12120 69 6f 6e 20 64 75 72 69 6e 67 20 62 75 69 6c 64  ion during build
12130 2c 20 62 75 74 20 61 6c 73 6f 20 63 68 65 63 6b  , but also check
12140 65 64 20 62 79 20 74 68 65 20 4d 49 52 20 74 79  ed by the MIR ty
12150 70 65 20 63 68 65 63 6b 65 72 2e 0a 20 20 20 20  pe checker..    
12160 43 6f 70 79 28 50 6c 61 63 65 3c 27 74 63 78 3e  Copy(Place<'tcx>
12170 29 2c 0a 0a 20 20 20 20 2f 2f 2f 20 4d 6f 76 65  ),..    /// Move
12180 3a 20 54 68 65 20 76 61 6c 75 65 20 28 69 6e 63  : The value (inc
12190 6c 75 64 69 6e 67 20 6f 6c 64 20 62 6f 72 72 6f  luding old borro
121a0 77 73 20 6f 66 20 69 74 29 20 77 69 6c 6c 20 6e  ws of it) will n
121b0 6f 74 20 62 65 20 75 73 65 64 20 61 67 61 69 6e  ot be used again
121c0 2e 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f  ..    ///.    //
121d0 2f 20 53 61 66 65 20 66 6f 72 20 76 61 6c 75 65  / Safe for value
121e0 73 20 6f 66 20 61 6c 6c 20 74 79 70 65 73 20 28  s of all types (
121f0 6d 6f 64 75 6c 6f 20 66 75 74 75 72 65 20 64 65  modulo future de
12200 76 65 6c 6f 70 6d 65 6e 74 73 20 74 6f 77 61 72  velopments towar
12210 64 73 20 60 3f 4d 6f 76 65 60 29 2e 0a 20 20 20  ds `?Move`)..   
12220 20 2f 2f 2f 20 43 6f 72 72 65 63 74 20 75 73 61   /// Correct usa
12230 67 65 20 70 61 74 74 65 72 6e 73 20 61 72 65 20  ge patterns are 
12240 65 6e 66 6f 72 63 65 64 20 62 79 20 74 68 65 20  enforced by the 
12250 62 6f 72 72 6f 77 20 63 68 65 63 6b 65 72 20 66  borrow checker f
12260 6f 72 20 73 61 66 65 20 63 6f 64 65 2e 0a 20 20  or safe code..  
12270 20 20 2f 2f 2f 20 60 43 6f 70 79 60 20 6d 61 79    /// `Copy` may
12280 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 74 6f   be converted to
12290 20 60 4d 6f 76 65 60 20 74 6f 20 65 6e 61 62 6c   `Move` to enabl
122a0 65 20 22 6c 61 73 74 2d 75 73 65 22 20 6f 70 74  e "last-use" opt
122b0 69 6d 69 7a 61 74 69 6f 6e 73 2e 0a 20 20 20 20  imizations..    
122c0 4d 6f 76 65 28 50 6c 61 63 65 3c 27 74 63 78 3e  Move(Place<'tcx>
122d0 29 2c 0a 0a 20 20 20 20 2f 2f 2f 20 53 79 6e 74  ),..    /// Synt
122e0 68 65 73 69 7a 65 73 20 61 20 63 6f 6e 73 74 61  hesizes a consta
122f0 6e 74 20 76 61 6c 75 65 2e 0a 20 20 20 20 43 6f  nt value..    Co
12300 6e 73 74 61 6e 74 28 42 6f 78 3c 43 6f 6e 73 74  nstant(Box<Const
12310 61 6e 74 3c 27 74 63 78 3e 3e 29 2c 0a 7d 0a 0a  ant<'tcx>>),.}..
12320 69 6d 70 6c 3c 27 74 63 78 3e 20 44 65 62 75 67  impl<'tcx> Debug
12330 20 66 6f 72 20 4f 70 65 72 61 6e 64 3c 27 74 63   for Operand<'tc
12340 78 3e 20 7b 0a 20 20 20 20 66 6e 20 66 6d 74 28  x> {.    fn fmt(
12350 26 73 65 6c 66 2c 20 66 6d 74 3a 20 26 6d 75 74  &self, fmt: &mut
12360 20 46 6f 72 6d 61 74 74 65 72 3c 27 5f 3e 29 20   Formatter<'_>) 
12370 2d 3e 20 66 6d 74 3a 3a 52 65 73 75 6c 74 20 7b  -> fmt::Result {
12380 0a 20 20 20 20 20 20 20 20 75 73 65 20 73 65 6c  .        use sel
12390 66 3a 3a 4f 70 65 72 61 6e 64 3a 3a 2a 3b 0a 20  f::Operand::*;. 
123a0 20 20 20 20 20 20 20 6d 61 74 63 68 20 2a 73 65         match *se
123b0 6c 66 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lf {.           
123c0 20 43 6f 6e 73 74 61 6e 74 28 72 65 66 20 61 29   Constant(ref a)
123d0 20 3d 3e 20 77 72 69 74 65 21 28 66 6d 74 2c 20   => write!(fmt, 
123e0 22 7b 3a 3f 7d 22 2c 20 61 29 2c 0a 20 20 20 20  "{:?}", a),.    
123f0 20 20 20 20 20 20 20 20 43 6f 70 79 28 72 65 66          Copy(ref
12400 20 70 6c 61 63 65 29 20 3d 3e 20 77 72 69 74 65   place) => write
12410 21 28 66 6d 74 2c 20 22 7b 3a 3f 7d 22 2c 20 70  !(fmt, "{:?}", p
12420 6c 61 63 65 29 2c 0a 20 20 20 20 20 20 20 20 20  lace),.         
12430 20 20 20 4d 6f 76 65 28 72 65 66 20 70 6c 61 63     Move(ref plac
12440 65 29 20 3d 3e 20 77 72 69 74 65 21 28 66 6d 74  e) => write!(fmt
12450 2c 20 22 6d 6f 76 65 20 7b 3a 3f 7d 22 2c 20 70  , "move {:?}", p
12460 6c 61 63 65 29 2c 0a 20 20 20 20 20 20 20 20 7d  lace),.        }
12470 0a 20 20 20 20 7d 0a 7d 0a 0a 69 6d 70 6c 3c 27  .    }.}..impl<'
12480 74 63 78 3e 20 4f 70 65 72 61 6e 64 3c 27 74 63  tcx> Operand<'tc
12490 78 3e 20 7b 0a 20 20 20 20 2f 2f 2f 20 43 6f 6e  x> {.    /// Con
124a0 76 65 6e 69 65 6e 63 65 20 68 65 6c 70 65 72 20  venience helper 
124b0 74 6f 20 6d 61 6b 65 20 61 20 63 6f 6e 73 74 61  to make a consta
124c0 6e 74 20 74 68 61 74 20 72 65 66 65 72 73 20 74  nt that refers t
124d0 6f 20 74 68 65 20 66 6e 0a 20 20 20 20 2f 2f 2f  o the fn.    ///
124e0 20 77 69 74 68 20 67 69 76 65 6e 20 60 44 65 66   with given `Def
124f0 49 64 60 20 61 6e 64 20 73 75 62 73 74 73 2e 20  Id` and substs. 
12500 53 69 6e 63 65 20 74 68 69 73 20 69 73 20 75 73  Since this is us
12510 65 64 20 74 6f 20 73 79 6e 74 68 65 73 69 7a 65  ed to synthesize
12520 0a 20 20 20 20 2f 2f 2f 20 4d 49 52 2c 20 61 73  .    /// MIR, as
12530 73 75 6d 65 73 20 60 75 73 65 72 5f 74 79 60 20  sumes `user_ty` 
12540 69 73 20 4e 6f 6e 65 2e 0a 20 20 20 20 70 75 62  is None..    pub
12550 20 66 6e 20 66 75 6e 63 74 69 6f 6e 5f 68 61 6e   fn function_han
12560 64 6c 65 28 0a 20 20 20 20 20 20 20 20 74 63 78  dle(.        tcx
12570 3a 20 54 79 43 74 78 74 3c 27 74 63 78 3e 2c 0a  : TyCtxt<'tcx>,.
12580 20 20 20 20 20 20 20 20 64 65 66 5f 69 64 3a 20          def_id: 
12590 44 65 66 49 64 2c 0a 20 20 20 20 20 20 20 20 73  DefId,.        s
125a0 75 62 73 74 73 3a 20 53 75 62 73 74 73 52 65 66  ubsts: SubstsRef
125b0 3c 27 74 63 78 3e 2c 0a 20 20 20 20 20 20 20 20  <'tcx>,.        
125c0 73 70 61 6e 3a 20 53 70 61 6e 2c 0a 20 20 20 20  span: Span,.    
125d0 29 20 2d 3e 20 53 65 6c 66 20 7b 0a 20 20 20 20  ) -> Self {.    
125e0 20 20 20 20 6c 65 74 20 74 79 20 3d 20 74 63 78      let ty = tcx
125f0 2e 74 79 70 65 5f 6f 66 28 64 65 66 5f 69 64 29  .type_of(def_id)
12600 2e 73 75 62 73 74 28 74 63 78 2c 20 73 75 62 73  .subst(tcx, subs
12610 74 73 29 3b 0a 20 20 20 20 20 20 20 20 4f 70 65  ts);.        Ope
12620 72 61 6e 64 3a 3a 43 6f 6e 73 74 61 6e 74 28 62  rand::Constant(b
12630 6f 78 20 43 6f 6e 73 74 61 6e 74 20 7b 0a 20 20  ox Constant {.  
12640 20 20 20 20 20 20 20 20 20 20 73 70 61 6e 2c 0a            span,.
12650 20 20 20 20 20 20 20 20 20 20 20 20 75 73 65 72              user
12660 5f 74 79 3a 20 4e 6f 6e 65 2c 0a 20 20 20 20 20  _ty: None,.     
12670 20 20 20 20 20 20 20 6c 69 74 65 72 61 6c 3a 20         literal: 
12680 74 79 3a 3a 43 6f 6e 73 74 3a 3a 7a 65 72 6f 5f  ty::Const::zero_
12690 73 69 7a 65 64 28 74 63 78 2c 20 74 79 29 2c 0a  sized(tcx, ty),.
126a0 20 20 20 20 20 20 20 20 7d 29 0a 20 20 20 20 7d          }).    }
126b0 0a 0a 20 20 20 20 70 75 62 20 66 6e 20 74 6f 5f  ..    pub fn to_
126c0 63 6f 70 79 28 26 73 65 6c 66 29 20 2d 3e 20 53  copy(&self) -> S
126d0 65 6c 66 20 7b 0a 20 20 20 20 20 20 20 20 6d 61  elf {.        ma
126e0 74 63 68 20 2a 73 65 6c 66 20 7b 0a 20 20 20 20  tch *self {.    
126f0 20 20 20 20 20 20 20 20 4f 70 65 72 61 6e 64 3a          Operand:
12700 3a 43 6f 70 79 28 5f 29 20 7c 20 4f 70 65 72 61  :Copy(_) | Opera
12710 6e 64 3a 3a 43 6f 6e 73 74 61 6e 74 28 5f 29 20  nd::Constant(_) 
12720 3d 3e 20 73 65 6c 66 2e 63 6c 6f 6e 65 28 29 2c  => self.clone(),
12730 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f 70 65  .            Ope
12740 72 61 6e 64 3a 3a 4d 6f 76 65 28 72 65 66 20 70  rand::Move(ref p
12750 6c 61 63 65 29 20 3d 3e 20 4f 70 65 72 61 6e 64  lace) => Operand
12760 3a 3a 43 6f 70 79 28 70 6c 61 63 65 2e 63 6c 6f  ::Copy(place.clo
12770 6e 65 28 29 29 2c 0a 20 20 20 20 20 20 20 20 7d  ne()),.        }
12780 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2f 2f 2f 2f 2f  .    }.}..//////
12790 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
127a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
127b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
127c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
127d0 2f 2f 2f 2f 2f 0a 2f 2f 2f 20 52 76 61 6c 75 65  /////./// Rvalue
127e0 73 0a 0a 23 5b 64 65 72 69 76 65 28 43 6c 6f 6e  s..#[derive(Clon
127f0 65 2c 20 52 75 73 74 63 45 6e 63 6f 64 61 62 6c  e, RustcEncodabl
12800 65 2c 20 52 75 73 74 63 44 65 63 6f 64 61 62 6c  e, RustcDecodabl
12810 65 2c 20 48 61 73 68 53 74 61 62 6c 65 2c 20 50  e, HashStable, P
12820 61 72 74 69 61 6c 45 71 29 5d 0a 70 75 62 20 65  artialEq)].pub e
12830 6e 75 6d 20 52 76 61 6c 75 65 3c 27 74 63 78 3e  num Rvalue<'tcx>
12840 20 7b 0a 20 20 20 20 2f 2f 2f 20 78 20 28 65 69   {.    /// x (ei
12850 74 68 65 72 20 61 20 6d 6f 76 65 20 6f 72 20 63  ther a move or c
12860 6f 70 79 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  opy, depending o
12870 6e 20 74 79 70 65 20 6f 66 20 78 29 0a 20 20 20  n type of x).   
12880 20 55 73 65 28 4f 70 65 72 61 6e 64 3c 27 74 63   Use(Operand<'tc
12890 78 3e 29 2c 0a 0a 20 20 20 20 2f 2f 2f 20 5b 78  x>),..    /// [x
128a0 3b 20 33 32 5d 0a 20 20 20 20 52 65 70 65 61 74  ; 32].    Repeat
128b0 28 4f 70 65 72 61 6e 64 3c 27 74 63 78 3e 2c 20  (Operand<'tcx>, 
128c0 75 36 34 29 2c 0a 0a 20 20 20 20 2f 2f 2f 20 26  u64),..    /// &
128d0 78 20 6f 72 20 26 6d 75 74 20 78 0a 20 20 20 20  x or &mut x.    
128e0 52 65 66 28 52 65 67 69 6f 6e 3c 27 74 63 78 3e  Ref(Region<'tcx>
128f0 2c 20 42 6f 72 72 6f 77 4b 69 6e 64 2c 20 50 6c  , BorrowKind, Pl
12900 61 63 65 3c 27 74 63 78 3e 29 2c 0a 0a 20 20 20  ace<'tcx>),..   
12910 20 2f 2f 2f 20 43 72 65 61 74 65 20 61 20 72 61   /// Create a ra
12920 77 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  w pointer to the
12930 20 67 69 76 65 6e 20 70 6c 61 63 65 0a 20 20 20   given place.   
12940 20 2f 2f 2f 20 43 61 6e 20 62 65 20 67 65 6e 65   /// Can be gene
12950 72 61 74 65 64 20 62 79 20 72 61 77 20 61 64 64  rated by raw add
12960 72 65 73 73 20 6f 66 20 65 78 70 72 65 73 73 69  ress of expressi
12970 6f 6e 73 20 28 60 26 72 61 77 20 63 6f 6e 73 74  ons (`&raw const
12980 20 78 60 29 2c 0a 20 20 20 20 2f 2f 2f 20 6f 72   x`),.    /// or
12990 20 77 68 65 6e 20 63 61 73 74 69 6e 67 20 61 20   when casting a 
129a0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 72  reference to a r
129b0 61 77 20 70 6f 69 6e 74 65 72 2e 0a 20 20 20 20  aw pointer..    
129c0 41 64 64 72 65 73 73 4f 66 28 4d 75 74 61 62 69  AddressOf(Mutabi
129d0 6c 69 74 79 2c 20 50 6c 61 63 65 3c 27 74 63 78  lity, Place<'tcx
129e0 3e 29 2c 0a 0a 20 20 20 20 2f 2f 2f 20 6c 65 6e  >),..    /// len
129f0 67 74 68 20 6f 66 20 61 20 5b 58 5d 20 6f 72 20  gth of a [X] or 
12a00 5b 58 3b 6e 5d 20 76 61 6c 75 65 0a 20 20 20 20  [X;n] value.    
12a10 4c 65 6e 28 50 6c 61 63 65 3c 27 74 63 78 3e 29  Len(Place<'tcx>)
12a20 2c 0a 0a 20 20 20 20 43 61 73 74 28 43 61 73 74  ,..    Cast(Cast
12a30 4b 69 6e 64 2c 20 4f 70 65 72 61 6e 64 3c 27 74  Kind, Operand<'t
12a40 63 78 3e 2c 20 54 79 3c 27 74 63 78 3e 29 2c 0a  cx>, Ty<'tcx>),.
12a50 0a 20 20 20 20 42 69 6e 61 72 79 4f 70 28 42 69  .    BinaryOp(Bi
12a60 6e 4f 70 2c 20 4f 70 65 72 61 6e 64 3c 27 74 63  nOp, Operand<'tc
12a70 78 3e 2c 20 4f 70 65 72 61 6e 64 3c 27 74 63 78  x>, Operand<'tcx
12a80 3e 29 2c 0a 20 20 20 20 43 68 65 63 6b 65 64 42  >),.    CheckedB
12a90 69 6e 61 72 79 4f 70 28 42 69 6e 4f 70 2c 20 4f  inaryOp(BinOp, O
12aa0 70 65 72 61 6e 64 3c 27 74 63 78 3e 2c 20 4f 70  perand<'tcx>, Op
12ab0 65 72 61 6e 64 3c 27 74 63 78 3e 29 2c 0a 0a 20  erand<'tcx>),.. 
12ac0 20 20 20 4e 75 6c 6c 61 72 79 4f 70 28 4e 75 6c     NullaryOp(Nul
12ad0 6c 4f 70 2c 20 54 79 3c 27 74 63 78 3e 29 2c 0a  lOp, Ty<'tcx>),.
12ae0 20 20 20 20 55 6e 61 72 79 4f 70 28 55 6e 4f 70      UnaryOp(UnOp
12af0 2c 20 4f 70 65 72 61 6e 64 3c 27 74 63 78 3e 29  , Operand<'tcx>)
12b00 2c 0a 0a 20 20 20 20 2f 2f 2f 20 52 65 61 64 20  ,..    /// Read 
12b10 74 68 65 20 64 69 73 63 72 69 6d 69 6e 61 6e 74  the discriminant
12b20 20 6f 66 20 61 6e 20 41 44 54 2e 0a 20 20 20 20   of an ADT..    
12b30 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 55 6e 64 65  ///.    /// Unde
12b40 66 69 6e 65 64 20 28 69 2e 65 2e 2c 20 6e 6f 20  fined (i.e., no 
12b50 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
12b60 6f 20 6d 61 6b 65 20 69 74 20 64 65 66 69 6e 65  o make it define
12b70 64 2c 20 62 75 74 20 74 68 65 72 65 e2 80 99 73  d, but there...s
12b80 20 6e 6f 20 72 65 61 73 6f 6e 20 77 68 79 20 69   no reason why i
12b90 74 20 63 61 6e 6e 6f 74 0a 20 20 20 20 2f 2f 2f  t cannot.    ///
12ba0 20 62 65 20 64 65 66 69 6e 65 64 20 74 6f 20 72   be defined to r
12bb0 65 74 75 72 6e 2c 20 73 61 79 2c 20 61 20 30 29  eturn, say, a 0)
12bc0 20 69 66 20 41 44 54 20 69 73 20 6e 6f 74 20 61   if ADT is not a
12bd0 6e 20 65 6e 75 6d 2e 0a 20 20 20 20 44 69 73 63  n enum..    Disc
12be0 72 69 6d 69 6e 61 6e 74 28 50 6c 61 63 65 3c 27  riminant(Place<'
12bf0 74 63 78 3e 29 2c 0a 0a 20 20 20 20 2f 2f 2f 20  tcx>),..    /// 
12c00 43 72 65 61 74 65 73 20 61 6e 20 61 67 67 72 65  Creates an aggre
12c10 67 61 74 65 20 76 61 6c 75 65 2c 20 6c 69 6b 65  gate value, like
12c20 20 61 20 74 75 70 6c 65 20 6f 72 20 73 74 72 75   a tuple or stru
12c30 63 74 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20  ct. This is.    
12c40 2f 2f 2f 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20  /// only needed 
12c50 62 65 63 61 75 73 65 20 77 65 20 77 61 6e 74 20  because we want 
12c60 74 6f 20 64 69 73 74 69 6e 67 75 69 73 68 20 60  to distinguish `
12c70 64 65 73 74 20 3d 20 46 6f 6f 20 7b 20 78 3a 0a  dest = Foo { x:.
12c80 20 20 20 20 2f 2f 2f 20 2e 2e 2e 2c 20 79 3a 20      /// ..., y: 
12c90 2e 2e 2e 20 7d 60 20 66 72 6f 6d 20 60 64 65 73  ... }` from `des
12ca0 74 2e 78 20 3d 20 2e 2e 2e 3b 20 64 65 73 74 2e  t.x = ...; dest.
12cb0 79 20 3d 20 2e 2e 2e 3b 60 20 69 6e 20 74 68 65  y = ...;` in the
12cc0 20 63 61 73 65 0a 20 20 20 20 2f 2f 2f 20 74 68   case.    /// th
12cd0 61 74 20 60 46 6f 6f 60 20 68 61 73 20 61 20 64  at `Foo` has a d
12ce0 65 73 74 72 75 63 74 6f 72 2e 20 54 68 65 73 65  estructor. These
12cf0 20 72 76 61 6c 75 65 73 20 63 61 6e 20 62 65 20   rvalues can be 
12d00 6f 70 74 69 6d 69 7a 65 64 0a 20 20 20 20 2f 2f  optimized.    //
12d10 2f 20 61 77 61 79 20 61 66 74 65 72 20 74 79 70  / away after typ
12d20 65 2d 63 68 65 63 6b 69 6e 67 20 61 6e 64 20 62  e-checking and b
12d30 65 66 6f 72 65 20 6c 6f 77 65 72 69 6e 67 2e 0a  efore lowering..
12d40 20 20 20 20 41 67 67 72 65 67 61 74 65 28 42 6f      Aggregate(Bo
12d50 78 3c 41 67 67 72 65 67 61 74 65 4b 69 6e 64 3c  x<AggregateKind<
12d60 27 74 63 78 3e 3e 2c 20 56 65 63 3c 4f 70 65 72  'tcx>>, Vec<Oper
12d70 61 6e 64 3c 27 74 63 78 3e 3e 29 2c 0a 7d 0a 0a  and<'tcx>>),.}..
12d80 23 5b 64 65 72 69 76 65 28 43 6c 6f 6e 65 2c 20  #[derive(Clone, 
12d90 43 6f 70 79 2c 20 44 65 62 75 67 2c 20 50 61 72  Copy, Debug, Par
12da0 74 69 61 6c 45 71 2c 20 45 71 2c 20 52 75 73 74  tialEq, Eq, Rust
12db0 63 45 6e 63 6f 64 61 62 6c 65 2c 20 52 75 73 74  cEncodable, Rust
12dc0 63 44 65 63 6f 64 61 62 6c 65 2c 20 48 61 73 68  cDecodable, Hash
12dd0 53 74 61 62 6c 65 29 5d 0a 70 75 62 20 65 6e 75  Stable)].pub enu
12de0 6d 20 43 61 73 74 4b 69 6e 64 20 7b 0a 20 20 20  m CastKind {.   
12df0 20 4d 69 73 63 2c 0a 20 20 20 20 50 6f 69 6e 74   Misc,.    Point
12e00 65 72 28 50 6f 69 6e 74 65 72 43 61 73 74 29 2c  er(PointerCast),
12e10 0a 7d 0a 0a 23 5b 64 65 72 69 76 65 28 43 6c 6f  .}..#[derive(Clo
12e20 6e 65 2c 20 44 65 62 75 67 2c 20 50 61 72 74 69  ne, Debug, Parti
12e30 61 6c 45 71 2c 20 45 71 2c 20 52 75 73 74 63 45  alEq, Eq, RustcE
12e40 6e 63 6f 64 61 62 6c 65 2c 20 52 75 73 74 63 44  ncodable, RustcD
12e50 65 63 6f 64 61 62 6c 65 2c 20 48 61 73 68 53 74  ecodable, HashSt
12e60 61 62 6c 65 29 5d 0a 70 75 62 20 65 6e 75 6d 20  able)].pub enum 
12e70 41 67 67 72 65 67 61 74 65 4b 69 6e 64 3c 27 74  AggregateKind<'t
12e80 63 78 3e 20 7b 0a 20 20 20 20 2f 2f 2f 20 54 68  cx> {.    /// Th
12e90 65 20 74 79 70 65 20 69 73 20 6f 66 20 74 68 65  e type is of the
12ea0 20 65 6c 65 6d 65 6e 74 0a 20 20 20 20 41 72 72   element.    Arr
12eb0 61 79 28 54 79 3c 27 74 63 78 3e 29 2c 0a 20 20  ay(Ty<'tcx>),.  
12ec0 20 20 54 75 70 6c 65 2c 0a 0a 20 20 20 20 2f 2f    Tuple,..    //
12ed0 2f 20 54 68 65 20 73 65 63 6f 6e 64 20 66 69 65  / The second fie
12ee0 6c 64 20 69 73 20 74 68 65 20 76 61 72 69 61 6e  ld is the varian
12ef0 74 20 69 6e 64 65 78 2e 20 49 74 27 73 20 65 71  t index. It's eq
12f00 75 61 6c 20 74 6f 20 30 20 66 6f 72 20 73 74 72  ual to 0 for str
12f10 75 63 74 0a 20 20 20 20 2f 2f 2f 20 61 6e 64 20  uct.    /// and 
12f20 75 6e 69 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e  union expression
12f30 73 2e 20 54 68 65 20 66 6f 75 72 74 68 20 66 69  s. The fourth fi
12f40 65 6c 64 20 69 73 0a 20 20 20 20 2f 2f 2f 20 61  eld is.    /// a
12f50 63 74 69 76 65 20 66 69 65 6c 64 20 6e 75 6d 62  ctive field numb
12f60 65 72 20 61 6e 64 20 69 73 20 70 72 65 73 65 6e  er and is presen
12f70 74 20 6f 6e 6c 79 20 66 6f 72 20 75 6e 69 6f 6e  t only for union
12f80 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 20 20 20   expressions.   
12f90 20 2f 2f 2f 20 2d 2d 20 65 2e 67 2e 2c 20 66 6f   /// -- e.g., fo
12fa0 72 20 61 20 75 6e 69 6f 6e 20 65 78 70 72 65 73  r a union expres
12fb0 73 69 6f 6e 20 60 53 6f 6d 65 55 6e 69 6f 6e 20  sion `SomeUnion 
12fc0 7b 20 63 3a 20 2e 2e 20 7d 60 2c 20 74 68 65 0a  { c: .. }`, the.
12fd0 20 20 20 20 2f 2f 2f 20 61 63 74 69 76 65 20 66      /// active f
12fe0 69 65 6c 64 20 69 6e 64 65 78 20 77 6f 75 6c 64  ield index would
12ff0 20 69 64 65 6e 74 69 74 79 20 74 68 65 20 66 69   identity the fi
13000 65 6c 64 20 60 63 60 0a 20 20 20 20 41 64 74 28  eld `c`.    Adt(
13010 26 27 74 63 78 20 41 64 74 44 65 66 2c 20 56 61  &'tcx AdtDef, Va
13020 72 69 61 6e 74 49 64 78 2c 20 53 75 62 73 74 73  riantIdx, Substs
13030 52 65 66 3c 27 74 63 78 3e 2c 20 4f 70 74 69 6f  Ref<'tcx>, Optio
13040 6e 3c 55 73 65 72 54 79 70 65 41 6e 6e 6f 74 61  n<UserTypeAnnota
13050 74 69 6f 6e 49 6e 64 65 78 3e 2c 20 4f 70 74 69  tionIndex>, Opti
13060 6f 6e 3c 75 73 69 7a 65 3e 29 2c 0a 0a 20 20 20  on<usize>),..   
13070 20 43 6c 6f 73 75 72 65 28 44 65 66 49 64 2c 20   Closure(DefId, 
13080 53 75 62 73 74 73 52 65 66 3c 27 74 63 78 3e 29  SubstsRef<'tcx>)
13090 2c 0a 20 20 20 20 47 65 6e 65 72 61 74 6f 72 28  ,.    Generator(
130a0 44 65 66 49 64 2c 20 53 75 62 73 74 73 52 65 66  DefId, SubstsRef
130b0 3c 27 74 63 78 3e 2c 20 68 69 72 3a 3a 4d 6f 76  <'tcx>, hir::Mov
130c0 61 62 69 6c 69 74 79 29 2c 0a 7d 0a 0a 23 5b 64  ability),.}..#[d
130d0 65 72 69 76 65 28 43 6f 70 79 2c 20 43 6c 6f 6e  erive(Copy, Clon
130e0 65 2c 20 44 65 62 75 67 2c 20 50 61 72 74 69 61  e, Debug, Partia
130f0 6c 45 71 2c 20 45 71 2c 20 52 75 73 74 63 45 6e  lEq, Eq, RustcEn
13100 63 6f 64 61 62 6c 65 2c 20 52 75 73 74 63 44 65  codable, RustcDe
13110 63 6f 64 61 62 6c 65 2c 20 48 61 73 68 53 74 61  codable, HashSta
13120 62 6c 65 29 5d 0a 70 75 62 20 65 6e 75 6d 20 42  ble)].pub enum B
13130 69 6e 4f 70 20 7b 0a 20 20 20 20 2f 2f 2f 20 54  inOp {.    /// T
13140 68 65 20 60 2b 60 20 6f 70 65 72 61 74 6f 72 20  he `+` operator 
13150 28 61 64 64 69 74 69 6f 6e 29 0a 20 20 20 20 41  (addition).    A
13160 64 64 2c 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20  dd,.    /// The 
13170 60 2d 60 20 6f 70 65 72 61 74 6f 72 20 28 73 75  `-` operator (su
13180 62 74 72 61 63 74 69 6f 6e 29 0a 20 20 20 20 53  btraction).    S
13190 75 62 2c 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20  ub,.    /// The 
131a0 60 2a 60 20 6f 70 65 72 61 74 6f 72 20 28 6d 75  `*` operator (mu
131b0 6c 74 69 70 6c 69 63 61 74 69 6f 6e 29 0a 20 20  ltiplication).  
131c0 20 20 4d 75 6c 2c 0a 20 20 20 20 2f 2f 2f 20 54    Mul,.    /// T
131d0 68 65 20 60 2f 60 20 6f 70 65 72 61 74 6f 72 20  he `/` operator 
131e0 28 64 69 76 69 73 69 6f 6e 29 0a 20 20 20 20 44  (division).    D
131f0 69 76 2c 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20  iv,.    /// The 
13200 60 25 60 20 6f 70 65 72 61 74 6f 72 20 28 6d 6f  `%` operator (mo
13210 64 75 6c 75 73 29 0a 20 20 20 20 52 65 6d 2c 0a  dulus).    Rem,.
13220 20 20 20 20 2f 2f 2f 20 54 68 65 20 60 5e 60 20      /// The `^` 
13230 6f 70 65 72 61 74 6f 72 20 28 62 69 74 77 69 73  operator (bitwis
13240 65 20 78 6f 72 29 0a 20 20 20 20 42 69 74 58 6f  e xor).    BitXo
13250 72 2c 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 60  r,.    /// The `
13260 26 60 20 6f 70 65 72 61 74 6f 72 20 28 62 69 74  &` operator (bit
13270 77 69 73 65 20 61 6e 64 29 0a 20 20 20 20 42 69  wise and).    Bi
13280 74 41 6e 64 2c 0a 20 20 20 20 2f 2f 2f 20 54 68  tAnd,.    /// Th
13290 65 20 60 7c 60 20 6f 70 65 72 61 74 6f 72 20 28  e `|` operator (
132a0 62 69 74 77 69 73 65 20 6f 72 29 0a 20 20 20 20  bitwise or).    
132b0 42 69 74 4f 72 2c 0a 20 20 20 20 2f 2f 2f 20 54  BitOr,.    /// T
132c0 68 65 20 60 3c 3c 60 20 6f 70 65 72 61 74 6f 72  he `<<` operator
132d0 20 28 73 68 69 66 74 20 6c 65 66 74 29 0a 20 20   (shift left).  
132e0 20 20 53 68 6c 2c 0a 20 20 20 20 2f 2f 2f 20 54    Shl,.    /// T
132f0 68 65 20 60 3e 3e 60 20 6f 70 65 72 61 74 6f 72  he `>>` operator
13300 20 28 73 68 69 66 74 20 72 69 67 68 74 29 0a 20   (shift right). 
13310 20 20 20 53 68 72 2c 0a 20 20 20 20 2f 2f 2f 20     Shr,.    /// 
13320 54 68 65 20 60 3d 3d 60 20 6f 70 65 72 61 74 6f  The `==` operato
13330 72 20 28 65 71 75 61 6c 69 74 79 29 0a 20 20 20  r (equality).   
13340 20 45 71 2c 0a 20 20 20 20 2f 2f 2f 20 54 68 65   Eq,.    /// The
13350 20 60 3c 60 20 6f 70 65 72 61 74 6f 72 20 28 6c   `<` operator (l
13360 65 73 73 20 74 68 61 6e 29 0a 20 20 20 20 4c 74  ess than).    Lt
13370 2c 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 60 3c  ,.    /// The `<
13380 3d 60 20 6f 70 65 72 61 74 6f 72 20 28 6c 65 73  =` operator (les
13390 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
133a0 74 6f 29 0a 20 20 20 20 4c 65 2c 0a 20 20 20 20  to).    Le,.    
133b0 2f 2f 2f 20 54 68 65 20 60 21 3d 60 20 6f 70 65  /// The `!=` ope
133c0 72 61 74 6f 72 20 28 6e 6f 74 20 65 71 75 61 6c  rator (not equal
133d0 20 74 6f 29 0a 20 20 20 20 4e 65 2c 0a 20 20 20   to).    Ne,.   
133e0 20 2f 2f 2f 20 54 68 65 20 60 3e 3d 60 20 6f 70   /// The `>=` op
133f0 65 72 61 74 6f 72 20 28 67 72 65 61 74 65 72 20  erator (greater 
13400 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
13410 29 0a 20 20 20 20 47 65 2c 0a 20 20 20 20 2f 2f  ).    Ge,.    //
13420 2f 20 54 68 65 20 60 3e 60 20 6f 70 65 72 61 74  / The `>` operat
13430 6f 72 20 28 67 72 65 61 74 65 72 20 74 68 61 6e  or (greater than
13440 29 0a 20 20 20 20 47 74 2c 0a 20 20 20 20 2f 2f  ).    Gt,.    //
13450 2f 20 54 68 65 20 60 70 74 72 2e 6f 66 66 73 65  / The `ptr.offse
13460 74 60 20 6f 70 65 72 61 74 6f 72 0a 20 20 20 20  t` operator.    
13470 4f 66 66 73 65 74 2c 0a 7d 0a 0a 69 6d 70 6c 20  Offset,.}..impl 
13480 42 69 6e 4f 70 20 7b 0a 20 20 20 20 70 75 62 20  BinOp {.    pub 
13490 66 6e 20 69 73 5f 63 68 65 63 6b 61 62 6c 65 28  fn is_checkable(
134a0 73 65 6c 66 29 20 2d 3e 20 62 6f 6f 6c 20 7b 0a  self) -> bool {.
134b0 20 20 20 20 20 20 20 20 75 73 65 20 73 65 6c 66          use self
134c0 3a 3a 42 69 6e 4f 70 3a 3a 2a 3b 0a 20 20 20 20  ::BinOp::*;.    
134d0 20 20 20 20 6d 61 74 63 68 20 73 65 6c 66 20 7b      match self {
134e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 64 64  .            Add
134f0 20 7c 20 53 75 62 20 7c 20 4d 75 6c 20 7c 20 53   | Sub | Mul | S
13500 68 6c 20 7c 20 53 68 72 20 3d 3e 20 74 72 75 65  hl | Shr => true
13510 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 5f 20  ,.            _ 
13520 3d 3e 20 66 61 6c 73 65 2c 0a 20 20 20 20 20 20  => false,.      
13530 20 20 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 23 5b 64    }.    }.}..#[d
13540 65 72 69 76 65 28 43 6f 70 79 2c 20 43 6c 6f 6e  erive(Copy, Clon
13550 65 2c 20 44 65 62 75 67 2c 20 50 61 72 74 69 61  e, Debug, Partia
13560 6c 45 71 2c 20 45 71 2c 20 52 75 73 74 63 45 6e  lEq, Eq, RustcEn
13570 63 6f 64 61 62 6c 65 2c 20 52 75 73 74 63 44 65  codable, RustcDe
13580 63 6f 64 61 62 6c 65 2c 20 48 61 73 68 53 74 61  codable, HashSta
13590 62 6c 65 29 5d 0a 70 75 62 20 65 6e 75 6d 20 4e  ble)].pub enum N
135a0 75 6c 6c 4f 70 20 7b 0a 20 20 20 20 2f 2f 2f 20  ullOp {.    /// 
135b0 52 65 74 75 72 6e 73 20 74 68 65 20 73 69 7a 65  Returns the size
135c0 20 6f 66 20 61 20 76 61 6c 75 65 20 6f 66 20 74   of a value of t
135d0 68 61 74 20 74 79 70 65 0a 20 20 20 20 53 69 7a  hat type.    Siz
135e0 65 4f 66 2c 0a 20 20 20 20 2f 2f 2f 20 43 72 65  eOf,.    /// Cre
135f0 61 74 65 73 20 61 20 6e 65 77 20 75 6e 69 6e 69  ates a new unini
13600 74 69 61 6c 69 7a 65 64 20 62 6f 78 20 66 6f 72  tialized box for
13610 20 61 20 76 61 6c 75 65 20 6f 66 20 74 68 61 74   a value of that
13620 20 74 79 70 65 0a 20 20 20 20 42 6f 78 2c 0a 7d   type.    Box,.}
13630 0a 0a 23 5b 64 65 72 69 76 65 28 43 6f 70 79 2c  ..#[derive(Copy,
13640 20 43 6c 6f 6e 65 2c 20 44 65 62 75 67 2c 20 50   Clone, Debug, P
13650 61 72 74 69 61 6c 45 71 2c 20 45 71 2c 20 52 75  artialEq, Eq, Ru
13660 73 74 63 45 6e 63 6f 64 61 62 6c 65 2c 20 52 75  stcEncodable, Ru
13670 73 74 63 44 65 63 6f 64 61 62 6c 65 2c 20 48 61  stcDecodable, Ha
13680 73 68 53 74 61 62 6c 65 29 5d 0a 70 75 62 20 65  shStable)].pub e
13690 6e 75 6d 20 55 6e 4f 70 20 7b 0a 20 20 20 20 2f  num UnOp {.    /
136a0 2f 2f 20 54 68 65 20 60 21 60 20 6f 70 65 72 61  // The `!` opera
136b0 74 6f 72 20 66 6f 72 20 6c 6f 67 69 63 61 6c 20  tor for logical 
136c0 69 6e 76 65 72 73 69 6f 6e 0a 20 20 20 20 4e 6f  inversion.    No
136d0 74 2c 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 60  t,.    /// The `
136e0 2d 60 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  -` operator for 
136f0 6e 65 67 61 74 69 6f 6e 0a 20 20 20 20 4e 65 67  negation.    Neg
13700 2c 0a 7d 0a 0a 69 6d 70 6c 3c 27 74 63 78 3e 20  ,.}..impl<'tcx> 
13710 44 65 62 75 67 20 66 6f 72 20 52 76 61 6c 75 65  Debug for Rvalue
13720 3c 27 74 63 78 3e 20 7b 0a 20 20 20 20 66 6e 20  <'tcx> {.    fn 
13730 66 6d 74 28 26 73 65 6c 66 2c 20 66 6d 74 3a 20  fmt(&self, fmt: 
13740 26 6d 75 74 20 46 6f 72 6d 61 74 74 65 72 3c 27  &mut Formatter<'
13750 5f 3e 29 20 2d 3e 20 66 6d 74 3a 3a 52 65 73 75  _>) -> fmt::Resu
13760 6c 74 20 7b 0a 20 20 20 20 20 20 20 20 75 73 65  lt {.        use
13770 20 73 65 6c 66 3a 3a 52 76 61 6c 75 65 3a 3a 2a   self::Rvalue::*
13780 3b 0a 0a 20 20 20 20 20 20 20 20 6d 61 74 63 68  ;..        match
13790 20 2a 73 65 6c 66 20 7b 0a 20 20 20 20 20 20 20   *self {.       
137a0 20 20 20 20 20 55 73 65 28 72 65 66 20 70 6c 61       Use(ref pla
137b0 63 65 29 20 3d 3e 20 77 72 69 74 65 21 28 66 6d  ce) => write!(fm
137c0 74 2c 20 22 7b 3a 3f 7d 22 2c 20 70 6c 61 63 65  t, "{:?}", place
137d0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 52  ),.            R
137e0 65 70 65 61 74 28 72 65 66 20 61 2c 20 72 65 66  epeat(ref a, ref
137f0 20 62 29 20 3d 3e 20 77 72 69 74 65 21 28 66 6d   b) => write!(fm
13800 74 2c 20 22 5b 7b 3a 3f 7d 3b 20 7b 3a 3f 7d 5d  t, "[{:?}; {:?}]
13810 22 2c 20 61 2c 20 62 29 2c 0a 20 20 20 20 20 20  ", a, b),.      
13820 20 20 20 20 20 20 4c 65 6e 28 72 65 66 20 61 29        Len(ref a)
13830 20 3d 3e 20 77 72 69 74 65 21 28 66 6d 74 2c 20   => write!(fmt, 
13840 22 4c 65 6e 28 7b 3a 3f 7d 29 22 2c 20 61 29 2c  "Len({:?})", a),
13850 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 61 73  .            Cas
13860 74 28 72 65 66 20 6b 69 6e 64 2c 20 72 65 66 20  t(ref kind, ref 
13870 70 6c 61 63 65 2c 20 72 65 66 20 74 79 29 20 3d  place, ref ty) =
13880 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  > {.            
13890 20 20 20 20 77 72 69 74 65 21 28 66 6d 74 2c 20      write!(fmt, 
138a0 22 7b 3a 3f 7d 20 61 73 20 7b 3a 3f 7d 20 28 7b  "{:?} as {:?} ({
138b0 3a 3f 7d 29 22 2c 20 70 6c 61 63 65 2c 20 74 79  :?})", place, ty
138c0 2c 20 6b 69 6e 64 29 0a 20 20 20 20 20 20 20 20  , kind).        
138d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
138e0 20 20 42 69 6e 61 72 79 4f 70 28 72 65 66 20 6f    BinaryOp(ref o
138f0 70 2c 20 72 65 66 20 61 2c 20 72 65 66 20 62 29  p, ref a, ref b)
13900 20 3d 3e 20 77 72 69 74 65 21 28 66 6d 74 2c 20   => write!(fmt, 
13910 22 7b 3a 3f 7d 28 7b 3a 3f 7d 2c 20 7b 3a 3f 7d  "{:?}({:?}, {:?}
13920 29 22 2c 20 6f 70 2c 20 61 2c 20 62 29 2c 0a 20  )", op, a, b),. 
13930 20 20 20 20 20 20 20 20 20 20 20 43 68 65 63 6b             Check
13940 65 64 42 69 6e 61 72 79 4f 70 28 72 65 66 20 6f  edBinaryOp(ref o
13950 70 2c 20 72 65 66 20 61 2c 20 72 65 66 20 62 29  p, ref a, ref b)
13960 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20   => {.          
13970 20 20 20 20 20 20 77 72 69 74 65 21 28 66 6d 74        write!(fmt
13980 2c 20 22 43 68 65 63 6b 65 64 7b 3a 3f 7d 28 7b  , "Checked{:?}({
13990 3a 3f 7d 2c 20 7b 3a 3f 7d 29 22 2c 20 6f 70 2c  :?}, {:?})", op,
139a0 20 61 2c 20 62 29 0a 20 20 20 20 20 20 20 20 20   a, b).         
139b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
139c0 20 55 6e 61 72 79 4f 70 28 72 65 66 20 6f 70 2c   UnaryOp(ref op,
139d0 20 72 65 66 20 61 29 20 3d 3e 20 77 72 69 74 65   ref a) => write
139e0 21 28 66 6d 74 2c 20 22 7b 3a 3f 7d 28 7b 3a 3f  !(fmt, "{:?}({:?
139f0 7d 29 22 2c 20 6f 70 2c 20 61 29 2c 0a 20 20 20  })", op, a),.   
13a00 20 20 20 20 20 20 20 20 20 44 69 73 63 72 69 6d           Discrim
13a10 69 6e 61 6e 74 28 72 65 66 20 70 6c 61 63 65 29  inant(ref place)
13a20 20 3d 3e 20 77 72 69 74 65 21 28 66 6d 74 2c 20   => write!(fmt, 
13a30 22 64 69 73 63 72 69 6d 69 6e 61 6e 74 28 7b 3a  "discriminant({:
13a40 3f 7d 29 22 2c 20 70 6c 61 63 65 29 2c 0a 20 20  ?})", place),.  
13a50 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 61 72            Nullar
13a60 79 4f 70 28 72 65 66 20 6f 70 2c 20 72 65 66 20  yOp(ref op, ref 
13a70 74 29 20 3d 3e 20 77 72 69 74 65 21 28 66 6d 74  t) => write!(fmt
13a80 2c 20 22 7b 3a 3f 7d 28 7b 3a 3f 7d 29 22 2c 20  , "{:?}({:?})", 
13a90 6f 70 2c 20 74 29 2c 0a 20 20 20 20 20 20 20 20  op, t),.        
13aa0 20 20 20 20 52 65 66 28 72 65 67 69 6f 6e 2c 20      Ref(region, 
13ab0 62 6f 72 72 6f 77 5f 6b 69 6e 64 2c 20 72 65 66  borrow_kind, ref
13ac0 20 70 6c 61 63 65 29 20 3d 3e 20 7b 0a 20 20 20   place) => {.   
13ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74               let
13ae0 20 6b 69 6e 64 5f 73 74 72 20 3d 20 6d 61 74 63   kind_str = matc
13af0 68 20 62 6f 72 72 6f 77 5f 6b 69 6e 64 20 7b 0a  h borrow_kind {.
13b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b10 20 20 20 20 42 6f 72 72 6f 77 4b 69 6e 64 3a 3a      BorrowKind::
13b20 53 68 61 72 65 64 20 3d 3e 20 22 22 2c 0a 20 20  Shared => "",.  
13b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b40 20 20 42 6f 72 72 6f 77 4b 69 6e 64 3a 3a 53 68    BorrowKind::Sh
13b50 61 6c 6c 6f 77 20 3d 3e 20 22 73 68 61 6c 6c 6f  allow => "shallo
13b60 77 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  w ",.           
13b70 20 20 20 20 20 20 20 20 20 42 6f 72 72 6f 77 4b           BorrowK
13b80 69 6e 64 3a 3a 4d 75 74 20 7b 20 2e 2e 20 7d 20  ind::Mut { .. } 
13b90 7c 20 42 6f 72 72 6f 77 4b 69 6e 64 3a 3a 55 6e  | BorrowKind::Un
13ba0 69 71 75 65 20 3d 3e 20 22 6d 75 74 20 22 2c 0a  ique => "mut ",.
13bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bc0 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  };..            
13bd0 20 20 20 20 2f 2f 20 57 68 65 6e 20 70 72 69 6e      // When prin
13be0 74 69 6e 67 20 72 65 67 69 6f 6e 73 2c 20 61 64  ting regions, ad
13bf0 64 20 74 72 61 69 6c 69 6e 67 20 73 70 61 63 65  d trailing space
13c00 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   if necessary.. 
13c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
13c20 65 74 20 70 72 69 6e 74 5f 72 65 67 69 6f 6e 20  et print_region 
13c30 3d 20 74 79 3a 3a 74 6c 73 3a 3a 77 69 74 68 28  = ty::tls::with(
13c40 7c 74 63 78 7c 20 7b 0a 20 20 20 20 20 20 20 20  |tcx| {.        
13c50 20 20 20 20 20 20 20 20 20 20 20 20 74 63 78 2e              tcx.
13c60 73 65 73 73 2e 76 65 72 62 6f 73 65 28 29 20 7c  sess.verbose() |
13c70 7c 20 74 63 78 2e 73 65 73 73 2e 6f 70 74 73 2e  | tcx.sess.opts.
13c80 64 65 62 75 67 67 69 6e 67 5f 6f 70 74 73 2e 69  debugging_opts.i
13c90 64 65 6e 74 69 66 79 5f 72 65 67 69 6f 6e 73 0a  dentify_regions.
13ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cb0 7d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  });.            
13cc0 20 20 20 20 6c 65 74 20 72 65 67 69 6f 6e 20 3d      let region =
13cd0 20 69 66 20 70 72 69 6e 74 5f 72 65 67 69 6f 6e   if print_region
13ce0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
13cf0 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74 20 72         let mut r
13d00 65 67 69 6f 6e 20 3d 20 72 65 67 69 6f 6e 2e 74  egion = region.t
13d10 6f 5f 73 74 72 69 6e 67 28 29 3b 0a 20 20 20 20  o_string();.    
13d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d30 69 66 20 72 65 67 69 6f 6e 2e 6c 65 6e 28 29 20  if region.len() 
13d40 3e 20 30 20 7b 0a 20 20 20 20 20 20 20 20 20 20  > 0 {.          
13d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
13d60 67 69 6f 6e 2e 70 75 73 68 28 27 20 27 29 3b 0a  gion.push(' ');.
13d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
13d90 20 20 20 20 20 20 20 20 20 20 72 65 67 69 6f 6e            region
13da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13db0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
13dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
13dd0 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 70 72 69   Do not even pri
13de0 6e 74 20 27 73 74 61 74 69 63 0a 20 20 20 20 20  nt 'static.     
13df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
13e00 74 72 69 6e 67 3a 3a 6e 65 77 28 29 0a 20 20 20  tring::new().   
13e10 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 3b 0a               };.
13e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e30 77 72 69 74 65 21 28 66 6d 74 2c 20 22 26 7b 7d  write!(fmt, "&{}
13e40 7b 7d 7b 3a 3f 7d 22 2c 20 72 65 67 69 6f 6e 2c  {}{:?}", region,
13e50 20 6b 69 6e 64 5f 73 74 72 2c 20 70 6c 61 63 65   kind_str, place
13e60 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ).            }.
13e70 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 64 64  .            Add
13e80 72 65 73 73 4f 66 28 6d 75 74 61 62 69 6c 69 74  ressOf(mutabilit
13e90 79 2c 20 72 65 66 20 70 6c 61 63 65 29 20 3d 3e  y, ref place) =>
13ea0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
13eb0 20 20 20 6c 65 74 20 6b 69 6e 64 5f 73 74 72 20     let kind_str 
13ec0 3d 20 6d 61 74 63 68 20 6d 75 74 61 62 69 6c 69  = match mutabili
13ed0 74 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ty {.           
13ee0 20 20 20 20 20 20 20 20 20 4d 75 74 61 62 69 6c           Mutabil
13ef0 69 74 79 3a 3a 4d 75 74 20 3d 3e 20 22 6d 75 74  ity::Mut => "mut
13f00 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
13f10 20 20 20 20 20 20 20 4d 75 74 61 62 69 6c 69 74         Mutabilit
13f20 79 3a 3a 4e 6f 74 20 3d 3e 20 22 63 6f 6e 73 74  y::Not => "const
13f30 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
13f40 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20     };..         
13f50 20 20 20 20 20 20 20 77 72 69 74 65 21 28 66 6d         write!(fm
13f60 74 2c 20 22 26 72 61 77 20 7b 7d 20 7b 3a 3f 7d  t, "&raw {} {:?}
13f70 22 2c 20 6b 69 6e 64 5f 73 74 72 2c 20 70 6c 61  ", kind_str, pla
13f80 63 65 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ce).            
13f90 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 41  }..            A
13fa0 67 67 72 65 67 61 74 65 28 72 65 66 20 6b 69 6e  ggregate(ref kin
13fb0 64 2c 20 72 65 66 20 70 6c 61 63 65 73 29 20 3d  d, ref places) =
13fc0 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  > {.            
13fd0 20 20 20 20 66 6e 20 66 6d 74 5f 74 75 70 6c 65      fn fmt_tuple
13fe0 28 66 6d 74 3a 20 26 6d 75 74 20 46 6f 72 6d 61  (fmt: &mut Forma
13ff0 74 74 65 72 3c 27 5f 3e 2c 20 70 6c 61 63 65 73  tter<'_>, places
14000 3a 20 26 5b 4f 70 65 72 61 6e 64 3c 27 5f 3e 5d  : &[Operand<'_>]
14010 29 20 2d 3e 20 66 6d 74 3a 3a 52 65 73 75 6c 74  ) -> fmt::Result
14020 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
14030 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74 20 74         let mut t
14040 75 70 6c 65 5f 66 6d 74 20 3d 20 66 6d 74 2e 64  uple_fmt = fmt.d
14050 65 62 75 67 5f 74 75 70 6c 65 28 22 22 29 3b 0a  ebug_tuple("");.
14060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14070 20 20 20 20 66 6f 72 20 70 6c 61 63 65 20 69 6e      for place in
14080 20 70 6c 61 63 65 73 20 7b 0a 20 20 20 20 20 20   places {.      
14090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140a0 20 20 74 75 70 6c 65 5f 66 6d 74 2e 66 69 65 6c    tuple_fmt.fiel
140b0 64 28 70 6c 61 63 65 29 3b 0a 20 20 20 20 20 20  d(place);.      
140c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
140d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140e0 20 20 20 20 74 75 70 6c 65 5f 66 6d 74 2e 66 69      tuple_fmt.fi
140f0 6e 69 73 68 28 29 0a 20 20 20 20 20 20 20 20 20  nish().         
14100 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
14110 20 20 20 20 20 20 20 20 20 20 6d 61 74 63 68 20            match 
14120 2a 2a 6b 69 6e 64 20 7b 0a 20 20 20 20 20 20 20  **kind {.       
14130 20 20 20 20 20 20 20 20 20 20 20 20 20 41 67 67               Agg
14140 72 65 67 61 74 65 4b 69 6e 64 3a 3a 41 72 72 61  regateKind::Arra
14150 79 28 5f 29 20 3d 3e 20 77 72 69 74 65 21 28 66  y(_) => write!(f
14160 6d 74 2c 20 22 7b 3a 3f 7d 22 2c 20 70 6c 61 63  mt, "{:?}", plac
14170 65 73 29 2c 0a 0a 20 20 20 20 20 20 20 20 20 20  es),..          
14180 20 20 20 20 20 20 20 20 20 20 41 67 67 72 65 67            Aggreg
14190 61 74 65 4b 69 6e 64 3a 3a 54 75 70 6c 65 20 3d  ateKind::Tuple =
141a0 3e 20 6d 61 74 63 68 20 70 6c 61 63 65 73 2e 6c  > match places.l
141b0 65 6e 28 29 20 7b 0a 20 20 20 20 20 20 20 20 20  en() {.         
141c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
141d0 20 3d 3e 20 77 72 69 74 65 21 28 66 6d 74 2c 20   => write!(fmt, 
141e0 22 28 29 22 29 2c 0a 20 20 20 20 20 20 20 20 20  "()"),.         
141f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
14200 20 3d 3e 20 77 72 69 74 65 21 28 66 6d 74 2c 20   => write!(fmt, 
14210 22 28 7b 3a 3f 7d 2c 29 22 2c 20 70 6c 61 63 65  "({:?},)", place
14220 73 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 20 20  s[0]),.         
14230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5f                 _
14240 20 3d 3e 20 66 6d 74 5f 74 75 70 6c 65 28 66 6d   => fmt_tuple(fm
14250 74 2c 20 70 6c 61 63 65 73 29 2c 0a 20 20 20 20  t, places),.    
14260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14270 7d 2c 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  },..            
14280 20 20 20 20 20 20 20 20 41 67 67 72 65 67 61 74          Aggregat
14290 65 4b 69 6e 64 3a 3a 41 64 74 28 61 64 74 5f 64  eKind::Adt(adt_d
142a0 65 66 2c 20 76 61 72 69 61 6e 74 2c 20 73 75 62  ef, variant, sub
142b0 73 74 73 2c 20 5f 75 73 65 72 5f 74 79 2c 20 5f  sts, _user_ty, _
142c0 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20  ) => {.         
142d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
142e0 65 74 20 76 61 72 69 61 6e 74 5f 64 65 66 20 3d  et variant_def =
142f0 20 26 61 64 74 5f 64 65 66 2e 76 61 72 69 61 6e   &adt_def.varian
14300 74 73 5b 76 61 72 69 61 6e 74 5d 3b 0a 0a 20 20  ts[variant];..  
14310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14320 20 20 20 20 20 20 6c 65 74 20 66 20 3d 20 26 6d        let f = &m
14330 75 74 20 2a 66 6d 74 3b 0a 20 20 20 20 20 20 20  ut *fmt;.       
14340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14350 20 74 79 3a 3a 74 6c 73 3a 3a 77 69 74 68 28 7c   ty::tls::with(|
14360 74 63 78 7c 20 7b 0a 20 20 20 20 20 20 20 20 20  tcx| {.         
14370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14380 20 20 20 6c 65 74 20 73 75 62 73 74 73 20 3d 20     let substs = 
14390 74 63 78 2e 6c 69 66 74 28 26 73 75 62 73 74 73  tcx.lift(&substs
143a0 29 2e 65 78 70 65 63 74 28 22 63 6f 75 6c 64 20  ).expect("could 
143b0 6e 6f 74 20 6c 69 66 74 20 66 6f 72 20 70 72 69  not lift for pri
143c0 6e 74 69 6e 67 22 29 3b 0a 20 20 20 20 20 20 20  nting");.       
143d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143e0 20 20 20 20 20 46 6d 74 50 72 69 6e 74 65 72 3a       FmtPrinter:
143f0 3a 6e 65 77 28 74 63 78 2c 20 66 2c 20 4e 61 6d  :new(tcx, f, Nam
14400 65 73 70 61 63 65 3a 3a 56 61 6c 75 65 4e 53 29  espace::ValueNS)
14410 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14430 20 2e 70 72 69 6e 74 5f 64 65 66 5f 70 61 74 68   .print_def_path
14440 28 76 61 72 69 61 6e 74 5f 64 65 66 2e 64 65 66  (variant_def.def
14450 5f 69 64 2c 20 73 75 62 73 74 73 29 3f 3b 0a 20  _id, substs)?;. 
14460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14470 20 20 20 20 20 20 20 20 20 20 20 4f 6b 28 28 29             Ok(()
14480 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
14490 20 20 20 20 20 20 20 20 20 20 7d 29 3f 3b 0a 0a            })?;..
144a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144b0 20 20 20 20 20 20 20 20 6d 61 74 63 68 20 76 61          match va
144c0 72 69 61 6e 74 5f 64 65 66 2e 63 74 6f 72 5f 6b  riant_def.ctor_k
144d0 69 6e 64 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ind {.          
144e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144f0 20 20 43 74 6f 72 4b 69 6e 64 3a 3a 43 6f 6e 73    CtorKind::Cons
14500 74 20 3d 3e 20 4f 6b 28 28 29 29 2c 0a 20 20 20  t => Ok(()),.   
14510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14520 20 20 20 20 20 20 20 20 20 43 74 6f 72 4b 69 6e           CtorKin
14530 64 3a 3a 46 6e 20 3d 3e 20 66 6d 74 5f 74 75 70  d::Fn => fmt_tup
14540 6c 65 28 66 6d 74 2c 20 70 6c 61 63 65 73 29 2c  le(fmt, places),
14550 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14560 20 20 20 20 20 20 20 20 20 20 20 20 20 43 74 6f               Cto
14570 72 4b 69 6e 64 3a 3a 46 69 63 74 69 76 65 20 3d  rKind::Fictive =
14580 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  > {.            
14590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145a0 20 20 20 20 6c 65 74 20 6d 75 74 20 73 74 72 75      let mut stru
145b0 63 74 5f 66 6d 74 20 3d 20 66 6d 74 2e 64 65 62  ct_fmt = fmt.deb
145c0 75 67 5f 73 74 72 75 63 74 28 22 22 29 3b 0a 20  ug_struct("");. 
145d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
145f0 6f 72 20 28 66 69 65 6c 64 2c 20 70 6c 61 63 65  or (field, place
14600 29 20 69 6e 20 76 61 72 69 61 6e 74 5f 64 65 66  ) in variant_def
14610 2e 66 69 65 6c 64 73 2e 69 74 65 72 28 29 2e 7a  .fields.iter().z
14620 69 70 28 70 6c 61 63 65 73 29 20 7b 0a 20 20 20  ip(places) {.   
14630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14650 20 73 74 72 75 63 74 5f 66 6d 74 2e 66 69 65 6c   struct_fmt.fiel
14660 64 28 26 66 69 65 6c 64 2e 69 64 65 6e 74 2e 61  d(&field.ident.a
14670 73 5f 73 74 72 28 29 2c 20 70 6c 61 63 65 29 3b  s_str(), place);
14680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
146b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146c0 20 20 20 73 74 72 75 63 74 5f 66 6d 74 2e 66 69     struct_fmt.fi
146d0 6e 69 73 68 28 29 0a 20 20 20 20 20 20 20 20 20  nish().         
146e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
14700 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
14710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14720 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
14730 20 20 20 20 20 20 20 20 20 20 41 67 67 72 65 67            Aggreg
14740 61 74 65 4b 69 6e 64 3a 3a 43 6c 6f 73 75 72 65  ateKind::Closure
14750 28 64 65 66 5f 69 64 2c 20 73 75 62 73 74 73 29  (def_id, substs)
14760 20 3d 3e 20 74 79 3a 3a 74 6c 73 3a 3a 77 69 74   => ty::tls::wit
14770 68 28 7c 74 63 78 7c 20 7b 0a 20 20 20 20 20 20  h(|tcx| {.      
14780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14790 20 20 69 66 20 6c 65 74 20 53 6f 6d 65 28 68 69    if let Some(hi
147a0 72 5f 69 64 29 20 3d 20 74 63 78 2e 68 69 72 28  r_id) = tcx.hir(
147b0 29 2e 61 73 5f 6c 6f 63 61 6c 5f 68 69 72 5f 69  ).as_local_hir_i
147c0 64 28 64 65 66 5f 69 64 29 20 7b 0a 20 20 20 20  d(def_id) {.    
147d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147e0 20 20 20 20 20 20 20 20 6c 65 74 20 6e 61 6d 65          let name
147f0 20 3d 20 69 66 20 74 63 78 2e 73 65 73 73 2e 6f   = if tcx.sess.o
14800 70 74 73 2e 64 65 62 75 67 67 69 6e 67 5f 6f 70  pts.debugging_op
14810 74 73 2e 73 70 61 6e 5f 66 72 65 65 5f 66 6f 72  ts.span_free_for
14820 6d 61 74 73 20 7b 0a 20 20 20 20 20 20 20 20 20  mats {.         
14830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14840 20 20 20 20 20 20 20 6c 65 74 20 73 75 62 73 74         let subst
14850 73 20 3d 20 74 63 78 2e 6c 69 66 74 28 26 73 75  s = tcx.lift(&su
14860 62 73 74 73 29 2e 75 6e 77 72 61 70 28 29 3b 0a  bsts).unwrap();.
14870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14890 66 6f 72 6d 61 74 21 28 0a 20 20 20 20 20 20 20  format!(.       
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148b0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5b 63               "[c
148c0 6c 6f 73 75 72 65 40 7b 7d 5d 22 2c 0a 20 20 20  losure@{}]",.   
148d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148f0 20 74 63 78 2e 64 65 66 5f 70 61 74 68 5f 73 74   tcx.def_path_st
14900 72 5f 77 69 74 68 5f 73 75 62 73 74 73 28 64 65  r_with_substs(de
14910 66 5f 69 64 2c 20 73 75 62 73 74 73 29 2c 0a 20  f_id, substs),. 
14920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29                 )
14940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14950 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65               } e
14960 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
14970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14980 20 20 20 20 20 20 66 6f 72 6d 61 74 21 28 22 5b        format!("[
14990 63 6c 6f 73 75 72 65 40 7b 3a 3f 7d 5d 22 2c 20  closure@{:?}]", 
149a0 74 63 78 2e 68 69 72 28 29 2e 73 70 61 6e 28 68  tcx.hir().span(h
149b0 69 72 5f 69 64 29 29 0a 20 20 20 20 20 20 20 20  ir_id)).        
149c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149d0 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20 20      };.         
149e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149f0 20 20 20 6c 65 74 20 6d 75 74 20 73 74 72 75 63     let mut struc
14a00 74 5f 66 6d 74 20 3d 20 66 6d 74 2e 64 65 62 75  t_fmt = fmt.debu
14a10 67 5f 73 74 72 75 63 74 28 26 6e 61 6d 65 29 3b  g_struct(&name);
14a20 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
14a40 20 6c 65 74 20 53 6f 6d 65 28 75 70 76 61 72 73   let Some(upvars
14a50 29 20 3d 20 74 63 78 2e 75 70 76 61 72 73 28 64  ) = tcx.upvars(d
14a60 65 66 5f 69 64 29 20 7b 0a 20 20 20 20 20 20 20  ef_id) {.       
14a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a80 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 26 76           for (&v
14a90 61 72 5f 69 64 2c 20 70 6c 61 63 65 29 20 69 6e  ar_id, place) in
14aa0 20 75 70 76 61 72 73 2e 6b 65 79 73 28 29 2e 7a   upvars.keys().z
14ab0 69 70 28 70 6c 61 63 65 73 29 20 7b 0a 20 20 20  ip(places) {.   
14ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ae0 20 6c 65 74 20 76 61 72 5f 6e 61 6d 65 20 3d 20   let var_name = 
14af0 74 63 78 2e 68 69 72 28 29 2e 6e 61 6d 65 28 76  tcx.hir().name(v
14b00 61 72 5f 69 64 29 3b 0a 20 20 20 20 20 20 20 20  ar_id);.        
14b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
14b30 63 74 5f 66 6d 74 2e 66 69 65 6c 64 28 26 76 61  ct_fmt.field(&va
14b40 72 5f 6e 61 6d 65 2e 61 73 5f 73 74 72 28 29 2c  r_name.as_str(),
14b50 20 70 6c 61 63 65 29 3b 0a 20 20 20 20 20 20 20   place);.       
14b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b90 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
14ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bb0 20 20 20 20 20 20 73 74 72 75 63 74 5f 66 6d 74        struct_fmt
14bc0 2e 66 69 6e 69 73 68 28 29 0a 20 20 20 20 20 20  .finish().      
14bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14be0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
14bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c00 20 20 20 20 20 20 20 77 72 69 74 65 21 28 66 6d         write!(fm
14c10 74 2c 20 22 5b 63 6c 6f 73 75 72 65 5d 22 29 0a  t, "[closure]").
14c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 29                })
14c50 2c 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
14c60 20 20 20 20 20 20 20 41 67 67 72 65 67 61 74 65         Aggregate
14c70 4b 69 6e 64 3a 3a 47 65 6e 65 72 61 74 6f 72 28  Kind::Generator(
14c80 64 65 66 5f 69 64 2c 20 5f 2c 20 5f 29 20 3d 3e  def_id, _, _) =>
14c90 20 74 79 3a 3a 74 6c 73 3a 3a 77 69 74 68 28 7c   ty::tls::with(|
14ca0 74 63 78 7c 20 7b 0a 20 20 20 20 20 20 20 20 20  tcx| {.         
14cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
14cc0 66 20 6c 65 74 20 53 6f 6d 65 28 68 69 72 5f 69  f let Some(hir_i
14cd0 64 29 20 3d 20 74 63 78 2e 68 69 72 28 29 2e 61  d) = tcx.hir().a
14ce0 73 5f 6c 6f 63 61 6c 5f 68 69 72 5f 69 64 28 64  s_local_hir_id(d
14cf0 65 66 5f 69 64 29 20 7b 0a 20 20 20 20 20 20 20  ef_id) {.       
14d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d10 20 20 20 20 20 6c 65 74 20 6e 61 6d 65 20 3d 20       let name = 
14d20 66 6f 72 6d 61 74 21 28 22 5b 67 65 6e 65 72 61  format!("[genera
14d30 74 6f 72 40 7b 3a 3f 7d 5d 22 2c 20 74 63 78 2e  tor@{:?}]", tcx.
14d40 68 69 72 28 29 2e 73 70 61 6e 28 68 69 72 5f 69  hir().span(hir_i
14d50 64 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  d));.           
14d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d70 20 6c 65 74 20 6d 75 74 20 73 74 72 75 63 74 5f   let mut struct_
14d80 66 6d 74 20 3d 20 66 6d 74 2e 64 65 62 75 67 5f  fmt = fmt.debug_
14d90 73 74 72 75 63 74 28 26 6e 61 6d 65 29 3b 0a 0a  struct(&name);..
14da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14db0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 6c              if l
14dc0 65 74 20 53 6f 6d 65 28 75 70 76 61 72 73 29 20  et Some(upvars) 
14dd0 3d 20 74 63 78 2e 75 70 76 61 72 73 28 64 65 66  = tcx.upvars(def
14de0 5f 69 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20  _id) {.         
14df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e00 20 20 20 20 20 20 20 66 6f 72 20 28 26 76 61 72         for (&var
14e10 5f 69 64 2c 20 70 6c 61 63 65 29 20 69 6e 20 75  _id, place) in u
14e20 70 76 61 72 73 2e 6b 65 79 73 28 29 2e 7a 69 70  pvars.keys().zip
14e30 28 70 6c 61 63 65 73 29 20 7b 0a 20 20 20 20 20  (places) {.     
14e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
14e60 65 74 20 76 61 72 5f 6e 61 6d 65 20 3d 20 74 63  et var_name = tc
14e70 78 2e 68 69 72 28 29 2e 6e 61 6d 65 28 76 61 72  x.hir().name(var
14e80 5f 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  _id);.          
14e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ea0 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
14eb0 5f 66 6d 74 2e 66 69 65 6c 64 28 26 76 61 72 5f  _fmt.field(&var_
14ec0 6e 61 6d 65 2e 61 73 5f 73 74 72 28 29 2c 20 70  name.as_str(), p
14ed0 6c 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20  lace);.         
14ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ef0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f10 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
14f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f30 20 20 20 20 73 74 72 75 63 74 5f 66 6d 74 2e 66      struct_fmt.f
14f40 69 6e 69 73 68 28 29 0a 20 20 20 20 20 20 20 20  inish().        
14f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f60 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
14f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f80 20 20 20 20 20 77 72 69 74 65 21 28 66 6d 74 2c       write!(fmt,
14f90 20 22 5b 67 65 6e 65 72 61 74 6f 72 5d 22 29 0a   "[generator]").
14fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 29                })
14fd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14fe0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
14ff0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
15000 7d 0a 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  }.}..///////////
15010 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15020 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15030 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15040 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15050 0a 2f 2f 2f 20 43 6f 6e 73 74 61 6e 74 73 0a 2f  ./// Constants./
15060 2f 2f 0a 2f 2f 2f 20 54 77 6f 20 63 6f 6e 73 74  //./// Two const
15070 61 6e 74 73 20 61 72 65 20 65 71 75 61 6c 20 69  ants are equal i
15080 66 20 74 68 65 79 20 61 72 65 20 74 68 65 20 73  f they are the s
15090 61 6d 65 20 63 6f 6e 73 74 61 6e 74 2e 20 4e 6f  ame constant. No
150a0 74 65 20 74 68 61 74 0a 2f 2f 2f 20 74 68 69 73  te that./// this
150b0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73   does not necess
150c0 61 72 69 6c 79 20 6d 65 61 6e 20 74 68 61 74 20  arily mean that 
150d0 74 68 65 79 20 61 72 65 20 22 3d 3d 22 20 69 6e  they are "==" in
150e0 20 52 75 73 74 20 2d 2d 20 69 6e 0a 2f 2f 2f 20   Rust -- in./// 
150f0 70 61 72 74 69 63 75 6c 61 72 20 6f 6e 65 20 6d  particular one m
15100 75 73 74 20 62 65 20 77 61 72 79 20 6f 66 20 60  ust be wary of `
15110 4e 61 4e 60 21 0a 0a 23 5b 64 65 72 69 76 65 28  NaN`!..#[derive(
15120 43 6c 6f 6e 65 2c 20 50 61 72 74 69 61 6c 45 71  Clone, PartialEq
15130 2c 20 52 75 73 74 63 45 6e 63 6f 64 61 62 6c 65  , RustcEncodable
15140 2c 20 52 75 73 74 63 44 65 63 6f 64 61 62 6c 65  , RustcDecodable
15150 2c 20 48 61 73 68 53 74 61 62 6c 65 29 5d 0a 70  , HashStable)].p
15160 75 62 20 73 74 72 75 63 74 20 43 6f 6e 73 74 61  ub struct Consta
15170 6e 74 3c 27 74 63 78 3e 20 7b 0a 20 20 20 20 70  nt<'tcx> {.    p
15180 75 62 20 73 70 61 6e 3a 20 53 70 61 6e 2c 0a 0a  ub span: Span,..
15190 20 20 20 20 2f 2f 2f 20 4f 70 74 69 6f 6e 61 6c      /// Optional
151a0 20 75 73 65 72 2d 67 69 76 65 6e 20 74 79 70 65   user-given type
151b0 3a 20 66 6f 72 20 73 6f 6d 65 74 68 69 6e 67 20  : for something 
151c0 6c 69 6b 65 0a 20 20 20 20 2f 2f 2f 20 60 63 6f  like.    /// `co
151d0 6c 6c 65 63 74 3a 3a 3c 56 65 63 3c 5f 3e 3e 60  llect::<Vec<_>>`
151e0 2c 20 74 68 69 73 20 77 6f 75 6c 64 20 62 65 20  , this would be 
151f0 70 72 65 73 65 6e 74 20 61 6e 64 20 77 6f 75 6c  present and woul
15200 64 0a 20 20 20 20 2f 2f 2f 20 69 6e 64 69 63 61  d.    /// indica
15210 74 65 20 74 68 61 74 20 60 56 65 63 3c 5f 3e 60  te that `Vec<_>`
15220 20 77 61 73 20 65 78 70 6c 69 63 69 74 6c 79 20   was explicitly 
15230 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2f  specified..    /
15240 2f 2f 0a 20 20 20 20 2f 2f 2f 20 4e 65 65 64 65  //.    /// Neede
15250 64 20 66 6f 72 20 4e 4c 4c 20 74 6f 20 69 6d 70  d for NLL to imp
15260 6f 73 65 20 75 73 65 72 2d 67 69 76 65 6e 20 74  ose user-given t
15270 79 70 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  ype constraints.
15280 0a 20 20 20 20 70 75 62 20 75 73 65 72 5f 74 79  .    pub user_ty
15290 3a 20 4f 70 74 69 6f 6e 3c 55 73 65 72 54 79 70  : Option<UserTyp
152a0 65 41 6e 6e 6f 74 61 74 69 6f 6e 49 6e 64 65 78  eAnnotationIndex
152b0 3e 2c 0a 0a 20 20 20 20 70 75 62 20 6c 69 74 65  >,..    pub lite
152c0 72 61 6c 3a 20 26 27 74 63 78 20 74 79 3a 3a 43  ral: &'tcx ty::C
152d0 6f 6e 73 74 3c 27 74 63 78 3e 2c 0a 7d 0a 0a 69  onst<'tcx>,.}..i
152e0 6d 70 6c 20 43 6f 6e 73 74 61 6e 74 3c 27 74 63  mpl Constant<'tc
152f0 78 3e 20 7b 0a 20 20 20 20 70 75 62 20 66 6e 20  x> {.    pub fn 
15300 63 68 65 63 6b 5f 73 74 61 74 69 63 5f 70 74 72  check_static_ptr
15310 28 26 73 65 6c 66 2c 20 74 63 78 3a 20 54 79 43  (&self, tcx: TyC
15320 74 78 74 3c 27 5f 3e 29 20 2d 3e 20 4f 70 74 69  txt<'_>) -> Opti
15330 6f 6e 3c 44 65 66 49 64 3e 20 7b 0a 20 20 20 20  on<DefId> {.    
15340 20 20 20 20 6d 61 74 63 68 20 73 65 6c 66 2e 6c      match self.l
15350 69 74 65 72 61 6c 2e 76 61 6c 2e 74 72 79 5f 74  iteral.val.try_t
15360 6f 5f 73 63 61 6c 61 72 28 29 20 7b 0a 20 20 20  o_scalar() {.   
15370 20 20 20 20 20 20 20 20 20 53 6f 6d 65 28 53 63           Some(Sc
15380 61 6c 61 72 3a 3a 50 74 72 28 70 74 72 29 29 20  alar::Ptr(ptr)) 
15390 3d 3e 20 6d 61 74 63 68 20 74 63 78 2e 61 6c 6c  => match tcx.all
153a0 6f 63 5f 6d 61 70 2e 6c 6f 63 6b 28 29 2e 67 65  oc_map.lock().ge
153b0 74 28 70 74 72 2e 61 6c 6c 6f 63 5f 69 64 29 20  t(ptr.alloc_id) 
153c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
153d0 20 20 53 6f 6d 65 28 47 6c 6f 62 61 6c 41 6c 6c    Some(GlobalAll
153e0 6f 63 3a 3a 53 74 61 74 69 63 28 64 65 66 5f 69  oc::Static(def_i
153f0 64 29 29 20 3d 3e 20 53 6f 6d 65 28 64 65 66 5f  d)) => Some(def_
15400 69 64 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  id),.           
15410 20 20 20 20 20 53 6f 6d 65 28 5f 29 20 3d 3e 20       Some(_) => 
15420 4e 6f 6e 65 2c 0a 20 20 20 20 20 20 20 20 20 20  None,.          
15430 20 20 20 20 20 20 4e 6f 6e 65 20 3d 3e 20 7b 0a        None => {.
15440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15450 20 20 20 20 74 63 78 2e 73 65 73 73 2e 64 65 6c      tcx.sess.del
15460 61 79 5f 73 70 61 6e 5f 62 75 67 28 0a 20 20 20  ay_span_bug(.   
15470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15480 20 20 20 20 20 44 55 4d 4d 59 5f 53 50 2c 20 22       DUMMY_SP, "
15490 4d 49 52 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 61  MIR cannot conta
154a0 69 6e 20 64 61 6e 67 6c 69 6e 67 20 63 6f 6e 73  in dangling cons
154b0 74 20 70 6f 69 6e 74 65 72 73 22 2c 0a 20 20 20  t pointers",.   
154c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
154e0 20 20 20 20 20 20 20 20 4e 6f 6e 65 0a 20 20 20          None.   
154f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
15500 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
15510 20 20 20 20 20 20 20 20 20 20 20 5f 20 3d 3e 20             _ => 
15520 4e 6f 6e 65 2c 0a 20 20 20 20 20 20 20 20 7d 0a  None,.        }.
15530 20 20 20 20 7d 0a 7d 0a 0a 2f 2f 2f 20 41 20 63      }.}../// A c
15540 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66 20 70 72 6f  ollection of pro
15550 6a 65 63 74 69 6f 6e 73 20 69 6e 74 6f 20 75 73  jections into us
15560 65 72 20 74 79 70 65 73 2e 0a 2f 2f 2f 0a 2f 2f  er types..///.//
15570 2f 20 54 68 65 79 20 61 72 65 20 70 72 6f 6a 65  / They are proje
15580 63 74 69 6f 6e 73 20 62 65 63 61 75 73 65 20 61  ctions because a
15590 20 62 69 6e 64 69 6e 67 20 63 61 6e 20 6f 63 63   binding can occ
155a0 75 72 20 61 20 70 61 72 74 20 6f 66 20 61 0a 2f  ur a part of a./
155b0 2f 2f 20 70 61 72 65 6e 74 20 70 61 74 74 65 72  // parent patter
155c0 6e 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  n that has been 
155d0 61 73 63 72 69 62 65 64 20 61 20 74 79 70 65 2e  ascribed a type.
155e0 0a 2f 2f 2f 0a 2f 2f 2f 20 49 74 73 20 61 20 63  .///./// Its a c
155f0 6f 6c 6c 65 63 74 69 6f 6e 20 62 65 63 61 75 73  ollection becaus
15600 65 20 74 68 65 72 65 20 63 61 6e 20 62 65 20 6d  e there can be m
15610 75 6c 74 69 70 6c 65 20 74 79 70 65 20 61 73 63  ultiple type asc
15620 72 69 70 74 69 6f 6e 73 20 6f 6e 0a 2f 2f 2f 20  riptions on./// 
15630 74 68 65 20 70 61 74 68 20 66 72 6f 6d 20 74 68  the path from th
15640 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 70 61  e root of the pa
15650 74 74 65 72 6e 20 64 6f 77 6e 20 74 6f 20 74 68  ttern down to th
15660 65 20 62 69 6e 64 69 6e 67 20 69 74 73 65 6c 66  e binding itself
15670 2e 0a 2f 2f 2f 0a 2f 2f 2f 20 41 6e 20 65 78 61  ..///./// An exa
15680 6d 70 6c 65 3a 0a 2f 2f 2f 0a 2f 2f 2f 20 60 60  mple:.///./// ``
15690 60 72 75 73 74 0a 2f 2f 2f 20 73 74 72 75 63 74  `rust./// struct
156a0 20 53 3c 27 61 3e 28 28 69 33 32 2c 20 26 27 61   S<'a>((i32, &'a
156b0 20 73 74 72 29 2c 20 53 74 72 69 6e 67 29 3b 0a   str), String);.
156c0 2f 2f 2f 20 6c 65 74 20 53 28 28 5f 2c 20 77 29  /// let S((_, w)
156d0 3a 20 28 69 33 32 2c 20 26 27 73 74 61 74 69 63  : (i32, &'static
156e0 20 73 74 72 29 2c 20 5f 29 3a 20 53 20 3d 20 2e   str), _): S = .
156f0 2e 2e 3b 0a 2f 2f 2f 20 2f 2f 20 20 20 20 2d 2d  ..;./// //    --
15700 2d 2d 2d 2d 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ----  ^^^^^^^^^^
15710 5e 5e 5e 5e 5e 5e 5e 5e 5e 20 28 31 29 0a 2f 2f  ^^^^^^^^^ (1).//
15720 2f 20 2f 2f 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  / //  ----------
15730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15740 2d 2d 2d 2d 2d 2d 2d 20 20 5e 20 28 32 29 0a 2f  -------  ^ (2)./
15750 2f 2f 20 60 60 60 0a 2f 2f 2f 0a 2f 2f 2f 20 54  // ```.///./// T
15760 68 65 20 68 69 67 68 6c 69 67 68 74 73 20 6c 61  he highlights la
15770 62 65 6c 6c 65 64 20 60 28 31 29 60 20 73 68 6f  belled `(1)` sho
15780 77 20 74 68 65 20 73 75 62 70 61 74 74 65 72 6e  w the subpattern
15790 20 60 28 5f 2c 20 77 29 60 20 62 65 69 6e 67 0a   `(_, w)` being.
157a0 2f 2f 2f 20 61 73 63 72 69 62 65 64 20 74 68 65  /// ascribed the
157b0 20 74 79 70 65 20 60 28 69 33 32 2c 20 26 27 73   type `(i32, &'s
157c0 74 61 74 69 63 20 73 74 72 29 60 2e 0a 2f 2f 2f  tatic str)`..///
157d0 0a 2f 2f 2f 20 54 68 65 20 68 69 67 68 6c 69 67  ./// The highlig
157e0 68 74 73 20 6c 61 62 65 6c 6c 65 64 20 60 28 32  hts labelled `(2
157f0 29 60 20 73 68 6f 77 20 74 68 65 20 77 68 6f 6c  )` show the whol
15800 65 20 70 61 74 74 65 72 6e 20 62 65 69 6e 67 0a  e pattern being.
15810 2f 2f 2f 20 61 73 63 72 69 62 65 64 20 74 68 65  /// ascribed the
15820 20 74 79 70 65 20 60 53 60 2e 0a 2f 2f 2f 0a 2f   type `S`..///./
15830 2f 2f 20 49 6e 20 74 68 69 73 20 65 78 61 6d 70  // In this examp
15840 6c 65 2c 20 77 68 65 6e 20 77 65 20 64 65 73 63  le, when we desc
15850 65 6e 64 20 74 6f 20 60 77 60 2c 20 77 65 20 77  end to `w`, we w
15860 69 6c 6c 20 68 61 76 65 20 62 75 69 6c 74 20 75  ill have built u
15870 70 20 74 68 65 0a 2f 2f 2f 20 66 6f 6c 6c 6f 77  p the./// follow
15880 69 6e 67 20 74 77 6f 20 70 72 6f 6a 65 63 74 65  ing two projecte
15890 64 20 74 79 70 65 73 3a 0a 2f 2f 2f 0a 2f 2f 2f  d types:.///.///
158a0 20 20 20 2a 20 62 61 73 65 3a 20 60 53 60 2c 20     * base: `S`, 
158b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158c0 20 20 70 72 6f 6a 65 63 74 69 6f 6e 3a 20 60 28    projection: `(
158d0 62 61 73 65 2e 30 29 2e 31 60 0a 2f 2f 2f 20 20  base.0).1`.///  
158e0 20 2a 20 62 61 73 65 3a 20 60 28 69 33 32 2c 20   * base: `(i32, 
158f0 26 27 73 74 61 74 69 63 20 73 74 72 29 60 2c 20  &'static str)`, 
15900 70 72 6f 6a 65 63 74 69 6f 6e 3a 20 60 62 61 73  projection: `bas
15910 65 2e 31 60 0a 2f 2f 2f 0a 2f 2f 2f 20 54 68 65  e.1`.///./// The
15920 20 66 69 72 73 74 20 77 69 6c 6c 20 6c 65 61 64   first will lead
15930 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61 69   to the constrai
15940 6e 74 20 60 77 3a 20 26 27 31 20 73 74 72 60 20  nt `w: &'1 str` 
15950 28 66 6f 72 20 73 6f 6d 65 0a 2f 2f 2f 20 69 6e  (for some./// in
15960 66 65 72 72 65 64 20 72 65 67 69 6f 6e 20 60 27  ferred region `'
15970 31 60 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  1`). The second 
15980 77 69 6c 6c 20 6c 65 61 64 20 74 6f 20 74 68 65  will lead to the
15990 20 63 6f 6e 73 74 72 61 69 6e 74 20 60 77 3a 0a   constraint `w:.
159a0 2f 2f 2f 20 26 27 73 74 61 74 69 63 20 73 74 72  /// &'static str
159b0 60 2e 0a 23 5b 64 65 72 69 76 65 28 43 6c 6f 6e  `..#[derive(Clon
159c0 65 2c 20 44 65 62 75 67 2c 20 52 75 73 74 63 45  e, Debug, RustcE
159d0 6e 63 6f 64 61 62 6c 65 2c 20 52 75 73 74 63 44  ncodable, RustcD
159e0 65 63 6f 64 61 62 6c 65 2c 20 48 61 73 68 53 74  ecodable, HashSt
159f0 61 62 6c 65 2c 20 54 79 70 65 46 6f 6c 64 61 62  able, TypeFoldab
15a00 6c 65 29 5d 0a 70 75 62 20 73 74 72 75 63 74 20  le)].pub struct 
15a10 55 73 65 72 54 79 70 65 50 72 6f 6a 65 63 74 69  UserTypeProjecti
15a20 6f 6e 73 20 7b 0a 20 20 20 20 70 75 62 28 63 72  ons {.    pub(cr
15a30 61 74 65 29 20 63 6f 6e 74 65 6e 74 73 3a 20 56  ate) contents: V
15a40 65 63 3c 28 55 73 65 72 54 79 70 65 50 72 6f 6a  ec<(UserTypeProj
15a50 65 63 74 69 6f 6e 2c 20 53 70 61 6e 29 3e 2c 0a  ection, Span)>,.
15a60 7d 0a 0a 69 6d 70 6c 3c 27 74 63 78 3e 20 55 73  }..impl<'tcx> Us
15a70 65 72 54 79 70 65 50 72 6f 6a 65 63 74 69 6f 6e  erTypeProjection
15a80 73 20 7b 0a 20 20 20 20 70 75 62 20 66 6e 20 6e  s {.    pub fn n
15a90 6f 6e 65 28 29 20 2d 3e 20 53 65 6c 66 20 7b 0a  one() -> Self {.
15aa0 20 20 20 20 20 20 20 20 55 73 65 72 54 79 70 65          UserType
15ab0 50 72 6f 6a 65 63 74 69 6f 6e 73 20 7b 20 63 6f  Projections { co
15ac0 6e 74 65 6e 74 73 3a 20 76 65 63 21 5b 5d 20 7d  ntents: vec![] }
15ad0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 75 62 20  .    }..    pub 
15ae0 66 6e 20 66 72 6f 6d 5f 70 72 6f 6a 65 63 74 69  fn from_projecti
15af0 6f 6e 73 28 70 72 6f 6a 73 3a 20 69 6d 70 6c 20  ons(projs: impl 
15b00 49 74 65 72 61 74 6f 72 3c 49 74 65 6d 20 3d 20  Iterator<Item = 
15b10 28 55 73 65 72 54 79 70 65 50 72 6f 6a 65 63 74  (UserTypeProject
15b20 69 6f 6e 2c 20 53 70 61 6e 29 3e 29 20 2d 3e 20  ion, Span)>) -> 
15b30 53 65 6c 66 20 7b 0a 20 20 20 20 20 20 20 20 55  Self {.        U
15b40 73 65 72 54 79 70 65 50 72 6f 6a 65 63 74 69 6f  serTypeProjectio
15b50 6e 73 20 7b 20 63 6f 6e 74 65 6e 74 73 3a 20 70  ns { contents: p
15b60 72 6f 6a 73 2e 63 6f 6c 6c 65 63 74 28 29 20 7d  rojs.collect() }
15b70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 75 62 20  .    }..    pub 
15b80 66 6e 20 70 72 6f 6a 65 63 74 69 6f 6e 73 5f 61  fn projections_a
15b90 6e 64 5f 73 70 61 6e 73 28 26 73 65 6c 66 29 0a  nd_spans(&self).
15ba0 20 20 20 20 20 20 20 20 2d 3e 20 69 6d 70 6c 20          -> impl 
15bb0 49 74 65 72 61 74 6f 72 3c 49 74 65 6d 20 3d 20  Iterator<Item = 
15bc0 26 28 55 73 65 72 54 79 70 65 50 72 6f 6a 65 63  &(UserTypeProjec
15bd0 74 69 6f 6e 2c 20 53 70 61 6e 29 3e 20 2b 20 45  tion, Span)> + E
15be0 78 61 63 74 53 69 7a 65 49 74 65 72 61 74 6f 72  xactSizeIterator
15bf0 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 73  .    {.        s
15c00 65 6c 66 2e 63 6f 6e 74 65 6e 74 73 2e 69 74 65  elf.contents.ite
15c10 72 28 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  r().    }..    p
15c20 75 62 20 66 6e 20 70 72 6f 6a 65 63 74 69 6f 6e  ub fn projection
15c30 73 28 26 73 65 6c 66 29 0a 20 20 20 20 20 20 20  s(&self).       
15c40 20 2d 3e 20 69 6d 70 6c 20 49 74 65 72 61 74 6f   -> impl Iterato
15c50 72 3c 49 74 65 6d 20 3d 20 26 55 73 65 72 54 79  r<Item = &UserTy
15c60 70 65 50 72 6f 6a 65 63 74 69 6f 6e 3e 20 2b 20  peProjection> + 
15c70 45 78 61 63 74 53 69 7a 65 49 74 65 72 61 74 6f  ExactSizeIterato
15c80 72 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20  r.    {.        
15c90 73 65 6c 66 2e 63 6f 6e 74 65 6e 74 73 2e 69 74  self.contents.it
15ca0 65 72 28 29 2e 6d 61 70 28 7c 26 28 72 65 66 20  er().map(|&(ref 
15cb0 75 73 65 72 5f 74 79 70 65 2c 20 5f 73 70 61 6e  user_type, _span
15cc0 29 7c 20 75 73 65 72 5f 74 79 70 65 29 0a 20 20  )| user_type).  
15cd0 20 20 7d 0a 0a 20 20 20 20 70 75 62 20 66 6e 20    }..    pub fn 
15ce0 70 75 73 68 5f 70 72 6f 6a 65 63 74 69 6f 6e 28  push_projection(
15cf0 6d 75 74 20 73 65 6c 66 2c 20 75 73 65 72 5f 74  mut self, user_t
15d00 79 3a 20 26 55 73 65 72 54 79 70 65 50 72 6f 6a  y: &UserTypeProj
15d10 65 63 74 69 6f 6e 2c 20 73 70 61 6e 3a 20 53 70  ection, span: Sp
15d20 61 6e 29 20 2d 3e 20 53 65 6c 66 20 7b 0a 20 20  an) -> Self {.  
15d30 20 20 20 20 20 20 73 65 6c 66 2e 63 6f 6e 74 65        self.conte
15d40 6e 74 73 2e 70 75 73 68 28 28 75 73 65 72 5f 74  nts.push((user_t
15d50 79 2e 63 6c 6f 6e 65 28 29 2c 20 73 70 61 6e 29  y.clone(), span)
15d60 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 66 0a  );.        self.
15d70 20 20 20 20 7d 0a 0a 20 20 20 20 66 6e 20 6d 61      }..    fn ma
15d80 70 5f 70 72 6f 6a 65 63 74 69 6f 6e 73 28 0a 20  p_projections(. 
15d90 20 20 20 20 20 20 20 6d 75 74 20 73 65 6c 66 2c         mut self,
15da0 0a 20 20 20 20 20 20 20 20 6d 75 74 20 66 3a 20  .        mut f: 
15db0 69 6d 70 6c 20 46 6e 4d 75 74 28 55 73 65 72 54  impl FnMut(UserT
15dc0 79 70 65 50 72 6f 6a 65 63 74 69 6f 6e 29 20 2d  ypeProjection) -
15dd0 3e 20 55 73 65 72 54 79 70 65 50 72 6f 6a 65 63  > UserTypeProjec
15de0 74 69 6f 6e 2c 0a 20 20 20 20 29 20 2d 3e 20 53  tion,.    ) -> S
15df0 65 6c 66 20 7b 0a 20 20 20 20 20 20 20 20 73 65  elf {.        se
15e00 6c 66 2e 63 6f 6e 74 65 6e 74 73 20 3d 20 73 65  lf.contents = se
15e10 6c 66 2e 63 6f 6e 74 65 6e 74 73 2e 64 72 61 69  lf.contents.drai
15e20 6e 28 2e 2e 29 2e 6d 61 70 28 7c 28 70 72 6f 6a  n(..).map(|(proj
15e30 2c 20 73 70 61 6e 29 7c 20 28 66 28 70 72 6f 6a  , span)| (f(proj
15e40 29 2c 20 73 70 61 6e 29 29 2e 63 6f 6c 6c 65 63  ), span)).collec
15e50 74 28 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c  t();.        sel
15e60 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 75 62  f.    }..    pub
15e70 20 66 6e 20 69 6e 64 65 78 28 73 65 6c 66 29 20   fn index(self) 
15e80 2d 3e 20 53 65 6c 66 20 7b 0a 20 20 20 20 20 20  -> Self {.      
15e90 20 20 73 65 6c 66 2e 6d 61 70 5f 70 72 6f 6a 65    self.map_proje
15ea0 63 74 69 6f 6e 73 28 7c 70 61 74 5f 74 79 5f 70  ctions(|pat_ty_p
15eb0 72 6f 6a 7c 20 70 61 74 5f 74 79 5f 70 72 6f 6a  roj| pat_ty_proj
15ec0 2e 69 6e 64 65 78 28 29 29 0a 20 20 20 20 7d 0a  .index()).    }.
15ed0 0a 20 20 20 20 70 75 62 20 66 6e 20 73 75 62 73  .    pub fn subs
15ee0 6c 69 63 65 28 73 65 6c 66 2c 20 66 72 6f 6d 3a  lice(self, from:
15ef0 20 75 33 32 2c 20 74 6f 3a 20 75 33 32 29 20 2d   u32, to: u32) -
15f00 3e 20 53 65 6c 66 20 7b 0a 20 20 20 20 20 20 20  > Self {.       
15f10 20 73 65 6c 66 2e 6d 61 70 5f 70 72 6f 6a 65 63   self.map_projec
15f20 74 69 6f 6e 73 28 7c 70 61 74 5f 74 79 5f 70 72  tions(|pat_ty_pr
15f30 6f 6a 7c 20 70 61 74 5f 74 79 5f 70 72 6f 6a 2e  oj| pat_ty_proj.
15f40 73 75 62 73 6c 69 63 65 28 66 72 6f 6d 2c 20 74  subslice(from, t
15f50 6f 29 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  o)).    }..    p
15f60 75 62 20 66 6e 20 64 65 72 65 66 28 73 65 6c 66  ub fn deref(self
15f70 29 20 2d 3e 20 53 65 6c 66 20 7b 0a 20 20 20 20  ) -> Self {.    
15f80 20 20 20 20 73 65 6c 66 2e 6d 61 70 5f 70 72 6f      self.map_pro
15f90 6a 65 63 74 69 6f 6e 73 28 7c 70 61 74 5f 74 79  jections(|pat_ty
15fa0 5f 70 72 6f 6a 7c 20 70 61 74 5f 74 79 5f 70 72  _proj| pat_ty_pr
15fb0 6f 6a 2e 64 65 72 65 66 28 29 29 0a 20 20 20 20  oj.deref()).    
15fc0 7d 0a 0a 20 20 20 20 70 75 62 20 66 6e 20 6c 65  }..    pub fn le
15fd0 61 66 28 73 65 6c 66 2c 20 66 69 65 6c 64 3a 20  af(self, field: 
15fe0 46 69 65 6c 64 29 20 2d 3e 20 53 65 6c 66 20 7b  Field) -> Self {
15ff0 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e 6d 61  .        self.ma
16000 70 5f 70 72 6f 6a 65 63 74 69 6f 6e 73 28 7c 70  p_projections(|p
16010 61 74 5f 74 79 5f 70 72 6f 6a 7c 20 70 61 74 5f  at_ty_proj| pat_
16020 74 79 5f 70 72 6f 6a 2e 6c 65 61 66 28 66 69 65  ty_proj.leaf(fie
16030 6c 64 29 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ld)).    }..    
16040 70 75 62 20 66 6e 20 76 61 72 69 61 6e 74 28 73  pub fn variant(s
16050 65 6c 66 2c 20 61 64 74 5f 64 65 66 3a 20 26 27  elf, adt_def: &'
16060 74 63 78 20 41 64 74 44 65 66 2c 20 76 61 72 69  tcx AdtDef, vari
16070 61 6e 74 5f 69 6e 64 65 78 3a 20 56 61 72 69 61  ant_index: Varia
16080 6e 74 49 64 78 2c 20 66 69 65 6c 64 3a 20 46 69  ntIdx, field: Fi
16090 65 6c 64 29 20 2d 3e 20 53 65 6c 66 20 7b 0a 20  eld) -> Self {. 
160a0 20 20 20 20 20 20 20 73 65 6c 66 2e 6d 61 70 5f         self.map_
160b0 70 72 6f 6a 65 63 74 69 6f 6e 73 28 7c 70 61 74  projections(|pat
160c0 5f 74 79 5f 70 72 6f 6a 7c 20 70 61 74 5f 74 79  _ty_proj| pat_ty
160d0 5f 70 72 6f 6a 2e 76 61 72 69 61 6e 74 28 61 64  _proj.variant(ad
160e0 74 5f 64 65 66 2c 20 76 61 72 69 61 6e 74 5f 69  t_def, variant_i
160f0 6e 64 65 78 2c 20 66 69 65 6c 64 29 29 0a 20 20  ndex, field)).  
16100 20 20 7d 0a 7d 0a 0a 2f 2f 2f 20 45 6e 63 6f 64    }.}../// Encod
16110 65 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  es the effect of
16120 20 61 20 75 73 65 72 2d 73 75 70 70 6c 69 65 64   a user-supplied
16130 20 74 79 70 65 20 61 6e 6e 6f 74 61 74 69 6f 6e   type annotation
16140 20 6f 6e 20 74 68 65 0a 2f 2f 2f 20 73 75 62 63   on the./// subc
16150 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 61 20 70  omponents of a p
16160 61 74 74 65 72 6e 2e 20 54 68 65 20 65 66 66 65  attern. The effe
16170 63 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  ct is determined
16180 20 62 79 20 61 70 70 6c 79 69 6e 67 20 74 68 65   by applying the
16190 0a 2f 2f 2f 20 67 69 76 65 6e 20 6c 69 73 74 20  ./// given list 
161a0 6f 66 20 70 72 6f 65 6a 63 74 69 6f 6e 73 20 74  of proejctions t
161b0 6f 20 73 6f 6d 65 20 75 6e 64 65 72 6c 79 69 6e  o some underlyin
161c0 67 20 62 61 73 65 20 74 79 70 65 2e 20 4f 66 74  g base type. Oft
161d0 65 6e 2c 0a 2f 2f 2f 20 74 68 65 20 70 72 6f 6a  en,./// the proj
161e0 65 63 74 69 6f 6e 20 65 6c 65 6d 65 6e 74 20 6c  ection element l
161f0 69 73 74 20 60 70 72 6f 6a 73 60 20 69 73 20 65  ist `projs` is e
16200 6d 70 74 79 2c 20 69 6e 20 77 68 69 63 68 20 63  mpty, in which c
16210 61 73 65 20 74 68 69 73 0a 2f 2f 2f 20 64 69 72  ase this./// dir
16220 65 63 74 6c 79 20 65 6e 63 6f 64 65 73 20 61 20  ectly encodes a 
16230 74 79 70 65 20 69 6e 20 60 62 61 73 65 60 2e 20  type in `base`. 
16240 42 75 74 20 69 6e 20 74 68 65 20 63 61 73 65 20  But in the case 
16250 6f 66 20 63 6f 6d 70 6c 65 78 20 70 61 74 74 65  of complex patte
16260 72 6e 73 20 77 69 74 68 0a 2f 2f 2f 20 73 75 62  rns with./// sub
16270 70 61 74 74 65 72 6e 73 20 61 6e 64 20 62 69 6e  patterns and bin
16280 64 69 6e 67 73 2c 20 77 65 20 77 61 6e 74 20 74  dings, we want t
16290 6f 20 61 70 70 6c 79 20 6f 6e 6c 79 20 61 20 2a  o apply only a *
162a0 70 61 72 74 2a 20 6f 66 20 74 68 65 20 74 79 70  part* of the typ
162b0 65 20 74 6f 20 61 20 76 61 72 69 61 62 6c 65 2c  e to a variable,
162c0 0a 2f 2f 2f 20 69 6e 20 77 68 69 63 68 20 63 61  ./// in which ca
162d0 73 65 20 74 68 65 20 60 70 72 6f 6a 73 60 20 76  se the `projs` v
162e0 65 63 74 6f 72 20 69 73 20 75 73 65 64 2e 0a 2f  ector is used../
162f0 2f 2f 0a 2f 2f 2f 20 45 78 61 6d 70 6c 65 73 3a  //./// Examples:
16300 0a 2f 2f 2f 0a 2f 2f 2f 20 2a 20 60 6c 65 74 20  .///./// * `let 
16310 78 3a 20 54 20 3d 20 2e 2e 2e 60 20 2d 2d 20 68  x: T = ...` -- h
16320 65 72 65 2c 20 74 68 65 20 60 70 72 6f 6a 73 60  ere, the `projs`
16330 20 76 65 63 74 6f 72 20 69 73 20 65 6d 70 74 79   vector is empty
16340 2e 0a 2f 2f 2f 0a 2f 2f 2f 20 2a 20 60 6c 65 74  ..///./// * `let
16350 20 28 78 2c 20 5f 29 3a 20 54 20 3d 20 2e 2e 2e   (x, _): T = ...
16360 60 20 2d 2d 20 68 65 72 65 2c 20 74 68 65 20 60  ` -- here, the `
16370 70 72 6f 6a 73 60 20 76 65 63 74 6f 72 20 77 6f  projs` vector wo
16380 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2f 2f 2f 20  uld contain./// 
16390 20 20 60 66 69 65 6c 64 5b 30 5d 60 20 28 61 6b    `field[0]` (ak
163a0 61 20 60 2e 30 60 29 2c 20 69 6e 64 69 63 61 74  a `.0`), indicat
163b0 69 6e 67 20 74 68 61 74 20 74 68 65 20 74 79 70  ing that the typ
163c0 65 20 6f 66 20 60 73 60 20 69 73 0a 2f 2f 2f 20  e of `s` is./// 
163d0 20 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20    determined by 
163e0 66 69 6e 64 69 6e 67 20 74 68 65 20 74 79 70 65  finding the type
163f0 20 6f 66 20 74 68 65 20 60 2e 30 60 20 66 69 65   of the `.0` fie
16400 6c 64 20 66 72 6f 6d 20 60 54 60 2e 0a 23 5b 64  ld from `T`..#[d
16410 65 72 69 76 65 28 43 6c 6f 6e 65 2c 20 44 65 62  erive(Clone, Deb
16420 75 67 2c 20 52 75 73 74 63 45 6e 63 6f 64 61 62  ug, RustcEncodab
16430 6c 65 2c 20 52 75 73 74 63 44 65 63 6f 64 61 62  le, RustcDecodab
16440 6c 65 2c 20 48 61 73 68 53 74 61 62 6c 65 2c 20  le, HashStable, 
16450 50 61 72 74 69 61 6c 45 71 29 5d 0a 70 75 62 20  PartialEq)].pub 
16460 73 74 72 75 63 74 20 55 73 65 72 54 79 70 65 50  struct UserTypeP
16470 72 6f 6a 65 63 74 69 6f 6e 20 7b 0a 20 20 20 20  rojection {.    
16480 70 75 62 20 62 61 73 65 3a 20 55 73 65 72 54 79  pub base: UserTy
16490 70 65 41 6e 6e 6f 74 61 74 69 6f 6e 49 6e 64 65  peAnnotationInde
164a0 78 2c 0a 20 20 20 20 70 75 62 20 70 72 6f 6a 73  x,.    pub projs
164b0 3a 20 56 65 63 3c 50 72 6f 6a 65 63 74 69 6f 6e  : Vec<Projection
164c0 4b 69 6e 64 3e 2c 0a 7d 0a 0a 69 6d 70 6c 20 43  Kind>,.}..impl C
164d0 6f 70 79 20 66 6f 72 20 50 72 6f 6a 65 63 74 69  opy for Projecti
164e0 6f 6e 4b 69 6e 64 20 7b 7d 0a 0a 69 6d 70 6c 20  onKind {}..impl 
164f0 55 73 65 72 54 79 70 65 50 72 6f 6a 65 63 74 69  UserTypeProjecti
16500 6f 6e 20 7b 0a 20 20 20 20 70 75 62 28 63 72 61  on {.    pub(cra
16510 74 65 29 20 66 6e 20 69 6e 64 65 78 28 6d 75 74  te) fn index(mut
16520 20 73 65 6c 66 29 20 2d 3e 20 53 65 6c 66 20 7b   self) -> Self {
16530 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e 70 72  .        self.pr
16540 6f 6a 73 2e 70 75 73 68 28 50 72 6f 6a 65 63 74  ojs.push(Project
16550 69 6f 6e 45 6c 65 6d 3a 3a 49 6e 64 65 78 28 28  ionElem::Index((
16560 29 29 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c  )));.        sel
16570 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 75 62  f.    }..    pub
16580 28 63 72 61 74 65 29 20 66 6e 20 73 75 62 73 6c  (crate) fn subsl
16590 69 63 65 28 6d 75 74 20 73 65 6c 66 2c 20 66 72  ice(mut self, fr
165a0 6f 6d 3a 20 75 33 32 2c 20 74 6f 3a 20 75 33 32  om: u32, to: u32
165b0 29 20 2d 3e 20 53 65 6c 66 20 7b 0a 20 20 20 20  ) -> Self {.    
165c0 20 20 20 20 73 65 6c 66 2e 70 72 6f 6a 73 2e 70      self.projs.p
165d0 75 73 68 28 50 72 6f 6a 65 63 74 69 6f 6e 45 6c  ush(ProjectionEl
165e0 65 6d 3a 3a 53 75 62 73 6c 69 63 65 20 7b 20 66  em::Subslice { f
165f0 72 6f 6d 2c 20 74 6f 2c 20 66 72 6f 6d 5f 65 6e  rom, to, from_en
16600 64 3a 20 74 72 75 65 20 7d 29 3b 0a 20 20 20 20  d: true });.    
16610 20 20 20 20 73 65 6c 66 0a 20 20 20 20 7d 0a 0a      self.    }..
16620 20 20 20 20 70 75 62 28 63 72 61 74 65 29 20 66      pub(crate) f
16630 6e 20 64 65 72 65 66 28 6d 75 74 20 73 65 6c 66  n deref(mut self
16640 29 20 2d 3e 20 53 65 6c 66 20 7b 0a 20 20 20 20  ) -> Self {.    
16650 20 20 20 20 73 65 6c 66 2e 70 72 6f 6a 73 2e 70      self.projs.p
16660 75 73 68 28 50 72 6f 6a 65 63 74 69 6f 6e 45 6c  ush(ProjectionEl
16670 65 6d 3a 3a 44 65 72 65 66 29 3b 0a 20 20 20 20  em::Deref);.    
16680 20 20 20 20 73 65 6c 66 0a 20 20 20 20 7d 0a 0a      self.    }..
16690 20 20 20 20 70 75 62 28 63 72 61 74 65 29 20 66      pub(crate) f
166a0 6e 20 6c 65 61 66 28 6d 75 74 20 73 65 6c 66 2c  n leaf(mut self,
166b0 20 66 69 65 6c 64 3a 20 46 69 65 6c 64 29 20 2d   field: Field) -
166c0 3e 20 53 65 6c 66 20 7b 0a 20 20 20 20 20 20 20  > Self {.       
166d0 20 73 65 6c 66 2e 70 72 6f 6a 73 2e 70 75 73 68   self.projs.push
166e0 28 50 72 6f 6a 65 63 74 69 6f 6e 45 6c 65 6d 3a  (ProjectionElem:
166f0 3a 46 69 65 6c 64 28 66 69 65 6c 64 2c 20 28 29  :Field(field, ()
16700 29 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 66  ));.        self
16710 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 75 62 28  .    }..    pub(
16720 63 72 61 74 65 29 20 66 6e 20 76 61 72 69 61 6e  crate) fn varian
16730 74 28 0a 20 20 20 20 20 20 20 20 6d 75 74 20 73  t(.        mut s
16740 65 6c 66 2c 0a 20 20 20 20 20 20 20 20 61 64 74  elf,.        adt
16750 5f 64 65 66 3a 20 26 27 74 63 78 20 41 64 74 44  _def: &'tcx AdtD
16760 65 66 2c 0a 20 20 20 20 20 20 20 20 76 61 72 69  ef,.        vari
16770 61 6e 74 5f 69 6e 64 65 78 3a 20 56 61 72 69 61  ant_index: Varia
16780 6e 74 49 64 78 2c 0a 20 20 20 20 20 20 20 20 66  ntIdx,.        f
16790 69 65 6c 64 3a 20 46 69 65 6c 64 2c 0a 20 20 20  ield: Field,.   
167a0 20 29 20 2d 3e 20 53 65 6c 66 20 7b 0a 20 20 20   ) -> Self {.   
167b0 20 20 20 20 20 73 65 6c 66 2e 70 72 6f 6a 73 2e       self.projs.
167c0 70 75 73 68 28 50 72 6f 6a 65 63 74 69 6f 6e 45  push(ProjectionE
167d0 6c 65 6d 3a 3a 44 6f 77 6e 63 61 73 74 28 0a 20  lem::Downcast(. 
167e0 20 20 20 20 20 20 20 20 20 20 20 53 6f 6d 65 28             Some(
167f0 61 64 74 5f 64 65 66 2e 76 61 72 69 61 6e 74 73  adt_def.variants
16800 5b 76 61 72 69 61 6e 74 5f 69 6e 64 65 78 5d 2e  [variant_index].
16810 69 64 65 6e 74 2e 6e 61 6d 65 29 2c 0a 20 20 20  ident.name),.   
16820 20 20 20 20 20 20 20 20 20 76 61 72 69 61 6e 74           variant
16830 5f 69 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 20  _index,.        
16840 29 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 66  ));.        self
16850 2e 70 72 6f 6a 73 2e 70 75 73 68 28 50 72 6f 6a  .projs.push(Proj
16860 65 63 74 69 6f 6e 45 6c 65 6d 3a 3a 46 69 65 6c  ectionElem::Fiel
16870 64 28 66 69 65 6c 64 2c 20 28 29 29 29 3b 0a 20  d(field, ()));. 
16880 20 20 20 20 20 20 20 73 65 6c 66 0a 20 20 20 20         self.    
16890 7d 0a 7d 0a 0a 43 6c 6f 6e 65 54 79 70 65 46 6f  }.}..CloneTypeFo
168a0 6c 64 61 62 6c 65 41 6e 64 4c 69 66 74 49 6d 70  ldableAndLiftImp
168b0 6c 73 21 20 7b 20 50 72 6f 6a 65 63 74 69 6f 6e  ls! { Projection
168c0 4b 69 6e 64 2c 20 7d 0a 0a 69 6d 70 6c 3c 27 74  Kind, }..impl<'t
168d0 63 78 3e 20 54 79 70 65 46 6f 6c 64 61 62 6c 65  cx> TypeFoldable
168e0 3c 27 74 63 78 3e 20 66 6f 72 20 55 73 65 72 54  <'tcx> for UserT
168f0 79 70 65 50 72 6f 6a 65 63 74 69 6f 6e 20 7b 0a  ypeProjection {.
16900 20 20 20 20 66 6e 20 73 75 70 65 72 5f 66 6f 6c      fn super_fol
16910 64 5f 77 69 74 68 3c 46 3a 20 54 79 70 65 46 6f  d_with<F: TypeFo
16920 6c 64 65 72 3c 27 74 63 78 3e 3e 28 26 73 65 6c  lder<'tcx>>(&sel
16930 66 2c 20 66 6f 6c 64 65 72 3a 20 26 6d 75 74 20  f, folder: &mut 
16940 46 29 20 2d 3e 20 53 65 6c 66 20 7b 0a 20 20 20  F) -> Self {.   
16950 20 20 20 20 20 75 73 65 20 63 72 61 74 65 3a 3a       use crate::
16960 6d 69 72 3a 3a 50 72 6f 6a 65 63 74 69 6f 6e 45  mir::ProjectionE
16970 6c 65 6d 3a 3a 2a 3b 0a 0a 20 20 20 20 20 20 20  lem::*;..       
16980 20 6c 65 74 20 62 61 73 65 20 3d 20 73 65 6c 66   let base = self
16990 2e 62 61 73 65 2e 66 6f 6c 64 5f 77 69 74 68 28  .base.fold_with(
169a0 66 6f 6c 64 65 72 29 3b 0a 20 20 20 20 20 20 20  folder);.       
169b0 20 6c 65 74 20 70 72 6f 6a 73 3a 20 56 65 63 3c   let projs: Vec<
169c0 5f 3e 20 3d 20 73 65 6c 66 0a 20 20 20 20 20 20  _> = self.      
169d0 20 20 20 20 20 20 2e 70 72 6f 6a 73 0a 20 20 20        .projs.   
169e0 20 20 20 20 20 20 20 20 20 2e 69 74 65 72 28 29           .iter()
169f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2e 6d 61  .            .ma
16a00 70 28 7c 65 6c 65 6d 7c 20 6d 61 74 63 68 20 65  p(|elem| match e
16a10 6c 65 6d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lem {.          
16a20 20 20 20 20 20 20 44 65 72 65 66 20 3d 3e 20 44        Deref => D
16a30 65 72 65 66 2c 0a 20 20 20 20 20 20 20 20 20 20  eref,.          
16a40 20 20 20 20 20 20 46 69 65 6c 64 28 66 2c 20 28        Field(f, (
16a50 29 29 20 3d 3e 20 46 69 65 6c 64 28 66 2e 63 6c  )) => Field(f.cl
16a60 6f 6e 65 28 29 2c 20 28 29 29 2c 0a 20 20 20 20  one(), ()),.    
16a70 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 64 65              Inde
16a80 78 28 28 29 29 20 3d 3e 20 49 6e 64 65 78 28 28  x(()) => Index((
16a90 29 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )),.            
16aa0 20 20 20 20 65 6c 65 6d 20 3d 3e 20 65 6c 65 6d      elem => elem
16ab0 2e 63 6c 6f 6e 65 28 29 2c 0a 20 20 20 20 20 20  .clone(),.      
16ac0 20 20 20 20 20 20 7d 29 0a 20 20 20 20 20 20 20        }).       
16ad0 20 20 20 20 20 2e 63 6f 6c 6c 65 63 74 28 29 3b       .collect();
16ae0 0a 0a 20 20 20 20 20 20 20 20 55 73 65 72 54 79  ..        UserTy
16af0 70 65 50 72 6f 6a 65 63 74 69 6f 6e 20 7b 20 62  peProjection { b
16b00 61 73 65 2c 20 70 72 6f 6a 73 20 7d 0a 20 20 20  ase, projs }.   
16b10 20 7d 0a 0a 20 20 20 20 66 6e 20 73 75 70 65 72   }..    fn super
16b20 5f 76 69 73 69 74 5f 77 69 74 68 3c 56 73 3a 20  _visit_with<Vs: 
16b30 54 79 70 65 56 69 73 69 74 6f 72 3c 27 74 63 78  TypeVisitor<'tcx
16b40 3e 3e 28 26 73 65 6c 66 2c 20 76 69 73 69 74 6f  >>(&self, visito
16b50 72 3a 20 26 6d 75 74 20 56 73 29 20 2d 3e 20 62  r: &mut Vs) -> b
16b60 6f 6f 6c 20 7b 0a 20 20 20 20 20 20 20 20 73 65  ool {.        se
16b70 6c 66 2e 62 61 73 65 2e 76 69 73 69 74 5f 77 69  lf.base.visit_wi
16b80 74 68 28 76 69 73 69 74 6f 72 29 0a 20 20 20 20  th(visitor).    
16b90 20 20 20 20 2f 2f 20 4e 6f 74 65 3a 20 74 68 65      // Note: the
16ba0 72 65 27 73 20 6e 6f 74 68 69 6e 67 20 69 6e 20  re's nothing in 
16bb0 60 73 65 6c 66 2e 70 72 6f 6a 60 20 74 6f 20 76  `self.proj` to v
16bc0 69 73 69 74 2e 0a 20 20 20 20 7d 0a 7d 0a 0a 72  isit..    }.}..r
16bd0 75 73 74 63 5f 69 6e 64 65 78 3a 3a 6e 65 77 74  ustc_index::newt
16be0 79 70 65 5f 69 6e 64 65 78 21 20 7b 0a 20 20 20  ype_index! {.   
16bf0 20 70 75 62 20 73 74 72 75 63 74 20 50 72 6f 6d   pub struct Prom
16c00 6f 74 65 64 20 7b 0a 20 20 20 20 20 20 20 20 64  oted {.        d
16c10 65 72 69 76 65 20 5b 48 61 73 68 53 74 61 62 6c  erive [HashStabl
16c20 65 5d 0a 20 20 20 20 20 20 20 20 44 45 42 55 47  e].        DEBUG
16c30 5f 46 4f 52 4d 41 54 20 3d 20 22 70 72 6f 6d 6f  _FORMAT = "promo
16c40 74 65 64 5b 7b 7d 5d 22 0a 20 20 20 20 7d 0a 7d  ted[{}]".    }.}
16c50 0a 0a 69 6d 70 6c 3c 27 74 63 78 3e 20 44 65 62  ..impl<'tcx> Deb
16c60 75 67 20 66 6f 72 20 43 6f 6e 73 74 61 6e 74 3c  ug for Constant<
16c70 27 74 63 78 3e 20 7b 0a 20 20 20 20 66 6e 20 66  'tcx> {.    fn f
16c80 6d 74 28 26 73 65 6c 66 2c 20 66 6d 74 3a 20 26  mt(&self, fmt: &
16c90 6d 75 74 20 46 6f 72 6d 61 74 74 65 72 3c 27 5f  mut Formatter<'_
16ca0 3e 29 20 2d 3e 20 66 6d 74 3a 3a 52 65 73 75 6c  >) -> fmt::Resul
16cb0 74 20 7b 0a 20 20 20 20 20 20 20 20 77 72 69 74  t {.        writ
16cc0 65 21 28 66 6d 74 2c 20 22 7b 7d 22 2c 20 73 65  e!(fmt, "{}", se
16cd0 6c 66 29 0a 20 20 20 20 7d 0a 7d 0a 0a 69 6d 70  lf).    }.}..imp
16ce0 6c 3c 27 74 63 78 3e 20 44 69 73 70 6c 61 79 20  l<'tcx> Display 
16cf0 66 6f 72 20 43 6f 6e 73 74 61 6e 74 3c 27 74 63  for Constant<'tc
16d00 78 3e 20 7b 0a 20 20 20 20 66 6e 20 66 6d 74 28  x> {.    fn fmt(
16d10 26 73 65 6c 66 2c 20 66 6d 74 3a 20 26 6d 75 74  &self, fmt: &mut
16d20 20 46 6f 72 6d 61 74 74 65 72 3c 27 5f 3e 29 20   Formatter<'_>) 
16d30 2d 3e 20 66 6d 74 3a 3a 52 65 73 75 6c 74 20 7b  -> fmt::Result {
16d40 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 21 28  .        write!(
16d50 66 6d 74 2c 20 22 63 6f 6e 73 74 20 22 29 3f 3b  fmt, "const ")?;
16d60 0a 20 20 20 20 20 20 20 20 2f 2f 20 46 49 58 4d  .        // FIXM
16d70 45 20 6d 61 6b 65 20 74 68 65 20 64 65 66 61 75  E make the defau
16d80 6c 74 20 70 72 65 74 74 79 20 70 72 69 6e 74 69  lt pretty printi
16d90 6e 67 20 6f 66 20 72 61 77 20 70 6f 69 6e 74 65  ng of raw pointe
16da0 72 73 20 6d 6f 72 65 20 64 65 74 61 69 6c 65 64  rs more detailed
16db0 2e 20 48 65 72 65 20 77 65 20 6f 75 74 70 75 74  . Here we output
16dc0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2f 2f 20   the.        // 
16dd0 64 65 62 75 67 20 72 65 70 72 65 73 65 6e 74 61  debug representa
16de0 74 69 6f 6e 20 6f 66 20 72 61 77 20 70 6f 69 6e  tion of raw poin
16df0 74 65 72 73 2c 20 73 6f 20 74 68 61 74 20 74 68  ters, so that th
16e00 65 20 72 61 77 20 70 6f 69 6e 74 65 72 73 20 69  e raw pointers i
16e10 6e 20 74 68 65 20 6d 69 72 20 64 75 6d 70 20 6f  n the mir dump o
16e20 75 74 70 75 74 20 61 72 65 0a 20 20 20 20 20 20  utput are.      
16e30 20 20 2f 2f 20 64 65 74 61 69 6c 65 64 20 61 6e    // detailed an
16e40 64 20 6a 75 73 74 20 6e 6f 74 20 27 7b 70 6f 69  d just not '{poi
16e50 6e 74 65 72 7d 27 2e 0a 20 20 20 20 20 20 20 20  nter}'..        
16e60 69 66 20 6c 65 74 20 74 79 3a 3a 52 61 77 50 74  if let ty::RawPt
16e70 72 28 5f 29 20 3d 20 73 65 6c 66 2e 6c 69 74 65  r(_) = self.lite
16e80 72 61 6c 2e 74 79 2e 6b 69 6e 64 20 7b 0a 20 20  ral.ty.kind {.  
16e90 20 20 20 20 20 20 20 20 20 20 77 72 69 74 65 21            write!
16ea0 28 66 6d 74 2c 20 22 7b 3a 3f 7d 20 3a 20 7b 7d  (fmt, "{:?} : {}
16eb0 22 2c 20 73 65 6c 66 2e 6c 69 74 65 72 61 6c 2e  ", self.literal.
16ec0 76 61 6c 2c 20 73 65 6c 66 2e 6c 69 74 65 72 61  val, self.litera
16ed0 6c 2e 74 79 29 0a 20 20 20 20 20 20 20 20 7d 20  l.ty).        } 
16ee0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
16ef0 20 20 20 77 72 69 74 65 21 28 66 6d 74 2c 20 22     write!(fmt, "
16f00 7b 7d 22 2c 20 73 65 6c 66 2e 6c 69 74 65 72 61  {}", self.litera
16f10 6c 29 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  l).        }.   
16f20 20 7d 0a 7d 0a 0a 69 6d 70 6c 3c 27 74 63 78 3e   }.}..impl<'tcx>
16f30 20 67 72 61 70 68 3a 3a 44 69 72 65 63 74 65 64   graph::Directed
16f40 47 72 61 70 68 20 66 6f 72 20 42 6f 64 79 3c 27  Graph for Body<'
16f50 74 63 78 3e 20 7b 0a 20 20 20 20 74 79 70 65 20  tcx> {.    type 
16f60 4e 6f 64 65 20 3d 20 42 61 73 69 63 42 6c 6f 63  Node = BasicBloc
16f70 6b 3b 0a 7d 0a 0a 69 6d 70 6c 3c 27 74 63 78 3e  k;.}..impl<'tcx>
16f80 20 67 72 61 70 68 3a 3a 57 69 74 68 4e 75 6d 4e   graph::WithNumN
16f90 6f 64 65 73 20 66 6f 72 20 42 6f 64 79 3c 27 74  odes for Body<'t
16fa0 63 78 3e 20 7b 0a 20 20 20 20 66 6e 20 6e 75 6d  cx> {.    fn num
16fb0 5f 6e 6f 64 65 73 28 26 73 65 6c 66 29 20 2d 3e  _nodes(&self) ->
16fc0 20 75 73 69 7a 65 20 7b 0a 20 20 20 20 20 20 20   usize {.       
16fd0 20 73 65 6c 66 2e 62 61 73 69 63 5f 62 6c 6f 63   self.basic_bloc
16fe0 6b 73 2e 6c 65 6e 28 29 0a 20 20 20 20 7d 0a 7d  ks.len().    }.}
16ff0 0a 0a 69 6d 70 6c 3c 27 74 63 78 3e 20 67 72 61  ..impl<'tcx> gra
17000 70 68 3a 3a 57 69 74 68 53 74 61 72 74 4e 6f 64  ph::WithStartNod
17010 65 20 66 6f 72 20 42 6f 64 79 3c 27 74 63 78 3e  e for Body<'tcx>
17020 20 7b 0a 20 20 20 20 66 6e 20 73 74 61 72 74 5f   {.    fn start_
17030 6e 6f 64 65 28 26 73 65 6c 66 29 20 2d 3e 20 53  node(&self) -> S
17040 65 6c 66 3a 3a 4e 6f 64 65 20 7b 0a 20 20 20 20  elf::Node {.    
17050 20 20 20 20 53 54 41 52 54 5f 42 4c 4f 43 4b 0a      START_BLOCK.
17060 20 20 20 20 7d 0a 7d 0a 0a 69 6d 70 6c 3c 27 74      }.}..impl<'t
17070 63 78 3e 20 67 72 61 70 68 3a 3a 57 69 74 68 53  cx> graph::WithS
17080 75 63 63 65 73 73 6f 72 73 20 66 6f 72 20 42 6f  uccessors for Bo
17090 64 79 3c 27 74 63 78 3e 20 7b 0a 20 20 20 20 66  dy<'tcx> {.    f
170a0 6e 20 73 75 63 63 65 73 73 6f 72 73 28 0a 20 20  n successors(.  
170b0 20 20 20 20 20 20 26 73 65 6c 66 2c 0a 20 20 20        &self,.   
170c0 20 20 20 20 20 6e 6f 64 65 3a 20 53 65 6c 66 3a       node: Self:
170d0 3a 4e 6f 64 65 2c 0a 20 20 20 20 29 20 2d 3e 20  :Node,.    ) -> 
170e0 3c 53 65 6c 66 20 61 73 20 47 72 61 70 68 53 75  <Self as GraphSu
170f0 63 63 65 73 73 6f 72 73 3c 27 5f 3e 3e 3a 3a 49  ccessors<'_>>::I
17100 74 65 72 20 7b 0a 20 20 20 20 20 20 20 20 73 65  ter {.        se
17110 6c 66 2e 62 61 73 69 63 5f 62 6c 6f 63 6b 73 5b  lf.basic_blocks[
17120 6e 6f 64 65 5d 2e 74 65 72 6d 69 6e 61 74 6f 72  node].terminator
17130 28 29 2e 73 75 63 63 65 73 73 6f 72 73 28 29 2e  ().successors().
17140 63 6c 6f 6e 65 64 28 29 0a 20 20 20 20 7d 0a 7d  cloned().    }.}
17150 0a 0a 69 6d 70 6c 3c 27 61 2c 20 27 62 3e 20 67  ..impl<'a, 'b> g
17160 72 61 70 68 3a 3a 47 72 61 70 68 53 75 63 63 65  raph::GraphSucce
17170 73 73 6f 72 73 3c 27 62 3e 20 66 6f 72 20 42 6f  ssors<'b> for Bo
17180 64 79 3c 27 61 3e 20 7b 0a 20 20 20 20 74 79 70  dy<'a> {.    typ
17190 65 20 49 74 65 6d 20 3d 20 42 61 73 69 63 42 6c  e Item = BasicBl
171a0 6f 63 6b 3b 0a 20 20 20 20 74 79 70 65 20 49 74  ock;.    type It
171b0 65 72 20 3d 20 69 74 65 72 3a 3a 43 6c 6f 6e 65  er = iter::Clone
171c0 64 3c 53 75 63 63 65 73 73 6f 72 73 3c 27 62 3e  d<Successors<'b>
171d0 3e 3b 0a 7d 0a 0a 23 5b 64 65 72 69 76 65 28 43  >;.}..#[derive(C
171e0 6f 70 79 2c 20 43 6c 6f 6e 65 2c 20 50 61 72 74  opy, Clone, Part
171f0 69 61 6c 45 71 2c 20 45 71 2c 20 48 61 73 68 2c  ialEq, Eq, Hash,
17200 20 4f 72 64 2c 20 50 61 72 74 69 61 6c 4f 72 64   Ord, PartialOrd
17210 2c 20 48 61 73 68 53 74 61 62 6c 65 29 5d 0a 70  , HashStable)].p
17220 75 62 20 73 74 72 75 63 74 20 4c 6f 63 61 74 69  ub struct Locati
17230 6f 6e 20 7b 0a 20 20 20 20 2f 2f 2f 20 54 68 65  on {.    /// The
17240 20 62 6c 6f 63 6b 20 74 68 61 74 20 74 68 65 20   block that the 
17250 6c 6f 63 61 74 69 6f 6e 20 69 73 20 77 69 74 68  location is with
17260 69 6e 2e 0a 20 20 20 20 70 75 62 20 62 6c 6f 63  in..    pub bloc
17270 6b 3a 20 42 61 73 69 63 42 6c 6f 63 6b 2c 0a 0a  k: BasicBlock,..
17280 20 20 20 20 2f 2f 2f 20 54 68 65 20 6c 6f 63 61      /// The loca
17290 74 69 6f 6e 20 69 73 20 74 68 65 20 70 6f 73 69  tion is the posi
172a0 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 72  tion of the star
172b0 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
172c0 6e 74 3b 20 6f 72 2c 20 69 66 0a 20 20 20 20 2f  nt; or, if.    /
172d0 2f 2f 20 60 73 74 61 74 65 6d 65 6e 74 5f 69 6e  // `statement_in
172e0 64 65 78 60 20 65 71 75 61 6c 73 20 74 68 65 20  dex` equals the 
172f0 6e 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65 6d  number of statem
17300 65 6e 74 73 2c 20 74 68 65 6e 20 74 68 65 20 73  ents, then the s
17310 74 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20  tart of the.    
17320 2f 2f 2f 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  /// terminator..
17330 20 20 20 20 70 75 62 20 73 74 61 74 65 6d 65 6e      pub statemen
17340 74 5f 69 6e 64 65 78 3a 20 75 73 69 7a 65 2c 0a  t_index: usize,.
17350 7d 0a 0a 69 6d 70 6c 20 66 6d 74 3a 3a 44 65 62  }..impl fmt::Deb
17360 75 67 20 66 6f 72 20 4c 6f 63 61 74 69 6f 6e 20  ug for Location 
17370 7b 0a 20 20 20 20 66 6e 20 66 6d 74 28 26 73 65  {.    fn fmt(&se
17380 6c 66 2c 20 66 6d 74 3a 20 26 6d 75 74 20 66 6d  lf, fmt: &mut fm
17390 74 3a 3a 46 6f 72 6d 61 74 74 65 72 3c 27 5f 3e  t::Formatter<'_>
173a0 29 20 2d 3e 20 66 6d 74 3a 3a 52 65 73 75 6c 74  ) -> fmt::Result
173b0 20 7b 0a 20 20 20 20 20 20 20 20 77 72 69 74 65   {.        write
173c0 21 28 66 6d 74 2c 20 22 7b 3a 3f 7d 5b 7b 7d 5d  !(fmt, "{:?}[{}]
173d0 22 2c 20 73 65 6c 66 2e 62 6c 6f 63 6b 2c 20 73  ", self.block, s
173e0 65 6c 66 2e 73 74 61 74 65 6d 65 6e 74 5f 69 6e  elf.statement_in
173f0 64 65 78 29 0a 20 20 20 20 7d 0a 7d 0a 0a 69 6d  dex).    }.}..im
17400 70 6c 20 4c 6f 63 61 74 69 6f 6e 20 7b 0a 20 20  pl Location {.  
17410 20 20 70 75 62 20 63 6f 6e 73 74 20 53 54 41 52    pub const STAR
17420 54 3a 20 4c 6f 63 61 74 69 6f 6e 20 3d 20 4c 6f  T: Location = Lo
17430 63 61 74 69 6f 6e 20 7b 20 62 6c 6f 63 6b 3a 20  cation { block: 
17440 53 54 41 52 54 5f 42 4c 4f 43 4b 2c 20 73 74 61  START_BLOCK, sta
17450 74 65 6d 65 6e 74 5f 69 6e 64 65 78 3a 20 30 20  tement_index: 0 
17460 7d 3b 0a 0a 20 20 20 20 2f 2f 2f 20 52 65 74 75  };..    /// Retu
17470 72 6e 73 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e  rns the location
17480 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
17490 65 72 20 74 68 69 73 20 6f 6e 65 20 77 69 74 68  er this one with
174a0 69 6e 20 74 68 65 20 65 6e 63 6c 6f 73 69 6e 67  in the enclosing
174b0 20 62 6c 6f 63 6b 2e 0a 20 20 20 20 2f 2f 2f 0a   block..    ///.
174c0 20 20 20 20 2f 2f 2f 20 4e 6f 74 65 20 74 68 61      /// Note tha
174d0 74 20 69 66 20 74 68 69 73 20 6c 6f 63 61 74 69  t if this locati
174e0 6f 6e 20 72 65 70 72 65 73 65 6e 74 73 20 61 20  on represents a 
174f0 74 65 72 6d 69 6e 61 74 6f 72 2c 20 74 68 65 6e  terminator, then
17500 20 74 68 65 0a 20 20 20 20 2f 2f 2f 20 72 65 73   the.    /// res
17510 75 6c 74 69 6e 67 20 6c 6f 63 61 74 69 6f 6e 20  ulting location 
17520 77 6f 75 6c 64 20 62 65 20 6f 75 74 20 6f 66 20  would be out of 
17530 62 6f 75 6e 64 73 20 61 6e 64 20 69 6e 76 61 6c  bounds and inval
17540 69 64 2e 0a 20 20 20 20 70 75 62 20 66 6e 20 73  id..    pub fn s
17550 75 63 63 65 73 73 6f 72 5f 77 69 74 68 69 6e 5f  uccessor_within_
17560 62 6c 6f 63 6b 28 26 73 65 6c 66 29 20 2d 3e 20  block(&self) -> 
17570 4c 6f 63 61 74 69 6f 6e 20 7b 0a 20 20 20 20 20  Location {.     
17580 20 20 20 4c 6f 63 61 74 69 6f 6e 20 7b 20 62 6c     Location { bl
17590 6f 63 6b 3a 20 73 65 6c 66 2e 62 6c 6f 63 6b 2c  ock: self.block,
175a0 20 73 74 61 74 65 6d 65 6e 74 5f 69 6e 64 65 78   statement_index
175b0 3a 20 73 65 6c 66 2e 73 74 61 74 65 6d 65 6e 74  : self.statement
175c0 5f 69 6e 64 65 78 20 2b 20 31 20 7d 0a 20 20 20  _index + 1 }.   
175d0 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 52 65 74 75   }..    /// Retu
175e0 72 6e 73 20 60 74 72 75 65 60 20 69 66 20 60 6f  rns `true` if `o
175f0 74 68 65 72 60 20 69 73 20 65 61 72 6c 69 65 72  ther` is earlier
17600 20 69 6e 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20   in the control 
17610 66 6c 6f 77 20 67 72 61 70 68 20 74 68 61 6e 20  flow graph than 
17620 60 73 65 6c 66 60 2e 0a 20 20 20 20 70 75 62 20  `self`..    pub 
17630 66 6e 20 69 73 5f 70 72 65 64 65 63 65 73 73 6f  fn is_predecesso
17640 72 5f 6f 66 3c 27 74 63 78 3e 28 0a 20 20 20 20  r_of<'tcx>(.    
17650 20 20 20 20 26 73 65 6c 66 2c 0a 20 20 20 20 20      &self,.     
17660 20 20 20 6f 74 68 65 72 3a 20 4c 6f 63 61 74 69     other: Locati
17670 6f 6e 2c 0a 20 20 20 20 20 20 20 20 62 6f 64 79  on,.        body
17680 3a 20 52 65 61 64 4f 6e 6c 79 42 6f 64 79 41 6e  : ReadOnlyBodyAn
17690 64 43 61 63 68 65 3c 27 5f 2c 20 27 74 63 78 3e  dCache<'_, 'tcx>
176a0 0a 20 20 20 20 29 20 2d 3e 20 62 6f 6f 6c 20 7b  .    ) -> bool {
176b0 0a 20 20 20 20 20 20 20 20 2f 2f 20 49 66 20 77  .        // If w
176c0 65 20 61 72 65 20 69 6e 20 74 68 65 20 73 61 6d  e are in the sam
176d0 65 20 62 6c 6f 63 6b 20 61 73 20 74 68 65 20 6f  e block as the o
176e0 74 68 65 72 20 6c 6f 63 61 74 69 6f 6e 20 61 6e  ther location an
176f0 64 20 61 72 65 20 61 6e 20 65 61 72 6c 69 65 72  d are an earlier
17700 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20   statement.     
17710 20 20 20 2f 2f 20 74 68 65 6e 20 77 65 20 61 72     // then we ar
17720 65 20 61 20 70 72 65 64 65 63 65 73 73 6f 72 20  e a predecessor 
17730 6f 66 20 60 6f 74 68 65 72 60 2e 0a 20 20 20 20  of `other`..    
17740 20 20 20 20 69 66 20 73 65 6c 66 2e 62 6c 6f 63      if self.bloc
17750 6b 20 3d 3d 20 6f 74 68 65 72 2e 62 6c 6f 63 6b  k == other.block
17760 20 26 26 20 73 65 6c 66 2e 73 74 61 74 65 6d 65   && self.stateme
17770 6e 74 5f 69 6e 64 65 78 20 3c 20 6f 74 68 65 72  nt_index < other
17780 2e 73 74 61 74 65 6d 65 6e 74 5f 69 6e 64 65 78  .statement_index
17790 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72   {.            r
177a0 65 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20  eturn true;.    
177b0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
177c0 2f 20 49 66 20 77 65 27 72 65 20 69 6e 20 61 6e  / If we're in an
177d0 6f 74 68 65 72 20 62 6c 6f 63 6b 2c 20 74 68 65  other block, the
177e0 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 63 68 65  n we want to che
177f0 63 6b 20 74 68 61 74 20 62 6c 6f 63 6b 20 69 73  ck that block is
17800 20 61 20 70 72 65 64 65 63 65 73 73 6f 72 20 6f   a predecessor o
17810 66 20 60 6f 74 68 65 72 60 2e 0a 20 20 20 20 20  f `other`..     
17820 20 20 20 6c 65 74 20 6d 75 74 20 71 75 65 75 65     let mut queue
17830 3a 20 56 65 63 3c 42 61 73 69 63 42 6c 6f 63 6b  : Vec<BasicBlock
17840 3e 20 3d 20 62 6f 64 79 2e 70 72 65 64 65 63 65  > = body.predece
17850 73 73 6f 72 73 5f 66 6f 72 28 6f 74 68 65 72 2e  ssors_for(other.
17860 62 6c 6f 63 6b 29 2e 74 6f 5f 76 65 63 28 29 3b  block).to_vec();
17870 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74  .        let mut
17880 20 76 69 73 69 74 65 64 20 3d 20 46 78 48 61 73   visited = FxHas
17890 68 53 65 74 3a 3a 64 65 66 61 75 6c 74 28 29 3b  hSet::default();
178a0 0a 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 20  ..        while 
178b0 6c 65 74 20 53 6f 6d 65 28 62 6c 6f 63 6b 29 20  let Some(block) 
178c0 3d 20 71 75 65 75 65 2e 70 6f 70 28 29 20 7b 0a  = queue.pop() {.
178d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 49              // I
178e0 66 20 77 65 20 68 61 76 65 6e 27 74 20 76 69 73  f we haven't vis
178f0 69 74 65 64 20 74 68 69 73 20 62 6c 6f 63 6b 20  ited this block 
17900 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 6d 61 6b  before, then mak
17910 65 20 73 75 72 65 20 77 65 20 76 69 73 69 74 20  e sure we visit 
17920 69 74 27 73 20 70 72 65 64 65 63 65 73 73 6f 72  it's predecessor
17930 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  s..            i
17940 66 20 76 69 73 69 74 65 64 2e 69 6e 73 65 72 74  f visited.insert
17950 28 62 6c 6f 63 6b 29 20 7b 0a 20 20 20 20 20 20  (block) {.      
17960 20 20 20 20 20 20 20 20 20 20 71 75 65 75 65 2e            queue.
17970 65 78 74 65 6e 64 28 62 6f 64 79 2e 70 72 65 64  extend(body.pred
17980 65 63 65 73 73 6f 72 73 5f 66 6f 72 28 62 6c 6f  ecessors_for(blo
17990 63 6b 29 2e 69 74 65 72 28 29 2e 63 6c 6f 6e 65  ck).iter().clone
179a0 64 28 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d());.          
179b0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
179c0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
179d0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
179e0 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
179f0 2f 2f 20 49 66 20 77 65 20 66 6f 75 6e 64 20 74  // If we found t
17a00 68 65 20 62 6c 6f 63 6b 20 74 68 61 74 20 60 73  he block that `s
17a10 65 6c 66 60 20 69 73 20 69 6e 2c 20 74 68 65 6e  elf` is in, then
17a20 20 77 65 20 61 72 65 20 61 20 70 72 65 64 65 63   we are a predec
17a30 65 73 73 6f 72 20 6f 66 20 60 6f 74 68 65 72 60  essor of `other`
17a40 20 28 73 69 6e 63 65 0a 20 20 20 20 20 20 20 20   (since.        
17a50 20 20 20 20 2f 2f 20 77 65 20 66 6f 75 6e 64 20      // we found 
17a60 74 68 61 74 20 62 6c 6f 63 6b 20 62 79 20 6c 6f  that block by lo
17a70 6f 6b 69 6e 67 20 61 74 20 74 68 65 20 70 72 65  oking at the pre
17a80 64 65 63 65 73 73 6f 72 73 20 6f 66 20 60 6f 74  decessors of `ot
17a90 68 65 72 60 29 2e 0a 20 20 20 20 20 20 20 20 20  her`)..         
17aa0 20 20 20 69 66 20 73 65 6c 66 2e 62 6c 6f 63 6b     if self.block
17ab0 20 3d 3d 20 62 6c 6f 63 6b 20 7b 0a 20 20 20 20   == block {.    
17ac0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
17ad0 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20  rn true;.       
17ae0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
17af0 0a 0a 20 20 20 20 20 20 20 20 66 61 6c 73 65 0a  ..        false.
17b00 20 20 20 20 7d 0a 0a 20 20 20 20 70 75 62 20 66      }..    pub f
17b10 6e 20 64 6f 6d 69 6e 61 74 65 73 28 26 73 65 6c  n dominates(&sel
17b20 66 2c 20 6f 74 68 65 72 3a 20 4c 6f 63 61 74 69  f, other: Locati
17b30 6f 6e 2c 20 64 6f 6d 69 6e 61 74 6f 72 73 3a 20  on, dominators: 
17b40 26 44 6f 6d 69 6e 61 74 6f 72 73 3c 42 61 73 69  &Dominators<Basi
17b50 63 42 6c 6f 63 6b 3e 29 20 2d 3e 20 62 6f 6f 6c  cBlock>) -> bool
17b60 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 73 65   {.        if se
17b70 6c 66 2e 62 6c 6f 63 6b 20 3d 3d 20 6f 74 68 65  lf.block == othe
17b80 72 2e 62 6c 6f 63 6b 20 7b 0a 20 20 20 20 20 20  r.block {.      
17b90 20 20 20 20 20 20 73 65 6c 66 2e 73 74 61 74 65        self.state
17ba0 6d 65 6e 74 5f 69 6e 64 65 78 20 3c 3d 20 6f 74  ment_index <= ot
17bb0 68 65 72 2e 73 74 61 74 65 6d 65 6e 74 5f 69 6e  her.statement_in
17bc0 64 65 78 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  dex.        } el
17bd0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
17be0 20 64 6f 6d 69 6e 61 74 6f 72 73 2e 69 73 5f 64   dominators.is_d
17bf0 6f 6d 69 6e 61 74 65 64 5f 62 79 28 6f 74 68 65  ominated_by(othe
17c00 72 2e 62 6c 6f 63 6b 2c 20 73 65 6c 66 2e 62 6c  r.block, self.bl
17c10 6f 63 6b 29 0a 20 20 20 20 20 20 20 20 7d 0a 20  ock).        }. 
17c20 20 20 20 7d 0a 7d 0a 0a 23 5b 64 65 72 69 76 65     }.}..#[derive
17c30 28 43 6f 70 79 2c 20 43 6c 6f 6e 65 2c 20 50 61  (Copy, Clone, Pa
17c40 72 74 69 61 6c 45 71 2c 20 52 75 73 74 63 45 6e  rtialEq, RustcEn
17c50 63 6f 64 61 62 6c 65 2c 20 52 75 73 74 63 44 65  codable, RustcDe
17c60 63 6f 64 61 62 6c 65 2c 20 48 61 73 68 53 74 61  codable, HashSta
17c70 62 6c 65 29 5d 0a 70 75 62 20 65 6e 75 6d 20 55  ble)].pub enum U
17c80 6e 73 61 66 65 74 79 56 69 6f 6c 61 74 69 6f 6e  nsafetyViolation
17c90 4b 69 6e 64 20 7b 0a 20 20 20 20 47 65 6e 65 72  Kind {.    Gener
17ca0 61 6c 2c 0a 20 20 20 20 2f 2f 2f 20 50 65 72 6d  al,.    /// Perm
17cb0 69 74 74 65 64 20 62 6f 74 68 20 69 6e 20 60 63  itted both in `c
17cc0 6f 6e 73 74 20 66 6e 60 73 20 61 6e 64 20 72 65  onst fn`s and re
17cd0 67 75 6c 61 72 20 60 66 6e 60 73 2e 0a 20 20 20  gular `fn`s..   
17ce0 20 47 65 6e 65 72 61 6c 41 6e 64 43 6f 6e 73 74   GeneralAndConst
17cf0 46 6e 2c 0a 20 20 20 20 42 6f 72 72 6f 77 50 61  Fn,.    BorrowPa
17d00 63 6b 65 64 28 68 69 72 3a 3a 48 69 72 49 64 29  cked(hir::HirId)
17d10 2c 0a 7d 0a 0a 23 5b 64 65 72 69 76 65 28 43 6f  ,.}..#[derive(Co
17d20 70 79 2c 20 43 6c 6f 6e 65 2c 20 50 61 72 74 69  py, Clone, Parti
17d30 61 6c 45 71 2c 20 52 75 73 74 63 45 6e 63 6f 64  alEq, RustcEncod
17d40 61 62 6c 65 2c 20 52 75 73 74 63 44 65 63 6f 64  able, RustcDecod
17d50 61 62 6c 65 2c 20 48 61 73 68 53 74 61 62 6c 65  able, HashStable
17d60 29 5d 0a 70 75 62 20 73 74 72 75 63 74 20 55 6e  )].pub struct Un
17d70 73 61 66 65 74 79 56 69 6f 6c 61 74 69 6f 6e 20  safetyViolation 
17d80 7b 0a 20 20 20 20 70 75 62 20 73 6f 75 72 63 65  {.    pub source
17d90 5f 69 6e 66 6f 3a 20 53 6f 75 72 63 65 49 6e 66  _info: SourceInf
17da0 6f 2c 0a 20 20 20 20 70 75 62 20 64 65 73 63 72  o,.    pub descr
17db0 69 70 74 69 6f 6e 3a 20 53 79 6d 62 6f 6c 2c 0a  iption: Symbol,.
17dc0 20 20 20 20 70 75 62 20 64 65 74 61 69 6c 73 3a      pub details:
17dd0 20 53 79 6d 62 6f 6c 2c 0a 20 20 20 20 70 75 62   Symbol,.    pub
17de0 20 6b 69 6e 64 3a 20 55 6e 73 61 66 65 74 79 56   kind: UnsafetyV
17df0 69 6f 6c 61 74 69 6f 6e 4b 69 6e 64 2c 0a 7d 0a  iolationKind,.}.
17e00 0a 23 5b 64 65 72 69 76 65 28 43 6c 6f 6e 65 2c  .#[derive(Clone,
17e10 20 52 75 73 74 63 45 6e 63 6f 64 61 62 6c 65 2c   RustcEncodable,
17e20 20 52 75 73 74 63 44 65 63 6f 64 61 62 6c 65 2c   RustcDecodable,
17e30 20 48 61 73 68 53 74 61 62 6c 65 29 5d 0a 70 75   HashStable)].pu
17e40 62 20 73 74 72 75 63 74 20 55 6e 73 61 66 65 74  b struct Unsafet
17e50 79 43 68 65 63 6b 52 65 73 75 6c 74 20 7b 0a 20  yCheckResult {. 
17e60 20 20 20 2f 2f 2f 20 56 69 6f 6c 61 74 69 6f 6e     /// Violation
17e70 73 20 74 68 61 74 20 61 72 65 20 70 72 6f 70 61  s that are propa
17e80 67 61 74 65 64 20 2a 75 70 77 61 72 64 73 2a 20  gated *upwards* 
17e90 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
17ea0 6f 6e 2e 0a 20 20 20 20 70 75 62 20 76 69 6f 6c  on..    pub viol
17eb0 61 74 69 6f 6e 73 3a 20 4c 72 63 3c 5b 55 6e 73  ations: Lrc<[Uns
17ec0 61 66 65 74 79 56 69 6f 6c 61 74 69 6f 6e 5d 3e  afetyViolation]>
17ed0 2c 0a 20 20 20 20 2f 2f 2f 20 60 75 6e 73 61 66  ,.    /// `unsaf
17ee0 65 60 20 62 6c 6f 63 6b 73 20 69 6e 20 74 68 69  e` blocks in thi
17ef0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6c 6f 6e  s function, alon
17f00 67 20 77 69 74 68 20 77 68 65 74 68 65 72 20 74  g with whether t
17f10 68 65 79 20 61 72 65 20 75 73 65 64 2e 20 54 68  hey are used. Th
17f20 69 73 20 69 73 0a 20 20 20 20 2f 2f 2f 20 75 73  is is.    /// us
17f30 65 64 20 66 6f 72 20 74 68 65 20 22 75 6e 75 73  ed for the "unus
17f40 65 64 5f 75 6e 73 61 66 65 22 20 6c 69 6e 74 2e  ed_unsafe" lint.
17f50 0a 20 20 20 20 70 75 62 20 75 6e 73 61 66 65 5f  .    pub unsafe_
17f60 62 6c 6f 63 6b 73 3a 20 4c 72 63 3c 5b 28 68 69  blocks: Lrc<[(hi
17f70 72 3a 3a 48 69 72 49 64 2c 20 62 6f 6f 6c 29 5d  r::HirId, bool)]
17f80 3e 2c 0a 7d 0a 0a 72 75 73 74 63 5f 69 6e 64 65  >,.}..rustc_inde
17f90 78 3a 3a 6e 65 77 74 79 70 65 5f 69 6e 64 65 78  x::newtype_index
17fa0 21 20 7b 0a 20 20 20 20 70 75 62 20 73 74 72 75  ! {.    pub stru
17fb0 63 74 20 47 65 6e 65 72 61 74 6f 72 53 61 76 65  ct GeneratorSave
17fc0 64 4c 6f 63 61 6c 20 7b 0a 20 20 20 20 20 20 20  dLocal {.       
17fd0 20 64 65 72 69 76 65 20 5b 48 61 73 68 53 74 61   derive [HashSta
17fe0 62 6c 65 5d 0a 20 20 20 20 20 20 20 20 44 45 42  ble].        DEB
17ff0 55 47 5f 46 4f 52 4d 41 54 20 3d 20 22 5f 7b 7d  UG_FORMAT = "_{}
18000 22 2c 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2f 2f 20  ",.    }.}../// 
18010 54 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 67 65  The layout of ge
18020 6e 65 72 61 74 6f 72 20 73 74 61 74 65 2e 0a 23  nerator state..#
18030 5b 64 65 72 69 76 65 28 43 6c 6f 6e 65 2c 20 44  [derive(Clone, D
18040 65 62 75 67 2c 20 52 75 73 74 63 45 6e 63 6f 64  ebug, RustcEncod
18050 61 62 6c 65 2c 20 52 75 73 74 63 44 65 63 6f 64  able, RustcDecod
18060 61 62 6c 65 2c 20 48 61 73 68 53 74 61 62 6c 65  able, HashStable
18070 2c 20 54 79 70 65 46 6f 6c 64 61 62 6c 65 29 5d  , TypeFoldable)]
18080 0a 70 75 62 20 73 74 72 75 63 74 20 47 65 6e 65  .pub struct Gene
18090 72 61 74 6f 72 4c 61 79 6f 75 74 3c 27 74 63 78  ratorLayout<'tcx
180a0 3e 20 7b 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20  > {.    /// The 
180b0 74 79 70 65 20 6f 66 20 65 76 65 72 79 20 6c 6f  type of every lo
180c0 63 61 6c 20 73 74 6f 72 65 64 20 69 6e 73 69 64  cal stored insid
180d0 65 20 74 68 65 20 67 65 6e 65 72 61 74 6f 72 2e  e the generator.
180e0 0a 20 20 20 20 70 75 62 20 66 69 65 6c 64 5f 74  .    pub field_t
180f0 79 73 3a 20 49 6e 64 65 78 56 65 63 3c 47 65 6e  ys: IndexVec<Gen
18100 65 72 61 74 6f 72 53 61 76 65 64 4c 6f 63 61 6c  eratorSavedLocal
18110 2c 20 54 79 3c 27 74 63 78 3e 3e 2c 0a 0a 20 20  , Ty<'tcx>>,..  
18120 20 20 2f 2f 2f 20 57 68 69 63 68 20 6f 66 20 74    /// Which of t
18130 68 65 20 61 62 6f 76 65 20 66 69 65 6c 64 73 20  he above fields 
18140 61 72 65 20 69 6e 20 65 61 63 68 20 76 61 72 69  are in each vari
18150 61 6e 74 2e 20 4e 6f 74 65 20 74 68 61 74 20 6f  ant. Note that o
18160 6e 65 20 66 69 65 6c 64 20 6d 61 79 0a 20 20 20  ne field may.   
18170 20 2f 2f 2f 20 62 65 20 73 74 6f 72 65 64 20 69   /// be stored i
18180 6e 20 6d 75 6c 74 69 70 6c 65 20 76 61 72 69 61  n multiple varia
18190 6e 74 73 2e 0a 20 20 20 20 70 75 62 20 76 61 72  nts..    pub var
181a0 69 61 6e 74 5f 66 69 65 6c 64 73 3a 20 49 6e 64  iant_fields: Ind
181b0 65 78 56 65 63 3c 56 61 72 69 61 6e 74 49 64 78  exVec<VariantIdx
181c0 2c 20 49 6e 64 65 78 56 65 63 3c 46 69 65 6c 64  , IndexVec<Field
181d0 2c 20 47 65 6e 65 72 61 74 6f 72 53 61 76 65 64  , GeneratorSaved
181e0 4c 6f 63 61 6c 3e 3e 2c 0a 0a 20 20 20 20 2f 2f  Local>>,..    //
181f0 2f 20 57 68 69 63 68 20 73 61 76 65 64 20 6c 6f  / Which saved lo
18200 63 61 6c 73 20 61 72 65 20 73 74 6f 72 61 67 65  cals are storage
18210 2d 6c 69 76 65 20 61 74 20 74 68 65 20 73 61 6d  -live at the sam
18220 65 20 74 69 6d 65 2e 20 4c 6f 63 61 6c 73 20 74  e time. Locals t
18230 68 61 74 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2f  hat do not.    /
18240 2f 2f 20 68 61 76 65 20 63 6f 6e 66 6c 69 63 74  // have conflict
18250 73 20 77 69 74 68 20 65 61 63 68 20 6f 74 68 65  s with each othe
18260 72 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f  r are allowed to
18270 20 6f 76 65 72 6c 61 70 20 69 6e 20 74 68 65 20   overlap in the 
18280 63 6f 6d 70 75 74 65 64 0a 20 20 20 20 2f 2f 2f  computed.    ///
18290 20 6c 61 79 6f 75 74 2e 0a 20 20 20 20 70 75 62   layout..    pub
182a0 20 73 74 6f 72 61 67 65 5f 63 6f 6e 66 6c 69 63   storage_conflic
182b0 74 73 3a 20 42 69 74 4d 61 74 72 69 78 3c 47 65  ts: BitMatrix<Ge
182c0 6e 65 72 61 74 6f 72 53 61 76 65 64 4c 6f 63 61  neratorSavedLoca
182d0 6c 2c 20 47 65 6e 65 72 61 74 6f 72 53 61 76 65  l, GeneratorSave
182e0 64 4c 6f 63 61 6c 3e 2c 0a 7d 0a 0a 23 5b 64 65  dLocal>,.}..#[de
182f0 72 69 76 65 28 43 6c 6f 6e 65 2c 20 44 65 62 75  rive(Clone, Debu
18300 67 2c 20 52 75 73 74 63 45 6e 63 6f 64 61 62 6c  g, RustcEncodabl
18310 65 2c 20 52 75 73 74 63 44 65 63 6f 64 61 62 6c  e, RustcDecodabl
18320 65 2c 20 48 61 73 68 53 74 61 62 6c 65 29 5d 0a  e, HashStable)].
18330 70 75 62 20 73 74 72 75 63 74 20 42 6f 72 72 6f  pub struct Borro
18340 77 43 68 65 63 6b 52 65 73 75 6c 74 3c 27 74 63  wCheckResult<'tc
18350 78 3e 20 7b 0a 20 20 20 20 70 75 62 20 63 6c 6f  x> {.    pub clo
18360 73 75 72 65 5f 72 65 71 75 69 72 65 6d 65 6e 74  sure_requirement
18370 73 3a 20 4f 70 74 69 6f 6e 3c 43 6c 6f 73 75 72  s: Option<Closur
18380 65 52 65 67 69 6f 6e 52 65 71 75 69 72 65 6d 65  eRegionRequireme
18390 6e 74 73 3c 27 74 63 78 3e 3e 2c 0a 20 20 20 20  nts<'tcx>>,.    
183a0 70 75 62 20 75 73 65 64 5f 6d 75 74 5f 75 70 76  pub used_mut_upv
183b0 61 72 73 3a 20 53 6d 61 6c 6c 56 65 63 3c 5b 46  ars: SmallVec<[F
183c0 69 65 6c 64 3b 20 38 5d 3e 2c 0a 7d 0a 0a 2f 2f  ield; 8]>,.}..//
183d0 2f 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20  / The result of 
183e0 74 68 65 20 60 6d 69 72 5f 63 6f 6e 73 74 5f 71  the `mir_const_q
183f0 75 61 6c 69 66 60 20 71 75 65 72 79 2e 0a 2f 2f  ualif` query..//
18400 2f 0a 2f 2f 2f 20 45 61 63 68 20 66 69 65 6c 64  /./// Each field
18410 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
18420 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 72 20 6f  an implementer o
18430 66 20 74 68 65 20 60 51 75 61 6c 69 66 60 20 74  f the `Qualif` t
18440 72 61 69 74 20 69 6e 0a 2f 2f 2f 20 60 6c 69 62  rait in./// `lib
18450 72 75 73 74 63 5f 6d 69 72 2f 74 72 61 6e 73 66  rustc_mir/transf
18460 6f 72 6d 2f 63 68 65 63 6b 5f 63 6f 6e 73 74 73  orm/check_consts
18470 2f 71 75 61 6c 69 66 73 2e 72 73 60 2e 20 53 65  /qualifs.rs`. Se
18480 65 20 74 68 61 74 20 66 69 6c 65 20 66 6f 72 20  e that file for 
18490 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  more information
184a0 20 6f 6e 20 65 61 63 68 0a 2f 2f 2f 20 60 51 75   on each./// `Qu
184b0 61 6c 69 66 60 2e 0a 23 5b 64 65 72 69 76 65 28  alif`..#[derive(
184c0 43 6c 6f 6e 65 2c 20 43 6f 70 79 2c 20 44 65 62  Clone, Copy, Deb
184d0 75 67 2c 20 44 65 66 61 75 6c 74 2c 20 52 75 73  ug, Default, Rus
184e0 74 63 45 6e 63 6f 64 61 62 6c 65 2c 20 52 75 73  tcEncodable, Rus
184f0 74 63 44 65 63 6f 64 61 62 6c 65 2c 20 48 61 73  tcDecodable, Has
18500 68 53 74 61 62 6c 65 29 5d 0a 70 75 62 20 73 74  hStable)].pub st
18510 72 75 63 74 20 43 6f 6e 73 74 51 75 61 6c 69 66  ruct ConstQualif
18520 73 20 7b 0a 20 20 20 20 70 75 62 20 68 61 73 5f  s {.    pub has_
18530 6d 75 74 5f 69 6e 74 65 72 69 6f 72 3a 20 62 6f  mut_interior: bo
18540 6f 6c 2c 0a 20 20 20 20 70 75 62 20 6e 65 65 64  ol,.    pub need
18550 73 5f 64 72 6f 70 3a 20 62 6f 6f 6c 2c 0a 7d 0a  s_drop: bool,.}.
18560 0a 2f 2f 2f 20 41 66 74 65 72 20 77 65 20 62 6f  ./// After we bo
18570 72 72 6f 77 20 63 68 65 63 6b 20 61 20 63 6c 6f  rrow check a clo
18580 73 75 72 65 2c 20 77 65 20 61 72 65 20 6c 65 66  sure, we are lef
18590 74 20 77 69 74 68 20 76 61 72 69 6f 75 73 0a 2f  t with various./
185a0 2f 2f 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20  // requirements 
185b0 74 68 61 74 20 77 65 20 68 61 76 65 20 69 6e 66  that we have inf
185c0 65 72 72 65 64 20 62 65 74 77 65 65 6e 20 74 68  erred between th
185d0 65 20 66 72 65 65 20 72 65 67 69 6f 6e 73 20 74  e free regions t
185e0 68 61 74 0a 2f 2f 2f 20 61 70 70 65 61 72 20 69  hat./// appear i
185f0 6e 20 74 68 65 20 63 6c 6f 73 75 72 65 27 73 20  n the closure's 
18600 73 69 67 6e 61 74 75 72 65 20 6f 72 20 6f 6e 20  signature or on 
18610 69 74 73 20 66 69 65 6c 64 20 74 79 70 65 73 2e  its field types.
18620 20 54 68 65 73 65 0a 2f 2f 2f 20 72 65 71 75 69   These./// requi
18630 72 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65 6e  rements are then
18640 20 76 65 72 69 66 69 65 64 20 61 6e 64 20 70 72   verified and pr
18650 6f 76 65 64 20 62 79 20 74 68 65 20 63 6c 6f 73  oved by the clos
18660 75 72 65 27 73 0a 2f 2f 2f 20 63 72 65 61 74 69  ure's./// creati
18670 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 69  ng function. Thi
18680 73 20 73 74 72 75 63 74 20 65 6e 63 6f 64 65 73  s struct encodes
18690 20 74 68 6f 73 65 20 72 65 71 75 69 72 65 6d 65   those requireme
186a0 6e 74 73 2e 0a 2f 2f 2f 0a 2f 2f 2f 20 54 68 65  nts..///./// The
186b0 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 61 72   requirements ar
186c0 65 20 6c 69 73 74 65 64 20 61 73 20 62 65 69 6e  e listed as bein
186d0 67 20 62 65 74 77 65 65 6e 20 76 61 72 69 6f 75  g between variou
186e0 73 0a 2f 2f 2f 20 60 52 65 67 69 6f 6e 56 69 64  s./// `RegionVid
186f0 60 2e 20 54 68 65 20 30 74 68 20 72 65 67 69 6f  `. The 0th regio
18700 6e 20 72 65 66 65 72 73 20 74 6f 20 60 27 73 74  n refers to `'st
18710 61 74 69 63 60 3b 20 73 75 62 73 65 71 75 65 6e  atic`; subsequen
18720 74 20 72 65 67 69 6f 6e 0a 2f 2f 2f 20 76 69 64  t region./// vid
18730 73 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 66  s refer to the f
18740 72 65 65 20 72 65 67 69 6f 6e 73 20 74 68 61 74  ree regions that
18750 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 63   appear in the c
18760 6c 6f 73 75 72 65 20 28 6f 72 0a 2f 2f 2f 20 67  losure (or./// g
18770 65 6e 65 72 61 74 6f 72 27 73 29 20 74 79 70 65  enerator's) type
18780 2c 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 61 70  , in order of ap
18790 70 65 61 72 61 6e 63 65 2e 20 28 54 68 69 73 20  pearance. (This 
187a0 6e 75 6d 62 65 72 69 6e 67 20 69 73 0a 2f 2f 2f  numbering is.///
187b0 20 61 63 74 75 61 6c 6c 79 20 64 65 66 69 6e 65   actually define
187c0 64 20 62 79 20 74 68 65 20 60 55 6e 69 76 65 72  d by the `Univer
187d0 73 61 6c 52 65 67 69 6f 6e 73 60 20 73 74 72 75  salRegions` stru
187e0 63 74 20 69 6e 20 74 68 65 20 4e 4c 4c 0a 2f 2f  ct in the NLL.//
187f0 2f 20 72 65 67 69 6f 6e 20 63 68 65 63 6b 65 72  / region checker
18800 2e 20 53 65 65 20 66 6f 72 20 65 78 61 6d 70 6c  . See for exampl
18810 65 0a 2f 2f 2f 20 60 55 6e 69 76 65 72 73 61 6c  e./// `Universal
18820 52 65 67 69 6f 6e 73 3a 3a 63 6c 6f 73 75 72 65  Regions::closure
18830 5f 6d 61 70 70 69 6e 67 60 2e 29 20 4e 6f 74 65  _mapping`.) Note
18840 20 74 68 61 74 20 77 65 20 74 72 65 61 74 20 74   that we treat t
18850 68 65 20 66 72 65 65 0a 2f 2f 2f 20 72 65 67 69  he free./// regi
18860 6f 6e 73 20 69 6e 20 74 68 65 20 63 6c 6f 73 75  ons in the closu
18870 72 65 27 73 20 74 79 70 65 20 22 61 73 20 69 66  re's type "as if
18880 22 20 74 68 65 79 20 77 65 72 65 20 65 72 61 73  " they were eras
18890 65 64 2c 20 73 6f 20 74 68 65 69 72 0a 2f 2f 2f  ed, so their.///
188a0 20 70 72 65 63 69 73 65 20 69 64 65 6e 74 69 74   precise identit
188b0 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61  y is not importa
188c0 6e 74 2c 20 6f 6e 6c 79 20 74 68 65 69 72 20 70  nt, only their p
188d0 6f 73 69 74 69 6f 6e 2e 0a 2f 2f 2f 0a 2f 2f 2f  osition..///.///
188e0 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 79 70   Example: If typ
188f0 65 20 63 68 65 63 6b 20 70 72 6f 64 75 63 65 73  e check produces
18900 20 61 20 63 6c 6f 73 75 72 65 20 77 69 74 68 20   a closure with 
18910 74 68 65 20 63 6c 6f 73 75 72 65 20 73 75 62 73  the closure subs
18920 74 73 3a 0a 2f 2f 2f 0a 2f 2f 2f 20 60 60 60 74  ts:.///./// ```t
18930 65 78 74 0a 2f 2f 2f 20 43 6c 6f 73 75 72 65 53  ext./// ClosureS
18940 75 62 73 74 73 20 3d 20 5b 0a 2f 2f 2f 20 20 20  ubsts = [.///   
18950 20 20 69 38 2c 20 20 20 20 20 20 20 20 20 20 20    i8,           
18960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18970 20 20 20 20 20 20 20 2f 2f 20 74 68 65 20 22 63         // the "c
18980 6c 6f 73 75 72 65 20 6b 69 6e 64 22 0a 2f 2f 2f  losure kind".///
18990 20 20 20 20 20 66 6f 72 3c 27 78 3e 20 66 6e 28       for<'x> fn(
189a0 26 27 61 20 26 27 78 20 75 33 32 29 20 2d 3e 20  &'a &'x u32) -> 
189b0 26 27 78 20 75 33 32 2c 20 20 2f 2f 20 74 68 65  &'x u32,  // the
189c0 20 22 63 6c 6f 73 75 72 65 20 73 69 67 6e 61 74   "closure signat
189d0 75 72 65 22 0a 2f 2f 2f 20 20 20 20 20 26 27 61  ure".///     &'a
189e0 20 53 74 72 69 6e 67 2c 20 20 20 20 20 20 20 20   String,        
189f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a00 20 20 2f 2f 20 73 6f 6d 65 20 75 70 76 61 72 0a    // some upvar.
18a10 2f 2f 2f 20 5d 0a 2f 2f 2f 20 60 60 60 0a 2f 2f  /// ]./// ```.//
18a20 2f 0a 2f 2f 2f 20 68 65 72 65 2c 20 74 68 65 72  /./// here, ther
18a30 65 20 69 73 20 6f 6e 65 20 75 6e 69 71 75 65 20  e is one unique 
18a40 66 72 65 65 20 72 65 67 69 6f 6e 20 28 60 27 61  free region (`'a
18a50 60 29 20 62 75 74 20 69 74 20 61 70 70 65 61 72  `) but it appear
18a60 73 0a 2f 2f 2f 20 74 77 69 63 65 2e 20 57 65 20  s./// twice. We 
18a70 77 6f 75 6c 64 20 22 72 65 6e 75 6d 62 65 72 22  would "renumber"
18a80 20 65 61 63 68 20 6f 63 63 75 72 72 65 6e 63 65   each occurrence
18a90 20 74 6f 20 61 20 75 6e 69 71 75 65 20 76 69 64   to a unique vid
18aa0 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2f 2f  , as follows:.//
18ab0 2f 0a 2f 2f 2f 20 60 60 60 74 65 78 74 0a 2f 2f  /./// ```text.//
18ac0 2f 20 43 6c 6f 73 75 72 65 53 75 62 73 74 73 20  / ClosureSubsts 
18ad0 3d 20 5b 0a 2f 2f 2f 20 20 20 20 20 69 38 2c 20  = [.///     i8, 
18ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b00 20 2f 2f 20 74 68 65 20 22 63 6c 6f 73 75 72 65   // the "closure
18b10 20 6b 69 6e 64 22 0a 2f 2f 2f 20 20 20 20 20 66   kind".///     f
18b20 6f 72 3c 27 78 3e 20 66 6e 28 26 27 31 20 26 27  or<'x> fn(&'1 &'
18b30 78 20 75 33 32 29 20 2d 3e 20 26 27 78 20 75 33  x u32) -> &'x u3
18b40 32 2c 20 20 2f 2f 20 74 68 65 20 22 63 6c 6f 73  2,  // the "clos
18b50 75 72 65 20 73 69 67 6e 61 74 75 72 65 22 0a 2f  ure signature"./
18b60 2f 2f 20 20 20 20 20 26 27 32 20 53 74 72 69 6e  //     &'2 Strin
18b70 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
18b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73              // s
18b90 6f 6d 65 20 75 70 76 61 72 0a 2f 2f 2f 20 5d 0a  ome upvar./// ].
18ba0 2f 2f 2f 20 60 60 60 0a 2f 2f 2f 0a 2f 2f 2f 20  /// ```.///./// 
18bb0 4e 6f 77 20 74 68 65 20 63 6f 64 65 20 6d 69 67  Now the code mig
18bc0 68 74 20 69 6d 70 6f 73 65 20 61 20 72 65 71 75  ht impose a requ
18bd0 69 72 65 6d 65 6e 74 20 6c 69 6b 65 20 60 27 31  irement like `'1
18be0 3a 20 27 32 60 2e 20 57 68 65 6e 20 61 6e 0a 2f  : '2`. When an./
18bf0 2f 2f 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  // instance of t
18c00 68 65 20 63 6c 6f 73 75 72 65 20 69 73 20 63 72  he closure is cr
18c10 65 61 74 65 64 2c 20 74 68 65 20 63 6f 72 72 65  eated, the corre
18c20 73 70 6f 6e 64 69 6e 67 20 66 72 65 65 20 72 65  sponding free re
18c30 67 69 6f 6e 73 0a 2f 2f 2f 20 63 61 6e 20 62 65  gions./// can be
18c40 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
18c50 69 74 73 20 74 79 70 65 20 61 6e 64 20 63 6f 6e  its type and con
18c60 73 74 72 61 69 6e 65 64 20 74 6f 20 68 61 76 65  strained to have
18c70 20 74 68 65 20 67 69 76 65 6e 0a 2f 2f 2f 20 6f   the given./// o
18c80 75 74 6c 69 76 65 73 20 72 65 6c 61 74 69 6f 6e  utlives relation
18c90 73 68 69 70 2e 0a 2f 2f 2f 0a 2f 2f 2f 20 49 6e  ship..///./// In
18ca0 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 77 65 20   some cases, we 
18cb0 68 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20 6f  have to record o
18cc0 75 74 6c 69 76 65 73 20 72 65 71 75 69 72 65 6d  utlives requirem
18cd0 65 6e 74 73 20 62 65 74 77 65 65 6e 0a 2f 2f 2f  ents between.///
18ce0 20 74 79 70 65 73 20 61 6e 64 20 72 65 67 69 6f   types and regio
18cf0 6e 73 20 61 73 20 77 65 6c 6c 2e 20 49 6e 20 74  ns as well. In t
18d00 68 61 74 20 63 61 73 65 2c 20 69 66 20 74 68 6f  hat case, if tho
18d10 73 65 20 74 79 70 65 73 20 69 6e 63 6c 75 64 65  se types include
18d20 0a 2f 2f 2f 20 61 6e 79 20 72 65 67 69 6f 6e 73  ./// any regions
18d30 2c 20 74 68 6f 73 65 20 72 65 67 69 6f 6e 73 20  , those regions 
18d40 61 72 65 20 72 65 63 6f 72 64 65 64 20 61 73 20  are recorded as 
18d50 60 52 65 43 6c 6f 73 75 72 65 42 6f 75 6e 64 60  `ReClosureBound`
18d60 0a 2f 2f 2f 20 69 6e 73 74 61 6e 63 65 73 20 61  ./// instances a
18d70 73 73 69 67 6e 65 64 20 6f 6e 65 20 6f 66 20 74  ssigned one of t
18d80 68 65 73 65 20 73 61 6d 65 20 69 6e 64 69 63 65  hese same indice
18d90 73 2e 20 54 68 6f 73 65 20 72 65 67 69 6f 6e 73  s. Those regions
18da0 20 77 69 6c 6c 0a 2f 2f 2f 20 62 65 20 73 75 62   will./// be sub
18db0 73 74 69 74 75 74 65 64 20 61 77 61 79 20 62 79  stituted away by
18dc0 20 74 68 65 20 63 72 65 61 74 6f 72 2e 20 57 65   the creator. We
18dd0 20 75 73 65 20 60 52 65 43 6c 6f 73 75 72 65 42   use `ReClosureB
18de0 6f 75 6e 64 60 20 69 6e 0a 2f 2f 2f 20 74 68 61  ound` in./// tha
18df0 74 20 63 61 73 65 20 62 65 63 61 75 73 65 20 74  t case because t
18e00 68 65 20 72 65 67 69 6f 6e 73 20 6d 75 73 74 20  he regions must 
18e10 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20  be allocated in 
18e20 74 68 65 20 67 6c 6f 62 61 6c 0a 2f 2f 2f 20 60  the global./// `
18e30 54 79 43 74 78 74 60 2c 20 61 6e 64 20 68 65 6e  TyCtxt`, and hen
18e40 63 65 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65  ce we cannot use
18e50 20 60 52 65 56 61 72 60 20 28 77 68 69 63 68 20   `ReVar` (which 
18e60 69 73 20 77 68 61 74 20 77 65 20 75 73 65 0a 2f  is what we use./
18e70 2f 2f 20 69 6e 74 65 72 6e 61 6c 6c 79 20 77 69  // internally wi
18e80 74 68 69 6e 20 74 68 65 20 72 65 73 74 20 6f 66  thin the rest of
18e90 20 74 68 65 20 4e 4c 4c 20 63 6f 64 65 29 2e 0a   the NLL code)..
18ea0 23 5b 64 65 72 69 76 65 28 43 6c 6f 6e 65 2c 20  #[derive(Clone, 
18eb0 44 65 62 75 67 2c 20 52 75 73 74 63 45 6e 63 6f  Debug, RustcEnco
18ec0 64 61 62 6c 65 2c 20 52 75 73 74 63 44 65 63 6f  dable, RustcDeco
18ed0 64 61 62 6c 65 2c 20 48 61 73 68 53 74 61 62 6c  dable, HashStabl
18ee0 65 29 5d 0a 70 75 62 20 73 74 72 75 63 74 20 43  e)].pub struct C
18ef0 6c 6f 73 75 72 65 52 65 67 69 6f 6e 52 65 71 75  losureRegionRequ
18f00 69 72 65 6d 65 6e 74 73 3c 27 74 63 78 3e 20 7b  irements<'tcx> {
18f10 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e 75 6d  .    /// The num
18f20 62 65 72 20 6f 66 20 65 78 74 65 72 6e 61 6c 20  ber of external 
18f30 72 65 67 69 6f 6e 73 20 64 65 66 69 6e 65 64 20  regions defined 
18f40 6f 6e 20 74 68 65 20 63 6c 6f 73 75 72 65 2e 20  on the closure. 
18f50 49 6e 20 6f 75 72 0a 20 20 20 20 2f 2f 2f 20 65  In our.    /// e
18f60 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 69 74  xample above, it
18f70 20 77 6f 75 6c 64 20 62 65 20 33 20 2d 2d 20 6f   would be 3 -- o
18f80 6e 65 20 66 6f 72 20 60 27 73 74 61 74 69 63 60  ne for `'static`
18f90 2c 20 74 68 65 6e 20 60 27 31 60 0a 20 20 20 20  , then `'1`.    
18fa0 2f 2f 2f 20 61 6e 64 20 60 27 32 60 2e 20 54 68  /// and `'2`. Th
18fb0 69 73 20 69 73 20 6a 75 73 74 20 75 73 65 64 20  is is just used 
18fc0 66 6f 72 20 61 20 73 61 6e 69 74 79 20 63 68 65  for a sanity che
18fd0 63 6b 20 6c 61 74 65 72 20 6f 6e 2c 20 74 6f 0a  ck later on, to.
18fe0 20 20 20 20 2f 2f 2f 20 6d 61 6b 65 20 73 75 72      /// make sur
18ff0 65 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  e that the numbe
19000 72 20 6f 66 20 72 65 67 69 6f 6e 73 20 77 65 20  r of regions we 
19010 73 65 65 20 61 74 20 74 68 65 20 63 61 6c 6c 73  see at the calls
19020 69 74 65 0a 20 20 20 20 2f 2f 2f 20 6d 61 74 63  ite.    /// matc
19030 68 65 73 2e 0a 20 20 20 20 70 75 62 20 6e 75 6d  hes..    pub num
19040 5f 65 78 74 65 72 6e 61 6c 5f 76 69 64 73 3a 20  _external_vids: 
19050 75 73 69 7a 65 2c 0a 0a 20 20 20 20 2f 2f 2f 20  usize,..    /// 
19060 52 65 71 75 69 72 65 6d 65 6e 74 73 20 62 65 74  Requirements bet
19070 77 65 65 6e 20 74 68 65 20 76 61 72 69 6f 75 73  ween the various
19080 20 66 72 65 65 20 72 65 67 69 6f 6e 73 20 64 65   free regions de
19090 66 69 6e 65 64 20 69 6e 0a 20 20 20 20 2f 2f 2f  fined in.    ///
190a0 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 70 75   indices..    pu
190b0 62 20 6f 75 74 6c 69 76 65 73 5f 72 65 71 75 69  b outlives_requi
190c0 72 65 6d 65 6e 74 73 3a 20 56 65 63 3c 43 6c 6f  rements: Vec<Clo
190d0 73 75 72 65 4f 75 74 6c 69 76 65 73 52 65 71 75  sureOutlivesRequ
190e0 69 72 65 6d 65 6e 74 3c 27 74 63 78 3e 3e 2c 0a  irement<'tcx>>,.
190f0 7d 0a 0a 2f 2f 2f 20 49 6e 64 69 63 61 74 65 73  }../// Indicates
19100 20 61 6e 20 6f 75 74 6c 69 76 65 73 2d 63 6f 6e   an outlives-con
19110 73 74 72 61 69 6e 74 20 62 65 74 77 65 65 6e 20  straint between 
19120 61 20 74 79 70 65 20 6f 72 20 62 65 74 77 65 65  a type or betwee
19130 6e 20 74 77 6f 0a 2f 2f 2f 20 66 72 65 65 20 72  n two./// free r
19140 65 67 69 6f 6e 73 20 64 65 63 6c 61 72 65 64 20  egions declared 
19150 6f 6e 20 74 68 65 20 63 6c 6f 73 75 72 65 2e 0a  on the closure..
19160 23 5b 64 65 72 69 76 65 28 43 6f 70 79 2c 20 43  #[derive(Copy, C
19170 6c 6f 6e 65 2c 20 44 65 62 75 67 2c 20 52 75 73  lone, Debug, Rus
19180 74 63 45 6e 63 6f 64 61 62 6c 65 2c 20 52 75 73  tcEncodable, Rus
19190 74 63 44 65 63 6f 64 61 62 6c 65 2c 20 48 61 73  tcDecodable, Has
191a0 68 53 74 61 62 6c 65 29 5d 0a 70 75 62 20 73 74  hStable)].pub st
191b0 72 75 63 74 20 43 6c 6f 73 75 72 65 4f 75 74 6c  ruct ClosureOutl
191c0 69 76 65 73 52 65 71 75 69 72 65 6d 65 6e 74 3c  ivesRequirement<
191d0 27 74 63 78 3e 20 7b 0a 20 20 20 20 2f 2f 20 54  'tcx> {.    // T
191e0 68 69 73 20 72 65 67 69 6f 6e 20 6f 72 20 74 79  his region or ty
191f0 70 65 20 2e 2e 2e 0a 20 20 20 20 70 75 62 20 73  pe ....    pub s
19200 75 62 6a 65 63 74 3a 20 43 6c 6f 73 75 72 65 4f  ubject: ClosureO
19210 75 74 6c 69 76 65 73 53 75 62 6a 65 63 74 3c 27  utlivesSubject<'
19220 74 63 78 3e 2c 0a 0a 20 20 20 20 2f 2f 20 2e 2e  tcx>,..    // ..
19230 2e 20 6d 75 73 74 20 6f 75 74 6c 69 76 65 20 74  . must outlive t
19240 68 69 73 20 6f 6e 65 2e 0a 20 20 20 20 70 75 62  his one..    pub
19250 20 6f 75 74 6c 69 76 65 64 5f 66 72 65 65 5f 72   outlived_free_r
19260 65 67 69 6f 6e 3a 20 74 79 3a 3a 52 65 67 69 6f  egion: ty::Regio
19270 6e 56 69 64 2c 0a 0a 20 20 20 20 2f 2f 20 49 66  nVid,..    // If
19280 20 6e 6f 74 2c 20 72 65 70 6f 72 74 20 61 6e 20   not, report an 
19290 65 72 72 6f 72 20 68 65 72 65 20 2e 2e 2e 0a 20  error here .... 
192a0 20 20 20 70 75 62 20 62 6c 61 6d 65 5f 73 70 61     pub blame_spa
192b0 6e 3a 20 53 70 61 6e 2c 0a 0a 20 20 20 20 2f 2f  n: Span,..    //
192c0 20 2e 2e 2e 20 64 75 65 20 74 6f 20 74 68 69 73   ... due to this
192d0 20 72 65 61 73 6f 6e 2e 0a 20 20 20 20 70 75 62   reason..    pub
192e0 20 63 61 74 65 67 6f 72 79 3a 20 43 6f 6e 73 74   category: Const
192f0 72 61 69 6e 74 43 61 74 65 67 6f 72 79 2c 0a 7d  raintCategory,.}
19300 0a 0a 2f 2f 2f 20 4f 75 74 6c 69 76 65 73 2d 63  ../// Outlives-c
19310 6f 6e 73 74 72 61 69 6e 74 73 20 63 61 6e 20 62  onstraints can b
19320 65 20 63 61 74 65 67 6f 72 69 7a 65 64 20 74 6f  e categorized to
19330 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
19340 65 72 20 61 6e 64 20 77 68 79 20 74 68 65 79 0a  er and why they.
19350 2f 2f 2f 20 61 72 65 20 69 6e 74 65 72 65 73 74  /// are interest
19360 69 6e 67 20 28 66 6f 72 20 65 72 72 6f 72 20 72  ing (for error r
19370 65 70 6f 72 74 69 6e 67 29 2e 20 4f 72 64 65 72  eporting). Order
19380 20 6f 66 20 76 61 72 69 61 6e 74 73 20 69 6e 64   of variants ind
19390 69 63 61 74 65 73 20 73 6f 72 74 0a 2f 2f 2f 20  icates sort./// 
193a0 6f 72 64 65 72 20 6f 66 20 74 68 65 20 63 61 74  order of the cat
193b0 65 67 6f 72 79 2c 20 74 68 65 72 65 62 79 20 69  egory, thereby i
193c0 6e 66 6c 75 65 6e 63 69 6e 67 20 64 69 61 67 6e  nfluencing diagn
193d0 6f 73 74 69 63 20 6f 75 74 70 75 74 2e 0a 2f 2f  ostic output..//
193e0 2f 0a 2f 2f 2f 20 53 65 65 20 61 6c 73 6f 20 5b  /./// See also [
193f0 72 75 73 74 63 5f 6d 69 72 3a 3a 62 6f 72 72 6f  rustc_mir::borro
19400 77 5f 63 68 65 63 6b 3a 3a 6e 6c 6c 3a 3a 63 6f  w_check::nll::co
19410 6e 73 74 72 61 69 6e 74 73 5d 2e 0a 23 5b 64 65  nstraints]..#[de
19420 72 69 76 65 28 0a 20 20 20 20 43 6f 70 79 2c 0a  rive(.    Copy,.
19430 20 20 20 20 43 6c 6f 6e 65 2c 0a 20 20 20 20 44      Clone,.    D
19440 65 62 75 67 2c 0a 20 20 20 20 45 71 2c 0a 20 20  ebug,.    Eq,.  
19450 20 20 50 61 72 74 69 61 6c 45 71 2c 0a 20 20 20    PartialEq,.   
19460 20 50 61 72 74 69 61 6c 4f 72 64 2c 0a 20 20 20   PartialOrd,.   
19470 20 4f 72 64 2c 0a 20 20 20 20 48 61 73 68 2c 0a   Ord,.    Hash,.
19480 20 20 20 20 52 75 73 74 63 45 6e 63 6f 64 61 62      RustcEncodab
19490 6c 65 2c 0a 20 20 20 20 52 75 73 74 63 44 65 63  le,.    RustcDec
194a0 6f 64 61 62 6c 65 2c 0a 20 20 20 20 48 61 73 68  odable,.    Hash
194b0 53 74 61 62 6c 65 2c 0a 29 5d 0a 70 75 62 20 65  Stable,.)].pub e
194c0 6e 75 6d 20 43 6f 6e 73 74 72 61 69 6e 74 43 61  num ConstraintCa
194d0 74 65 67 6f 72 79 20 7b 0a 20 20 20 20 52 65 74  tegory {.    Ret
194e0 75 72 6e 2c 0a 20 20 20 20 59 69 65 6c 64 2c 0a  urn,.    Yield,.
194f0 20 20 20 20 55 73 65 41 73 43 6f 6e 73 74 2c 0a      UseAsConst,.
19500 20 20 20 20 55 73 65 41 73 53 74 61 74 69 63 2c      UseAsStatic,
19510 0a 20 20 20 20 54 79 70 65 41 6e 6e 6f 74 61 74  .    TypeAnnotat
19520 69 6f 6e 2c 0a 20 20 20 20 43 61 73 74 2c 0a 0a  ion,.    Cast,..
19530 20 20 20 20 2f 2f 2f 20 41 20 63 6f 6e 73 74 72      /// A constr
19540 61 69 6e 74 20 74 68 61 74 20 63 61 6d 65 20 66  aint that came f
19550 72 6f 6d 20 63 68 65 63 6b 69 6e 67 20 74 68 65  rom checking the
19560 20 62 6f 64 79 20 6f 66 20 61 20 63 6c 6f 73 75   body of a closu
19570 72 65 2e 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20  re..    ///.    
19580 2f 2f 2f 20 57 65 20 74 72 79 20 74 6f 20 67 65  /// We try to ge
19590 74 20 74 68 65 20 63 61 74 65 67 6f 72 79 20 74  t the category t
195a0 68 61 74 20 74 68 65 20 63 6c 6f 73 75 72 65 20  hat the closure 
195b0 75 73 65 64 20 77 68 65 6e 20 72 65 70 6f 72 74  used when report
195c0 69 6e 67 20 74 68 69 73 2e 0a 20 20 20 20 43 6c  ing this..    Cl
195d0 6f 73 75 72 65 42 6f 75 6e 64 73 2c 0a 20 20 20  osureBounds,.   
195e0 20 43 61 6c 6c 41 72 67 75 6d 65 6e 74 2c 0a 20   CallArgument,. 
195f0 20 20 20 43 6f 70 79 42 6f 75 6e 64 2c 0a 20 20     CopyBound,.  
19600 20 20 53 69 7a 65 64 42 6f 75 6e 64 2c 0a 20 20    SizedBound,.  
19610 20 20 41 73 73 69 67 6e 6d 65 6e 74 2c 0a 20 20    Assignment,.  
19620 20 20 4f 70 61 71 75 65 54 79 70 65 2c 0a 0a 20    OpaqueType,.. 
19630 20 20 20 2f 2f 2f 20 41 20 22 62 6f 72 69 6e 67     /// A "boring
19640 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 63 61  " constraint (ca
19650 75 73 65 64 20 62 79 20 74 68 65 20 67 69 76 65  used by the give
19660 6e 20 6c 6f 63 61 74 69 6f 6e 29 20 69 73 20 6f  n location) is o
19670 6e 65 20 74 68 61 74 0a 20 20 20 20 2f 2f 2f 20  ne that.    /// 
19680 74 68 65 20 75 73 65 72 20 70 72 6f 62 61 62 6c  the user probabl
19690 79 20 64 6f 65 73 6e 27 74 20 77 61 6e 74 20 74  y doesn't want t
196a0 6f 20 73 65 65 20 64 65 73 63 72 69 62 65 64 20  o see described 
196b0 69 6e 20 64 69 61 67 6e 6f 73 74 69 63 73 2c 0a  in diagnostics,.
196c0 20 20 20 20 2f 2f 2f 20 62 65 63 61 75 73 65 20      /// because 
196d0 69 74 20 69 73 20 6b 69 6e 64 20 6f 66 20 61 6e  it is kind of an
196e0 20 61 72 74 69 66 61 63 74 20 6f 66 20 74 68 65   artifact of the
196f0 20 74 79 70 65 20 73 79 73 74 65 6d 20 73 65 74   type system set
19700 75 70 2e 0a 20 20 20 20 2f 2f 2f 20 45 78 61 6d  up..    /// Exam
19710 70 6c 65 3a 20 60 78 20 3d 20 46 6f 6f 20 7b 20  ple: `x = Foo { 
19720 66 69 65 6c 64 3a 20 79 20 7d 60 20 74 65 63 68  field: y }` tech
19730 6e 69 63 61 6c 6c 79 20 63 72 65 61 74 65 73 0a  nically creates.
19740 20 20 20 20 2f 2f 2f 20 69 6e 74 65 72 6d 65 64      /// intermed
19750 69 61 74 65 20 72 65 67 69 6f 6e 73 20 72 65 70  iate regions rep
19760 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 22 74  resenting the "t
19770 79 70 65 20 6f 66 20 60 46 6f 6f 20 7b 20 66 69  ype of `Foo { fi
19780 65 6c 64 3a 20 79 0a 20 20 20 20 2f 2f 2f 20 7d  eld: y.    /// }
19790 60 22 2c 20 61 6e 64 20 64 61 74 61 20 66 6c 6f  `", and data flo
197a0 77 73 20 66 72 6f 6d 20 60 79 60 20 69 6e 74 6f  ws from `y` into
197b0 20 74 68 6f 73 65 20 76 61 72 69 61 62 6c 65 73   those variables
197c0 2c 20 62 75 74 20 74 68 65 79 0a 20 20 20 20 2f  , but they.    /
197d0 2f 2f 20 61 72 65 20 6e 6f 74 20 76 65 72 79 20  // are not very 
197e0 69 6e 74 65 72 65 73 74 69 6e 67 2e 20 54 68 65  interesting. The
197f0 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 74 6f   assignment into
19800 20 60 78 60 20 6f 6e 20 74 68 65 20 6f 74 68 65   `x` on the othe
19810 72 0a 20 20 20 20 2f 2f 2f 20 68 61 6e 64 20 6d  r.    /// hand m
19820 69 67 68 74 20 62 65 2e 0a 20 20 20 20 42 6f 72  ight be..    Bor
19830 69 6e 67 2c 0a 20 20 20 20 2f 2f 20 42 6f 72 69  ing,.    // Bori
19840 6e 67 20 61 6e 64 20 61 70 70 6c 69 63 61 62 6c  ng and applicabl
19850 65 20 65 76 65 72 79 77 68 65 72 65 2e 0a 20 20  e everywhere..  
19860 20 20 42 6f 72 69 6e 67 4e 6f 4c 6f 63 61 74 69    BoringNoLocati
19870 6f 6e 2c 0a 0a 20 20 20 20 2f 2f 2f 20 41 20 63  on,..    /// A c
19880 6f 6e 73 74 72 61 69 6e 74 20 74 68 61 74 20 64  onstraint that d
19890 6f 65 73 6e 27 74 20 63 6f 72 72 65 73 70 6f 6e  oesn't correspon
198a0 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 74 68  d to anything th
198b0 65 20 75 73 65 72 20 73 65 65 73 2e 0a 20 20 20  e user sees..   
198c0 20 49 6e 74 65 72 6e 61 6c 2c 0a 7d 0a 0a 2f 2f   Internal,.}..//
198d0 2f 20 54 68 65 20 73 75 62 6a 65 63 74 20 6f 66  / The subject of
198e0 20 61 20 60 43 6c 6f 73 75 72 65 4f 75 74 6c 69   a `ClosureOutli
198f0 76 65 73 52 65 71 75 69 72 65 6d 65 6e 74 60 20  vesRequirement` 
19900 2d 2d 20 74 68 61 74 20 69 73 2c 20 74 68 65 20  -- that is, the 
19910 74 68 69 6e 67 0a 2f 2f 2f 20 74 68 61 74 20 6d  thing./// that m
19920 75 73 74 20 6f 75 74 6c 69 76 65 20 73 6f 6d 65  ust outlive some
19930 20 72 65 67 69 6f 6e 2e 0a 23 5b 64 65 72 69 76   region..#[deriv
19940 65 28 43 6f 70 79 2c 20 43 6c 6f 6e 65 2c 20 44  e(Copy, Clone, D
19950 65 62 75 67 2c 20 52 75 73 74 63 45 6e 63 6f 64  ebug, RustcEncod
19960 61 62 6c 65 2c 20 52 75 73 74 63 44 65 63 6f 64  able, RustcDecod
19970 61 62 6c 65 2c 20 48 61 73 68 53 74 61 62 6c 65  able, HashStable
19980 29 5d 0a 70 75 62 20 65 6e 75 6d 20 43 6c 6f 73  )].pub enum Clos
19990 75 72 65 4f 75 74 6c 69 76 65 73 53 75 62 6a 65  ureOutlivesSubje
199a0 63 74 3c 27 74 63 78 3e 20 7b 0a 20 20 20 20 2f  ct<'tcx> {.    /
199b0 2f 2f 20 53 75 62 6a 65 63 74 20 69 73 20 61 20  // Subject is a 
199c0 74 79 70 65 2c 20 74 79 70 69 63 61 6c 6c 79 20  type, typically 
199d0 61 20 74 79 70 65 20 70 61 72 61 6d 65 74 65 72  a type parameter
199e0 2c 20 62 75 74 20 63 6f 75 6c 64 20 61 6c 73 6f  , but could also
199f0 0a 20 20 20 20 2f 2f 2f 20 62 65 20 61 20 70 72  .    /// be a pr
19a00 6f 6a 65 63 74 69 6f 6e 2e 20 49 6e 64 69 63 61  ojection. Indica
19a10 74 65 73 20 61 20 72 65 71 75 69 72 65 6d 65 6e  tes a requiremen
19a20 74 20 6c 69 6b 65 20 60 54 3a 20 27 61 60 20 62  t like `T: 'a` b
19a30 65 69 6e 67 0a 20 20 20 20 2f 2f 2f 20 70 61 73  eing.    /// pas
19a40 73 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  sed to the calle
19a50 72 2c 20 77 68 65 72 65 20 74 68 65 20 74 79 70  r, where the typ
19a60 65 20 68 65 72 65 20 69 73 20 60 54 60 2e 0a 20  e here is `T`.. 
19a70 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 54     ///.    /// T
19a80 68 65 20 74 79 70 65 20 68 65 72 65 20 69 73 20  he type here is 
19a90 67 75 61 72 61 6e 74 65 65 64 20 6e 6f 74 20 74  guaranteed not t
19aa0 6f 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20 66 72  o contain any fr
19ab0 65 65 20 72 65 67 69 6f 6e 73 20 61 74 0a 20 20  ee regions at.  
19ac0 20 20 2f 2f 2f 20 70 72 65 73 65 6e 74 2e 0a 20    /// present.. 
19ad0 20 20 20 54 79 28 54 79 3c 27 74 63 78 3e 29 2c     Ty(Ty<'tcx>),
19ae0 0a 0a 20 20 20 20 2f 2f 2f 20 53 75 62 6a 65 63  ..    /// Subjec
19af0 74 20 69 73 20 61 20 66 72 65 65 20 72 65 67 69  t is a free regi
19b00 6f 6e 20 66 72 6f 6d 20 74 68 65 20 63 6c 6f 73  on from the clos
19b10 75 72 65 2e 20 49 6e 64 69 63 61 74 65 73 20 61  ure. Indicates a
19b20 20 72 65 71 75 69 72 65 6d 65 6e 74 0a 20 20 20   requirement.   
19b30 20 2f 2f 2f 20 6c 69 6b 65 20 60 27 61 3a 20 27   /// like `'a: '
19b40 62 60 20 62 65 69 6e 67 20 70 61 73 73 65 64 20  b` being passed 
19b50 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 3b 20 74  to the caller; t
19b60 68 65 20 72 65 67 69 6f 6e 20 68 65 72 65 20 69  he region here i
19b70 73 20 60 27 61 60 2e 0a 20 20 20 20 52 65 67 69  s `'a`..    Regi
19b80 6f 6e 28 74 79 3a 3a 52 65 67 69 6f 6e 56 69 64  on(ty::RegionVid
19b90 29 2c 0a 7d 0a 0a 2f 2a 0a 20 2a 20 60 54 79 70  ),.}../*. * `Typ
19ba0 65 46 6f 6c 64 61 62 6c 65 60 20 69 6d 70 6c 65  eFoldable` imple
19bb0 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 4d  mentations for M
19bc0 49 52 20 74 79 70 65 73 0a 2a 2f 0a 0a 43 6c 6f  IR types.*/..Clo
19bd0 6e 65 54 79 70 65 46 6f 6c 64 61 62 6c 65 41 6e  neTypeFoldableAn
19be0 64 4c 69 66 74 49 6d 70 6c 73 21 20 7b 0a 20 20  dLiftImpls! {.  
19bf0 20 20 42 6c 6f 63 6b 54 61 69 6c 49 6e 66 6f 2c    BlockTailInfo,
19c00 0a 20 20 20 20 4d 69 72 50 68 61 73 65 2c 0a 20  .    MirPhase,. 
19c10 20 20 20 4d 75 74 61 62 69 6c 69 74 79 2c 0a 20     Mutability,. 
19c20 20 20 20 53 6f 75 72 63 65 49 6e 66 6f 2c 0a 20     SourceInfo,. 
19c30 20 20 20 46 61 6b 65 52 65 61 64 43 61 75 73 65     FakeReadCause
19c40 2c 0a 20 20 20 20 52 65 74 61 67 4b 69 6e 64 2c  ,.    RetagKind,
19c50 0a 20 20 20 20 53 6f 75 72 63 65 53 63 6f 70 65  .    SourceScope
19c60 2c 0a 20 20 20 20 53 6f 75 72 63 65 53 63 6f 70  ,.    SourceScop
19c70 65 44 61 74 61 2c 0a 20 20 20 20 53 6f 75 72 63  eData,.    Sourc
19c80 65 53 63 6f 70 65 4c 6f 63 61 6c 44 61 74 61 2c  eScopeLocalData,
19c90 0a 20 20 20 20 55 73 65 72 54 79 70 65 41 6e 6e  .    UserTypeAnn
19ca0 6f 74 61 74 69 6f 6e 49 6e 64 65 78 2c 0a 7d 0a  otationIndex,.}.
19cb0 0a 69 6d 70 6c 3c 27 74 63 78 3e 20 54 79 70 65  .impl<'tcx> Type
19cc0 46 6f 6c 64 61 62 6c 65 3c 27 74 63 78 3e 20 66  Foldable<'tcx> f
19cd0 6f 72 20 54 65 72 6d 69 6e 61 74 6f 72 3c 27 74  or Terminator<'t
19ce0 63 78 3e 20 7b 0a 20 20 20 20 66 6e 20 73 75 70  cx> {.    fn sup
19cf0 65 72 5f 66 6f 6c 64 5f 77 69 74 68 3c 46 3a 20  er_fold_with<F: 
19d00 54 79 70 65 46 6f 6c 64 65 72 3c 27 74 63 78 3e  TypeFolder<'tcx>
19d10 3e 28 26 73 65 6c 66 2c 20 66 6f 6c 64 65 72 3a  >(&self, folder:
19d20 20 26 6d 75 74 20 46 29 20 2d 3e 20 53 65 6c 66   &mut F) -> Self
19d30 20 7b 0a 20 20 20 20 20 20 20 20 75 73 65 20 63   {.        use c
19d40 72 61 74 65 3a 3a 6d 69 72 3a 3a 54 65 72 6d 69  rate::mir::Termi
19d50 6e 61 74 6f 72 4b 69 6e 64 3a 3a 2a 3b 0a 0a 20  natorKind::*;.. 
19d60 20 20 20 20 20 20 20 6c 65 74 20 6b 69 6e 64 20         let kind 
19d70 3d 20 6d 61 74 63 68 20 73 65 6c 66 2e 6b 69 6e  = match self.kin
19d80 64 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d {.            
19d90 47 6f 74 6f 20 7b 20 74 61 72 67 65 74 20 7d 20  Goto { target } 
19da0 3d 3e 20 47 6f 74 6f 20 7b 20 74 61 72 67 65 74  => Goto { target
19db0 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
19dc0 53 77 69 74 63 68 49 6e 74 20 7b 20 72 65 66 20  SwitchInt { ref 
19dd0 64 69 73 63 72 2c 20 73 77 69 74 63 68 5f 74 79  discr, switch_ty
19de0 2c 20 72 65 66 20 76 61 6c 75 65 73 2c 20 72 65  , ref values, re
19df0 66 20 74 61 72 67 65 74 73 20 7d 20 3d 3e 20 53  f targets } => S
19e00 77 69 74 63 68 49 6e 74 20 7b 0a 20 20 20 20 20  witchInt {.     
19e10 20 20 20 20 20 20 20 20 20 20 20 64 69 73 63 72             discr
19e20 3a 20 64 69 73 63 72 2e 66 6f 6c 64 5f 77 69 74  : discr.fold_wit
19e30 68 28 66 6f 6c 64 65 72 29 2c 0a 20 20 20 20 20  h(folder),.     
19e40 20 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63             switc
19e50 68 5f 74 79 3a 20 73 77 69 74 63 68 5f 74 79 2e  h_ty: switch_ty.
19e60 66 6f 6c 64 5f 77 69 74 68 28 66 6f 6c 64 65 72  fold_with(folder
19e70 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
19e80 20 20 20 76 61 6c 75 65 73 3a 20 76 61 6c 75 65     values: value
19e90 73 2e 63 6c 6f 6e 65 28 29 2c 0a 20 20 20 20 20  s.clone(),.     
19ea0 20 20 20 20 20 20 20 20 20 20 20 74 61 72 67 65             targe
19eb0 74 73 3a 20 74 61 72 67 65 74 73 2e 63 6c 6f 6e  ts: targets.clon
19ec0 65 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  e(),.           
19ed0 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
19ee0 44 72 6f 70 20 7b 20 72 65 66 20 6c 6f 63 61 74  Drop { ref locat
19ef0 69 6f 6e 2c 20 74 61 72 67 65 74 2c 20 75 6e 77  ion, target, unw
19f00 69 6e 64 20 7d 20 3d 3e 20 7b 0a 20 20 20 20 20  ind } => {.     
19f10 20 20 20 20 20 20 20 20 20 20 20 44 72 6f 70 20             Drop 
19f20 7b 20 6c 6f 63 61 74 69 6f 6e 3a 20 6c 6f 63 61  { location: loca
19f30 74 69 6f 6e 2e 66 6f 6c 64 5f 77 69 74 68 28 66  tion.fold_with(f
19f40 6f 6c 64 65 72 29 2c 20 74 61 72 67 65 74 2c 20  older), target, 
19f50 75 6e 77 69 6e 64 20 7d 0a 20 20 20 20 20 20 20  unwind }.       
19f60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
19f70 20 20 20 44 72 6f 70 41 6e 64 52 65 70 6c 61 63     DropAndReplac
19f80 65 20 7b 20 72 65 66 20 6c 6f 63 61 74 69 6f 6e  e { ref location
19f90 2c 20 72 65 66 20 76 61 6c 75 65 2c 20 74 61 72  , ref value, tar
19fa0 67 65 74 2c 20 75 6e 77 69 6e 64 20 7d 20 3d 3e  get, unwind } =>
19fb0 20 44 72 6f 70 41 6e 64 52 65 70 6c 61 63 65 20   DropAndReplace 
19fc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
19fd0 20 20 6c 6f 63 61 74 69 6f 6e 3a 20 6c 6f 63 61    location: loca
19fe0 74 69 6f 6e 2e 66 6f 6c 64 5f 77 69 74 68 28 66  tion.fold_with(f
19ff0 6f 6c 64 65 72 29 2c 0a 20 20 20 20 20 20 20 20  older),.        
1a000 20 20 20 20 20 20 20 20 76 61 6c 75 65 3a 20 76          value: v
1a010 61 6c 75 65 2e 66 6f 6c 64 5f 77 69 74 68 28 66  alue.fold_with(f
1a020 6f 6c 64 65 72 29 2c 0a 20 20 20 20 20 20 20 20  older),.        
1a030 20 20 20 20 20 20 20 20 74 61 72 67 65 74 2c 0a          target,.
1a040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a050 75 6e 77 69 6e 64 2c 0a 20 20 20 20 20 20 20 20  unwind,.        
1a060 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 20      },.         
1a070 20 20 20 59 69 65 6c 64 20 7b 20 72 65 66 20 76     Yield { ref v
1a080 61 6c 75 65 2c 20 72 65 73 75 6d 65 2c 20 64 72  alue, resume, dr
1a090 6f 70 20 7d 20 3d 3e 20 7b 0a 20 20 20 20 20 20  op } => {.      
1a0a0 20 20 20 20 20 20 20 20 20 20 59 69 65 6c 64 20            Yield 
1a0b0 7b 20 76 61 6c 75 65 3a 20 76 61 6c 75 65 2e 66  { value: value.f
1a0c0 6f 6c 64 5f 77 69 74 68 28 66 6f 6c 64 65 72 29  old_with(folder)
1a0d0 2c 20 72 65 73 75 6d 65 3a 20 72 65 73 75 6d 65  , resume: resume
1a0e0 2c 20 64 72 6f 70 3a 20 64 72 6f 70 20 7d 0a 20  , drop: drop }. 
1a0f0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1a100 20 20 20 20 20 20 20 20 20 43 61 6c 6c 20 7b 20           Call { 
1a110 72 65 66 20 66 75 6e 63 2c 20 72 65 66 20 61 72  ref func, ref ar
1a120 67 73 2c 20 72 65 66 20 64 65 73 74 69 6e 61 74  gs, ref destinat
1a130 69 6f 6e 2c 20 63 6c 65 61 6e 75 70 2c 20 66 72  ion, cleanup, fr
1a140 6f 6d 5f 68 69 72 5f 63 61 6c 6c 20 7d 20 3d 3e  om_hir_call } =>
1a150 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
1a160 20 20 20 6c 65 74 20 64 65 73 74 20 3d 0a 20 20     let dest =.  
1a170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a180 20 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 61 73    destination.as
1a190 5f 72 65 66 28 29 2e 6d 61 70 28 7c 26 28 72 65  _ref().map(|&(re
1a1a0 66 20 6c 6f 63 2c 20 64 65 73 74 29 7c 20 28 6c  f loc, dest)| (l
1a1b0 6f 63 2e 66 6f 6c 64 5f 77 69 74 68 28 66 6f 6c  oc.fold_with(fol
1a1c0 64 65 72 29 2c 20 64 65 73 74 29 29 3b 0a 0a 20  der), dest));.. 
1a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
1a1e0 61 6c 6c 20 7b 0a 20 20 20 20 20 20 20 20 20 20  all {.          
1a1f0 20 20 20 20 20 20 20 20 20 20 66 75 6e 63 3a 20            func: 
1a200 66 75 6e 63 2e 66 6f 6c 64 5f 77 69 74 68 28 66  func.fold_with(f
1a210 6f 6c 64 65 72 29 2c 0a 20 20 20 20 20 20 20 20  older),.        
1a220 20 20 20 20 20 20 20 20 20 20 20 20 61 72 67 73              args
1a230 3a 20 61 72 67 73 2e 66 6f 6c 64 5f 77 69 74 68  : args.fold_with
1a240 28 66 6f 6c 64 65 72 29 2c 0a 20 20 20 20 20 20  (folder),.      
1a250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
1a260 73 74 69 6e 61 74 69 6f 6e 3a 20 64 65 73 74 2c  stination: dest,
1a270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a280 20 20 20 20 20 63 6c 65 61 6e 75 70 2c 0a 20 20       cleanup,.  
1a290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2a0 20 20 66 72 6f 6d 5f 68 69 72 5f 63 61 6c 6c 2c    from_hir_call,
1a2b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a2c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
1a2d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 73 73  .            Ass
1a2e0 65 72 74 20 7b 20 72 65 66 20 63 6f 6e 64 2c 20  ert { ref cond, 
1a2f0 65 78 70 65 63 74 65 64 2c 20 72 65 66 20 6d 73  expected, ref ms
1a300 67 2c 20 74 61 72 67 65 74 2c 20 63 6c 65 61 6e  g, target, clean
1a310 75 70 20 7d 20 3d 3e 20 7b 0a 20 20 20 20 20 20  up } => {.      
1a320 20 20 20 20 20 20 20 20 20 20 75 73 65 20 50 61            use Pa
1a330 6e 69 63 49 6e 66 6f 3a 3a 2a 3b 0a 20 20 20 20  nicInfo::*;.    
1a340 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
1a350 6d 73 67 20 3d 20 6d 61 74 63 68 20 6d 73 67 20  msg = match msg 
1a360 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1a370 20 20 20 20 20 20 42 6f 75 6e 64 73 43 68 65 63        BoundsChec
1a380 6b 20 7b 20 72 65 66 20 6c 65 6e 2c 20 72 65 66  k { ref len, ref
1a390 20 69 6e 64 65 78 20 7d 20 3d 3e 0a 20 20 20 20   index } =>.    
1a3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3b0 20 20 20 20 42 6f 75 6e 64 73 43 68 65 63 6b 20      BoundsCheck 
1a3c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1a3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65                le
1a3e0 6e 3a 20 6c 65 6e 2e 66 6f 6c 64 5f 77 69 74 68  n: len.fold_with
1a3f0 28 66 6f 6c 64 65 72 29 2c 0a 20 20 20 20 20 20  (folder),.      
1a400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a410 20 20 20 20 20 20 69 6e 64 65 78 3a 20 69 6e 64        index: ind
1a420 65 78 2e 66 6f 6c 64 5f 77 69 74 68 28 66 6f 6c  ex.fold_with(fol
1a430 64 65 72 29 2c 0a 20 20 20 20 20 20 20 20 20 20  der),.          
1a440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
1a450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a460 20 20 20 20 20 50 61 6e 69 63 20 7b 20 2e 2e 20       Panic { .. 
1a470 7d 20 7c 20 4f 76 65 72 66 6c 6f 77 28 5f 29 20  } | Overflow(_) 
1a480 7c 20 4f 76 65 72 66 6c 6f 77 4e 65 67 20 7c 20  | OverflowNeg | 
1a490 44 69 76 69 73 69 6f 6e 42 79 5a 65 72 6f 20 7c  DivisionByZero |
1a4a0 20 52 65 6d 61 69 6e 64 65 72 42 79 5a 65 72 6f   RemainderByZero
1a4b0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
1a4c0 20 20 20 20 20 20 20 52 65 73 75 6d 65 64 41 66         ResumedAf
1a4d0 74 65 72 52 65 74 75 72 6e 28 5f 29 20 7c 20 52  terReturn(_) | R
1a4e0 65 73 75 6d 65 64 41 66 74 65 72 50 61 6e 69 63  esumedAfterPanic
1a4f0 28 5f 29 20 20 3d 3e 0a 20 20 20 20 20 20 20 20  (_)  =>.        
1a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a510 6d 73 67 2e 63 6c 6f 6e 65 28 29 2c 0a 20 20 20  msg.clone(),.   
1a520 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 3b 0a               };.
1a530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a540 41 73 73 65 72 74 20 7b 20 63 6f 6e 64 3a 20 63  Assert { cond: c
1a550 6f 6e 64 2e 66 6f 6c 64 5f 77 69 74 68 28 66 6f  ond.fold_with(fo
1a560 6c 64 65 72 29 2c 20 65 78 70 65 63 74 65 64 2c  lder), expected,
1a570 20 6d 73 67 2c 20 74 61 72 67 65 74 2c 20 63 6c   msg, target, cl
1a580 65 61 6e 75 70 20 7d 0a 20 20 20 20 20 20 20 20  eanup }.        
1a590 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1a5a0 20 20 47 65 6e 65 72 61 74 6f 72 44 72 6f 70 20    GeneratorDrop 
1a5b0 3d 3e 20 47 65 6e 65 72 61 74 6f 72 44 72 6f 70  => GeneratorDrop
1a5c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 52 65  ,.            Re
1a5d0 73 75 6d 65 20 3d 3e 20 52 65 73 75 6d 65 2c 0a  sume => Resume,.
1a5e0 20 20 20 20 20 20 20 20 20 20 20 20 41 62 6f 72              Abor
1a5f0 74 20 3d 3e 20 41 62 6f 72 74 2c 0a 20 20 20 20  t => Abort,.    
1a600 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 3d          Return =
1a610 3e 20 52 65 74 75 72 6e 2c 0a 20 20 20 20 20 20  > Return,.      
1a620 20 20 20 20 20 20 55 6e 72 65 61 63 68 61 62 6c        Unreachabl
1a630 65 20 3d 3e 20 55 6e 72 65 61 63 68 61 62 6c 65  e => Unreachable
1a640 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 61  ,.            Fa
1a650 6c 73 65 45 64 67 65 73 20 7b 20 72 65 61 6c 5f  lseEdges { real_
1a660 74 61 72 67 65 74 2c 20 69 6d 61 67 69 6e 61 72  target, imaginar
1a670 79 5f 74 61 72 67 65 74 20 7d 20 3d 3e 20 7b 0a  y_target } => {.
1a680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a690 46 61 6c 73 65 45 64 67 65 73 20 7b 20 72 65 61  FalseEdges { rea
1a6a0 6c 5f 74 61 72 67 65 74 2c 20 69 6d 61 67 69 6e  l_target, imagin
1a6b0 61 72 79 5f 74 61 72 67 65 74 20 7d 0a 20 20 20  ary_target }.   
1a6c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1a6d0 20 20 20 20 20 20 20 46 61 6c 73 65 55 6e 77 69         FalseUnwi
1a6e0 6e 64 20 7b 20 72 65 61 6c 5f 74 61 72 67 65 74  nd { real_target
1a6f0 2c 20 75 6e 77 69 6e 64 20 7d 20 3d 3e 20 46 61  , unwind } => Fa
1a700 6c 73 65 55 6e 77 69 6e 64 20 7b 20 72 65 61 6c  lseUnwind { real
1a710 5f 74 61 72 67 65 74 2c 20 75 6e 77 69 6e 64 20  _target, unwind 
1a720 7d 2c 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20  },.        };.  
1a730 20 20 20 20 20 20 54 65 72 6d 69 6e 61 74 6f 72        Terminator
1a740 20 7b 20 73 6f 75 72 63 65 5f 69 6e 66 6f 3a 20   { source_info: 
1a750 73 65 6c 66 2e 73 6f 75 72 63 65 5f 69 6e 66 6f  self.source_info
1a760 2c 20 6b 69 6e 64 20 7d 0a 20 20 20 20 7d 0a 0a  , kind }.    }..
1a770 20 20 20 20 66 6e 20 73 75 70 65 72 5f 76 69 73      fn super_vis
1a780 69 74 5f 77 69 74 68 3c 56 3a 20 54 79 70 65 56  it_with<V: TypeV
1a790 69 73 69 74 6f 72 3c 27 74 63 78 3e 3e 28 26 73  isitor<'tcx>>(&s
1a7a0 65 6c 66 2c 20 76 69 73 69 74 6f 72 3a 20 26 6d  elf, visitor: &m
1a7b0 75 74 20 56 29 20 2d 3e 20 62 6f 6f 6c 20 7b 0a  ut V) -> bool {.
1a7c0 20 20 20 20 20 20 20 20 75 73 65 20 63 72 61 74          use crat
1a7d0 65 3a 3a 6d 69 72 3a 3a 54 65 72 6d 69 6e 61 74  e::mir::Terminat
1a7e0 6f 72 4b 69 6e 64 3a 3a 2a 3b 0a 0a 20 20 20 20  orKind::*;..    
1a7f0 20 20 20 20 6d 61 74 63 68 20 73 65 6c 66 2e 6b      match self.k
1a800 69 6e 64 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ind {.          
1a810 20 20 53 77 69 74 63 68 49 6e 74 20 7b 20 72 65    SwitchInt { re
1a820 66 20 64 69 73 63 72 2c 20 73 77 69 74 63 68 5f  f discr, switch_
1a830 74 79 2c 20 2e 2e 20 7d 20 3d 3e 20 7b 0a 20 20  ty, .. } => {.  
1a840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
1a850 73 63 72 2e 76 69 73 69 74 5f 77 69 74 68 28 76  scr.visit_with(v
1a860 69 73 69 74 6f 72 29 20 7c 7c 20 73 77 69 74 63  isitor) || switc
1a870 68 5f 74 79 2e 76 69 73 69 74 5f 77 69 74 68 28  h_ty.visit_with(
1a880 76 69 73 69 74 6f 72 29 0a 20 20 20 20 20 20 20  visitor).       
1a890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1a8a0 20 20 20 44 72 6f 70 20 7b 20 72 65 66 20 6c 6f     Drop { ref lo
1a8b0 63 61 74 69 6f 6e 2c 20 2e 2e 20 7d 20 3d 3e 20  cation, .. } => 
1a8c0 6c 6f 63 61 74 69 6f 6e 2e 76 69 73 69 74 5f 77  location.visit_w
1a8d0 69 74 68 28 76 69 73 69 74 6f 72 29 2c 0a 20 20  ith(visitor),.  
1a8e0 20 20 20 20 20 20 20 20 20 20 44 72 6f 70 41 6e            DropAn
1a8f0 64 52 65 70 6c 61 63 65 20 7b 20 72 65 66 20 6c  dReplace { ref l
1a900 6f 63 61 74 69 6f 6e 2c 20 72 65 66 20 76 61 6c  ocation, ref val
1a910 75 65 2c 20 2e 2e 20 7d 20 3d 3e 20 7b 0a 20 20  ue, .. } => {.  
1a920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f                lo
1a930 63 61 74 69 6f 6e 2e 76 69 73 69 74 5f 77 69 74  cation.visit_wit
1a940 68 28 76 69 73 69 74 6f 72 29 20 7c 7c 20 76 61  h(visitor) || va
1a950 6c 75 65 2e 76 69 73 69 74 5f 77 69 74 68 28 76  lue.visit_with(v
1a960 69 73 69 74 6f 72 29 0a 20 20 20 20 20 20 20 20  isitor).        
1a970 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1a980 20 20 59 69 65 6c 64 20 7b 20 72 65 66 20 76 61    Yield { ref va
1a990 6c 75 65 2c 20 2e 2e 20 7d 20 3d 3e 20 76 61 6c  lue, .. } => val
1a9a0 75 65 2e 76 69 73 69 74 5f 77 69 74 68 28 76 69  ue.visit_with(vi
1a9b0 73 69 74 6f 72 29 2c 0a 20 20 20 20 20 20 20 20  sitor),.        
1a9c0 20 20 20 20 43 61 6c 6c 20 7b 20 72 65 66 20 66      Call { ref f
1a9d0 75 6e 63 2c 20 72 65 66 20 61 72 67 73 2c 20 72  unc, ref args, r
1a9e0 65 66 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c 20  ef destination, 
1a9f0 2e 2e 20 7d 20 3d 3e 20 7b 0a 20 20 20 20 20 20  .. } => {.      
1aa00 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 64 65            let de
1aa10 73 74 20 3d 20 69 66 20 6c 65 74 20 53 6f 6d 65  st = if let Some
1aa20 28 28 72 65 66 20 6c 6f 63 2c 20 5f 29 29 20 3d  ((ref loc, _)) =
1aa30 20 2a 64 65 73 74 69 6e 61 74 69 6f 6e 20 7b 0a   *destination {.
1aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa50 20 20 20 20 6c 6f 63 2e 76 69 73 69 74 5f 77 69      loc.visit_wi
1aa60 74 68 28 76 69 73 69 74 6f 72 29 0a 20 20 20 20  th(visitor).    
1aa70 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
1aa80 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
1aa90 20 20 20 20 20 20 20 20 20 66 61 6c 73 65 0a 20           false. 
1aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1aab0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1aac0 20 20 64 65 73 74 20 7c 7c 20 66 75 6e 63 2e 76    dest || func.v
1aad0 69 73 69 74 5f 77 69 74 68 28 76 69 73 69 74 6f  isit_with(visito
1aae0 72 29 20 7c 7c 20 61 72 67 73 2e 76 69 73 69 74  r) || args.visit
1aaf0 5f 77 69 74 68 28 76 69 73 69 74 6f 72 29 0a 20  _with(visitor). 
1ab00 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1ab10 20 20 20 20 20 20 20 20 20 41 73 73 65 72 74 20           Assert 
1ab20 7b 20 72 65 66 20 63 6f 6e 64 2c 20 72 65 66 20  { ref cond, ref 
1ab30 6d 73 67 2c 20 2e 2e 20 7d 20 3d 3e 20 7b 0a 20  msg, .. } => {. 
1ab40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1ab50 66 20 63 6f 6e 64 2e 76 69 73 69 74 5f 77 69 74  f cond.visit_wit
1ab60 68 28 76 69 73 69 74 6f 72 29 20 7b 0a 20 20 20  h(visitor) {.   
1ab70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab80 20 75 73 65 20 50 61 6e 69 63 49 6e 66 6f 3a 3a   use PanicInfo::
1ab90 2a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  *;.             
1aba0 20 20 20 20 20 20 20 6d 61 74 63 68 20 6d 73 67         match msg
1abb0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
1abc0 20 20 20 20 20 20 20 20 20 20 20 42 6f 75 6e 64             Bound
1abd0 73 43 68 65 63 6b 20 7b 20 72 65 66 20 6c 65 6e  sCheck { ref len
1abe0 2c 20 72 65 66 20 69 6e 64 65 78 20 7d 20 3d 3e  , ref index } =>
1abf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 6e               len
1ac10 2e 76 69 73 69 74 5f 77 69 74 68 28 76 69 73 69  .visit_with(visi
1ac20 74 6f 72 29 20 7c 7c 20 69 6e 64 65 78 2e 76 69  tor) || index.vi
1ac30 73 69 74 5f 77 69 74 68 28 76 69 73 69 74 6f 72  sit_with(visitor
1ac40 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1ac50 20 20 20 20 20 20 20 20 20 20 20 50 61 6e 69 63             Panic
1ac60 20 7b 20 2e 2e 20 7d 20 7c 20 4f 76 65 72 66 6c   { .. } | Overfl
1ac70 6f 77 28 5f 29 20 7c 20 4f 76 65 72 66 6c 6f 77  ow(_) | Overflow
1ac80 4e 65 67 20 7c 0a 20 20 20 20 20 20 20 20 20 20  Neg |.          
1ac90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44 69                Di
1aca0 76 69 73 69 6f 6e 42 79 5a 65 72 6f 20 7c 20 52  visionByZero | R
1acb0 65 6d 61 69 6e 64 65 72 42 79 5a 65 72 6f 20 7c  emainderByZero |
1acc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1acd0 20 20 20 20 20 20 20 20 20 52 65 73 75 6d 65 64           Resumed
1ace0 41 66 74 65 72 52 65 74 75 72 6e 28 5f 29 20 7c  AfterReturn(_) |
1acf0 20 52 65 73 75 6d 65 64 41 66 74 65 72 50 61 6e   ResumedAfterPan
1ad00 69 63 28 5f 29 20 3d 3e 0a 20 20 20 20 20 20 20  ic(_) =>.       
1ad10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad20 20 20 20 20 20 66 61 6c 73 65 0a 20 20 20 20 20       false.     
1ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1ad40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ad50 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
1ad60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 61                fa
1ad70 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  lse.            
1ad80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1ad90 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1ada0 47 6f 74 6f 20 7b 20 2e 2e 20 7d 0a 20 20 20 20  Goto { .. }.    
1adb0 20 20 20 20 20 20 20 20 7c 20 52 65 73 75 6d 65          | Resume
1adc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 41  .            | A
1add0 62 6f 72 74 0a 20 20 20 20 20 20 20 20 20 20 20  bort.           
1ade0 20 7c 20 52 65 74 75 72 6e 0a 20 20 20 20 20 20   | Return.      
1adf0 20 20 20 20 20 20 7c 20 47 65 6e 65 72 61 74 6f        | Generato
1ae00 72 44 72 6f 70 0a 20 20 20 20 20 20 20 20 20 20  rDrop.          
1ae10 20 20 7c 20 55 6e 72 65 61 63 68 61 62 6c 65 0a    | Unreachable.
1ae20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 61              | Fa
1ae30 6c 73 65 45 64 67 65 73 20 7b 20 2e 2e 20 7d 0a  lseEdges { .. }.
1ae40 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 61              | Fa
1ae50 6c 73 65 55 6e 77 69 6e 64 20 7b 20 2e 2e 20 7d  lseUnwind { .. }
1ae60 20 3d 3e 20 66 61 6c 73 65 2c 0a 20 20 20 20 20   => false,.     
1ae70 20 20 20 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 69 6d     }.    }.}..im
1ae80 70 6c 3c 27 74 63 78 3e 20 54 79 70 65 46 6f 6c  pl<'tcx> TypeFol
1ae90 64 61 62 6c 65 3c 27 74 63 78 3e 20 66 6f 72 20  dable<'tcx> for 
1aea0 47 65 6e 65 72 61 74 6f 72 4b 69 6e 64 20 7b 0a  GeneratorKind {.
1aeb0 20 20 20 20 66 6e 20 73 75 70 65 72 5f 66 6f 6c      fn super_fol
1aec0 64 5f 77 69 74 68 3c 46 3a 20 54 79 70 65 46 6f  d_with<F: TypeFo
1aed0 6c 64 65 72 3c 27 74 63 78 3e 3e 28 26 73 65 6c  lder<'tcx>>(&sel
1aee0 66 2c 20 5f 3a 20 26 6d 75 74 20 46 29 20 2d 3e  f, _: &mut F) ->
1aef0 20 53 65 6c 66 20 7b 0a 20 20 20 20 20 20 20 20   Self {.        
1af00 2a 73 65 6c 66 0a 20 20 20 20 7d 0a 0a 20 20 20  *self.    }..   
1af10 20 66 6e 20 73 75 70 65 72 5f 76 69 73 69 74 5f   fn super_visit_
1af20 77 69 74 68 3c 56 3a 20 54 79 70 65 56 69 73 69  with<V: TypeVisi
1af30 74 6f 72 3c 27 74 63 78 3e 3e 28 26 73 65 6c 66  tor<'tcx>>(&self
1af40 2c 20 5f 3a 20 26 6d 75 74 20 56 29 20 2d 3e 20  , _: &mut V) -> 
1af50 62 6f 6f 6c 20 7b 0a 20 20 20 20 20 20 20 20 66  bool {.        f
1af60 61 6c 73 65 0a 20 20 20 20 7d 0a 7d 0a 0a 69 6d  alse.    }.}..im
1af70 70 6c 3c 27 74 63 78 3e 20 54 79 70 65 46 6f 6c  pl<'tcx> TypeFol
1af80 64 61 62 6c 65 3c 27 74 63 78 3e 20 66 6f 72 20  dable<'tcx> for 
1af90 50 6c 61 63 65 3c 27 74 63 78 3e 20 7b 0a 20 20  Place<'tcx> {.  
1afa0 20 20 66 6e 20 73 75 70 65 72 5f 66 6f 6c 64 5f    fn super_fold_
1afb0 77 69 74 68 3c 46 3a 20 54 79 70 65 46 6f 6c 64  with<F: TypeFold
1afc0 65 72 3c 27 74 63 78 3e 3e 28 26 73 65 6c 66 2c  er<'tcx>>(&self,
1afd0 20 66 6f 6c 64 65 72 3a 20 26 6d 75 74 20 46 29   folder: &mut F)
1afe0 20 2d 3e 20 53 65 6c 66 20 7b 0a 20 20 20 20 20   -> Self {.     
1aff0 20 20 20 50 6c 61 63 65 20 7b 0a 20 20 20 20 20     Place {.     
1b000 20 20 20 20 20 20 20 62 61 73 65 3a 20 73 65 6c         base: sel
1b010 66 2e 62 61 73 65 2e 66 6f 6c 64 5f 77 69 74 68  f.base.fold_with
1b020 28 66 6f 6c 64 65 72 29 2c 0a 20 20 20 20 20 20  (folder),.      
1b030 20 20 20 20 20 20 70 72 6f 6a 65 63 74 69 6f 6e        projection
1b040 3a 20 73 65 6c 66 2e 70 72 6f 6a 65 63 74 69 6f  : self.projectio
1b050 6e 2e 66 6f 6c 64 5f 77 69 74 68 28 66 6f 6c 64  n.fold_with(fold
1b060 65 72 29 2c 0a 20 20 20 20 20 20 20 20 7d 0a 20  er),.        }. 
1b070 20 20 20 7d 0a 0a 20 20 20 20 66 6e 20 73 75 70     }..    fn sup
1b080 65 72 5f 76 69 73 69 74 5f 77 69 74 68 3c 56 3a  er_visit_with<V:
1b090 20 54 79 70 65 56 69 73 69 74 6f 72 3c 27 74 63   TypeVisitor<'tc
1b0a0 78 3e 3e 28 26 73 65 6c 66 2c 20 76 69 73 69 74  x>>(&self, visit
1b0b0 6f 72 3a 20 26 6d 75 74 20 56 29 20 2d 3e 20 62  or: &mut V) -> b
1b0c0 6f 6f 6c 20 7b 0a 20 20 20 20 20 20 20 20 73 65  ool {.        se
1b0d0 6c 66 2e 62 61 73 65 2e 76 69 73 69 74 5f 77 69  lf.base.visit_wi
1b0e0 74 68 28 76 69 73 69 74 6f 72 29 20 7c 7c 20 73  th(visitor) || s
1b0f0 65 6c 66 2e 70 72 6f 6a 65 63 74 69 6f 6e 2e 76  elf.projection.v
1b100 69 73 69 74 5f 77 69 74 68 28 76 69 73 69 74 6f  isit_with(visito
1b110 72 29 0a 20 20 20 20 7d 0a 7d 0a 0a 69 6d 70 6c  r).    }.}..impl
1b120 3c 27 74 63 78 3e 20 54 79 70 65 46 6f 6c 64 61  <'tcx> TypeFolda
1b130 62 6c 65 3c 27 74 63 78 3e 20 66 6f 72 20 50 6c  ble<'tcx> for Pl
1b140 61 63 65 42 61 73 65 3c 27 74 63 78 3e 20 7b 0a  aceBase<'tcx> {.
1b150 20 20 20 20 66 6e 20 73 75 70 65 72 5f 66 6f 6c      fn super_fol
1b160 64 5f 77 69 74 68 3c 46 3a 20 54 79 70 65 46 6f  d_with<F: TypeFo
1b170 6c 64 65 72 3c 27 74 63 78 3e 3e 28 26 73 65 6c  lder<'tcx>>(&sel
1b180 66 2c 20 66 6f 6c 64 65 72 3a 20 26 6d 75 74 20  f, folder: &mut 
1b190 46 29 20 2d 3e 20 53 65 6c 66 20 7b 0a 20 20 20  F) -> Self {.   
1b1a0 20 20 20 20 20 6d 61 74 63 68 20 73 65 6c 66 20       match self 
1b1b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 50 6c  {.            Pl
1b1c0 61 63 65 42 61 73 65 3a 3a 4c 6f 63 61 6c 28 6c  aceBase::Local(l
1b1d0 6f 63 61 6c 29 20 3d 3e 20 50 6c 61 63 65 42 61  ocal) => PlaceBa
1b1e0 73 65 3a 3a 4c 6f 63 61 6c 28 6c 6f 63 61 6c 2e  se::Local(local.
1b1f0 66 6f 6c 64 5f 77 69 74 68 28 66 6f 6c 64 65 72  fold_with(folder
1b200 29 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )),.            
1b210 50 6c 61 63 65 42 61 73 65 3a 3a 53 74 61 74 69  PlaceBase::Stati
1b220 63 28 73 74 61 74 69 63 5f 29 20 3d 3e 20 50 6c  c(static_) => Pl
1b230 61 63 65 42 61 73 65 3a 3a 53 74 61 74 69 63 28  aceBase::Static(
1b240 73 74 61 74 69 63 5f 2e 66 6f 6c 64 5f 77 69 74  static_.fold_wit
1b250 68 28 66 6f 6c 64 65 72 29 29 2c 0a 20 20 20 20  h(folder)),.    
1b260 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1b270 20 66 6e 20 73 75 70 65 72 5f 76 69 73 69 74 5f   fn super_visit_
1b280 77 69 74 68 3c 56 3a 20 54 79 70 65 56 69 73 69  with<V: TypeVisi
1b290 74 6f 72 3c 27 74 63 78 3e 3e 28 26 73 65 6c 66  tor<'tcx>>(&self
1b2a0 2c 20 76 69 73 69 74 6f 72 3a 20 26 6d 75 74 20  , visitor: &mut 
1b2b0 56 29 20 2d 3e 20 62 6f 6f 6c 20 7b 0a 20 20 20  V) -> bool {.   
1b2c0 20 20 20 20 20 6d 61 74 63 68 20 73 65 6c 66 20       match self 
1b2d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 50 6c  {.            Pl
1b2e0 61 63 65 42 61 73 65 3a 3a 4c 6f 63 61 6c 28 6c  aceBase::Local(l
1b2f0 6f 63 61 6c 29 20 3d 3e 20 6c 6f 63 61 6c 2e 76  ocal) => local.v
1b300 69 73 69 74 5f 77 69 74 68 28 76 69 73 69 74 6f  isit_with(visito
1b310 72 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r),.            
1b320 50 6c 61 63 65 42 61 73 65 3a 3a 53 74 61 74 69  PlaceBase::Stati
1b330 63 28 73 74 61 74 69 63 5f 29 20 3d 3e 20 28 2a  c(static_) => (*
1b340 2a 73 74 61 74 69 63 5f 29 2e 76 69 73 69 74 5f  *static_).visit_
1b350 77 69 74 68 28 76 69 73 69 74 6f 72 29 2c 0a 20  with(visitor),. 
1b360 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 7d         }.    }.}
1b370 0a 0a 69 6d 70 6c 3c 27 74 63 78 3e 20 54 79 70  ..impl<'tcx> Typ
1b380 65 46 6f 6c 64 61 62 6c 65 3c 27 74 63 78 3e 20  eFoldable<'tcx> 
1b390 66 6f 72 20 26 27 74 63 78 20 74 79 3a 3a 4c 69  for &'tcx ty::Li
1b3a0 73 74 3c 50 6c 61 63 65 45 6c 65 6d 3c 27 74 63  st<PlaceElem<'tc
1b3b0 78 3e 3e 20 7b 0a 20 20 20 20 66 6e 20 73 75 70  x>> {.    fn sup
1b3c0 65 72 5f 66 6f 6c 64 5f 77 69 74 68 3c 46 3a 20  er_fold_with<F: 
1b3d0 54 79 70 65 46 6f 6c 64 65 72 3c 27 74 63 78 3e  TypeFolder<'tcx>
1b3e0 3e 28 26 73 65 6c 66 2c 20 66 6f 6c 64 65 72 3a  >(&self, folder:
1b3f0 20 26 6d 75 74 20 46 29 20 2d 3e 20 53 65 6c 66   &mut F) -> Self
1b400 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 76   {.        let v
1b410 20 3d 20 73 65 6c 66 2e 69 74 65 72 28 29 2e 6d   = self.iter().m
1b420 61 70 28 7c 74 7c 20 74 2e 66 6f 6c 64 5f 77 69  ap(|t| t.fold_wi
1b430 74 68 28 66 6f 6c 64 65 72 29 29 2e 63 6f 6c 6c  th(folder)).coll
1b440 65 63 74 3a 3a 3c 56 65 63 3c 5f 3e 3e 28 29 3b  ect::<Vec<_>>();
1b450 0a 20 20 20 20 20 20 20 20 66 6f 6c 64 65 72 2e  .        folder.
1b460 74 63 78 28 29 2e 69 6e 74 65 72 6e 5f 70 6c 61  tcx().intern_pla
1b470 63 65 5f 65 6c 65 6d 73 28 26 76 29 0a 20 20 20  ce_elems(&v).   
1b480 20 7d 0a 0a 20 20 20 20 66 6e 20 73 75 70 65 72   }..    fn super
1b490 5f 76 69 73 69 74 5f 77 69 74 68 3c 56 3a 20 54  _visit_with<V: T
1b4a0 79 70 65 56 69 73 69 74 6f 72 3c 27 74 63 78 3e  ypeVisitor<'tcx>
1b4b0 3e 28 26 73 65 6c 66 2c 20 76 69 73 69 74 6f 72  >(&self, visitor
1b4c0 3a 20 26 6d 75 74 20 56 29 20 2d 3e 20 62 6f 6f  : &mut V) -> boo
1b4d0 6c 20 7b 0a 20 20 20 20 20 20 20 20 73 65 6c 66  l {.        self
1b4e0 2e 69 74 65 72 28 29 2e 61 6e 79 28 7c 74 7c 20  .iter().any(|t| 
1b4f0 74 2e 76 69 73 69 74 5f 77 69 74 68 28 76 69 73  t.visit_with(vis
1b500 69 74 6f 72 29 29 0a 20 20 20 20 7d 0a 7d 0a 0a  itor)).    }.}..
1b510 69 6d 70 6c 3c 27 74 63 78 3e 20 54 79 70 65 46  impl<'tcx> TypeF
1b520 6f 6c 64 61 62 6c 65 3c 27 74 63 78 3e 20 66 6f  oldable<'tcx> fo
1b530 72 20 53 74 61 74 69 63 3c 27 74 63 78 3e 20 7b  r Static<'tcx> {
1b540 0a 20 20 20 20 66 6e 20 73 75 70 65 72 5f 66 6f  .    fn super_fo
1b550 6c 64 5f 77 69 74 68 3c 46 3a 20 54 79 70 65 46  ld_with<F: TypeF
1b560 6f 6c 64 65 72 3c 27 74 63 78 3e 3e 28 26 73 65  older<'tcx>>(&se
1b570 6c 66 2c 20 66 6f 6c 64 65 72 3a 20 26 6d 75 74  lf, folder: &mut
1b580 20 46 29 20 2d 3e 20 53 65 6c 66 20 7b 0a 20 20   F) -> Self {.  
1b590 20 20 20 20 20 20 53 74 61 74 69 63 20 7b 0a 20        Static {. 
1b5a0 20 20 20 20 20 20 20 20 20 20 20 74 79 3a 20 73             ty: s
1b5b0 65 6c 66 2e 74 79 2e 66 6f 6c 64 5f 77 69 74 68  elf.ty.fold_with
1b5c0 28 66 6f 6c 64 65 72 29 2c 0a 20 20 20 20 20 20  (folder),.      
1b5d0 20 20 20 20 20 20 6b 69 6e 64 3a 20 73 65 6c 66        kind: self
1b5e0 2e 6b 69 6e 64 2e 66 6f 6c 64 5f 77 69 74 68 28  .kind.fold_with(
1b5f0 66 6f 6c 64 65 72 29 2c 0a 20 20 20 20 20 20 20  folder),.       
1b600 20 20 20 20 20 64 65 66 5f 69 64 3a 20 73 65 6c       def_id: sel
1b610 66 2e 64 65 66 5f 69 64 2c 0a 20 20 20 20 20 20  f.def_id,.      
1b620 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66    }.    }..    f
1b630 6e 20 73 75 70 65 72 5f 76 69 73 69 74 5f 77 69  n super_visit_wi
1b640 74 68 3c 56 3a 20 54 79 70 65 56 69 73 69 74 6f  th<V: TypeVisito
1b650 72 3c 27 74 63 78 3e 3e 28 26 73 65 6c 66 2c 20  r<'tcx>>(&self, 
1b660 76 69 73 69 74 6f 72 3a 20 26 6d 75 74 20 56 29  visitor: &mut V)
1b670 20 2d 3e 20 62 6f 6f 6c 20 7b 0a 20 20 20 20 20   -> bool {.     
1b680 20 20 20 6c 65 74 20 53 74 61 74 69 63 20 7b 20     let Static { 
1b690 74 79 2c 20 6b 69 6e 64 2c 20 64 65 66 5f 69 64  ty, kind, def_id
1b6a0 3a 20 5f 20 7d 20 3d 20 73 65 6c 66 3b 0a 0a 20  : _ } = self;.. 
1b6b0 20 20 20 20 20 20 20 74 79 2e 76 69 73 69 74 5f         ty.visit_
1b6c0 77 69 74 68 28 76 69 73 69 74 6f 72 29 20 7c 7c  with(visitor) ||
1b6d0 20 6b 69 6e 64 2e 76 69 73 69 74 5f 77 69 74 68   kind.visit_with
1b6e0 28 76 69 73 69 74 6f 72 29 0a 20 20 20 20 7d 0a  (visitor).    }.
1b6f0 7d 0a 0a 69 6d 70 6c 3c 27 74 63 78 3e 20 54 79  }..impl<'tcx> Ty
1b700 70 65 46 6f 6c 64 61 62 6c 65 3c 27 74 63 78 3e  peFoldable<'tcx>
1b710 20 66 6f 72 20 53 74 61 74 69 63 4b 69 6e 64 3c   for StaticKind<
1b720 27 74 63 78 3e 20 7b 0a 20 20 20 20 66 6e 20 73  'tcx> {.    fn s
1b730 75 70 65 72 5f 66 6f 6c 64 5f 77 69 74 68 3c 46  uper_fold_with<F
1b740 3a 20 54 79 70 65 46 6f 6c 64 65 72 3c 27 74 63  : TypeFolder<'tc
1b750 78 3e 3e 28 26 73 65 6c 66 2c 20 66 6f 6c 64 65  x>>(&self, folde
1b760 72 3a 20 26 6d 75 74 20 46 29 20 2d 3e 20 53 65  r: &mut F) -> Se
1b770 6c 66 20 7b 0a 20 20 20 20 20 20 20 20 6d 61 74  lf {.        mat
1b780 63 68 20 73 65 6c 66 20 7b 0a 20 20 20 20 20 20  ch self {.      
1b790 20 20 20 20 20 20 53 74 61 74 69 63 4b 69 6e 64        StaticKind
1b7a0 3a 3a 50 72 6f 6d 6f 74 65 64 28 70 72 6f 6d 6f  ::Promoted(promo
1b7b0 74 65 64 2c 20 73 75 62 73 74 73 29 20 3d 3e 0a  ted, substs) =>.
1b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7d0 53 74 61 74 69 63 4b 69 6e 64 3a 3a 50 72 6f 6d  StaticKind::Prom
1b7e0 6f 74 65 64 28 70 72 6f 6d 6f 74 65 64 2e 66 6f  oted(promoted.fo
1b7f0 6c 64 5f 77 69 74 68 28 66 6f 6c 64 65 72 29 2c  ld_with(folder),
1b800 20 73 75 62 73 74 73 2e 66 6f 6c 64 5f 77 69 74   substs.fold_wit
1b810 68 28 66 6f 6c 64 65 72 29 29 2c 0a 20 20 20 20  h(folder)),.    
1b820 20 20 20 20 20 20 20 20 53 74 61 74 69 63 4b 69          StaticKi
1b830 6e 64 3a 3a 53 74 61 74 69 63 20 3d 3e 20 53 74  nd::Static => St
1b840 61 74 69 63 4b 69 6e 64 3a 3a 53 74 61 74 69 63  aticKind::Static
1b850 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
1b860 0a 0a 20 20 20 20 66 6e 20 73 75 70 65 72 5f 76  ..    fn super_v
1b870 69 73 69 74 5f 77 69 74 68 3c 56 3a 20 54 79 70  isit_with<V: Typ
1b880 65 56 69 73 69 74 6f 72 3c 27 74 63 78 3e 3e 28  eVisitor<'tcx>>(
1b890 26 73 65 6c 66 2c 20 76 69 73 69 74 6f 72 3a 20  &self, visitor: 
1b8a0 26 6d 75 74 20 56 29 20 2d 3e 20 62 6f 6f 6c 20  &mut V) -> bool 
1b8b0 7b 0a 20 20 20 20 20 20 20 20 6d 61 74 63 68 20  {.        match 
1b8c0 73 65 6c 66 20 7b 0a 20 20 20 20 20 20 20 20 20  self {.         
1b8d0 20 20 20 53 74 61 74 69 63 4b 69 6e 64 3a 3a 50     StaticKind::P
1b8e0 72 6f 6d 6f 74 65 64 28 70 72 6f 6d 6f 74 65 64  romoted(promoted
1b8f0 2c 20 73 75 62 73 74 73 29 20 3d 3e 0a 20 20 20  , substs) =>.   
1b900 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f               pro
1b910 6d 6f 74 65 64 2e 76 69 73 69 74 5f 77 69 74 68  moted.visit_with
1b920 28 76 69 73 69 74 6f 72 29 20 7c 7c 20 73 75 62  (visitor) || sub
1b930 73 74 73 2e 76 69 73 69 74 5f 77 69 74 68 28 76  sts.visit_with(v
1b940 69 73 69 74 6f 72 29 2c 0a 20 20 20 20 20 20 20  isitor),.       
1b950 20 20 20 20 20 53 74 61 74 69 63 4b 69 6e 64 3a       StaticKind:
1b960 3a 53 74 61 74 69 63 20 3d 3e 20 7b 20 66 61 6c  :Static => { fal
1b970 73 65 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20  se }.        }. 
1b980 20 20 20 7d 0a 7d 0a 0a 69 6d 70 6c 3c 27 74 63     }.}..impl<'tc
1b990 78 3e 20 54 79 70 65 46 6f 6c 64 61 62 6c 65 3c  x> TypeFoldable<
1b9a0 27 74 63 78 3e 20 66 6f 72 20 52 76 61 6c 75 65  'tcx> for Rvalue
1b9b0 3c 27 74 63 78 3e 20 7b 0a 20 20 20 20 66 6e 20  <'tcx> {.    fn 
1b9c0 73 75 70 65 72 5f 66 6f 6c 64 5f 77 69 74 68 3c  super_fold_with<
1b9d0 46 3a 20 54 79 70 65 46 6f 6c 64 65 72 3c 27 74  F: TypeFolder<'t
1b9e0 63 78 3e 3e 28 26 73 65 6c 66 2c 20 66 6f 6c 64  cx>>(&self, fold
1b9f0 65 72 3a 20 26 6d 75 74 20 46 29 20 2d 3e 20 53  er: &mut F) -> S
1ba00 65 6c 66 20 7b 0a 20 20 20 20 20 20 20 20 75 73  elf {.        us
1ba10 65 20 63 72 61 74 65 3a 3a 6d 69 72 3a 3a 52 76  e crate::mir::Rv
1ba20 61 6c 75 65 3a 3a 2a 3b 0a 20 20 20 20 20 20 20  alue::*;.       
1ba30 20 6d 61 74 63 68 20 2a 73 65 6c 66 20 7b 0a 20   match *self {. 
1ba40 20 20 20 20 20 20 20 20 20 20 20 55 73 65 28 72             Use(r
1ba50 65 66 20 6f 70 29 20 3d 3e 20 55 73 65 28 6f 70  ef op) => Use(op
1ba60 2e 66 6f 6c 64 5f 77 69 74 68 28 66 6f 6c 64 65  .fold_with(folde
1ba70 72 29 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r)),.           
1ba80 20 52 65 70 65 61 74 28 72 65 66 20 6f 70 2c 20   Repeat(ref op, 
1ba90 6c 65 6e 29 20 3d 3e 20 52 65 70 65 61 74 28 6f  len) => Repeat(o
1baa0 70 2e 66 6f 6c 64 5f 77 69 74 68 28 66 6f 6c 64  p.fold_with(fold
1bab0 65 72 29 2c 20 6c 65 6e 29 2c 0a 20 20 20 20 20  er), len),.     
1bac0 20 20 20 20 20 20 20 52 65 66 28 72 65 67 69 6f         Ref(regio
1bad0 6e 2c 20 62 6b 2c 20 72 65 66 20 70 6c 61 63 65  n, bk, ref place
1bae0 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20  ) => {.         
1baf0 20 20 20 20 20 20 20 52 65 66 28 72 65 67 69 6f         Ref(regio
1bb00 6e 2e 66 6f 6c 64 5f 77 69 74 68 28 66 6f 6c 64  n.fold_with(fold
1bb10 65 72 29 2c 20 62 6b 2c 20 70 6c 61 63 65 2e 66  er), bk, place.f
1bb20 6f 6c 64 5f 77 69 74 68 28 66 6f 6c 64 65 72 29  old_with(folder)
1bb30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ).            }.
1bb40 20 20 20 20 20 20 20 20 20 20 20 20 41 64 64 72              Addr
1bb50 65 73 73 4f 66 28 6d 75 74 61 62 69 6c 69 74 79  essOf(mutability
1bb60 2c 20 72 65 66 20 70 6c 61 63 65 29 20 3d 3e 20  , ref place) => 
1bb70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1bb80 20 20 41 64 64 72 65 73 73 4f 66 28 6d 75 74 61    AddressOf(muta
1bb90 62 69 6c 69 74 79 2c 20 70 6c 61 63 65 2e 66 6f  bility, place.fo
1bba0 6c 64 5f 77 69 74 68 28 66 6f 6c 64 65 72 29 29  ld_with(folder))
1bbb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1bbc0 20 20 20 20 20 20 20 20 20 20 20 4c 65 6e 28 72             Len(r
1bbd0 65 66 20 70 6c 61 63 65 29 20 3d 3e 20 4c 65 6e  ef place) => Len
1bbe0 28 70 6c 61 63 65 2e 66 6f 6c 64 5f 77 69 74 68  (place.fold_with
1bbf0 28 66 6f 6c 64 65 72 29 29 2c 0a 20 20 20 20 20  (folder)),.     
1bc00 20 20 20 20 20 20 20 43 61 73 74 28 6b 69 6e 64         Cast(kind
1bc10 2c 20 72 65 66 20 6f 70 2c 20 74 79 29 20 3d 3e  , ref op, ty) =>
1bc20 20 43 61 73 74 28 6b 69 6e 64 2c 20 6f 70 2e 66   Cast(kind, op.f
1bc30 6f 6c 64 5f 77 69 74 68 28 66 6f 6c 64 65 72 29  old_with(folder)
1bc40 2c 20 74 79 2e 66 6f 6c 64 5f 77 69 74 68 28 66  , ty.fold_with(f
1bc50 6f 6c 64 65 72 29 29 2c 0a 20 20 20 20 20 20 20  older)),.       
1bc60 20 20 20 20 20 42 69 6e 61 72 79 4f 70 28 6f 70       BinaryOp(op
1bc70 2c 20 72 65 66 20 72 68 73 2c 20 72 65 66 20 6c  , ref rhs, ref l
1bc80 68 73 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20  hs) => {.       
1bc90 20 20 20 20 20 20 20 20 20 42 69 6e 61 72 79 4f           BinaryO
1bca0 70 28 6f 70 2c 20 72 68 73 2e 66 6f 6c 64 5f 77  p(op, rhs.fold_w
1bcb0 69 74 68 28 66 6f 6c 64 65 72 29 2c 20 6c 68 73  ith(folder), lhs
1bcc0 2e 66 6f 6c 64 5f 77 69 74 68 28 66 6f 6c 64 65  .fold_with(folde
1bcd0 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  r)).            
1bce0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 68  }.            Ch
1bcf0 65 63 6b 65 64 42 69 6e 61 72 79 4f 70 28 6f 70  eckedBinaryOp(op
1bd00 2c 20 72 65 66 20 72 68 73 2c 20 72 65 66 20 6c  , ref rhs, ref l
1bd10 68 73 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20  hs) => {.       
1bd20 20 20 20 20 20 20 20 20 20 43 68 65 63 6b 65 64           Checked
1bd30 42 69 6e 61 72 79 4f 70 28 6f 70 2c 20 72 68 73  BinaryOp(op, rhs
1bd40 2e 66 6f 6c 64 5f 77 69 74 68 28 66 6f 6c 64 65  .fold_with(folde
1bd50 72 29 2c 20 6c 68 73 2e 66 6f 6c 64 5f 77 69 74  r), lhs.fold_wit
1bd60 68 28 66 6f 6c 64 65 72 29 29 0a 20 20 20 20 20  h(folder)).     
1bd70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1bd80 20 20 20 20 20 55 6e 61 72 79 4f 70 28 6f 70 2c       UnaryOp(op,
1bd90 20 72 65 66 20 76 61 6c 29 20 3d 3e 20 55 6e 61   ref val) => Una
1bda0 72 79 4f 70 28 6f 70 2c 20 76 61 6c 2e 66 6f 6c  ryOp(op, val.fol
1bdb0 64 5f 77 69 74 68 28 66 6f 6c 64 65 72 29 29 2c  d_with(folder)),
1bdc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 44 69 73  .            Dis
1bdd0 63 72 69 6d 69 6e 61 6e 74 28 72 65 66 20 70 6c  criminant(ref pl
1bde0 61 63 65 29 20 3d 3e 20 44 69 73 63 72 69 6d 69  ace) => Discrimi
1bdf0 6e 61 6e 74 28 70 6c 61 63 65 2e 66 6f 6c 64 5f  nant(place.fold_
1be00 77 69 74 68 28 66 6f 6c 64 65 72 29 29 2c 0a 20  with(folder)),. 
1be10 20 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 61             Nulla
1be20 72 79 4f 70 28 6f 70 2c 20 74 79 29 20 3d 3e 20  ryOp(op, ty) => 
1be30 4e 75 6c 6c 61 72 79 4f 70 28 6f 70 2c 20 74 79  NullaryOp(op, ty
1be40 2e 66 6f 6c 64 5f 77 69 74 68 28 66 6f 6c 64 65  .fold_with(folde
1be50 72 29 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r)),.           
1be60 20 41 67 67 72 65 67 61 74 65 28 72 65 66 20 6b   Aggregate(ref k
1be70 69 6e 64 2c 20 72 65 66 20 66 69 65 6c 64 73 29  ind, ref fields)
1be80 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20   => {.          
1be90 20 20 20 20 20 20 6c 65 74 20 6b 69 6e 64 20 3d        let kind =
1bea0 20 62 6f 78 20 6d 61 74 63 68 20 2a 2a 6b 69 6e   box match **kin
1beb0 64 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d {.            
1bec0 20 20 20 20 20 20 20 20 41 67 67 72 65 67 61 74          Aggregat
1bed0 65 4b 69 6e 64 3a 3a 41 72 72 61 79 28 74 79 29  eKind::Array(ty)
1bee0 20 3d 3e 20 41 67 67 72 65 67 61 74 65 4b 69 6e   => AggregateKin
1bef0 64 3a 3a 41 72 72 61 79 28 74 79 2e 66 6f 6c 64  d::Array(ty.fold
1bf00 5f 77 69 74 68 28 66 6f 6c 64 65 72 29 29 2c 0a  _with(folder)),.
1bf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf20 20 20 20 20 41 67 67 72 65 67 61 74 65 4b 69 6e      AggregateKin
1bf30 64 3a 3a 54 75 70 6c 65 20 3d 3e 20 41 67 67 72  d::Tuple => Aggr
1bf40 65 67 61 74 65 4b 69 6e 64 3a 3a 54 75 70 6c 65  egateKind::Tuple
1bf50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1bf60 20 20 20 20 20 20 41 67 67 72 65 67 61 74 65 4b        AggregateK
1bf70 69 6e 64 3a 3a 41 64 74 28 64 65 66 2c 20 76 2c  ind::Adt(def, v,
1bf80 20 73 75 62 73 74 73 2c 20 75 73 65 72 5f 74 79   substs, user_ty
1bf90 2c 20 6e 29 20 3d 3e 20 41 67 67 72 65 67 61 74  , n) => Aggregat
1bfa0 65 4b 69 6e 64 3a 3a 41 64 74 28 0a 20 20 20 20  eKind::Adt(.    
1bfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfc0 20 20 20 20 64 65 66 2c 0a 20 20 20 20 20 20 20      def,.       
1bfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfe0 20 76 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   v,.            
1bff0 20 20 20 20 20 20 20 20 20 20 20 20 73 75 62 73              subs
1c000 74 73 2e 66 6f 6c 64 5f 77 69 74 68 28 66 6f 6c  ts.fold_with(fol
1c010 64 65 72 29 2c 0a 20 20 20 20 20 20 20 20 20 20  der),.          
1c020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73                us
1c030 65 72 5f 74 79 2e 66 6f 6c 64 5f 77 69 74 68 28  er_ty.fold_with(
1c040 66 6f 6c 64 65 72 29 2c 0a 20 20 20 20 20 20 20  folder),.       
1c050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c060 20 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   n,.            
1c070 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 20          ),.     
1c080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
1c090 67 67 72 65 67 61 74 65 4b 69 6e 64 3a 3a 43 6c  ggregateKind::Cl
1c0a0 6f 73 75 72 65 28 69 64 2c 20 73 75 62 73 74 73  osure(id, substs
1c0b0 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20  ) => {.         
1c0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
1c0d0 67 67 72 65 67 61 74 65 4b 69 6e 64 3a 3a 43 6c  ggregateKind::Cl
1c0e0 6f 73 75 72 65 28 69 64 2c 20 73 75 62 73 74 73  osure(id, substs
1c0f0 2e 66 6f 6c 64 5f 77 69 74 68 28 66 6f 6c 64 65  .fold_with(folde
1c100 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  r)).            
1c110 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 67                Ag
1c130 67 72 65 67 61 74 65 4b 69 6e 64 3a 3a 47 65 6e  gregateKind::Gen
1c140 65 72 61 74 6f 72 28 69 64 2c 20 73 75 62 73 74  erator(id, subst
1c150 73 2c 20 6d 6f 76 61 62 6c 69 74 79 29 20 3d 3e  s, movablity) =>
1c160 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
1c170 20 20 20 20 20 20 20 20 20 20 20 41 67 67 72 65             Aggre
1c180 67 61 74 65 4b 69 6e 64 3a 3a 47 65 6e 65 72 61  gateKind::Genera
1c190 74 6f 72 28 69 64 2c 20 73 75 62 73 74 73 2e 66  tor(id, substs.f
1c1a0 6f 6c 64 5f 77 69 74 68 28 66 6f 6c 64 65 72 29  old_with(folder)
1c1b0 2c 20 6d 6f 76 61 62 6c 69 74 79 29 0a 20 20 20  , movablity).   
1c1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
1c1e0 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20 20 20     };.          
1c1f0 20 20 20 20 20 20 41 67 67 72 65 67 61 74 65 28        Aggregate(
1c200 6b 69 6e 64 2c 20 66 69 65 6c 64 73 2e 66 6f 6c  kind, fields.fol
1c210 64 5f 77 69 74 68 28 66 6f 6c 64 65 72 29 29 0a  d_with(folder)).
1c220 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1c230 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1c240 20 20 20 66 6e 20 73 75 70 65 72 5f 76 69 73 69     fn super_visi
1c250 74 5f 77 69 74 68 3c 56 3a 20 54 79 70 65 56 69  t_with<V: TypeVi
1c260 73 69 74 6f 72 3c 27 74 63 78 3e 3e 28 26 73 65  sitor<'tcx>>(&se
1c270 6c 66 2c 20 76 69 73 69 74 6f 72 3a 20 26 6d 75  lf, visitor: &mu
1c280 74 20 56 29 20 2d 3e 20 62 6f 6f 6c 20 7b 0a 20  t V) -> bool {. 
1c290 20 20 20 20 20 20 20 75 73 65 20 63 72 61 74 65         use crate
1c2a0 3a 3a 6d 69 72 3a 3a 52 76 61 6c 75 65 3a 3a 2a  ::mir::Rvalue::*
1c2b0 3b 0a 20 20 20 20 20 20 20 20 6d 61 74 63 68 20  ;.        match 
1c2c0 2a 73 65 6c 66 20 7b 0a 20 20 20 20 20 20 20 20  *self {.        
1c2d0 20 20 20 20 55 73 65 28 72 65 66 20 6f 70 29 20      Use(ref op) 
1c2e0 3d 3e 20 6f 70 2e 76 69 73 69 74 5f 77 69 74 68  => op.visit_with
1c2f0 28 76 69 73 69 74 6f 72 29 2c 0a 20 20 20 20 20  (visitor),.     
1c300 20 20 20 20 20 20 20 52 65 70 65 61 74 28 72 65         Repeat(re
1c310 66 20 6f 70 2c 20 5f 29 20 3d 3e 20 6f 70 2e 76  f op, _) => op.v
1c320 69 73 69 74 5f 77 69 74 68 28 76 69 73 69 74 6f  isit_with(visito
1c330 72 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r),.            
1c340 52 65 66 28 72 65 67 69 6f 6e 2c 20 5f 2c 20 72  Ref(region, _, r
1c350 65 66 20 70 6c 61 63 65 29 20 3d 3e 20 72 65 67  ef place) => reg
1c360 69 6f 6e 2e 76 69 73 69 74 5f 77 69 74 68 28 76  ion.visit_with(v
1c370 69 73 69 74 6f 72 29 20 7c 7c 20 70 6c 61 63 65  isitor) || place
1c380 2e 76 69 73 69 74 5f 77 69 74 68 28 76 69 73 69  .visit_with(visi
1c390 74 6f 72 29 2c 0a 20 20 20 20 20 20 20 20 20 20  tor),.          
1c3a0 20 20 41 64 64 72 65 73 73 4f 66 28 5f 2c 20 72    AddressOf(_, r
1c3b0 65 66 20 70 6c 61 63 65 29 20 3d 3e 20 70 6c 61  ef place) => pla
1c3c0 63 65 2e 76 69 73 69 74 5f 77 69 74 68 28 76 69  ce.visit_with(vi
1c3d0 73 69 74 6f 72 29 2c 0a 20 20 20 20 20 20 20 20  sitor),.        
1c3e0 20 20 20 20 4c 65 6e 28 72 65 66 20 70 6c 61 63      Len(ref plac
1c3f0 65 29 20 3d 3e 20 70 6c 61 63 65 2e 76 69 73 69  e) => place.visi
1c400 74 5f 77 69 74 68 28 76 69 73 69 74 6f 72 29 2c  t_with(visitor),
1c410 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 61 73  .            Cas
1c420 74 28 5f 2c 20 72 65 66 20 6f 70 2c 20 74 79 29  t(_, ref op, ty)
1c430 20 3d 3e 20 6f 70 2e 76 69 73 69 74 5f 77 69 74   => op.visit_wit
1c440 68 28 76 69 73 69 74 6f 72 29 20 7c 7c 20 74 79  h(visitor) || ty
1c450 2e 76 69 73 69 74 5f 77 69 74 68 28 76 69 73 69  .visit_with(visi
1c460 74 6f 72 29 2c 0a 20 20 20 20 20 20 20 20 20 20  tor),.          
1c470 20 20 42 69 6e 61 72 79 4f 70 28 5f 2c 20 72 65    BinaryOp(_, re
1c480 66 20 72 68 73 2c 20 72 65 66 20 6c 68 73 29 20  f rhs, ref lhs) 
1c490 7c 20 43 68 65 63 6b 65 64 42 69 6e 61 72 79 4f  | CheckedBinaryO
1c4a0 70 28 5f 2c 20 72 65 66 20 72 68 73 2c 20 72 65  p(_, ref rhs, re
1c4b0 66 20 6c 68 73 29 20 3d 3e 20 7b 0a 20 20 20 20  f lhs) => {.    
1c4c0 20 20 20 20 20 20 20 20 20 20 20 20 72 68 73 2e              rhs.
1c4d0 76 69 73 69 74 5f 77 69 74 68 28 76 69 73 69 74  visit_with(visit
1c4e0 6f 72 29 20 7c 7c 20 6c 68 73 2e 76 69 73 69 74  or) || lhs.visit
1c4f0 5f 77 69 74 68 28 76 69 73 69 74 6f 72 29 0a 20  _with(visitor). 
1c500 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1c510 20 20 20 20 20 20 20 20 20 55 6e 61 72 79 4f 70           UnaryOp
1c520 28 5f 2c 20 72 65 66 20 76 61 6c 29 20 3d 3e 20  (_, ref val) => 
1c530 76 61 6c 2e 76 69 73 69 74 5f 77 69 74 68 28 76  val.visit_with(v
1c540 69 73 69 74 6f 72 29 2c 0a 20 20 20 20 20 20 20  isitor),.       
1c550 20 20 20 20 20 44 69 73 63 72 69 6d 69 6e 61 6e       Discriminan
1c560 74 28 72 65 66 20 70 6c 61 63 65 29 20 3d 3e 20  t(ref place) => 
1c570 70 6c 61 63 65 2e 76 69 73 69 74 5f 77 69 74 68  place.visit_with
1c580 28 76 69 73 69 74 6f 72 29 2c 0a 20 20 20 20 20  (visitor),.     
1c590 20 20 20 20 20 20 20 4e 75 6c 6c 61 72 79 4f 70         NullaryOp
1c5a0 28 5f 2c 20 74 79 29 20 3d 3e 20 74 79 2e 76 69  (_, ty) => ty.vi
1c5b0 73 69 74 5f 77 69 74 68 28 76 69 73 69 74 6f 72  sit_with(visitor
1c5c0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 41  ),.            A
1c5d0 67 67 72 65 67 61 74 65 28 72 65 66 20 6b 69 6e  ggregate(ref kin
1c5e0 64 2c 20 72 65 66 20 66 69 65 6c 64 73 29 20 3d  d, ref fields) =
1c5f0 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  > {.            
1c600 20 20 20 20 28 6d 61 74 63 68 20 2a 2a 6b 69 6e      (match **kin
1c610 64 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d {.            
1c620 20 20 20 20 20 20 20 20 41 67 67 72 65 67 61 74          Aggregat
1c630 65 4b 69 6e 64 3a 3a 41 72 72 61 79 28 74 79 29  eKind::Array(ty)
1c640 20 3d 3e 20 74 79 2e 76 69 73 69 74 5f 77 69 74   => ty.visit_wit
1c650 68 28 76 69 73 69 74 6f 72 29 2c 0a 20 20 20 20  h(visitor),.    
1c660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c670 41 67 67 72 65 67 61 74 65 4b 69 6e 64 3a 3a 54  AggregateKind::T
1c680 75 70 6c 65 20 3d 3e 20 66 61 6c 73 65 2c 0a 20  uple => false,. 
1c690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6a0 20 20 20 41 67 67 72 65 67 61 74 65 4b 69 6e 64     AggregateKind
1c6b0 3a 3a 41 64 74 28 5f 2c 20 5f 2c 20 73 75 62 73  ::Adt(_, _, subs
1c6c0 74 73 2c 20 75 73 65 72 5f 74 79 2c 20 5f 29 20  ts, user_ty, _) 
1c6d0 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  => {.           
1c6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 75 62               sub
1c6f0 73 74 73 2e 76 69 73 69 74 5f 77 69 74 68 28 76  sts.visit_with(v
1c700 69 73 69 74 6f 72 29 20 7c 7c 20 75 73 65 72 5f  isitor) || user_
1c710 74 79 2e 76 69 73 69 74 5f 77 69 74 68 28 76 69  ty.visit_with(vi
1c720 73 69 74 6f 72 29 0a 20 20 20 20 20 20 20 20 20  sitor).         
1c730 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1c740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c750 20 41 67 67 72 65 67 61 74 65 4b 69 6e 64 3a 3a   AggregateKind::
1c760 43 6c 6f 73 75 72 65 28 5f 2c 20 73 75 62 73 74  Closure(_, subst
1c770 73 29 20 3d 3e 20 73 75 62 73 74 73 2e 76 69 73  s) => substs.vis
1c780 69 74 5f 77 69 74 68 28 76 69 73 69 74 6f 72 29  it_with(visitor)
1c790 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c7a0 20 20 20 20 20 20 41 67 67 72 65 67 61 74 65 4b        AggregateK
1c7b0 69 6e 64 3a 3a 47 65 6e 65 72 61 74 6f 72 28 5f  ind::Generator(_
1c7c0 2c 20 73 75 62 73 74 73 2c 20 5f 29 20 3d 3e 20  , substs, _) => 
1c7d0 73 75 62 73 74 73 2e 76 69 73 69 74 5f 77 69 74  substs.visit_wit
1c7e0 68 28 76 69 73 69 74 6f 72 29 2c 0a 20 20 20 20  h(visitor),.    
1c7f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 29 20 7c              }) |
1c800 7c 20 66 69 65 6c 64 73 2e 76 69 73 69 74 5f 77  | fields.visit_w
1c810 69 74 68 28 76 69 73 69 74 6f 72 29 0a 20 20 20  ith(visitor).   
1c820 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1c830 20 20 20 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 69 6d     }.    }.}..im
1c840 70 6c 3c 27 74 63 78 3e 20 54 79 70 65 46 6f 6c  pl<'tcx> TypeFol
1c850 64 61 62 6c 65 3c 27 74 63 78 3e 20 66 6f 72 20  dable<'tcx> for 
1c860 4f 70 65 72 61 6e 64 3c 27 74 63 78 3e 20 7b 0a  Operand<'tcx> {.
1c870 20 20 20 20 66 6e 20 73 75 70 65 72 5f 66 6f 6c      fn super_fol
1c880 64 5f 77 69 74 68 3c 46 3a 20 54 79 70 65 46 6f  d_with<F: TypeFo
1c890 6c 64 65 72 3c 27 74 63 78 3e 3e 28 26 73 65 6c  lder<'tcx>>(&sel
1c8a0 66 2c 20 66 6f 6c 64 65 72 3a 20 26 6d 75 74 20  f, folder: &mut 
1c8b0 46 29 20 2d 3e 20 53 65 6c 66 20 7b 0a 20 20 20  F) -> Self {.   
1c8c0 20 20 20 20 20 6d 61 74 63 68 20 2a 73 65 6c 66       match *self
1c8d0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f   {.            O
1c8e0 70 65 72 61 6e 64 3a 3a 43 6f 70 79 28 72 65 66  perand::Copy(ref
1c8f0 20 70 6c 61 63 65 29 20 3d 3e 20 4f 70 65 72 61   place) => Opera
1c900 6e 64 3a 3a 43 6f 70 79 28 70 6c 61 63 65 2e 66  nd::Copy(place.f
1c910 6f 6c 64 5f 77 69 74 68 28 66 6f 6c 64 65 72 29  old_with(folder)
1c920 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f  ),.            O
1c930 70 65 72 61 6e 64 3a 3a 4d 6f 76 65 28 72 65 66  perand::Move(ref
1c940 20 70 6c 61 63 65 29 20 3d 3e 20 4f 70 65 72 61   place) => Opera
1c950 6e 64 3a 3a 4d 6f 76 65 28 70 6c 61 63 65 2e 66  nd::Move(place.f
1c960 6f 6c 64 5f 77 69 74 68 28 66 6f 6c 64 65 72 29  old_with(folder)
1c970 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f  ),.            O
1c980 70 65 72 61 6e 64 3a 3a 43 6f 6e 73 74 61 6e 74  perand::Constant
1c990 28 72 65 66 20 63 29 20 3d 3e 20 4f 70 65 72 61  (ref c) => Opera
1c9a0 6e 64 3a 3a 43 6f 6e 73 74 61 6e 74 28 63 2e 66  nd::Constant(c.f
1c9b0 6f 6c 64 5f 77 69 74 68 28 66 6f 6c 64 65 72 29  old_with(folder)
1c9c0 29 2c 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ),.        }.   
1c9d0 20 7d 0a 0a 20 20 20 20 66 6e 20 73 75 70 65 72   }..    fn super
1c9e0 5f 76 69 73 69 74 5f 77 69 74 68 3c 56 3a 20 54  _visit_with<V: T
1c9f0 79 70 65 56 69 73 69 74 6f 72 3c 27 74 63 78 3e  ypeVisitor<'tcx>
1ca00 3e 28 26 73 65 6c 66 2c 20 76 69 73 69 74 6f 72  >(&self, visitor
1ca10 3a 20 26 6d 75 74 20 56 29 20 2d 3e 20 62 6f 6f  : &mut V) -> boo
1ca20 6c 20 7b 0a 20 20 20 20 20 20 20 20 6d 61 74 63  l {.        matc
1ca30 68 20 2a 73 65 6c 66 20 7b 0a 20 20 20 20 20 20  h *self {.      
1ca40 20 20 20 20 20 20 4f 70 65 72 61 6e 64 3a 3a 43        Operand::C
1ca50 6f 70 79 28 72 65 66 20 70 6c 61 63 65 29 20 7c  opy(ref place) |
1ca60 20 4f 70 65 72 61 6e 64 3a 3a 4d 6f 76 65 28 72   Operand::Move(r
1ca70 65 66 20 70 6c 61 63 65 29 20 3d 3e 20 70 6c 61  ef place) => pla
1ca80 63 65 2e 76 69 73 69 74 5f 77 69 74 68 28 76 69  ce.visit_with(vi
1ca90 73 69 74 6f 72 29 2c 0a 20 20 20 20 20 20 20 20  sitor),.        
1caa0 20 20 20 20 4f 70 65 72 61 6e 64 3a 3a 43 6f 6e      Operand::Con
1cab0 73 74 61 6e 74 28 72 65 66 20 63 29 20 3d 3e 20  stant(ref c) => 
1cac0 63 2e 76 69 73 69 74 5f 77 69 74 68 28 76 69 73  c.visit_with(vis
1cad0 69 74 6f 72 29 2c 0a 20 20 20 20 20 20 20 20 7d  itor),.        }
1cae0 0a 20 20 20 20 7d 0a 7d 0a 0a 69 6d 70 6c 3c 27  .    }.}..impl<'
1caf0 74 63 78 3e 20 54 79 70 65 46 6f 6c 64 61 62 6c  tcx> TypeFoldabl
1cb00 65 3c 27 74 63 78 3e 20 66 6f 72 20 50 6c 61 63  e<'tcx> for Plac
1cb10 65 45 6c 65 6d 3c 27 74 63 78 3e 20 7b 0a 20 20  eElem<'tcx> {.  
1cb20 20 20 66 6e 20 73 75 70 65 72 5f 66 6f 6c 64 5f    fn super_fold_
1cb30 77 69 74 68 3c 46 3a 20 54 79 70 65 46 6f 6c 64  with<F: TypeFold
1cb40 65 72 3c 27 74 63 78 3e 3e 28 26 73 65 6c 66 2c  er<'tcx>>(&self,
1cb50 20 66 6f 6c 64 65 72 3a 20 26 6d 75 74 20 46 29   folder: &mut F)
1cb60 20 2d 3e 20 53 65 6c 66 20 7b 0a 20 20 20 20 20   -> Self {.     
1cb70 20 20 20 75 73 65 20 63 72 61 74 65 3a 3a 6d 69     use crate::mi
1cb80 72 3a 3a 50 72 6f 6a 65 63 74 69 6f 6e 45 6c 65  r::ProjectionEle
1cb90 6d 3a 3a 2a 3b 0a 0a 20 20 20 20 20 20 20 20 6d  m::*;..        m
1cba0 61 74 63 68 20 73 65 6c 66 20 7b 0a 20 20 20 20  atch self {.    
1cbb0 20 20 20 20 20 20 20 20 44 65 72 65 66 20 3d 3e          Deref =>
1cbc0 20 44 65 72 65 66 2c 0a 20 20 20 20 20 20 20 20   Deref,.        
1cbd0 20 20 20 20 46 69 65 6c 64 28 66 2c 20 74 79 29      Field(f, ty)
1cbe0 20 3d 3e 20 46 69 65 6c 64 28 2a 66 2c 20 74 79   => Field(*f, ty
1cbf0 2e 66 6f 6c 64 5f 77 69 74 68 28 66 6f 6c 64 65  .fold_with(folde
1cc00 72 29 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r)),.           
1cc10 20 49 6e 64 65 78 28 76 29 20 3d 3e 20 49 6e 64   Index(v) => Ind
1cc20 65 78 28 76 2e 66 6f 6c 64 5f 77 69 74 68 28 66  ex(v.fold_with(f
1cc30 6f 6c 64 65 72 29 29 2c 0a 20 20 20 20 20 20 20  older)),.       
1cc40 20 20 20 20 20 65 6c 65 6d 20 3d 3e 20 65 6c 65       elem => ele
1cc50 6d 2e 63 6c 6f 6e 65 28 29 2c 0a 20 20 20 20 20  m.clone(),.     
1cc60 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1cc70 66 6e 20 73 75 70 65 72 5f 76 69 73 69 74 5f 77  fn super_visit_w
1cc80 69 74 68 3c 56 73 3a 20 54 79 70 65 56 69 73 69  ith<Vs: TypeVisi
1cc90 74 6f 72 3c 27 74 63 78 3e 3e 28 26 73 65 6c 66  tor<'tcx>>(&self
1cca0 2c 20 76 69 73 69 74 6f 72 3a 20 26 6d 75 74 20  , visitor: &mut 
1ccb0 56 73 29 20 2d 3e 20 62 6f 6f 6c 20 7b 0a 20 20  Vs) -> bool {.  
1ccc0 20 20 20 20 20 20 75 73 65 20 63 72 61 74 65 3a        use crate:
1ccd0 3a 6d 69 72 3a 3a 50 72 6f 6a 65 63 74 69 6f 6e  :mir::Projection
1cce0 45 6c 65 6d 3a 3a 2a 3b 0a 0a 20 20 20 20 20 20  Elem::*;..      
1ccf0 20 20 6d 61 74 63 68 20 73 65 6c 66 20 7b 0a 20    match self {. 
1cd00 20 20 20 20 20 20 20 20 20 20 20 46 69 65 6c 64             Field
1cd10 28 5f 2c 20 74 79 29 20 3d 3e 20 74 79 2e 76 69  (_, ty) => ty.vi
1cd20 73 69 74 5f 77 69 74 68 28 76 69 73 69 74 6f 72  sit_with(visitor
1cd30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 49  ),.            I
1cd40 6e 64 65 78 28 76 29 20 3d 3e 20 76 2e 76 69 73  ndex(v) => v.vis
1cd50 69 74 5f 77 69 74 68 28 76 69 73 69 74 6f 72 29  it_with(visitor)
1cd60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 5f 20  ,.            _ 
1cd70 3d 3e 20 66 61 6c 73 65 2c 0a 20 20 20 20 20 20  => false,.      
1cd80 20 20 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 69 6d 70    }.    }.}..imp
1cd90 6c 3c 27 74 63 78 3e 20 54 79 70 65 46 6f 6c 64  l<'tcx> TypeFold
1cda0 61 62 6c 65 3c 27 74 63 78 3e 20 66 6f 72 20 46  able<'tcx> for F
1cdb0 69 65 6c 64 20 7b 0a 20 20 20 20 66 6e 20 73 75  ield {.    fn su
1cdc0 70 65 72 5f 66 6f 6c 64 5f 77 69 74 68 3c 46 3a  per_fold_with<F:
1cdd0 20 54 79 70 65 46 6f 6c 64 65 72 3c 27 74 63 78   TypeFolder<'tcx
1cde0 3e 3e 28 26 73 65 6c 66 2c 20 5f 3a 20 26 6d 75  >>(&self, _: &mu
1cdf0 74 20 46 29 20 2d 3e 20 53 65 6c 66 20 7b 0a 20  t F) -> Self {. 
1ce00 20 20 20 20 20 20 20 2a 73 65 6c 66 0a 20 20 20         *self.   
1ce10 20 7d 0a 20 20 20 20 66 6e 20 73 75 70 65 72 5f   }.    fn super_
1ce20 76 69 73 69 74 5f 77 69 74 68 3c 56 3a 20 54 79  visit_with<V: Ty
1ce30 70 65 56 69 73 69 74 6f 72 3c 27 74 63 78 3e 3e  peVisitor<'tcx>>
1ce40 28 26 73 65 6c 66 2c 20 5f 3a 20 26 6d 75 74 20  (&self, _: &mut 
1ce50 56 29 20 2d 3e 20 62 6f 6f 6c 20 7b 0a 20 20 20  V) -> bool {.   
1ce60 20 20 20 20 20 66 61 6c 73 65 0a 20 20 20 20 7d       false.    }
1ce70 0a 7d 0a 0a 69 6d 70 6c 3c 27 74 63 78 3e 20 54  .}..impl<'tcx> T
1ce80 79 70 65 46 6f 6c 64 61 62 6c 65 3c 27 74 63 78  ypeFoldable<'tcx
1ce90 3e 20 66 6f 72 20 47 65 6e 65 72 61 74 6f 72 53  > for GeneratorS
1cea0 61 76 65 64 4c 6f 63 61 6c 20 7b 0a 20 20 20 20  avedLocal {.    
1ceb0 66 6e 20 73 75 70 65 72 5f 66 6f 6c 64 5f 77 69  fn super_fold_wi
1cec0 74 68 3c 46 3a 20 54 79 70 65 46 6f 6c 64 65 72  th<F: TypeFolder
1ced0 3c 27 74 63 78 3e 3e 28 26 73 65 6c 66 2c 20 5f  <'tcx>>(&self, _
1cee0 3a 20 26 6d 75 74 20 46 29 20 2d 3e 20 53 65 6c  : &mut F) -> Sel
1cef0 66 20 7b 0a 20 20 20 20 20 20 20 20 2a 73 65 6c  f {.        *sel
1cf00 66 0a 20 20 20 20 7d 0a 20 20 20 20 66 6e 20 73  f.    }.    fn s
1cf10 75 70 65 72 5f 76 69 73 69 74 5f 77 69 74 68 3c  uper_visit_with<
1cf20 56 3a 20 54 79 70 65 56 69 73 69 74 6f 72 3c 27  V: TypeVisitor<'
1cf30 74 63 78 3e 3e 28 26 73 65 6c 66 2c 20 5f 3a 20  tcx>>(&self, _: 
1cf40 26 6d 75 74 20 56 29 20 2d 3e 20 62 6f 6f 6c 20  &mut V) -> bool 
1cf50 7b 0a 20 20 20 20 20 20 20 20 66 61 6c 73 65 0a  {.        false.
1cf60 20 20 20 20 7d 0a 7d 0a 0a 69 6d 70 6c 3c 27 74      }.}..impl<'t
1cf70 63 78 2c 20 52 3a 20 49 64 78 2c 20 43 3a 20 49  cx, R: Idx, C: I
1cf80 64 78 3e 20 54 79 70 65 46 6f 6c 64 61 62 6c 65  dx> TypeFoldable
1cf90 3c 27 74 63 78 3e 20 66 6f 72 20 42 69 74 4d 61  <'tcx> for BitMa
1cfa0 74 72 69 78 3c 52 2c 20 43 3e 20 7b 0a 20 20 20  trix<R, C> {.   
1cfb0 20 66 6e 20 73 75 70 65 72 5f 66 6f 6c 64 5f 77   fn super_fold_w
1cfc0 69 74 68 3c 46 3a 20 54 79 70 65 46 6f 6c 64 65  ith<F: TypeFolde
1cfd0 72 3c 27 74 63 78 3e 3e 28 26 73 65 6c 66 2c 20  r<'tcx>>(&self, 
1cfe0 5f 3a 20 26 6d 75 74 20 46 29 20 2d 3e 20 53 65  _: &mut F) -> Se
1cff0 6c 66 20 7b 0a 20 20 20 20 20 20 20 20 73 65 6c  lf {.        sel
1d000 66 2e 63 6c 6f 6e 65 28 29 0a 20 20 20 20 7d 0a  f.clone().    }.
1d010 20 20 20 20 66 6e 20 73 75 70 65 72 5f 76 69 73      fn super_vis
1d020 69 74 5f 77 69 74 68 3c 56 3a 20 54 79 70 65 56  it_with<V: TypeV
1d030 69 73 69 74 6f 72 3c 27 74 63 78 3e 3e 28 26 73  isitor<'tcx>>(&s
1d040 65 6c 66 2c 20 5f 3a 20 26 6d 75 74 20 56 29 20  elf, _: &mut V) 
1d050 2d 3e 20 62 6f 6f 6c 20 7b 0a 20 20 20 20 20 20  -> bool {.      
1d060 20 20 66 61 6c 73 65 0a 20 20 20 20 7d 0a 7d 0a    false.    }.}.
1d070 0a 69 6d 70 6c 3c 27 74 63 78 3e 20 54 79 70 65  .impl<'tcx> Type
1d080 46 6f 6c 64 61 62 6c 65 3c 27 74 63 78 3e 20 66  Foldable<'tcx> f
1d090 6f 72 20 43 6f 6e 73 74 61 6e 74 3c 27 74 63 78  or Constant<'tcx
1d0a0 3e 20 7b 0a 20 20 20 20 66 6e 20 73 75 70 65 72  > {.    fn super
1d0b0 5f 66 6f 6c 64 5f 77 69 74 68 3c 46 3a 20 54 79  _fold_with<F: Ty
1d0c0 70 65 46 6f 6c 64 65 72 3c 27 74 63 78 3e 3e 28  peFolder<'tcx>>(
1d0d0 26 73 65 6c 66 2c 20 66 6f 6c 64 65 72 3a 20 26  &self, folder: &
1d0e0 6d 75 74 20 46 29 20 2d 3e 20 53 65 6c 66 20 7b  mut F) -> Self {
1d0f0 0a 20 20 20 20 20 20 20 20 43 6f 6e 73 74 61 6e  .        Constan
1d100 74 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t {.            
1d110 73 70 61 6e 3a 20 73 65 6c 66 2e 73 70 61 6e 2e  span: self.span.
1d120 63 6c 6f 6e 65 28 29 2c 0a 20 20 20 20 20 20 20  clone(),.       
1d130 20 20 20 20 20 75 73 65 72 5f 74 79 3a 20 73 65       user_ty: se
1d140 6c 66 2e 75 73 65 72 5f 74 79 2e 66 6f 6c 64 5f  lf.user_ty.fold_
1d150 77 69 74 68 28 66 6f 6c 64 65 72 29 2c 0a 20 20  with(folder),.  
1d160 20 20 20 20 20 20 20 20 20 20 6c 69 74 65 72 61            litera
1d170 6c 3a 20 73 65 6c 66 2e 6c 69 74 65 72 61 6c 2e  l: self.literal.
1d180 66 6f 6c 64 5f 77 69 74 68 28 66 6f 6c 64 65 72  fold_with(folder
1d190 29 2c 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ),.        }.   
1d1a0 20 7d 0a 20 20 20 20 66 6e 20 73 75 70 65 72 5f   }.    fn super_
1d1b0 76 69 73 69 74 5f 77 69 74 68 3c 56 3a 20 54 79  visit_with<V: Ty
1d1c0 70 65 56 69 73 69 74 6f 72 3c 27 74 63 78 3e 3e  peVisitor<'tcx>>
1d1d0 28 26 73 65 6c 66 2c 20 76 69 73 69 74 6f 72 3a  (&self, visitor:
1d1e0 20 26 6d 75 74 20 56 29 20 2d 3e 20 62 6f 6f 6c   &mut V) -> bool
1d1f0 20 7b 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e   {.        self.
1d200 6c 69 74 65 72 61 6c 2e 76 69 73 69 74 5f 77 69  literal.visit_wi
1d210 74 68 28 76 69 73 69 74 6f 72 29 0a 20 20 20 20  th(visitor).    
1d220 7d 0a 7d 0a                                      }.}.