]> git.lizzy.rs Git - rust.git/commitdiff
Fix rebase from LazyConst removal
authorvarkor <github@varkor.com>
Mon, 18 Mar 2019 20:55:19 +0000 (20:55 +0000)
committervarkor <github@varkor.com>
Wed, 1 May 2019 22:11:19 +0000 (23:11 +0100)
24 files changed:
src/librustc/infer/canonical/canonicalizer.rs
src/librustc/infer/canonical/mod.rs
src/librustc/infer/canonical/query_response.rs
src/librustc/infer/combine.rs
src/librustc/infer/equate.rs
src/librustc/infer/freshen.rs
src/librustc/infer/fudge.rs
src/librustc/infer/glb.rs
src/librustc/infer/higher_ranked/mod.rs
src/librustc/infer/lub.rs
src/librustc/infer/mod.rs
src/librustc/infer/nll_relate/mod.rs
src/librustc/infer/resolve.rs
src/librustc/infer/sub.rs
src/librustc/infer/unify_key.rs
src/librustc/ty/_match.rs
src/librustc/ty/context.rs
src/librustc/ty/error.rs
src/librustc/ty/fold.rs
src/librustc/ty/mod.rs
src/librustc/ty/print/pretty.rs
src/librustc/ty/relate.rs
src/librustc_traits/chalk_context/resolvent_ops.rs
src/librustc_typeck/check/writeback.rs

index 95310996c1859b1092544bebf79947e64b85aac3..1bf1163c4abcb6e0441c84976d5f7f7240e5fd86 100644 (file)
@@ -15,6 +15,7 @@
 use crate::ty::fold::{TypeFoldable, TypeFolder};
 use crate::ty::subst::Kind;
 use crate::ty::{self, BoundVar, InferConst, Lift, List, Ty, TyCtxt, TypeFlags};
+use crate::ty::flags::FlagComputation;
 
 use rustc_data_structures::fx::FxHashMap;
 use rustc_data_structures::indexed_vec::Idx;
@@ -434,59 +435,58 @@ fn fold_ty(&mut self, t: Ty<'tcx>) -> Ty<'tcx> {
         }
     }
 
-    fn fold_const(&mut self, c: &'tcx ty::LazyConst<'tcx>) -> &'tcx ty::LazyConst<'tcx> {
-        if let ty::LazyConst::Evaluated(ct) = c {
-            match ct.val {
-                ConstValue::Infer(InferConst::Var(vid)) => {
-                    debug!("canonical: const var found with vid {:?}", vid);
-                    match self.infcx.unwrap().probe_const_var(vid) {
-                        Ok(c) => {
-                            debug!("(resolved to {:?})", c);
-                            return self.fold_const(c);
-                        }
+    fn fold_const(&mut self, ct: &'tcx ty::Const<'tcx>) -> &'tcx ty::Const<'tcx> {
+        match ct.val {
+            ConstValue::Infer(InferConst::Var(vid)) => {
+                debug!("canonical: const var found with vid {:?}", vid);
+                match self.infcx.unwrap().probe_const_var(vid) {
+                    Ok(c) => {
+                        debug!("(resolved to {:?})", c);
+                        return self.fold_const(c);
+                    }
 
-                        // `ConstVar(vid)` is unresolved, track its universe index in the
-                        // canonicalized result
-                        Err(mut ui) => {
-                            if !self.infcx.unwrap().tcx.sess.opts.debugging_opts.chalk {
-                                // FIXME: perf problem described in #55921.
-                                ui = ty::UniverseIndex::ROOT;
-                            }
-                            return self.canonicalize_const_var(
-                                CanonicalVarInfo {
-                                    kind: CanonicalVarKind::Const(ui),
-                                },
-                                c,
-                            );
+                    // `ConstVar(vid)` is unresolved, track its universe index in the
+                    // canonicalized result
+                    Err(mut ui) => {
+                        if !self.infcx.unwrap().tcx.sess.opts.debugging_opts.chalk {
+                            // FIXME: perf problem described in #55921.
+                            ui = ty::UniverseIndex::ROOT;
                         }
+                        return self.canonicalize_const_var(
+                            CanonicalVarInfo {
+                                kind: CanonicalVarKind::Const(ui),
+                            },
+                            ct,
+                        );
                     }
                 }
-                ConstValue::Infer(InferConst::Fresh(_)) => {
-                    bug!("encountered a fresh const during canonicalization")
-                }
-                ConstValue::Infer(InferConst::Canonical(debruijn, _)) => {
-                    if debruijn >= self.binder_index {
-                        bug!("escaping bound type during canonicalization")
-                    } else {
-                        return c;
-                    }
-                }
-                ConstValue::Placeholder(placeholder) => {
-                    return self.canonicalize_const_var(
-                        CanonicalVarInfo {
-                            kind: CanonicalVarKind::PlaceholderConst(placeholder),
-                        },
-                        c,
-                    );
+            }
+            ConstValue::Infer(InferConst::Fresh(_)) => {
+                bug!("encountered a fresh const during canonicalization")
+            }
+            ConstValue::Infer(InferConst::Canonical(debruijn, _)) => {
+                if debruijn >= self.binder_index {
+                    bug!("escaping bound type during canonicalization")
+                } else {
+                    return ct;
                 }
-                _ => {}
             }
+            ConstValue::Placeholder(placeholder) => {
+                return self.canonicalize_const_var(
+                    CanonicalVarInfo {
+                        kind: CanonicalVarKind::PlaceholderConst(placeholder),
+                    },
+                    ct,
+                );
+            }
+            _ => {}
         }
 
-        if c.type_flags().intersects(self.needs_canonical_flags) {
-            c.super_fold_with(self)
+        let flags = FlagComputation::for_const(ct);
+        if flags.intersects(self.needs_canonical_flags) {
+            ct.super_fold_with(self)
         } else {
-            c
+            ct
         }
     }
 }
@@ -700,25 +700,19 @@ fn canonicalize_ty_var(&mut self, info: CanonicalVarInfo, ty_var: Ty<'tcx>) -> T
     fn canonicalize_const_var(
         &mut self,
         info: CanonicalVarInfo,
-        const_var: &'tcx ty::LazyConst<'tcx>
-    ) -> &'tcx ty::LazyConst<'tcx> {
+        const_var: &'tcx ty::Const<'tcx>
+    ) -> &'tcx ty::Const<'tcx> {
         let infcx = self.infcx.expect("encountered const-var without infcx");
         let bound_to = infcx.resolve_const_var(const_var);
         if bound_to != const_var {
             self.fold_const(bound_to)
         } else {
-            let ty = match const_var {
-                ty::LazyConst::Unevaluated(def_id, _) => {
-                    self.tcx.type_of(*def_id)
-                }
-                ty::LazyConst::Evaluated(ty::Const { ty, .. }) => ty,
-            };
             let var = self.canonical_var(info, const_var.into());
-            self.tcx().mk_lazy_const(
-                ty::LazyConst::Evaluated(ty::Const {
+            self.tcx().mk_const(
+                ty::Const {
                     val: ConstValue::Infer(InferConst::Canonical(self.binder_index, var.into())),
-                    ty,
-                })
+                    ty: const_var.ty,
+                }
             )
         }
     }
index a5694818b98109587c06ecc95794ede97decbe46..7c61db21e613a3a27babc95a0e7b1009e9748d50 100644 (file)
@@ -419,12 +419,12 @@ fn instantiate_canonical_var(
                     universe: universe_mapped,
                     name,
                 };
-                self.tcx.mk_lazy_const(ty::LazyConst::Evaluated(
+                self.tcx.mk_const(
                     ty::Const {
                         val: ConstValue::Placeholder(placeholder_mapped),
                         ty: self.tcx.types.err, // FIXME(const_generics)
                     }
-                )).into()
+                ).into()
             }
         }
     }
@@ -482,18 +482,12 @@ pub fn make_identity<'a>(&self, tcx: TyCtxt<'a, 'tcx, 'tcx>) -> Self {
                         ty::ReLateBound(ty::INNERMOST, ty::BoundRegion::BrAnon(i))
                     ).into(),
                     UnpackedKind::Const(ct) => {
-                        let ty = match ct {
-                            ty::LazyConst::Unevaluated(def_id, _) => {
-                                tcx.type_of(*def_id)
-                            }
-                            ty::LazyConst::Evaluated(ty::Const { ty, .. }) => ty,
-                        };
-                        tcx.mk_lazy_const(ty::LazyConst::Evaluated(ty::Const {
-                            ty: ty,
+                        tcx.mk_const(ty::Const {
+                            ty: ct.ty,
                             val: ConstValue::Infer(
                                 InferConst::Canonical(ty::INNERMOST, ty::BoundVar::from_u32(i))
                             ),
-                        })).into()
+                        }).into()
                     }
                 })
                 .collect()
index 65c579aedf2f44953f836a59e3206fb4e3501553..8225ed70c5827b283f06748bf8ff21a71f1b03bd 100644 (file)
@@ -481,10 +481,10 @@ fn query_response_substitution_guess<R>(
                     }
                 }
                 UnpackedKind::Const(result_value) => {
-                    if let ty::LazyConst::Evaluated(ty::Const {
+                    if let ty::Const {
                         val: ConstValue::Infer(InferConst::Canonical(debrujin, b)),
                         ..
-                    }) = result_value {
+                    } = result_value {
                         // ...in which case we would set `canonical_vars[0]` to `Some(const X)`.
 
                         // We only allow a `ty::INNERMOST` index in substitutions.
index 7ee762d94ae6c8b6b20caddf5ddba7819e6eba86..048c0a7a8fd0a5cdba566f6ad5df6d0b967f55d1 100644 (file)
@@ -33,7 +33,7 @@
 use crate::hir::def_id::DefId;
 use crate::mir::interpret::ConstValue;
 use crate::ty::{IntType, UintType};
-use crate::ty::{self, Ty, TyCtxt, InferConst, LazyConst};
+use crate::ty::{self, Ty, TyCtxt, InferConst};
 use crate::ty::error::TypeError;
 use crate::ty::relate::{self, Relate, RelateResult, TypeRelation};
 use crate::ty::subst::SubstsRef;
@@ -118,41 +118,39 @@ pub fn super_combine_tys<R>(&self,
     pub fn super_combine_consts<R>(
         &self,
         relation: &mut R,
-        a: &'tcx LazyConst<'tcx>,
-        b: &'tcx LazyConst<'tcx>,
-    ) -> RelateResult<'tcx, &'tcx LazyConst<'tcx>>
+        a: &'tcx ty::Const<'tcx>,
+        b: &'tcx ty::Const<'tcx>,
+    ) -> RelateResult<'tcx, &'tcx ty::Const<'tcx>>
     where
         R: TypeRelation<'infcx, 'gcx, 'tcx>,
     {
         let a_is_expected = relation.a_is_expected();
 
-        if let (&ty::LazyConst::Evaluated(a_eval), &ty::LazyConst::Evaluated(b_eval)) = (a, b) {
-            match (a_eval.val, b_eval.val) {
-                (ConstValue::Infer(InferConst::Var(a_vid)),
-                 ConstValue::Infer(InferConst::Var(b_vid))) => {
-                    self.const_unification_table
-                        .borrow_mut()
-                        .unify_var_var(a_vid, b_vid)
-                        .map_err(|e| const_unification_error(a_is_expected, e))?;
-                    return Ok(a);
-                }
-
-                // All other cases of inference with other variables are errors.
-                (ConstValue::Infer(InferConst::Var(_)), ConstValue::Infer(_)) |
-                (ConstValue::Infer(_), ConstValue::Infer(InferConst::Var(_))) => {
-                    bug!("tried to combine ConstValue::Infer/ConstValue::Infer(InferConst::Var)")
-                }
+        match (a.val, b.val) {
+            (ConstValue::Infer(InferConst::Var(a_vid)),
+                ConstValue::Infer(InferConst::Var(b_vid))) => {
+                self.const_unification_table
+                    .borrow_mut()
+                    .unify_var_var(a_vid, b_vid)
+                    .map_err(|e| const_unification_error(a_is_expected, e))?;
+                return Ok(a);
+            }
 
-                (ConstValue::Infer(InferConst::Var(vid)), _) => {
-                    return self.unify_const_variable(a_is_expected, vid, b);
-                }
+            // All other cases of inference with other variables are errors.
+            (ConstValue::Infer(InferConst::Var(_)), ConstValue::Infer(_)) |
+            (ConstValue::Infer(_), ConstValue::Infer(InferConst::Var(_))) => {
+                bug!("tried to combine ConstValue::Infer/ConstValue::Infer(InferConst::Var)")
+            }
 
-                (_, ConstValue::Infer(InferConst::Var(vid))) => {
-                    return self.unify_const_variable(!a_is_expected, vid, a);
-                }
+            (ConstValue::Infer(InferConst::Var(vid)), _) => {
+                return self.unify_const_variable(a_is_expected, vid, b);
+            }
 
-                _ => {}
+            (_, ConstValue::Infer(InferConst::Var(vid))) => {
+                return self.unify_const_variable(!a_is_expected, vid, a);
             }
+
+            _ => {}
         }
 
         ty::relate::super_relate_consts(relation, a, b)
@@ -162,8 +160,8 @@ pub fn unify_const_variable(
         &self,
         vid_is_expected: bool,
         vid: ty::ConstVid<'tcx>,
-        value: &'tcx LazyConst<'tcx>,
-    ) -> RelateResult<'tcx, &'tcx LazyConst<'tcx>> {
+        value: &'tcx ty::Const<'tcx>,
+    ) -> RelateResult<'tcx, &'tcx ty::Const<'tcx>> {
         self.const_unification_table
             .borrow_mut()
             .unify_var_value(vid, ConstVarValue {
@@ -582,16 +580,13 @@ fn regions(&mut self, r: ty::Region<'tcx>, r2: ty::Region<'tcx>)
 
     fn consts(
         &mut self,
-        c: &'tcx ty::LazyConst<'tcx>,
-        c2: &'tcx ty::LazyConst<'tcx>
-    ) -> RelateResult<'tcx, &'tcx ty::LazyConst<'tcx>> {
+        c: &'tcx ty::Const<'tcx>,
+        c2: &'tcx ty::Const<'tcx>
+    ) -> RelateResult<'tcx, &'tcx ty::Const<'tcx>> {
         assert_eq!(c, c2); // we are abusing TypeRelation here; both LHS and RHS ought to be ==
 
         match c {
-            LazyConst::Evaluated(ty::Const {
-                val: ConstValue::Infer(InferConst::Var(vid)),
-                ..
-            }) => {
+            ty::Const { val: ConstValue::Infer(InferConst::Var(vid)), .. } => {
                 let mut variable_table = self.infcx.const_unification_table.borrow_mut();
                 match variable_table.probe_value(*vid).val.known() {
                     Some(u) => {
@@ -628,7 +623,7 @@ fn compare<F>(&self, t: T, f: F) -> RelateResult<'tcx, T> where
 
 pub fn const_unification_error<'tcx>(
     a_is_expected: bool,
-    (a, b): (&'tcx LazyConst<'tcx>, &'tcx LazyConst<'tcx>),
+    (a, b): (&'tcx ty::Const<'tcx>, &'tcx ty::Const<'tcx>),
 ) -> TypeError<'tcx> {
     TypeError::ConstMismatch(ty::relate::expected_found_bool(a_is_expected, &a, &b))
 }
index 226ab8b438e3fff96f88c91be9b1791f477be154..f61408696ecbff8606da4aba221fd15760757851 100644 (file)
@@ -104,9 +104,9 @@ fn regions(&mut self, a: ty::Region<'tcx>, b: ty::Region<'tcx>)
 
     fn consts(
         &mut self,
-        a: &'tcx ty::LazyConst<'tcx>,
-        b: &'tcx ty::LazyConst<'tcx>,
-    ) -> RelateResult<'tcx, &'tcx ty::LazyConst<'tcx>> {
+        a: &'tcx ty::Const<'tcx>,
+        b: &'tcx ty::Const<'tcx>,
+    ) -> RelateResult<'tcx, &'tcx ty::Const<'tcx>> {
         debug!("{}.consts({:?}, {:?})", self.tag(), a, b);
         if a == b { return Ok(a); }
 
@@ -114,29 +114,28 @@ fn consts(
         let a = replace_if_possible(infcx.const_unification_table.borrow_mut(), a);
         let b = replace_if_possible(infcx.const_unification_table.borrow_mut(), b);
         let a_is_expected = self.a_is_expected();
-        if let (&ty::LazyConst::Evaluated(a_eval), &ty::LazyConst::Evaluated(b_eval)) = (a, b) {
-            match (a_eval.val, b_eval.val) {
-                (ConstValue::Infer(InferConst::Var(a_vid)),
-                 ConstValue::Infer(InferConst::Var(b_vid))) => {
-                    infcx.const_unification_table
-                        .borrow_mut()
-                        .unify_var_var(a_vid, b_vid)
-                        .map_err(|e| const_unification_error(a_is_expected, e))?;
-                    return Ok(a);
-                }
-
-                (ConstValue::Infer(InferConst::Var(a_id)), _) => {
-                    self.fields.infcx.unify_const_variable(a_is_expected, a_id, b)?;
-                    return Ok(a);
-                }
-
-                (_, ConstValue::Infer(InferConst::Var(b_id))) => {
-                    self.fields.infcx.unify_const_variable(!a_is_expected, b_id, a)?;
-                    return Ok(a);
-                }
-
-                _ => {}
+
+        match (a.val, b.val) {
+            (ConstValue::Infer(InferConst::Var(a_vid)),
+                ConstValue::Infer(InferConst::Var(b_vid))) => {
+                infcx.const_unification_table
+                    .borrow_mut()
+                    .unify_var_var(a_vid, b_vid)
+                    .map_err(|e| const_unification_error(a_is_expected, e))?;
+                return Ok(a);
+            }
+
+            (ConstValue::Infer(InferConst::Var(a_id)), _) => {
+                self.fields.infcx.unify_const_variable(a_is_expected, a_id, b)?;
+                return Ok(a);
             }
+
+            (_, ConstValue::Infer(InferConst::Var(b_id))) => {
+                self.fields.infcx.unify_const_variable(!a_is_expected, b_id, a)?;
+                return Ok(a);
+            }
+
+            _ => {}
         }
 
         self.fields.infcx.super_combine_consts(self, a, b)?;
index a1de08847887176a7813ad310a2bc19f85a9faa9..679635bef13e5623436aab23f846427c4ad59306 100644 (file)
@@ -46,7 +46,7 @@ pub struct TypeFreshener<'a, 'gcx: 'a+'tcx, 'tcx: 'a> {
     ty_freshen_count: u32,
     const_freshen_count: u32,
     ty_freshen_map: FxHashMap<ty::InferTy, Ty<'tcx>>,
-    const_freshen_map: FxHashMap<ty::InferConst<'tcx>, &'tcx ty::LazyConst<'tcx>>,
+    const_freshen_map: FxHashMap<ty::InferConst<'tcx>, &'tcx ty::Const<'tcx>>,
 }
 
 impl<'a, 'gcx, 'tcx> TypeFreshener<'a, 'gcx, 'tcx> {
@@ -88,11 +88,11 @@ fn freshen_ty<F>(
 
     fn freshen_const<F>(
         &mut self,
-        opt_ct: Option<&'tcx ty::LazyConst<'tcx>>,
+        opt_ct: Option<&'tcx ty::Const<'tcx>>,
         key: ty::InferConst<'tcx>,
         freshener: F,
         ty: Ty<'tcx>,
-    ) -> &'tcx ty::LazyConst<'tcx>
+    ) -> &'tcx ty::Const<'tcx>
     where
         F: FnOnce(u32) -> ty::InferConst<'tcx>,
     {
@@ -226,44 +226,43 @@ fn fold_ty(&mut self, t: Ty<'tcx>) -> Ty<'tcx> {
         }
     }
 
-    fn fold_const(&mut self, ct: &'tcx ty::LazyConst<'tcx>) -> &'tcx ty::LazyConst<'tcx> {
-        if let ty::LazyConst::Evaluated(ty::Const{ val, ty }) = ct {
-            match val {
-                ConstValue::Infer(ty::InferConst::Var(v)) => {
-                    let opt_ct = self.infcx.const_unification_table
-                        .borrow_mut()
-                        .probe_value(*v)
-                        .val
-                        .known();
-                    return self.freshen_const(
-                        opt_ct,
-                        ty::InferConst::Var(*v),
-                        ty::InferConst::Fresh,
-                        ty,
+    fn fold_const(&mut self, ct: &'tcx ty::Const<'tcx>) -> &'tcx ty::Const<'tcx> {
+        match ct.val {
+            ConstValue::Infer(ty::InferConst::Var(v)) => {
+                let opt_ct = self.infcx.const_unification_table
+                    .borrow_mut()
+                    .probe_value(v)
+                    .val
+                    .known();
+                return self.freshen_const(
+                    opt_ct,
+                    ty::InferConst::Var(v),
+                    ty::InferConst::Fresh,
+                    ct.ty,
+                );
+            }
+            ConstValue::Infer(ty::InferConst::Fresh(i)) => {
+                if i >= self.const_freshen_count {
+                    bug!(
+                        "Encountered a freshend const with id {} \
+                            but our counter is only at {}",
+                        i,
+                        self.const_freshen_count,
                     );
                 }
-                ConstValue::Infer(ty::InferConst::Fresh(i)) => {
-                    if *i >= self.const_freshen_count {
-                        bug!(
-                            "Encountered a freshend const with id {} \
-                                but our counter is only at {}",
-                            i,
-                            self.const_freshen_count,
-                        );
-                    }
-                    return ct;
-                }
-
-                ConstValue::Infer(ty::InferConst::Canonical(..)) |
-                ConstValue::Placeholder(_) => {
-                    bug!("unexpected const {:?}", ct)
-                }
+                return ct;
+            }
 
-                ConstValue::Param(_) |
-                ConstValue::Scalar(_) |
-                ConstValue::Slice(..) |
-                ConstValue::ByRef(..) => {}
+            ConstValue::Infer(ty::InferConst::Canonical(..)) |
+            ConstValue::Placeholder(_) => {
+                bug!("unexpected const {:?}", ct)
             }
+
+            ConstValue::Param(_) |
+            ConstValue::Scalar(_) |
+            ConstValue::Slice(..) |
+            ConstValue::ByRef(..) |
+            ConstValue::Unevaluated(..) => {}
         }
 
         ct.super_fold_with(self)
index 43f4ecfb852bf321f230e1ffad9caeae7e1d8ce3..5a9ba64659edc3173f1d3554611a714f8d1545dc 100644 (file)
@@ -176,11 +176,8 @@ fn fold_region(&mut self, r: ty::Region<'tcx>) -> ty::Region<'tcx> {
         r
     }
 
-    fn fold_const(&mut self, ct: &'tcx ty::LazyConst<'tcx>) -> &'tcx ty::LazyConst<'tcx> {
-        if let ty::LazyConst::Evaluated(ty::Const {
-            val: ConstValue::Infer(ty::InferConst::Var(vid)),
-            ty,
-        }) = *ct {
+    fn fold_const(&mut self, ct: &'tcx ty::Const<'tcx>) -> &'tcx ty::Const<'tcx> {
+        if let ty::Const { val: ConstValue::Infer(ty::InferConst::Var(vid)), ty } = *ct {
             if self.const_variables.contains(&vid) {
                 // This variable was created during the
                 // fudging. Recreate it with a fresh variable
index dde43d2072271ead492654ea2a31d062dc70d0ff..63a8f17398a0460bf994dc4e74a6553053dfd12c 100644 (file)
@@ -62,9 +62,9 @@ fn regions(&mut self, a: ty::Region<'tcx>, b: ty::Region<'tcx>)
 
     fn consts(
         &mut self,
-        a: &'tcx ty::LazyConst<'tcx>,
-        b: &'tcx ty::LazyConst<'tcx>,
-    ) -> RelateResult<'tcx, &'tcx ty::LazyConst<'tcx>> {
+        a: &'tcx ty::Const<'tcx>,
+        b: &'tcx ty::Const<'tcx>,
+    ) -> RelateResult<'tcx, &'tcx ty::Const<'tcx>> {
         debug!("{}.consts({:?}, {:?})", self.tag(), a, b);
         if a == b {
             return Ok(a);
index 84ebe2d8b52928a5fcfb57ac82aecaa0e348520b..fcec820cbb92ae844f7e2cdc8de66dc4674e4bb0 100644 (file)
@@ -101,7 +101,7 @@ pub fn replace_bound_vars_with_placeholders<T>(
         };
 
         let fld_c = |bound_var: ty::BoundVar, ty| {
-            self.tcx.mk_lazy_const(ty::LazyConst::Evaluated(
+            self.tcx.mk_const(
                 ty::Const {
                     val: ConstValue::Placeholder(ty::PlaceholderConst {
                         universe: next_universe,
@@ -109,7 +109,7 @@ pub fn replace_bound_vars_with_placeholders<T>(
                     }),
                     ty,
                 }
-            ))
+            )
         };
 
         let (result, map) = self.tcx.replace_bound_vars(binder, fld_r, fld_t, fld_c);
index 2a06886d94b68c3161ea29030bdce0dff677c35a..29b319ef8f5ff5ed8086cdb3fa6e129f8a27db36 100644 (file)
@@ -62,9 +62,9 @@ fn regions(&mut self, a: ty::Region<'tcx>, b: ty::Region<'tcx>)
 
     fn consts(
         &mut self,
-        a: &'tcx ty::LazyConst<'tcx>,
-        b: &'tcx ty::LazyConst<'tcx>,
-    ) -> RelateResult<'tcx, &'tcx ty::LazyConst<'tcx>> {
+        a: &'tcx ty::Const<'tcx>,
+        b: &'tcx ty::Const<'tcx>,
+    ) -> RelateResult<'tcx, &'tcx ty::Const<'tcx>> {
         debug!("{}.consts({:?}, {:?})", self.tag(), a, b);
         if a == b {
             return Ok(a);
index e013b2429e31815864de90248fc8bf3f4950cf6c..0f603a6c77785fd5e6d4487f2b4d2e87d3dc40f2 100644 (file)
@@ -1004,7 +1004,7 @@ pub fn next_const_var(
         &self,
         ty: Ty<'tcx>,
         origin: ConstVariableOrigin
-    ) -> &'tcx ty::LazyConst<'tcx> {
+    ) -> &'tcx ty::Const<'tcx> {
         self.tcx.mk_const_var(self.next_const_var_id(origin), ty)
     }
 
@@ -1013,7 +1013,7 @@ pub fn next_const_var_in_universe(
         ty: Ty<'tcx>,
         origin: ConstVariableOrigin,
         universe: ty::UniverseIndex,
-    ) -> &'tcx ty::LazyConst<'tcx> {
+    ) -> &'tcx ty::Const<'tcx> {
         let vid = self.const_unification_table
             .borrow_mut()
             .new_key(ConstVarValue {
@@ -1367,7 +1367,7 @@ pub fn unresolved_type_vars<T>(&self, value: &T) -> Option<(Ty<'tcx>, Option<Spa
     pub fn probe_const_var(
         &self,
         vid: ty::ConstVid<'tcx>
-    ) -> Result<&'tcx ty::LazyConst<'tcx>, ty::UniverseIndex> {
+    ) -> Result<&'tcx ty::Const<'tcx>, ty::UniverseIndex> {
         use self::unify_key::ConstVariableValue;
 
         match self.const_unification_table.borrow_mut().probe_value(vid).val {
@@ -1378,12 +1378,9 @@ pub fn probe_const_var(
 
     pub fn resolve_const_var(
         &self,
-        ct: &'tcx ty::LazyConst<'tcx>
-    ) -> &'tcx ty::LazyConst<'tcx> {
-        if let ty::LazyConst::Evaluated(ty::Const {
-            val: ConstValue::Infer(InferConst::Var(v)),
-            ..
-        }) = ct {
+        ct: &'tcx ty::Const<'tcx>
+    ) -> &'tcx ty::Const<'tcx> {
+        if let ty::Const { val: ConstValue::Infer(InferConst::Var(v)), .. } = ct {
             self.const_unification_table
                 .borrow_mut()
                 .probe_value(*v)
@@ -1398,13 +1395,10 @@ pub fn resolve_const_var(
 
     pub fn shallow_resolve_const(
         &self,
-        ct: &'tcx ty::LazyConst<'tcx>
-    ) -> &'tcx ty::LazyConst<'tcx> {
+        ct: &'tcx ty::Const<'tcx>
+    ) -> &'tcx ty::Const<'tcx> {
         match ct {
-            ty::LazyConst::Evaluated(ty::Const {
-                val: ConstValue::Infer(InferConst::Var(vid)),
-                ..
-            }) => {
+            ty::Const { val: ConstValue::Infer(InferConst::Var(vid)), .. } => {
                 self.const_unification_table
                     .borrow_mut()
                     .probe_value(*vid)
index 91a1e0a13bc2f125b1a2be926a5233cc3b30c14e..8d3a86a8dc3296d7316fa37fd3b3d92b81986dd2 100644 (file)
@@ -610,13 +610,10 @@ fn regions(
 
     fn consts(
         &mut self,
-        a: &'tcx ty::LazyConst<'tcx>,
-        b: &'tcx ty::LazyConst<'tcx>,
-    ) -> RelateResult<'tcx, &'tcx ty::LazyConst<'tcx>> {
-        if let ty::LazyConst::Evaluated(ty::Const {
-            val: ConstValue::Infer(InferConst::Canonical(_, _)),
-            ..
-        }) = a {
+        a: &'tcx ty::Const<'tcx>,
+        b: &'tcx ty::Const<'tcx>,
+    ) -> RelateResult<'tcx, &'tcx ty::Const<'tcx>> {
+        if let ty::Const { val: ConstValue::Infer(InferConst::Canonical(_, _)), .. } = a {
             // FIXME(const_generics): I'm unsure how this branch should actually be handled,
             // so this is probably not correct.
             self.infcx.super_combine_consts(self, a, b)
@@ -983,15 +980,12 @@ fn regions(
 
     fn consts(
         &mut self,
-        a: &'tcx ty::LazyConst<'tcx>,
-        _: &'tcx ty::LazyConst<'tcx>,
-    ) -> RelateResult<'tcx, &'tcx ty::LazyConst<'tcx>> {
+        a: &'tcx ty::Const<'tcx>,
+        _: &'tcx ty::Const<'tcx>,
+    ) -> RelateResult<'tcx, &'tcx ty::Const<'tcx>> {
         debug!("TypeGeneralizer::consts(a={:?})", a);
 
-        if let ty::LazyConst::Evaluated(ty::Const {
-            val: ConstValue::Infer(InferConst::Canonical(_, _)),
-            ..
-        }) = a {
+        if let ty::Const { val: ConstValue::Infer(InferConst::Canonical(_, _)), .. } = a {
             bug!(
                 "unexpected inference variable encountered in NLL generalization: {:?}",
                 a
index 30a398de19ae77715e1cc1e7c4866920223ef7ce..831ed302147ed387a1c0c25e08d6a19a0d9de2a4 100644 (file)
@@ -74,7 +74,7 @@ fn fold_region(&mut self, r: ty::Region<'tcx>) -> ty::Region<'tcx> {
         }
     }
 
-    fn fold_const(&mut self, ct: &'tcx ty::LazyConst<'tcx>) -> &'tcx ty::LazyConst<'tcx> {
+    fn fold_const(&mut self, ct: &'tcx ty::Const<'tcx>) -> &'tcx ty::Const<'tcx> {
         if !ct.needs_infer() {
             ct // micro-optimize -- if there is nothing in this const that this fold affects...
         } else {
@@ -210,25 +210,20 @@ fn fold_region(&mut self, r: ty::Region<'tcx>) -> ty::Region<'tcx> {
         }
     }
 
-    fn fold_const(&mut self, c: &'tcx ty::LazyConst<'tcx>) -> &'tcx ty::LazyConst<'tcx> {
+    fn fold_const(&mut self, c: &'tcx ty::Const<'tcx>) -> &'tcx ty::Const<'tcx> {
         if !c.needs_infer() && !ty::keep_local(&c) {
             c // micro-optimize -- if there is nothing in this const that this fold affects...
               // ^ we need to have the `keep_local` check to un-default
               // defaulted tuples.
         } else {
             let c = self.infcx.shallow_resolve_const(c);
-            match c {
-                ty::LazyConst::Evaluated(ty::Const { val, .. }) => {
-                    match val {
-                        ConstValue::Infer(InferConst::Var(vid)) => {
-                            self.err = Some(FixupError::UnresolvedConst(*vid));
-                            return self.tcx().types.ct_err;
-                        }
-                        ConstValue::Infer(InferConst::Fresh(_)) => {
-                            bug!("Unexpected const in full const resolver: {:?}", c);
-                        }
-                        _ => {}
-                    }
+            match c.val {
+                ConstValue::Infer(InferConst::Var(vid)) => {
+                    self.err = Some(FixupError::UnresolvedConst(vid));
+                    return self.tcx().types.ct_err;
+                }
+                ConstValue::Infer(InferConst::Fresh(_)) => {
+                    bug!("Unexpected const in full const resolver: {:?}", c);
                 }
                 _ => {}
             }
index 1b34403f0533997d3466b886ac9df33d6cb74e01..f2f36d59cbef6b6bb8d466e45762c98e03beab05 100644 (file)
@@ -137,9 +137,9 @@ fn regions(&mut self, a: ty::Region<'tcx>, b: ty::Region<'tcx>)
 
     fn consts(
         &mut self,
-        a: &'tcx ty::LazyConst<'tcx>,
-        b: &'tcx ty::LazyConst<'tcx>,
-    ) -> RelateResult<'tcx, &'tcx ty::LazyConst<'tcx>> {
+        a: &'tcx ty::Const<'tcx>,
+        b: &'tcx ty::Const<'tcx>,
+    ) -> RelateResult<'tcx, &'tcx ty::Const<'tcx>> {
         debug!("{}.consts({:?}, {:?})", self.tag(), a, b);
         if a == b { return Ok(a); }
 
@@ -150,29 +150,27 @@ fn consts(
         // Consts can only be equal or unequal to each other: there's no subtyping
         // relation, so we're just going to perform equating here instead.
         let a_is_expected = self.a_is_expected();
-        if let (&ty::LazyConst::Evaluated(a_eval), &ty::LazyConst::Evaluated(b_eval)) = (a, b) {
-            match (a_eval.val, b_eval.val) {
-                (ConstValue::Infer(InferConst::Var(a_vid)),
-                 ConstValue::Infer(InferConst::Var(b_vid))) => {
-                    infcx.const_unification_table
-                        .borrow_mut()
-                        .unify_var_var(a_vid, b_vid)
-                        .map_err(|e| const_unification_error(a_is_expected, e))?;
-                    return Ok(a);
-                }
-
-                (ConstValue::Infer(InferConst::Var(a_id)), _) => {
-                    self.fields.infcx.unify_const_variable(a_is_expected, a_id, b)?;
-                    return Ok(a);
-                }
-
-                (_, ConstValue::Infer(InferConst::Var(b_id))) => {
-                    self.fields.infcx.unify_const_variable(!a_is_expected, b_id, a)?;
-                    return Ok(a);
-                }
-
-                _ => {}
+        match (a.val, b.val) {
+            (ConstValue::Infer(InferConst::Var(a_vid)),
+                ConstValue::Infer(InferConst::Var(b_vid))) => {
+                infcx.const_unification_table
+                    .borrow_mut()
+                    .unify_var_var(a_vid, b_vid)
+                    .map_err(|e| const_unification_error(a_is_expected, e))?;
+                return Ok(a);
             }
+
+            (ConstValue::Infer(InferConst::Var(a_id)), _) => {
+                self.fields.infcx.unify_const_variable(a_is_expected, a_id, b)?;
+                return Ok(a);
+            }
+
+            (_, ConstValue::Infer(InferConst::Var(b_id))) => {
+                self.fields.infcx.unify_const_variable(!a_is_expected, b_id, a)?;
+                return Ok(a);
+            }
+
+            _ => {}
         }
 
         self.fields.infcx.super_combine_consts(self, a, b)?;
index 5cd0e8e25912e46e9bfa3b05e85e46990d19d4ca..9b1b423ef5059d0eaa4fbc825e21fc434296bf6f 100644 (file)
@@ -90,14 +90,14 @@ pub enum ConstVariableOrigin {
 
 #[derive(Copy, Clone, Debug)]
 pub enum ConstVariableValue<'tcx> {
-    Known { value: &'tcx ty::LazyConst<'tcx> },
+    Known { value: &'tcx ty::Const<'tcx> },
     Unknown { universe: ty::UniverseIndex },
 }
 
 impl<'tcx> ConstVariableValue<'tcx> {
     /// If this value is known, returns the const it is known to be.
     /// Otherwise, `None`.
-    pub fn known(&self) -> Option<&'tcx ty::LazyConst<'tcx>> {
+    pub fn known(&self) -> Option<&'tcx ty::Const<'tcx>> {
         match *self {
             ConstVariableValue::Unknown { .. } => None,
             ConstVariableValue::Known { value } => Some(value),
@@ -126,7 +126,7 @@ fn tag() -> &'static str { "ConstVid" }
 }
 
 impl<'tcx> UnifyValue for ConstVarValue<'tcx> {
-    type Error = (&'tcx ty::LazyConst<'tcx>, &'tcx ty::LazyConst<'tcx>);
+    type Error = (&'tcx ty::Const<'tcx>, &'tcx ty::Const<'tcx>);
 
     fn unify_values(value1: &Self, value2: &Self) -> Result<Self, Self::Error> {
         let val = match (value1.val, value2.val) {
@@ -134,7 +134,7 @@ fn unify_values(value1: &Self, value2: &Self) -> Result<Self, Self::Error> {
                 ConstVariableValue::Known { value: value1 },
                 ConstVariableValue::Known { value: value2 }
             ) => {
-                match <&'tcx ty::LazyConst<'tcx>>::unify_values(&value1, &value2) {
+                match <&'tcx ty::Const<'tcx>>::unify_values(&value1, &value2) {
                     Ok(value) => Ok(ConstVariableValue::Known { value }),
                     Err(err) => Err(err),
                 }
@@ -168,16 +168,13 @@ fn unify_values(value1: &Self, value2: &Self) -> Result<Self, Self::Error> {
     }
 }
 
-impl<'tcx> EqUnifyValue for &'tcx ty::LazyConst<'tcx> {}
+impl<'tcx> EqUnifyValue for &'tcx ty::Const<'tcx> {}
 
 pub fn replace_if_possible(
     mut table: RefMut<'_, UnificationTable<InPlace<ty::ConstVid<'tcx>>>>,
-    c: &'tcx ty::LazyConst<'tcx>
-) -> &'tcx ty::LazyConst<'tcx> {
-    if let ty::LazyConst::Evaluated(ty::Const {
-        val: ConstValue::Infer(InferConst::Var(vid)),
-        ..
-    }) = c {
+    c: &'tcx ty::Const<'tcx>
+) -> &'tcx ty::Const<'tcx> {
+    if let ty::Const { val: ConstValue::Infer(InferConst::Var(vid)), .. } = c {
         match table.probe_value(*vid).val.known() {
             Some(c) => c,
             None => c,
index 82e802dc164075ba23d2c2ce4688db3d470a8798..8640216b071ae4783cd27d01c64a2579c28fa532 100644 (file)
@@ -81,26 +81,24 @@ fn tys(&mut self, a: Ty<'tcx>, b: Ty<'tcx>) -> RelateResult<'tcx, Ty<'tcx>> {
 
     fn consts(
         &mut self,
-        a: &'tcx ty::LazyConst<'tcx>,
-        b: &'tcx ty::LazyConst<'tcx>,
-    ) -> RelateResult<'tcx, &'tcx ty::LazyConst<'tcx>> {
+        a: &'tcx ty::Const<'tcx>,
+        b: &'tcx ty::Const<'tcx>,
+    ) -> RelateResult<'tcx, &'tcx ty::Const<'tcx>> {
         debug!("{}.consts({:?}, {:?})", self.tag(), a, b);
         if a == b {
             return Ok(a);
         }
 
-        if let (&ty::LazyConst::Evaluated(a_eval), &ty::LazyConst::Evaluated(b_eval)) = (a, b) {
-            match (a_eval.val, b_eval.val) {
-                (_, ConstValue::Infer(InferConst::Fresh(_))) => {
-                    return Ok(a);
-                }
-
-                (ConstValue::Infer(_), _) | (_, ConstValue::Infer(_)) => {
-                    return Err(TypeError::ConstMismatch(relate::expected_found(self, &a, &b)));
-                }
+        match (a.val, b.val) {
+            (_, ConstValue::Infer(InferConst::Fresh(_))) => {
+                return Ok(a);
+            }
 
-                _ => {}
+            (ConstValue::Infer(_), _) | (_, ConstValue::Infer(_)) => {
+                return Err(TypeError::ConstMismatch(relate::expected_found(self, &a, &b)));
             }
+
+            _ => {}
         }
 
         relate::super_relate_consts(self, a, b)
index ef94008811afd0a04ce28c455828122a4c638292..e7b6a0ff4f4b5a485fed92198d24097a67d99c73 100644 (file)
@@ -232,7 +232,7 @@ pub struct CommonLifetimes<'tcx> {
     pub re_static: Region<'tcx>,
     pub re_erased: Region<'tcx>,
 
-    pub ct_err: &'tcx LazyConst<'tcx>,
+    pub ct_err: &'tcx Const<'tcx>,
 }
 
 pub struct LocalTableInContext<'a, V: 'a> {
@@ -2683,11 +2683,11 @@ pub fn mk_const_infer(
         self,
         ic: InferConst<'tcx>,
         ty: Ty<'tcx>,
-    ) -> &'tcx LazyConst<'tcx> {
-        self.mk_lazy_const(LazyConst::Evaluated(ty::Const {
+    ) -> &'tcx ty::Const<'tcx> {
+        self.mk_const(ty::Const {
             val: ConstValue::Infer(ic),
             ty,
-        }))
+        })
     }
 
     #[inline]
index 6a6708df5cb2e159f37176fdc969ee3f10051d23..4e4024d5bab43e67ba507a02be7d3b68d825daad 100644 (file)
@@ -45,7 +45,7 @@ pub enum TypeError<'tcx> {
     ProjectionBoundsLength(ExpectedFound<usize>),
     ExistentialMismatch(ExpectedFound<&'tcx ty::List<ty::ExistentialPredicate<'tcx>>>),
 
-    ConstMismatch(ExpectedFound<&'tcx ty::LazyConst<'tcx>>),
+    ConstMismatch(ExpectedFound<&'tcx ty::Const<'tcx>>),
 }
 
 #[derive(Clone, RustcEncodable, RustcDecodable, PartialEq, Eq, Hash, Debug, Copy)]
index 5d3c71f3eabb9fd7335d12580f97ab9c29883b5c..dbf9047f775bf2ea738ebd2c64730ef00242e408 100644 (file)
@@ -201,7 +201,7 @@ fn visit_const(&mut self, c: &'tcx ty::Const<'tcx>) -> bool {
 pub struct BottomUpFolder<'a, 'gcx: 'a+'tcx, 'tcx: 'a, F, G, H>
     where F: FnMut(Ty<'tcx>) -> Ty<'tcx>,
           G: FnMut(ty::Region<'tcx>) -> ty::Region<'tcx>,
-          H: FnMut(&'tcx ty::LazyConst<'tcx>) -> &'tcx ty::LazyConst<'tcx>,
+          H: FnMut(&'tcx ty::Const<'tcx>) -> &'tcx ty::Const<'tcx>,
 {
     pub tcx: TyCtxt<'a, 'gcx, 'tcx>,
     pub ty_op: F,
@@ -212,7 +212,7 @@ pub struct BottomUpFolder<'a, 'gcx: 'a+'tcx, 'tcx: 'a, F, G, H>
 impl<'a, 'gcx, 'tcx, F, G, H> TypeFolder<'gcx, 'tcx> for BottomUpFolder<'a, 'gcx, 'tcx, F, G, H>
     where F: FnMut(Ty<'tcx>) -> Ty<'tcx>,
           G: FnMut(ty::Region<'tcx>) -> ty::Region<'tcx>,
-          H: FnMut(&'tcx ty::LazyConst<'tcx>) -> &'tcx ty::LazyConst<'tcx>,
+          H: FnMut(&'tcx ty::Const<'tcx>) -> &'tcx ty::Const<'tcx>,
 {
     fn tcx<'b>(&'b self) -> TyCtxt<'b, 'gcx, 'tcx> { self.tcx }
 
@@ -226,7 +226,7 @@ fn fold_region(&mut self, r: ty::Region<'tcx>) -> ty::Region<'tcx> {
         (self.lt_op)(r)
     }
 
-    fn fold_const(&mut self, ct: &'tcx ty::LazyConst<'tcx>) -> &'tcx ty::LazyConst<'tcx> {
+    fn fold_const(&mut self, ct: &'tcx ty::Const<'tcx>) -> &'tcx ty::Const<'tcx> {
         let ct = ct.super_fold_with(self);
         (self.ct_op)(ct)
     }
@@ -435,7 +435,7 @@ struct BoundVarReplacer<'a, 'gcx: 'a + 'tcx, 'tcx: 'a> {
 
     fld_r: &'a mut (dyn FnMut(ty::BoundRegion) -> ty::Region<'tcx> + 'a),
     fld_t: &'a mut (dyn FnMut(ty::BoundTy) -> Ty<'tcx> + 'a),
-    fld_c: &'a mut (dyn FnMut(ty::BoundVar, Ty<'tcx>) -> &'tcx ty::LazyConst<'tcx> + 'a),
+    fld_c: &'a mut (dyn FnMut(ty::BoundVar, Ty<'tcx>) -> &'tcx ty::Const<'tcx> + 'a),
 }
 
 impl<'a, 'gcx, 'tcx> BoundVarReplacer<'a, 'gcx, 'tcx> {
@@ -447,7 +447,7 @@ fn new<F, G, H>(
     ) -> Self
         where F: FnMut(ty::BoundRegion) -> ty::Region<'tcx>,
               G: FnMut(ty::BoundTy) -> Ty<'tcx>,
-              H: FnMut(ty::BoundVar, Ty<'tcx>) -> &'tcx ty::LazyConst<'tcx>,
+              H: FnMut(ty::BoundVar, Ty<'tcx>) -> &'tcx ty::Const<'tcx>,
     {
         BoundVarReplacer {
             tcx,
@@ -515,11 +515,11 @@ fn fold_region(&mut self, r: ty::Region<'tcx>) -> ty::Region<'tcx> {
         }
     }
 
-    fn fold_const(&mut self, ct: &'tcx ty::LazyConst<'tcx>) -> &'tcx ty::LazyConst<'tcx> {
-        if let ty::LazyConst::Evaluated(ty::Const {
+    fn fold_const(&mut self, ct: &'tcx ty::Const<'tcx>) -> &'tcx ty::Const<'tcx> {
+        if let ty::Const {
             val: ConstValue::Infer(ty::InferConst::Canonical(debruijn, bound_const)),
             ty,
-        }) = *ct {
+        } = *ct {
             if debruijn == self.current_index {
                 let fld_c = &mut self.fld_c;
                 let ct = fld_c(bound_const, ty);
@@ -582,7 +582,7 @@ pub fn replace_escaping_bound_vars<T, F, G, H>(
     ) -> (T, BTreeMap<ty::BoundRegion, ty::Region<'tcx>>)
         where F: FnMut(ty::BoundRegion) -> ty::Region<'tcx>,
               G: FnMut(ty::BoundTy) -> Ty<'tcx>,
-              H: FnMut(ty::BoundVar, Ty<'tcx>) -> &'tcx ty::LazyConst<'tcx>,
+              H: FnMut(ty::BoundVar, Ty<'tcx>) -> &'tcx ty::Const<'tcx>,
               T: TypeFoldable<'tcx>,
     {
         use rustc_data_structures::fx::FxHashMap;
@@ -629,7 +629,7 @@ pub fn replace_bound_vars<T, F, G, H>(
     ) -> (T, BTreeMap<ty::BoundRegion, ty::Region<'tcx>>)
         where F: FnMut(ty::BoundRegion) -> ty::Region<'tcx>,
               G: FnMut(ty::BoundTy) -> Ty<'tcx>,
-              H: FnMut(ty::BoundVar, Ty<'tcx>) -> &'tcx ty::LazyConst<'tcx>,
+              H: FnMut(ty::BoundVar, Ty<'tcx>) -> &'tcx ty::Const<'tcx>,
               T: TypeFoldable<'tcx>
     {
         self.replace_escaping_bound_vars(value.skip_binder(), fld_r, fld_t, fld_c)
@@ -794,11 +794,11 @@ fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> {
         }
     }
 
-    fn fold_const(&mut self, ct: &'tcx ty::LazyConst<'tcx>) -> &'tcx ty::LazyConst<'tcx> {
-        if let ty::LazyConst::Evaluated(ty::Const {
+    fn fold_const(&mut self, ct: &'tcx ty::Const<'tcx>) -> &'tcx ty::Const<'tcx> {
+        if let ty::Const {
             val: ConstValue::Infer(ty::InferConst::Canonical(debruijn, bound_const)),
             ty,
-        }) = *ct {
+        } = *ct {
             if self.amount == 0 || debruijn < self.current_index {
                 ct
             } else {
@@ -908,11 +908,11 @@ fn visit_region(&mut self, r: ty::Region<'tcx>) -> bool {
         r.bound_at_or_above_binder(self.outer_index)
     }
 
-    fn visit_const(&mut self, ct: &'tcx ty::LazyConst<'tcx>) -> bool {
-        if let ty::LazyConst::Evaluated(ty::Const {
+    fn visit_const(&mut self, ct: &'tcx ty::Const<'tcx>) -> bool {
+        if let ty::Const {
             val: ConstValue::Infer(ty::InferConst::Canonical(debruijn, _)),
             ..
-        }) = *ct {
+        } = *ct {
             debruijn >= self.outer_index
         } else {
             false
index 2cdf718c3ac578f3116d382c90263b02eb24f7d2..36da21b71f53676fcd13907d5a33de83be642734 100644 (file)
@@ -96,6 +96,7 @@
 pub mod error;
 mod erase_regions;
 pub mod fast_reject;
+pub mod flags;
 pub mod fold;
 pub mod inhabitedness;
 pub mod layout;
 pub mod util;
 
 mod context;
-mod flags;
 mod instance;
 mod structural_impls;
 mod sty;
index e5803b7be4f63841d505e5e154e604ac87d66498..d2cc2514536102ac335656f51bf21516318dc9b9 100644 (file)
@@ -712,7 +712,7 @@ fn pretty_print_dyn_existential(
             // in order to place the projections inside the `<...>`.
             if !resugared {
                 // Use a type that can't appear in defaults of type parameters.
-                let dummy_self = self.tcx().mk_infer(ty::FreshTy(0));
+                let dummy_self = self.tcx().mk_ty_infer(ty::FreshTy(0));
                 let principal = principal.with_self_ty(self.tcx(), dummy_self);
 
                 let args = self.generic_args_to_print(
@@ -1481,7 +1481,7 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
 
     ty::ExistentialTraitRef<'tcx> {
         // Use a type that can't appear in defaults of type parameters.
-        let dummy_self = cx.tcx().mk_infer(ty::FreshTy(0));
+        let dummy_self = cx.tcx().mk_ty_infer(ty::FreshTy(0));
         let trait_ref = self.with_self_ty(cx.tcx(), dummy_self);
         p!(print(trait_ref))
     }
index e60edfeba1c273de62d690b61048568972d7bd5c..1ba5a67f7364d336eac4589599f5a7fd51868012 100644 (file)
@@ -7,7 +7,7 @@
 use crate::hir::def_id::DefId;
 use crate::ty::subst::{Kind, UnpackedKind, SubstsRef};
 use crate::ty::{self, Ty, TyCtxt, TypeFoldable};
-use crate::ty::error::{ExpectedFound, TypeError, ConstError};
+use crate::ty::error::{ExpectedFound, TypeError};
 use crate::mir::interpret::{GlobalId, ConstValue, Scalar};
 use crate::util::common::ErrorReported;
 use syntax_pos::DUMMY_SP;
@@ -86,9 +86,9 @@ fn regions(
 
     fn consts(
         &mut self,
-        a: &'tcx ty::LazyConst<'tcx>,
-        b: &'tcx ty::LazyConst<'tcx>
-    ) -> RelateResult<'tcx, &'tcx ty::LazyConst<'tcx>>;
+        a: &'tcx ty::Const<'tcx>,
+        b: &'tcx ty::Const<'tcx>
+    ) -> RelateResult<'tcx, &'tcx ty::Const<'tcx>>;
 
     fn binders<T>(&mut self, a: &ty::Binder<T>, b: &ty::Binder<T>)
                   -> RelateResult<'tcx, ty::Binder<T>>
@@ -124,7 +124,7 @@ fn relate<'a, 'gcx, R>(relation: &mut R,
                 ast::Mutability::MutMutable => ty::Invariant,
             };
             let ty = relation.relate_with_variance(variance, &a.ty, &b.ty)?;
-            Ok(ty::TypeAndMut {ty: ty, mutbl: mutbl})
+            Ok(ty::TypeAndMut { ty, mutbl })
         }
     }
 }
@@ -590,59 +590,55 @@ pub fn super_relate_tys<'a, 'gcx, 'tcx, R>(relation: &mut R,
 /// it.
 pub fn super_relate_consts<'a, 'gcx, 'tcx, R>(
     relation: &mut R,
-    a: &'tcx ty::LazyConst<'tcx>,
-    b: &'tcx ty::LazyConst<'tcx>
-) -> RelateResult<'tcx, &'tcx ty::LazyConst<'tcx>>
+    a: &'tcx ty::Const<'tcx>,
+    b: &'tcx ty::Const<'tcx>
+) -> RelateResult<'tcx, &'tcx ty::Const<'tcx>>
 where
     R: TypeRelation<'a, 'gcx, 'tcx>, 'gcx: 'a+'tcx, 'tcx: 'a
 {
+    // Only consts whose types are equal should be compared.
+    assert_eq!(a.ty, b.ty);
+
     let tcx = relation.tcx();
 
-    match (a, b) {
-        (ty::LazyConst::Evaluated(a_eval), ty::LazyConst::Evaluated(b_eval)) => {
-            // Only consts whose types are equal should be compared.
-            assert_eq!(a_eval.ty, b_eval.ty);
-
-            // Currently, the values that can be unified are those that
-            // implement both `PartialEq` and `Eq`, corresponding to
-            // `structural_match` types.
-            // FIXME(const_generics): check for `structural_match` synthetic attribute.
-            match (a_eval.val, b_eval.val) {
-                (ConstValue::Infer(_), _) | (_, ConstValue::Infer(_)) => {
-                    // The caller should handle these cases!
-                    bug!("var types encountered in super_relate_consts: {:?} {:?}", a, b)
-                }
-                (ConstValue::Param(a_p), ConstValue::Param(b_p)) if a_p.index == b_p.index => {
-                    Ok(a)
-                }
-                (ConstValue::Placeholder(p1), ConstValue::Placeholder(p2)) if p1 == p2 => {
-                    Ok(a)
-                }
-                (ConstValue::Scalar(Scalar::Bits { .. }), _) if a == b => {
-                    Ok(a)
-                }
-                (ConstValue::ByRef(..), _) => {
-                    bug!(
-                        "non-Scalar ConstValue encountered in super_relate_consts {:?} {:?}",
-                        a,
-                        b,
-                    );
-                }
-                 _ => {
-                    Err(TypeError::ConstMismatch(expected_found(relation, &a, &b)))
-                }
-            }
+    // Currently, the values that can be unified are those that
+    // implement both `PartialEq` and `Eq`, corresponding to
+    // `structural_match` types.
+    // FIXME(const_generics): check for `structural_match` synthetic attribute.
+    match (a.val, b.val) {
+        (ConstValue::Infer(_), _) | (_, ConstValue::Infer(_)) => {
+            // The caller should handle these cases!
+            bug!("var types encountered in super_relate_consts: {:?} {:?}", a, b)
         }
-        // FIXME(const_generics): this is probably wrong (regarding TyProjection)
-        (
-            ty::LazyConst::Unevaluated(a_def_id, a_substs),
-            ty::LazyConst::Unevaluated(b_def_id, b_substs),
-        ) if a_def_id == b_def_id => {
-            let substs =
-                relation.relate_with_variance(ty::Variance::Invariant, a_substs, b_substs)?;
-            Ok(tcx.mk_lazy_const(ty::LazyConst::Unevaluated(*a_def_id, substs)))
+        (ConstValue::Param(a_p), ConstValue::Param(b_p)) if a_p.index == b_p.index => {
+            Ok(a)
+        }
+        (ConstValue::Placeholder(p1), ConstValue::Placeholder(p2)) if p1 == p2 => {
+            Ok(a)
+        }
+        (ConstValue::Scalar(Scalar::Bits { .. }), _) if a == b => {
+            Ok(a)
         }
-        _ => {
+        (ConstValue::ByRef(..), _) => {
+            bug!(
+                "non-Scalar ConstValue encountered in super_relate_consts {:?} {:?}",
+                a,
+                b,
+            );
+        }
+
+        // FIXME(const_generics): this is wrong, as it is a projection
+        (ConstValue::Unevaluated(a_def_id, a_substs),
+            ConstValue::Unevaluated(b_def_id, b_substs)) if a_def_id == b_def_id => {
+                let substs =
+                    relation.relate_with_variance(ty::Variance::Invariant, &a_substs, &b_substs)?;
+                Ok(tcx.mk_const(ty::Const {
+                    val: ConstValue::Unevaluated(a_def_id, &substs),
+                    ty: a.ty,
+                })
+            }
+
+            _ => {
             Err(TypeError::ConstMismatch(expected_found(relation, &a, &b)))
         }
     }
@@ -719,11 +715,11 @@ fn relate<'a, 'gcx, R>(relation: &mut R,
     }
 }
 
-impl<'tcx> Relate<'tcx> for &'tcx ty::LazyConst<'tcx> {
+impl<'tcx> Relate<'tcx> for &'tcx ty::Const<'tcx> {
     fn relate<'a, 'gcx, R>(relation: &mut R,
-                           a: &&'tcx ty::LazyConst<'tcx>,
-                           b: &&'tcx ty::LazyConst<'tcx>)
-                           -> RelateResult<'tcx, &'tcx ty::LazyConst<'tcx>>
+                           a: &&'tcx ty::Const<'tcx>,
+                           b: &&'tcx ty::Const<'tcx>)
+                           -> RelateResult<'tcx, &'tcx ty::Const<'tcx>>
         where R: TypeRelation<'a, 'gcx, 'tcx>, 'gcx: 'a+'tcx, 'tcx: 'a
     {
         relation.consts(*a, *b)
index 7fc05308754065e8abfcb60c00e53df4a54fe2f6..6bc62364b43fd55eb0a20eab6d096bf60721bfae 100644 (file)
@@ -279,13 +279,13 @@ fn regions(
 
     fn consts(
         &mut self,
-        a: &'tcx ty::LazyConst<'tcx>,
-        b: &'tcx ty::LazyConst<'tcx>,
-    ) -> RelateResult<'tcx, &'tcx ty::LazyConst<'tcx>> {
-        if let ty::LazyConst::Evaluated(ty::Const {
+        a: &'tcx ty::Const<'tcx>,
+        b: &'tcx ty::Const<'tcx>,
+    ) -> RelateResult<'tcx, &'tcx ty::Const<'tcx>> {
+        if let ty::Const {
             val: ConstValue::Infer(InferConst::Canonical(debruijn, bound_ct)),
             ..
-        }) = a {
+        } = a {
             if *debruijn == self.binder_index {
                 self.unify_free_answer_var(*bound_ct, b.into())?;
                 return Ok(b);
@@ -294,14 +294,14 @@ fn consts(
 
         match (a, b) {
             (
-                ty::LazyConst::Evaluated(ty::Const {
+                ty::Const {
                     val: ConstValue::Infer(InferConst::Canonical(a_debruijn, a_bound)),
                     ..
-                }),
-                ty::LazyConst::Evaluated(ty::Const {
+                },
+                ty::Const {
                     val: ConstValue::Infer(InferConst::Canonical(b_debruijn, b_bound)),
                     ..
-                }),
+                },
             ) => {
                 assert_eq!(a_debruijn, b_debruijn);
                 assert_eq!(a_bound, b_bound);
index d16d69e92332662ebcc9c70f9867334dd52a5fc7..f56ef1a0d0c4e09da16848fddf0a0c963d99f653 100644 (file)
@@ -11,7 +11,7 @@
 use rustc::ty::adjustment::{Adjust, Adjustment, PointerCast};
 use rustc::ty::fold::{BottomUpFolder, TypeFoldable, TypeFolder};
 use rustc::ty::subst::UnpackedKind;
-use rustc::ty::{self, Ty, TyCtxt, Const, LazyConst};
+use rustc::ty::{self, Ty, TyCtxt, Const};
 use rustc::mir::interpret::ConstValue;
 use rustc::util::nodemap::DefIdSet;
 use rustc_data_structures::sync::Lrc;
@@ -567,36 +567,34 @@ fn visit_opaque_types(&mut self, span: Span) {
                     },
                     ct_op: |ct| {
                         trace!("checking const {:?}", ct);
-                        // find a const parameter
-                        if let LazyConst::Evaluated(Const { ty, val }) = ct {
-                            if let ConstValue::Param(..) = val {
-                                // look it up in the substitution list
-                                assert_eq!(opaque_defn.substs.len(), generics.params.len());
-                                for (subst, param) in opaque_defn.substs.iter()
-                                                                        .zip(&generics.params) {
-                                    if let UnpackedKind::Const(subst) = subst.unpack() {
-                                        if subst == ct {
-                                            // found it in the substitution list, replace with the
-                                            // parameter from the existential type
-                                            return self.tcx()
-                                                .global_tcx()
-                                                .mk_const_param(param.index, param.name, ty);
-                                        }
+                        // Find a const parameter
+                        if let ConstValue::Param(..) = ct.val {
+                            // look it up in the substitution list
+                            assert_eq!(opaque_defn.substs.len(), generics.params.len());
+                            for (subst, param) in opaque_defn.substs.iter()
+                                                                    .zip(&generics.params) {
+                                if let UnpackedKind::Const(subst) = subst.unpack() {
+                                    if subst == ct {
+                                        // found it in the substitution list, replace with the
+                                        // parameter from the existential type
+                                        return self.tcx()
+                                            .global_tcx()
+                                            .mk_const_param(param.index, param.name, ty);
                                     }
                                 }
-                                self.tcx()
-                                    .sess
-                                    .struct_span_err(
-                                        span,
-                                        &format!(
-                                            "const parameter `{}` is part of concrete type but not \
-                                             used in parameter list for existential type",
-                                            ct,
-                                        ),
-                                    )
-                                    .emit();
-                                return self.tcx().types.ct_err;
                             }
+                            self.tcx()
+                                .sess
+                                .struct_span_err(
+                                    span,
+                                    &format!(
+                                        "const parameter `{}` is part of concrete type but not \
+                                            used in parameter list for existential type",
+                                        ct,
+                                    ),
+                                )
+                                .emit();
+                            return self.tcx().types.ct_err;
                         }
                         ct
                     }