diff options
| author | Ellen <supbscripter@gmail.com> | 2021-02-15 11:38:20 +0000 |
|---|---|---|
| committer | Ellen <supbscripter@gmail.com> | 2021-02-15 11:38:20 +0000 |
| commit | 7e368e57f278b8073193c73001f4efc4af08fdfd (patch) | |
| tree | f20b80eac204744610ecdd1fa7552ced8a5d4b06 /compiler/rustc_trait_selection/src | |
| parent | b86674e7cc8ac9c846ed5aca84aaefc2d0d12e4a (diff) | |
| download | rust-7e368e57f278b8073193c73001f4efc4af08fdfd.tar.gz rust-7e368e57f278b8073193c73001f4efc4af08fdfd.zip | |
the environment round here is awfully empty
capitalism
Diffstat (limited to 'compiler/rustc_trait_selection/src')
| -rw-r--r-- | compiler/rustc_trait_selection/src/traits/const_evaluatable.rs | 13 | ||||
| -rw-r--r-- | compiler/rustc_trait_selection/src/traits/error_reporting/on_unimplemented.rs | 25 |
2 files changed, 15 insertions, 23 deletions
diff --git a/compiler/rustc_trait_selection/src/traits/const_evaluatable.rs b/compiler/rustc_trait_selection/src/traits/const_evaluatable.rs index b1ac02d9fed..8a1be7ea172 100644 --- a/compiler/rustc_trait_selection/src/traits/const_evaluatable.rs +++ b/compiler/rustc_trait_selection/src/traits/const_evaluatable.rs @@ -72,17 +72,16 @@ pub fn is_const_evaluatable<'cx, 'tcx>( // We were unable to unify the abstract constant with // a constant found in the caller bounds, there are // now three possible cases here. - // - // - The substs are concrete enough that we can simply - // try and evaluate the given constant. - // - The abstract const still references an inference - // variable, in this case we return `TooGeneric`. - // - The abstract const references a generic parameter, - // this means that we emit an error here. #[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] enum FailureKind { + /// The abstract const still references an inference + /// variable, in this case we return `TooGeneric`. MentionsInfer, + /// The abstract const references a generic parameter, + /// this means that we emit an error here. MentionsParam, + /// The substs are concrete enough that we can simply + /// try and evaluate the given constant. Concrete, } let mut failure_kind = FailureKind::Concrete; diff --git a/compiler/rustc_trait_selection/src/traits/error_reporting/on_unimplemented.rs b/compiler/rustc_trait_selection/src/traits/error_reporting/on_unimplemented.rs index 69f66f6e6b1..e6a1cf58fe3 100644 --- a/compiler/rustc_trait_selection/src/traits/error_reporting/on_unimplemented.rs +++ b/compiler/rustc_trait_selection/src/traits/error_reporting/on_unimplemented.rs @@ -200,22 +200,15 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> { if let Some(def) = aty.ty_adt_def() { // We also want to be able to select the array's type's original // signature with no type arguments resolved - flags.push(( - sym::_Self, - Some(format!("[{}]", self.tcx.type_of(def.did).to_string())), - )); - let tcx = self.tcx; - if let Some(len) = len.try_eval_usize(tcx, ty::ParamEnv::empty()) { - flags.push(( - sym::_Self, - Some(format!("[{}; {}]", self.tcx.type_of(def.did).to_string(), len)), - )); - } else { - flags.push(( - sym::_Self, - Some(format!("[{}; _]", self.tcx.type_of(def.did).to_string())), - )); - } + let type_string = self.tcx.type_of(def.did).to_string(); + flags.push((sym::_Self, Some(format!("[{}]", type_string)))); + + let len = len.val.try_to_value().and_then(|v| v.try_to_machine_usize(self.tcx)); + let string = match len { + Some(n) => format!("[{}; {}]", type_string, n), + None => format!("[{}; _]", type_string), + }; + flags.push((sym::_Self, Some(string))); } } if let ty::Dynamic(traits, _) = self_ty.kind() { |
