diff options
| author | Esteban Küber <esteban@kuber.com.ar> | 2017-06-02 10:15:13 -0700 |
|---|---|---|
| committer | Esteban Küber <esteban@kuber.com.ar> | 2017-06-02 10:15:13 -0700 |
| commit | e935acfa5c8240305119372a596bd563b0b0fb2c (patch) | |
| tree | fe28edc54122393fc17ba623f3f12cc8be359efb /src/test/ui/impl-trait | |
| parent | 4ed2edaafe82fb8d44e81e00ca3e4f7659855ba2 (diff) | |
| download | rust-e935acfa5c8240305119372a596bd563b0b0fb2c.tar.gz rust-e935acfa5c8240305119372a596bd563b0b0fb2c.zip | |
Use multiline note for trait suggestion
Diffstat (limited to 'src/test/ui/impl-trait')
7 files changed, 474 insertions, 0 deletions
diff --git a/src/test/ui/impl-trait/auxiliary/no_method_suggested_traits.rs b/src/test/ui/impl-trait/auxiliary/no_method_suggested_traits.rs new file mode 100644 index 00000000000..20cebb9be17 --- /dev/null +++ b/src/test/ui/impl-trait/auxiliary/no_method_suggested_traits.rs @@ -0,0 +1,46 @@ +// Copyright 2015 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. + +pub use reexport::Reexported; + +pub struct Foo; +pub enum Bar { X } + +pub mod foo { + pub trait PubPub { + fn method(&self) {} + + fn method3(&self) {} + } + + impl PubPub for u32 {} + impl PubPub for i32 {} +} +pub mod bar { + trait PubPriv { + fn method(&self); + } +} +mod qux { + pub trait PrivPub { + fn method(&self); + } +} +mod quz { + trait PrivPriv { + fn method(&self); + } +} + +mod reexport { + pub trait Reexported { + fn method(&self); + } +} diff --git a/src/test/ui/impl-trait/issue-21659-show-relevant-trait-impls-3.rs b/src/test/ui/impl-trait/issue-21659-show-relevant-trait-impls-3.rs new file mode 100644 index 00000000000..0bb944edb9d --- /dev/null +++ b/src/test/ui/impl-trait/issue-21659-show-relevant-trait-impls-3.rs @@ -0,0 +1,34 @@ +// Copyright 2015 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. + +trait Foo<A> { + fn foo(&self, a: A) -> A { + a + } +} + +trait NotRelevant<A> { + fn nr(&self, a: A) -> A { + a + } +} + +struct Bar; + +impl NotRelevant<usize> for Bar {} + +fn main() { + let f1 = Bar; + + f1.foo(1usize); + //~^ error: method named `foo` found for type `Bar` in the current scope + //~| help: items from traits can only be used if the trait is implemented and in scope + //~| help: candidate #1: `Foo` +} diff --git a/src/test/ui/impl-trait/issue-21659-show-relevant-trait-impls-3.stderr b/src/test/ui/impl-trait/issue-21659-show-relevant-trait-impls-3.stderr new file mode 100644 index 00000000000..38a1337c9b9 --- /dev/null +++ b/src/test/ui/impl-trait/issue-21659-show-relevant-trait-impls-3.stderr @@ -0,0 +1,11 @@ +error[E0599]: no method named `foo` found for type `Bar` in the current scope + --> $DIR/issue-21659-show-relevant-trait-impls-3.rs:30:8 + | +30 | f1.foo(1usize); + | ^^^ + | + = help: items from traits can only be used if the trait is implemented and in scope; the following trait defines an item `foo`, perhaps you need to implement it: + candidate #1: `Foo` + +error: aborting due to previous error(s) + diff --git a/src/test/ui/impl-trait/method-suggestion-no-duplication.rs b/src/test/ui/impl-trait/method-suggestion-no-duplication.rs new file mode 100644 index 00000000000..390b8f07b2f --- /dev/null +++ b/src/test/ui/impl-trait/method-suggestion-no-duplication.rs @@ -0,0 +1,25 @@ +// Copyright 2015 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. + +// issue #21405 +// ignore-tidy-linelength + +struct Foo; + +fn foo<F>(f: F) where F: FnMut(Foo) {} + +fn main() { + foo(|s| s.is_empty()); + //~^ ERROR no method named `is_empty` found + //~^^ HELP #1: `std::iter::ExactSizeIterator` + //~^^^ HELP #2: `core::slice::SliceExt` + //~^^^^ HELP #3: `core::str::StrExt` + //~^^^^^ HELP items from traits can only be used if the trait is implemented and in scope; the following traits define an item `is_empty`, perhaps you need to implement one of them: +} diff --git a/src/test/ui/impl-trait/method-suggestion-no-duplication.stderr b/src/test/ui/impl-trait/method-suggestion-no-duplication.stderr new file mode 100644 index 00000000000..a548924815a --- /dev/null +++ b/src/test/ui/impl-trait/method-suggestion-no-duplication.stderr @@ -0,0 +1,13 @@ +error[E0599]: no method named `is_empty` found for type `Foo` in the current scope + --> $DIR/method-suggestion-no-duplication.rs:19:15 + | +19 | foo(|s| s.is_empty()); + | ^^^^^^^^ + | + = help: items from traits can only be used if the trait is implemented and in scope; the following traits define an item `is_empty`, perhaps you need to implement one of them: + candidate #1: `std::iter::ExactSizeIterator` + candidate #2: `core::slice::SliceExt` + candidate #3: `core::str::StrExt` + +error: aborting due to previous error(s) + diff --git a/src/test/ui/impl-trait/no-method-suggested-traits.rs b/src/test/ui/impl-trait/no-method-suggested-traits.rs new file mode 100644 index 00000000000..15891b00028 --- /dev/null +++ b/src/test/ui/impl-trait/no-method-suggested-traits.rs @@ -0,0 +1,133 @@ +// Copyright 2015 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. + +// aux-build:no_method_suggested_traits.rs +extern crate no_method_suggested_traits; + +struct Foo; +enum Bar { X } + +mod foo { + pub trait Bar { + fn method(&self) {} + + fn method2(&self) {} + } + + impl Bar for u32 {} + + impl Bar for char {} +} + +fn main() { + // test the values themselves, and autoderef. + + + 1u32.method(); + //~^ HELP following traits are implemented but not in scope, perhaps add a `use` for one of them + //~| ERROR no method named + //~| HELP `use foo::Bar;` + //~| HELP `use no_method_suggested_traits::foo::PubPub;` + std::rc::Rc::new(&mut Box::new(&1u32)).method(); + //~^ HELP following traits are implemented but not in scope, perhaps add a `use` for one of them + //~| ERROR no method named + //~| HELP `use foo::Bar;` + //~| HELP `use no_method_suggested_traits::foo::PubPub;` + + 'a'.method(); + //~^ ERROR no method named + //~| HELP the following trait is implemented but not in scope, perhaps add a `use` for it: + //~| HELP `use foo::Bar;` + std::rc::Rc::new(&mut Box::new(&'a')).method(); + //~^ ERROR no method named + //~| HELP the following trait is implemented but not in scope, perhaps add a `use` for it: + //~| HELP `use foo::Bar;` + + 1i32.method(); + //~^ ERROR no method named + //~| HELP the following trait is implemented but not in scope, perhaps add a `use` for it: + //~| HELP `use no_method_suggested_traits::foo::PubPub;` + std::rc::Rc::new(&mut Box::new(&1i32)).method(); + //~^ ERROR no method named + //~| HELP the following trait is implemented but not in scope, perhaps add a `use` for it: + //~| HELP `use no_method_suggested_traits::foo::PubPub;` + + Foo.method(); + //~^ ERROR no method named + //~| HELP following traits define an item `method`, perhaps you need to implement one of them + //~| HELP `foo::Bar` + //~| HELP `no_method_suggested_traits::foo::PubPub` + //~| HELP `no_method_suggested_traits::Reexported` + //~| HELP `no_method_suggested_traits::bar::PubPriv` + //~| HELP `no_method_suggested_traits::qux::PrivPub` + //~| HELP `no_method_suggested_traits::quz::PrivPriv` + std::rc::Rc::new(&mut Box::new(&Foo)).method(); + //~^ ERROR no method named + //~| HELP following traits define an item `method`, perhaps you need to implement one of them + //~| HELP `foo::Bar` + //~| HELP `no_method_suggested_traits::foo::PubPub` + //~| HELP `no_method_suggested_traits::Reexported` + //~| HELP `no_method_suggested_traits::bar::PubPriv` + //~| HELP `no_method_suggested_traits::qux::PrivPub` + //~| HELP `no_method_suggested_traits::quz::PrivPriv` + + 1u64.method2(); + //~^ ERROR no method named + //~| HELP the following trait defines an item `method2`, perhaps you need to implement it + //~| HELP `foo::Bar` + std::rc::Rc::new(&mut Box::new(&1u64)).method2(); + //~^ ERROR no method named + //~| HELP the following trait defines an item `method2`, perhaps you need to implement it + //~| HELP `foo::Bar` + + no_method_suggested_traits::Foo.method2(); + //~^ ERROR no method named + //~| HELP following trait defines an item `method2`, perhaps you need to implement it + //~| HELP `foo::Bar` + std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Foo)).method2(); + //~^ ERROR no method named + //~| HELP following trait defines an item `method2`, perhaps you need to implement it + //~| HELP `foo::Bar` + no_method_suggested_traits::Bar::X.method2(); + //~^ ERROR no method named + //~| HELP following trait defines an item `method2`, perhaps you need to implement it + //~| HELP `foo::Bar` + std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Bar::X)).method2(); + //~^ ERROR no method named + //~| HELP following trait defines an item `method2`, perhaps you need to implement it + //~| HELP `foo::Bar` + + Foo.method3(); + //~^ ERROR no method named + //~| HELP following trait defines an item `method3`, perhaps you need to implement it + //~| HELP `no_method_suggested_traits::foo::PubPub` + std::rc::Rc::new(&mut Box::new(&Foo)).method3(); + //~^ ERROR no method named + //~| HELP following trait defines an item `method3`, perhaps you need to implement it + //~| HELP `no_method_suggested_traits::foo::PubPub` + Bar::X.method3(); + //~^ ERROR no method named + //~| HELP following trait defines an item `method3`, perhaps you need to implement it + //~| HELP `no_method_suggested_traits::foo::PubPub` + std::rc::Rc::new(&mut Box::new(&Bar::X)).method3(); + //~^ ERROR no method named + //~| HELP following trait defines an item `method3`, perhaps you need to implement it + //~| HELP `no_method_suggested_traits::foo::PubPub` + + // should have no help: + 1_usize.method3(); //~ ERROR no method named + std::rc::Rc::new(&mut Box::new(&1_usize)).method3(); //~ ERROR no method named + no_method_suggested_traits::Foo.method3(); //~ ERROR no method named + std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Foo)).method3(); + //~^ ERROR no method named + no_method_suggested_traits::Bar::X.method3(); //~ ERROR no method named + std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Bar::X)).method3(); + //~^ ERROR no method named +} diff --git a/src/test/ui/impl-trait/no-method-suggested-traits.stderr b/src/test/ui/impl-trait/no-method-suggested-traits.stderr new file mode 100644 index 00000000000..ab5f6b6c6c8 --- /dev/null +++ b/src/test/ui/impl-trait/no-method-suggested-traits.stderr @@ -0,0 +1,212 @@ +error[E0599]: no method named `method` found for type `u32` in the current scope + --> $DIR/no-method-suggested-traits.rs:33:10 + | +33 | 1u32.method(); + | ^^^^^^ + | + = help: items from traits can only be used if the trait is in scope; the following traits are implemented but not in scope, perhaps add a `use` for one of them: + candidate #1: `use foo::Bar;` + candidate #2: `use no_method_suggested_traits::foo::PubPub;` + +error[E0599]: no method named `method` found for type `std::rc::Rc<&mut std::boxed::Box<&u32>>` in the current scope + --> $DIR/no-method-suggested-traits.rs:38:44 + | +38 | std::rc::Rc::new(&mut Box::new(&1u32)).method(); + | ^^^^^^ + | + = help: items from traits can only be used if the trait is in scope; the following traits are implemented but not in scope, perhaps add a `use` for one of them: + candidate #1: `use foo::Bar;` + candidate #2: `use no_method_suggested_traits::foo::PubPub;` + +error[E0599]: no method named `method` found for type `char` in the current scope + --> $DIR/no-method-suggested-traits.rs:44:9 + | +44 | 'a'.method(); + | ^^^^^^ + | + = help: items from traits can only be used if the trait is in scope; the following trait is implemented but not in scope, perhaps add a `use` for it: + candidate #1: `use foo::Bar;` + +error[E0599]: no method named `method` found for type `std::rc::Rc<&mut std::boxed::Box<&char>>` in the current scope + --> $DIR/no-method-suggested-traits.rs:48:43 + | +48 | std::rc::Rc::new(&mut Box::new(&'a')).method(); + | ^^^^^^ + | + = help: items from traits can only be used if the trait is in scope; the following trait is implemented but not in scope, perhaps add a `use` for it: + candidate #1: `use foo::Bar;` + +error[E0599]: no method named `method` found for type `i32` in the current scope + --> $DIR/no-method-suggested-traits.rs:53:10 + | +53 | 1i32.method(); + | ^^^^^^ + | + = help: items from traits can only be used if the trait is in scope; the following trait is implemented but not in scope, perhaps add a `use` for it: + candidate #1: `use no_method_suggested_traits::foo::PubPub;` + +error[E0599]: no method named `method` found for type `std::rc::Rc<&mut std::boxed::Box<&i32>>` in the current scope + --> $DIR/no-method-suggested-traits.rs:57:44 + | +57 | std::rc::Rc::new(&mut Box::new(&1i32)).method(); + | ^^^^^^ + | + = help: items from traits can only be used if the trait is in scope; the following trait is implemented but not in scope, perhaps add a `use` for it: + candidate #1: `use no_method_suggested_traits::foo::PubPub;` + +error[E0599]: no method named `method` found for type `Foo` in the current scope + --> $DIR/no-method-suggested-traits.rs:62:9 + | +62 | Foo.method(); + | ^^^^^^ + | + = help: items from traits can only be used if the trait is implemented and in scope; the following traits define an item `method`, perhaps you need to implement one of them: + candidate #1: `foo::Bar` + candidate #2: `no_method_suggested_traits::foo::PubPub` + candidate #3: `no_method_suggested_traits::bar::PubPriv` + candidate #4: `no_method_suggested_traits::qux::PrivPub` + candidate #5: `no_method_suggested_traits::quz::PrivPriv` + candidate #6: `no_method_suggested_traits::Reexported` + +error[E0599]: no method named `method` found for type `std::rc::Rc<&mut std::boxed::Box<&Foo>>` in the current scope + --> $DIR/no-method-suggested-traits.rs:71:43 + | +71 | std::rc::Rc::new(&mut Box::new(&Foo)).method(); + | ^^^^^^ + | + = help: items from traits can only be used if the trait is implemented and in scope; the following traits define an item `method`, perhaps you need to implement one of them: + candidate #1: `foo::Bar` + candidate #2: `no_method_suggested_traits::foo::PubPub` + candidate #3: `no_method_suggested_traits::bar::PubPriv` + candidate #4: `no_method_suggested_traits::qux::PrivPub` + candidate #5: `no_method_suggested_traits::quz::PrivPriv` + candidate #6: `no_method_suggested_traits::Reexported` + +error[E0599]: no method named `method2` found for type `u64` in the current scope + --> $DIR/no-method-suggested-traits.rs:81:10 + | +81 | 1u64.method2(); + | ^^^^^^^ + | + = help: items from traits can only be used if the trait is implemented and in scope; the following trait defines an item `method2`, perhaps you need to implement it: + candidate #1: `foo::Bar` + +error[E0599]: no method named `method2` found for type `std::rc::Rc<&mut std::boxed::Box<&u64>>` in the current scope + --> $DIR/no-method-suggested-traits.rs:85:44 + | +85 | std::rc::Rc::new(&mut Box::new(&1u64)).method2(); + | ^^^^^^^ + | + = help: items from traits can only be used if the trait is implemented and in scope; the following trait defines an item `method2`, perhaps you need to implement it: + candidate #1: `foo::Bar` + +error[E0599]: no method named `method2` found for type `no_method_suggested_traits::Foo` in the current scope + --> $DIR/no-method-suggested-traits.rs:90:37 + | +90 | no_method_suggested_traits::Foo.method2(); + | ^^^^^^^ + | + = help: items from traits can only be used if the trait is implemented and in scope; the following trait defines an item `method2`, perhaps you need to implement it: + candidate #1: `foo::Bar` + +error[E0599]: no method named `method2` found for type `std::rc::Rc<&mut std::boxed::Box<&no_method_suggested_traits::Foo>>` in the current scope + --> $DIR/no-method-suggested-traits.rs:94:71 + | +94 | std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Foo)).method2(); + | ^^^^^^^ + | + = help: items from traits can only be used if the trait is implemented and in scope; the following trait defines an item `method2`, perhaps you need to implement it: + candidate #1: `foo::Bar` + +error[E0599]: no method named `method2` found for type `no_method_suggested_traits::Bar` in the current scope + --> $DIR/no-method-suggested-traits.rs:98:40 + | +98 | no_method_suggested_traits::Bar::X.method2(); + | ^^^^^^^ + | + = help: items from traits can only be used if the trait is implemented and in scope; the following trait defines an item `method2`, perhaps you need to implement it: + candidate #1: `foo::Bar` + +error[E0599]: no method named `method2` found for type `std::rc::Rc<&mut std::boxed::Box<&no_method_suggested_traits::Bar>>` in the current scope + --> $DIR/no-method-suggested-traits.rs:102:74 + | +102 | std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Bar::X)).method2(); + | ^^^^^^^ + | + = help: items from traits can only be used if the trait is implemented and in scope; the following trait defines an item `method2`, perhaps you need to implement it: + candidate #1: `foo::Bar` + +error[E0599]: no method named `method3` found for type `Foo` in the current scope + --> $DIR/no-method-suggested-traits.rs:107:9 + | +107 | Foo.method3(); + | ^^^^^^^ + | + = help: items from traits can only be used if the trait is implemented and in scope; the following trait defines an item `method3`, perhaps you need to implement it: + candidate #1: `no_method_suggested_traits::foo::PubPub` + +error[E0599]: no method named `method3` found for type `std::rc::Rc<&mut std::boxed::Box<&Foo>>` in the current scope + --> $DIR/no-method-suggested-traits.rs:111:43 + | +111 | std::rc::Rc::new(&mut Box::new(&Foo)).method3(); + | ^^^^^^^ + | + = help: items from traits can only be used if the trait is implemented and in scope; the following trait defines an item `method3`, perhaps you need to implement it: + candidate #1: `no_method_suggested_traits::foo::PubPub` + +error[E0599]: no method named `method3` found for type `Bar` in the current scope + --> $DIR/no-method-suggested-traits.rs:115:12 + | +115 | Bar::X.method3(); + | ^^^^^^^ + | + = help: items from traits can only be used if the trait is implemented and in scope; the following trait defines an item `method3`, perhaps you need to implement it: + candidate #1: `no_method_suggested_traits::foo::PubPub` + +error[E0599]: no method named `method3` found for type `std::rc::Rc<&mut std::boxed::Box<&Bar>>` in the current scope + --> $DIR/no-method-suggested-traits.rs:119:46 + | +119 | std::rc::Rc::new(&mut Box::new(&Bar::X)).method3(); + | ^^^^^^^ + | + = help: items from traits can only be used if the trait is implemented and in scope; the following trait defines an item `method3`, perhaps you need to implement it: + candidate #1: `no_method_suggested_traits::foo::PubPub` + +error[E0599]: no method named `method3` found for type `usize` in the current scope + --> $DIR/no-method-suggested-traits.rs:125:13 + | +125 | 1_usize.method3(); //~ ERROR no method named + | ^^^^^^^ + +error[E0599]: no method named `method3` found for type `std::rc::Rc<&mut std::boxed::Box<&usize>>` in the current scope + --> $DIR/no-method-suggested-traits.rs:126:47 + | +126 | std::rc::Rc::new(&mut Box::new(&1_usize)).method3(); //~ ERROR no method named + | ^^^^^^^ + +error[E0599]: no method named `method3` found for type `no_method_suggested_traits::Foo` in the current scope + --> $DIR/no-method-suggested-traits.rs:127:37 + | +127 | no_method_suggested_traits::Foo.method3(); //~ ERROR no method named + | ^^^^^^^ + +error[E0599]: no method named `method3` found for type `std::rc::Rc<&mut std::boxed::Box<&no_method_suggested_traits::Foo>>` in the current scope + --> $DIR/no-method-suggested-traits.rs:128:71 + | +128 | std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Foo)).method3(); + | ^^^^^^^ + +error[E0599]: no method named `method3` found for type `no_method_suggested_traits::Bar` in the current scope + --> $DIR/no-method-suggested-traits.rs:130:40 + | +130 | no_method_suggested_traits::Bar::X.method3(); //~ ERROR no method named + | ^^^^^^^ + +error[E0599]: no method named `method3` found for type `std::rc::Rc<&mut std::boxed::Box<&no_method_suggested_traits::Bar>>` in the current scope + --> $DIR/no-method-suggested-traits.rs:131:74 + | +131 | std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Bar::X)).method3(); + | ^^^^^^^ + +error: aborting due to previous error(s) + |
