From 9dab88712f68d79ec81d87deb433094a3b9d0013 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20Ochagav=C3=ADa?= Date: Sun, 26 Oct 2014 16:29:27 +0100 Subject: [PATCH 1/2] Show a note when closure field is called as method Closes https://github.com/rust-lang/rust/issues/18343 --- src/librustc/middle/typeck/check/method.rs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/librustc/middle/typeck/check/method.rs b/src/librustc/middle/typeck/check/method.rs index cb2f1e010ac6e..53a301cc94bc3 100644 --- a/src/librustc/middle/typeck/check/method.rs +++ b/src/librustc/middle/typeck/check/method.rs @@ -223,17 +223,37 @@ pub fn report_error(fcx: &FnCtxt, { match error { NoMatch(static_sources) => { + let cx = fcx.tcx(); + let method_ustring = method_name.user_string(cx); + + // True if the type is a struct and contains a field with + // the same name as the not-found method + let is_field = match ty::get(rcvr_ty).sty { + ty_struct(did, _) => + ty::lookup_struct_fields(cx, did) + .iter() + .any(|f| f.name.user_string(cx) == method_ustring), + _ => false + }; + fcx.type_error_message( span, |actual| { format!("type `{}` does not implement any \ method in scope named `{}`", actual, - method_name.user_string(fcx.tcx())) + method_ustring) }, rcvr_ty, None); + // If the method has the name of a field, give a help note + if is_field { + cx.sess.span_note(span, + format!("use `(s.{0})(...)` if you meant to call the \ + function stored in the `{0}` field", method_ustring).as_slice()); + } + if static_sources.len() > 0 { fcx.tcx().sess.fileline_note( span, From 2ce77b33b04c64d57bef696d88605d08dff72775 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20Ochagav=C3=ADa?= Date: Mon, 27 Oct 2014 12:15:03 +0100 Subject: [PATCH 2/2] Add test for issue 18343 --- src/test/compile-fail/issue-18343.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/test/compile-fail/issue-18343.rs diff --git a/src/test/compile-fail/issue-18343.rs b/src/test/compile-fail/issue-18343.rs new file mode 100644 index 0000000000000..1608d2137fc32 --- /dev/null +++ b/src/test/compile-fail/issue-18343.rs @@ -0,0 +1,19 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +struct Obj<'a> { + closure: ||: 'a -> u32 +} + +fn main() { + let o = Obj { closure: || 42 }; + o.closure(); //~ ERROR type `Obj<'_>` does not implement any method in scope named `closure` + //~^ NOTE use `(s.closure)(...)` if you meant to call the function stored in the `closure` field +}