From 57e82878c0c18d920b5fb0df11bff6aa2e2abca5 Mon Sep 17 00:00:00 2001 From: 12101111 Date: Sat, 14 Sep 2019 02:40:20 +0800 Subject: [PATCH 1/3] fix #64430 --- src/librustc/ty/context.rs | 6 ++--- src/librustc_typeck/check/expr.rs | 41 ++++++++++++++----------------- 2 files changed, 21 insertions(+), 26 deletions(-) diff --git a/src/librustc/ty/context.rs b/src/librustc/ty/context.rs index 8e8472a5aacc9..25d921b7cea4c 100644 --- a/src/librustc/ty/context.rs +++ b/src/librustc/ty/context.rs @@ -2396,9 +2396,9 @@ impl<'tcx> TyCtxt<'tcx> { } #[inline] - pub fn mk_lang_item(self, ty: Ty<'tcx>, item: lang_items::LangItem) -> Ty<'tcx> { - let def_id = self.require_lang_item(item, None); - self.mk_generic_adt(def_id, ty) + pub fn mk_lang_item(self, ty: Ty<'tcx>, item: lang_items::LangItem) -> Option> { + let def_id = self.lang_items().require(item).ok()?; + Some(self.mk_generic_adt(def_id, ty)) } #[inline] diff --git a/src/librustc_typeck/check/expr.rs b/src/librustc_typeck/check/expr.rs index da72dfd155182..56bd903040ab4 100644 --- a/src/librustc_typeck/check/expr.rs +++ b/src/librustc_typeck/check/expr.rs @@ -813,18 +813,20 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { error: MethodError<'tcx> ) { let rcvr = &args[0]; - let try_alt_rcvr = |err: &mut DiagnosticBuilder<'_>, new_rcvr_t| { - if let Ok(pick) = self.lookup_probe( - span, - segment.ident, - new_rcvr_t, - rcvr, - probe::ProbeScope::AllTraits, - ) { - err.span_label( - pick.item.ident.span, - &format!("the method is available for `{}` here", new_rcvr_t), - ); + let try_alt_rcvr = |err: &mut DiagnosticBuilder<'_>, rcvr_t, lang_item| { + if let Some(new_rcvr_t) = self.tcx.mk_lang_item(rcvr_t, lang_item) { + if let Ok(pick) = self.lookup_probe( + span, + segment.ident, + new_rcvr_t, + rcvr, + probe::ProbeScope::AllTraits, + ) { + err.span_label( + pick.item.ident.span, + &format!("the method is available for `{}` here", new_rcvr_t), + ); + } } }; @@ -840,17 +842,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { // Try alternative arbitrary self types that could fulfill this call. // FIXME: probe for all types that *could* be arbitrary self-types, not // just this whitelist. - let box_rcvr_t = self.tcx.mk_box(rcvr_t); - try_alt_rcvr(&mut err, box_rcvr_t); - let pin_rcvr_t = self.tcx.mk_lang_item( - rcvr_t, - lang_items::PinTypeLangItem, - ); - try_alt_rcvr(&mut err, pin_rcvr_t); - let arc_rcvr_t = self.tcx.mk_lang_item(rcvr_t, lang_items::Arc); - try_alt_rcvr(&mut err, arc_rcvr_t); - let rc_rcvr_t = self.tcx.mk_lang_item(rcvr_t, lang_items::Rc); - try_alt_rcvr(&mut err, rc_rcvr_t); + try_alt_rcvr(&mut err, rcvr_t, lang_items::OwnedBoxLangItem); + try_alt_rcvr(&mut err, rcvr_t, lang_items::PinTypeLangItem); + try_alt_rcvr(&mut err, rcvr_t, lang_items::Arc); + try_alt_rcvr(&mut err, rcvr_t, lang_items::Rc); } err.emit(); } From b98a844cf300779d7c103ccf7812e312f021c86f Mon Sep 17 00:00:00 2001 From: 12101111 Date: Sat, 14 Sep 2019 03:13:51 +0800 Subject: [PATCH 2/3] add ui test for #64430 --- src/test/ui/issues/issue-64430.rs | 14 ++++++++++++++ src/test/ui/issues/issue-64430.stderr | 12 ++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 src/test/ui/issues/issue-64430.rs create mode 100644 src/test/ui/issues/issue-64430.stderr diff --git a/src/test/ui/issues/issue-64430.rs b/src/test/ui/issues/issue-64430.rs new file mode 100644 index 0000000000000..8e58d0dda0e1b --- /dev/null +++ b/src/test/ui/issues/issue-64430.rs @@ -0,0 +1,14 @@ +// compile-flags:-C panic=abort + +#![no_std] +pub struct Foo; + +fn main() { + Foo.bar() + //~^ ERROR E0599 +} + +#[panic_handler] +fn panic(_info: &core::panic::PanicInfo) -> ! { + loop{} +} \ No newline at end of file diff --git a/src/test/ui/issues/issue-64430.stderr b/src/test/ui/issues/issue-64430.stderr new file mode 100644 index 0000000000000..f1b2de8d8b36f --- /dev/null +++ b/src/test/ui/issues/issue-64430.stderr @@ -0,0 +1,12 @@ +error[E0599]: no method named `bar` found for type `Foo` in the current scope + --> $DIR/issue-64430.rs:7:9 + | +LL | pub struct Foo; + | --------------- method `bar` not found for this +... +LL | Foo.bar() + | ^^^ method not found in `Foo` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0599`. From e484f213eebd2a61870eb25a6cee0992eab6275c Mon Sep 17 00:00:00 2001 From: 12101111 Date: Sat, 14 Sep 2019 03:23:58 +0800 Subject: [PATCH 3/3] add trailing newline --- src/test/ui/issues/issue-64430.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/ui/issues/issue-64430.rs b/src/test/ui/issues/issue-64430.rs index 8e58d0dda0e1b..0bc66e06e6731 100644 --- a/src/test/ui/issues/issue-64430.rs +++ b/src/test/ui/issues/issue-64430.rs @@ -11,4 +11,4 @@ fn main() { #[panic_handler] fn panic(_info: &core::panic::PanicInfo) -> ! { loop{} -} \ No newline at end of file +}