rollup merge of #18346 : aochagavia/closure-fields
This commit is contained in:
commit
15547e1d72
2 changed files with 40 additions and 1 deletions
|
|
@ -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,
|
||||
|
|
|
|||
19
src/test/compile-fail/issue-18343.rs
Normal file
19
src/test/compile-fail/issue-18343.rs
Normal file
|
|
@ -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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue