From c44ca17a4425b9bbd5d6219c8cf5d75bf670e667 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Tue, 14 Jul 2020 16:08:02 -0700 Subject: [PATCH] Remove string comparison and use diagnostic item instead --- src/libcore/option.rs | 1 + src/librustc_span/symbol.rs | 1 + .../traits/error_reporting/mod.rs | 18 +++++++++++------- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/libcore/option.rs b/src/libcore/option.rs index 7aca6af3de6f3..a27e8d2a72452 100644 --- a/src/libcore/option.rs +++ b/src/libcore/option.rs @@ -1681,6 +1681,7 @@ impl> FromIterator> for Option { /// to allow `x?` (where `x` is an `Option`) to be converted into your error type, you can /// implement `impl From` for `YourErrorType`. In that case, `x?` within a function that /// returns `Result<_, YourErrorType>` will translate a `None` value into an `Err` result. +#[rustc_diagnostic_item = "none_error"] #[unstable(feature = "try_trait", issue = "42327")] #[derive(Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)] pub struct NoneError; diff --git a/src/librustc_span/symbol.rs b/src/librustc_span/symbol.rs index 6b3dbd0bf7a05..c2fae47616f3b 100644 --- a/src/librustc_span/symbol.rs +++ b/src/librustc_span/symbol.rs @@ -564,6 +564,7 @@ symbols! { nomem, non_ascii_idents, None, + none_error, non_exhaustive, non_modrs_mods, nontemporal_store, diff --git a/src/librustc_trait_selection/traits/error_reporting/mod.rs b/src/librustc_trait_selection/traits/error_reporting/mod.rs index ad6e81ed3e889..d8af3da3b7018 100644 --- a/src/librustc_trait_selection/traits/error_reporting/mod.rs +++ b/src/librustc_trait_selection/traits/error_reporting/mod.rs @@ -26,6 +26,7 @@ use rustc_middle::ty::{ TypeFoldable, WithConstness, }; use rustc_session::DiagnosticMessageId; +use rustc_span::symbol::sym; use rustc_span::{ExpnKind, MultiSpan, Span, DUMMY_SP}; use std::fmt; @@ -283,8 +284,8 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> { .span_to_snippet(span) .map(|s| &s == "?") .unwrap_or(false); - let is_from = format!("{}", trait_ref.print_only_trait_path()) - .starts_with("std::convert::From<"); + let is_from = self.tcx.get_diagnostic_item(sym::from_trait) + == Some(trait_ref.def_id()); let is_unsize = { Some(trait_ref.def_id()) == self.tcx.lang_items().unsize_trait() }; let (message, note) = if is_try && is_from { @@ -315,12 +316,15 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> { )) ); - let should_convert_option_to_result = - format!("{}", trait_ref.print_only_trait_path()) - .starts_with("std::convert::From