Rollup merge of #40816 - estebank:issue-38321, r=nikomatsakis
Clarify suggetion for field used as method
Instead of
```rust
error: no method named `src_addr` found for type `&wire::ipv4::Repr` in the current scope
--> src/wire/ipv4.rs:409:34
|
409 | packet.set_src_addr(self.src_addr());
| ^^^^^^^^
|
note: did you mean to write `self.src_addr`?
--> src/wire/ipv4.rs:409:34
|
409 | packet.set_src_addr(self.src_addr());
| ^^^^^^^^
```
present
```rust
error: no method named `src_addr` found for type `&wire::ipv4::Repr` in the current scope
--> src/wire/ipv4.rs:409:34
|
409 | packet.set_src_addr(self.src_addr());
| ^^^^^^^^ field, not a method
|
= help: did you mean to write `self.src_addr` instead of `self.src_addr(...)`?
```
Fix #38321.
This commit is contained in:
commit
7f1083e741
9 changed files with 186 additions and 30 deletions
|
|
@ -0,0 +1,21 @@
|
|||
// 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<F> where F: FnMut() -> u32 {
|
||||
closure: F,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let o = Obj { closure: || 42 };
|
||||
o.closure();
|
||||
//~^ ERROR no method named `closure` found
|
||||
//~| HELP use `(o.closure)(...)` if you meant to call the function stored in the `closure` field
|
||||
//~| NOTE field, not a method
|
||||
}
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
error: no method named `closure` found for type `Obj<[closure@$DIR/issue-18343.rs:16:28: 16:33]>` in the current scope
|
||||
--> $DIR/issue-18343.rs:17:7
|
||||
|
|
||||
17 | o.closure();
|
||||
| ^^^^^^^ field, not a method
|
||||
|
|
||||
= help: use `(o.closure)(...)` if you meant to call the function stored in the `closure` field
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
105
src/test/ui/suggestions/confuse-field-and-method/issue-2392.rs
Normal file
105
src/test/ui/suggestions/confuse-field-and-method/issue-2392.rs
Normal file
|
|
@ -0,0 +1,105 @@
|
|||
// 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.
|
||||
|
||||
#![feature(core, fnbox)]
|
||||
|
||||
use std::boxed::FnBox;
|
||||
|
||||
struct FuncContainer {
|
||||
f1: fn(data: u8),
|
||||
f2: extern "C" fn(data: u8),
|
||||
f3: unsafe fn(data: u8),
|
||||
}
|
||||
|
||||
struct FuncContainerOuter {
|
||||
container: Box<FuncContainer>
|
||||
}
|
||||
|
||||
struct Obj<F> where F: FnOnce() -> u32 {
|
||||
closure: F,
|
||||
not_closure: usize,
|
||||
}
|
||||
|
||||
struct BoxedObj {
|
||||
boxed_closure: Box<FnBox() -> u32>,
|
||||
}
|
||||
|
||||
struct Wrapper<F> where F: FnMut() -> u32 {
|
||||
wrap: Obj<F>,
|
||||
}
|
||||
|
||||
fn func() -> u32 {
|
||||
0
|
||||
}
|
||||
|
||||
fn check_expression() -> Obj<Box<FnBox() -> u32>> {
|
||||
Obj { closure: Box::new(|| 42_u32) as Box<FnBox() -> u32>, not_closure: 42 }
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// test variations of function
|
||||
|
||||
let o_closure = Obj { closure: || 42, not_closure: 42 };
|
||||
o_closure.closure(); //~ ERROR no method named `closure` found
|
||||
//~^ HELP use `(o_closure.closure)(...)` if you meant to call the function stored
|
||||
//~| NOTE field, not a method
|
||||
|
||||
o_closure.not_closure();
|
||||
//~^ ERROR no method named `not_closure` found
|
||||
//~| NOTE field, not a method
|
||||
//~| HELP did you mean to write `o_closure.not_closure` instead of `o_closure.not_closure(...)`?
|
||||
|
||||
let o_func = Obj { closure: func, not_closure: 5 };
|
||||
o_func.closure(); //~ ERROR no method named `closure` found
|
||||
//~^ HELP use `(o_func.closure)(...)` if you meant to call the function stored
|
||||
//~| NOTE field, not a method
|
||||
|
||||
let boxed_fn = BoxedObj { boxed_closure: Box::new(func) };
|
||||
boxed_fn.boxed_closure();//~ ERROR no method named `boxed_closure` found
|
||||
//~^ HELP use `(boxed_fn.boxed_closure)(...)` if you meant to call the function stored
|
||||
//~| NOTE field, not a method
|
||||
|
||||
let boxed_closure = BoxedObj { boxed_closure: Box::new(|| 42_u32) as Box<FnBox() -> u32> };
|
||||
boxed_closure.boxed_closure();//~ ERROR no method named `boxed_closure` found
|
||||
//~^ HELP use `(boxed_closure.boxed_closure)(...)` if you meant to call the function stored
|
||||
//~| NOTE field, not a method
|
||||
|
||||
// test expression writing in the notes
|
||||
|
||||
let w = Wrapper { wrap: o_func };
|
||||
w.wrap.closure();//~ ERROR no method named `closure` found
|
||||
//~^ HELP use `(w.wrap.closure)(...)` if you meant to call the function stored
|
||||
//~| NOTE field, not a method
|
||||
|
||||
w.wrap.not_closure();
|
||||
//~^ ERROR no method named `not_closure` found
|
||||
//~| NOTE field, not a method
|
||||
//~| HELP did you mean to write `w.wrap.not_closure` instead of `w.wrap.not_closure(...)`?
|
||||
|
||||
check_expression().closure();//~ ERROR no method named `closure` found
|
||||
//~^ HELP use `(check_expression().closure)(...)` if you meant to call the function stored
|
||||
//~| NOTE field, not a method
|
||||
}
|
||||
|
||||
impl FuncContainerOuter {
|
||||
fn run(&self) {
|
||||
unsafe {
|
||||
(*self.container).f1(1); //~ ERROR no method named `f1` found
|
||||
//~^ HELP use `((*self.container).f1)(...)`
|
||||
//~| NOTE field, not a method
|
||||
(*self.container).f2(1); //~ ERROR no method named `f2` found
|
||||
//~^ HELP use `((*self.container).f2)(...)`
|
||||
//~| NOTE field, not a method
|
||||
(*self.container).f3(1); //~ ERROR no method named `f3` found
|
||||
//~^ HELP use `((*self.container).f3)(...)`
|
||||
//~| NOTE field, not a method
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,90 @@
|
|||
error: no method named `closure` found for type `Obj<[closure@$DIR/issue-2392.rs:49:36: 49:41]>` in the current scope
|
||||
--> $DIR/issue-2392.rs:50:15
|
||||
|
|
||||
50 | o_closure.closure(); //~ ERROR no method named `closure` found
|
||||
| ^^^^^^^ field, not a method
|
||||
|
|
||||
= help: use `(o_closure.closure)(...)` if you meant to call the function stored in the `closure` field
|
||||
|
||||
error: no method named `not_closure` found for type `Obj<[closure@$DIR/issue-2392.rs:49:36: 49:41]>` in the current scope
|
||||
--> $DIR/issue-2392.rs:54:15
|
||||
|
|
||||
54 | o_closure.not_closure();
|
||||
| ^^^^^^^^^^^ field, not a method
|
||||
|
|
||||
= help: did you mean to write `o_closure.not_closure` instead of `o_closure.not_closure(...)`?
|
||||
|
||||
error: no method named `closure` found for type `Obj<fn() -> u32 {func}>` in the current scope
|
||||
--> $DIR/issue-2392.rs:60:12
|
||||
|
|
||||
60 | o_func.closure(); //~ ERROR no method named `closure` found
|
||||
| ^^^^^^^ field, not a method
|
||||
|
|
||||
= help: use `(o_func.closure)(...)` if you meant to call the function stored in the `closure` field
|
||||
|
||||
error: no method named `boxed_closure` found for type `BoxedObj` in the current scope
|
||||
--> $DIR/issue-2392.rs:65:14
|
||||
|
|
||||
65 | boxed_fn.boxed_closure();//~ ERROR no method named `boxed_closure` found
|
||||
| ^^^^^^^^^^^^^ field, not a method
|
||||
|
|
||||
= help: use `(boxed_fn.boxed_closure)(...)` if you meant to call the function stored in the `boxed_closure` field
|
||||
|
||||
error: no method named `boxed_closure` found for type `BoxedObj` in the current scope
|
||||
--> $DIR/issue-2392.rs:70:19
|
||||
|
|
||||
70 | boxed_closure.boxed_closure();//~ ERROR no method named `boxed_closure` found
|
||||
| ^^^^^^^^^^^^^ field, not a method
|
||||
|
|
||||
= help: use `(boxed_closure.boxed_closure)(...)` if you meant to call the function stored in the `boxed_closure` field
|
||||
|
||||
error: no method named `closure` found for type `Obj<fn() -> u32 {func}>` in the current scope
|
||||
--> $DIR/issue-2392.rs:77:12
|
||||
|
|
||||
77 | w.wrap.closure();//~ ERROR no method named `closure` found
|
||||
| ^^^^^^^ field, not a method
|
||||
|
|
||||
= help: use `(w.wrap.closure)(...)` if you meant to call the function stored in the `closure` field
|
||||
|
||||
error: no method named `not_closure` found for type `Obj<fn() -> u32 {func}>` in the current scope
|
||||
--> $DIR/issue-2392.rs:81:12
|
||||
|
|
||||
81 | w.wrap.not_closure();
|
||||
| ^^^^^^^^^^^ field, not a method
|
||||
|
|
||||
= help: did you mean to write `w.wrap.not_closure` instead of `w.wrap.not_closure(...)`?
|
||||
|
||||
error: no method named `closure` found for type `Obj<std::boxed::Box<std::boxed::FnBox<(), Output=u32> + 'static>>` in the current scope
|
||||
--> $DIR/issue-2392.rs:86:24
|
||||
|
|
||||
86 | check_expression().closure();//~ ERROR no method named `closure` found
|
||||
| ^^^^^^^ field, not a method
|
||||
|
|
||||
= help: use `(check_expression().closure)(...)` if you meant to call the function stored in the `closure` field
|
||||
|
||||
error: no method named `f1` found for type `FuncContainer` in the current scope
|
||||
--> $DIR/issue-2392.rs:94:31
|
||||
|
|
||||
94 | (*self.container).f1(1); //~ ERROR no method named `f1` found
|
||||
| ^^ field, not a method
|
||||
|
|
||||
= help: use `((*self.container).f1)(...)` if you meant to call the function stored in the `f1` field
|
||||
|
||||
error: no method named `f2` found for type `FuncContainer` in the current scope
|
||||
--> $DIR/issue-2392.rs:97:31
|
||||
|
|
||||
97 | (*self.container).f2(1); //~ ERROR no method named `f2` found
|
||||
| ^^ field, not a method
|
||||
|
|
||||
= help: use `((*self.container).f2)(...)` if you meant to call the function stored in the `f2` field
|
||||
|
||||
error: no method named `f3` found for type `FuncContainer` in the current scope
|
||||
--> $DIR/issue-2392.rs:100:31
|
||||
|
|
||||
100 | (*self.container).f3(1); //~ ERROR no method named `f3` found
|
||||
| ^^ field, not a method
|
||||
|
|
||||
= help: use `((*self.container).f3)(...)` if you meant to call the function stored in the `f3` field
|
||||
|
||||
error: aborting due to 11 previous errors
|
||||
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
// Copyright 2016 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 Example {
|
||||
example: Box<Fn(i32) -> i32>
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let demo = Example {
|
||||
example: Box::new(|x| {
|
||||
x + 1
|
||||
})
|
||||
};
|
||||
|
||||
demo.example(1);
|
||||
//~^ ERROR no method named `example`
|
||||
//~| HELP use `(demo.example)(...)`
|
||||
//~| NOTE field, not a method
|
||||
// (demo.example)(1);
|
||||
}
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
error: no method named `example` found for type `Example` in the current scope
|
||||
--> $DIR/issue-32128.rs:22:10
|
||||
|
|
||||
22 | demo.example(1);
|
||||
| ^^^^^^^ field, not a method
|
||||
|
|
||||
= help: use `(demo.example)(...)` if you meant to call the function stored in the `example` field
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
// Copyright 2016 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.
|
||||
|
||||
use std::ops::Deref;
|
||||
|
||||
struct Obj<F> where F: FnMut() -> u32 {
|
||||
fn_ptr: fn() -> (),
|
||||
closure: F,
|
||||
}
|
||||
|
||||
struct C {
|
||||
c_fn_ptr: fn() -> (),
|
||||
}
|
||||
|
||||
struct D(C);
|
||||
|
||||
impl Deref for D {
|
||||
type Target = C;
|
||||
fn deref(&self) -> &C {
|
||||
&self.0
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fn empty() {}
|
||||
|
||||
fn main() {
|
||||
let o = Obj { fn_ptr: empty, closure: || 42 };
|
||||
let p = &o;
|
||||
p.closure(); //~ ERROR no method named `closure` found
|
||||
//~^ HELP use `(p.closure)(...)` if you meant to call the function stored in the `closure` field
|
||||
//~| NOTE `closure` is a field storing a function, not a method
|
||||
let q = &p;
|
||||
q.fn_ptr(); //~ ERROR no method named `fn_ptr` found
|
||||
//~^ HELP use `(q.fn_ptr)(...)` if you meant to call the function stored in the `fn_ptr` field
|
||||
//~| NOTE `fn_ptr` is a field storing a function, not a method
|
||||
let r = D(C { c_fn_ptr: empty });
|
||||
let s = &r;
|
||||
s.c_fn_ptr(); //~ ERROR no method named `c_fn_ptr` found
|
||||
//~^ HELP use `(s.c_fn_ptr)(...)` if you meant to call the function stored in the `c_fn_ptr`
|
||||
//~| NOTE `c_fn_ptr` is a field storing a function, not a method
|
||||
}
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
error: no method named `closure` found for type `&Obj<[closure@$DIR/issue-33784.rs:35:43: 35:48]>` in the current scope
|
||||
--> $DIR/issue-33784.rs:37:7
|
||||
|
|
||||
37 | p.closure(); //~ ERROR no method named `closure` found
|
||||
| ^^^^^^^ field, not a method
|
||||
|
|
||||
= help: use `(p.closure)(...)` if you meant to call the function stored in the `closure` field
|
||||
|
||||
error: no method named `fn_ptr` found for type `&&Obj<[closure@$DIR/issue-33784.rs:35:43: 35:48]>` in the current scope
|
||||
--> $DIR/issue-33784.rs:41:7
|
||||
|
|
||||
41 | q.fn_ptr(); //~ ERROR no method named `fn_ptr` found
|
||||
| ^^^^^^ field, not a method
|
||||
|
|
||||
= help: use `(q.fn_ptr)(...)` if you meant to call the function stored in the `fn_ptr` field
|
||||
|
||||
error: no method named `c_fn_ptr` found for type `&D` in the current scope
|
||||
--> $DIR/issue-33784.rs:46:7
|
||||
|
|
||||
46 | s.c_fn_ptr(); //~ ERROR no method named `c_fn_ptr` found
|
||||
| ^^^^^^^^ field, not a method
|
||||
|
|
||||
= help: use `(s.c_fn_ptr)(...)` if you meant to call the function stored in the `c_fn_ptr` field
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue