From 40c2c0f833c0480c3cf3904fa3614cb0a01d7f87 Mon Sep 17 00:00:00 2001 From: Esteban Küber Date: Sun, 23 Oct 2016 18:54:31 -0700 Subject: Include type of missing trait methods in error Provide either a span pointing to the original definition of missing trait items, or a message with the inferred definitions. --- src/test/compile-fail/E0046.rs | 22 -------- src/test/compile-fail/impl-wrong-item-for-trait.rs | 53 ------------------ src/test/compile-fail/issue-23729.rs | 44 --------------- src/test/compile-fail/issue-23827.rs | 44 --------------- src/test/compile-fail/issue-24356.rs | 40 -------------- src/test/run-make/missing-items/Makefile | 10 ++++ src/test/run-make/missing-items/m1.rs | 17 ++++++ src/test/run-make/missing-items/m2.rs | 19 +++++++ src/test/ui/span/E0046.rs | 23 ++++++++ src/test/ui/span/E0046.stderr | 11 ++++ src/test/ui/span/impl-wrong-item-for-trait.rs | 56 +++++++++++++++++++ src/test/ui/span/impl-wrong-item-for-trait.stderr | 64 ++++++++++++++++++++++ src/test/ui/span/issue-23729.rs | 45 +++++++++++++++ src/test/ui/span/issue-23729.stderr | 10 ++++ src/test/ui/span/issue-23827.rs | 45 +++++++++++++++ src/test/ui/span/issue-23827.stderr | 10 ++++ src/test/ui/span/issue-24356.rs | 41 ++++++++++++++ src/test/ui/span/issue-24356.stderr | 10 ++++ 18 files changed, 361 insertions(+), 203 deletions(-) delete mode 100644 src/test/compile-fail/E0046.rs delete mode 100644 src/test/compile-fail/impl-wrong-item-for-trait.rs delete mode 100644 src/test/compile-fail/issue-23729.rs delete mode 100644 src/test/compile-fail/issue-23827.rs delete mode 100644 src/test/compile-fail/issue-24356.rs create mode 100644 src/test/run-make/missing-items/Makefile create mode 100644 src/test/run-make/missing-items/m1.rs create mode 100644 src/test/run-make/missing-items/m2.rs create mode 100644 src/test/ui/span/E0046.rs create mode 100644 src/test/ui/span/E0046.stderr create mode 100644 src/test/ui/span/impl-wrong-item-for-trait.rs create mode 100644 src/test/ui/span/impl-wrong-item-for-trait.stderr create mode 100644 src/test/ui/span/issue-23729.rs create mode 100644 src/test/ui/span/issue-23729.stderr create mode 100644 src/test/ui/span/issue-23827.rs create mode 100644 src/test/ui/span/issue-23827.stderr create mode 100644 src/test/ui/span/issue-24356.rs create mode 100644 src/test/ui/span/issue-24356.stderr (limited to 'src/test') diff --git a/src/test/compile-fail/E0046.rs b/src/test/compile-fail/E0046.rs deleted file mode 100644 index a8b56b2b9ab..00000000000 --- a/src/test/compile-fail/E0046.rs +++ /dev/null @@ -1,22 +0,0 @@ -// 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 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -trait Foo { - fn foo(); -} - -struct Bar; - -impl Foo for Bar {} -//~^ ERROR E0046 -//~| NOTE missing `foo` in implementation - -fn main() { -} diff --git a/src/test/compile-fail/impl-wrong-item-for-trait.rs b/src/test/compile-fail/impl-wrong-item-for-trait.rs deleted file mode 100644 index 388c9a1729c..00000000000 --- a/src/test/compile-fail/impl-wrong-item-for-trait.rs +++ /dev/null @@ -1,53 +0,0 @@ -// 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 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -#![feature(associated_consts)] - -trait Foo { - fn bar(&self); - //~^ NOTE item in trait - //~| NOTE item in trait - const MY_CONST: u32; //~ NOTE item in trait -} - -pub struct FooConstForMethod; - -impl Foo for FooConstForMethod { - //~^ ERROR E0046 - //~| NOTE missing `bar` in implementation - const bar: u64 = 1; - //~^ ERROR E0323 - //~| NOTE does not match trait - const MY_CONST: u32 = 1; -} - -pub struct FooMethodForConst; - -impl Foo for FooMethodForConst { - //~^ ERROR E0046 - //~| NOTE missing `MY_CONST` in implementation - fn bar(&self) {} - fn MY_CONST() {} - //~^ ERROR E0324 - //~| NOTE does not match trait -} - -pub struct FooTypeForMethod; - -impl Foo for FooTypeForMethod { - //~^ ERROR E0046 - //~| NOTE missing `bar` in implementation - type bar = u64; - //~^ ERROR E0325 - //~| NOTE does not match trait - const MY_CONST: u32 = 1; -} - -fn main () {} diff --git a/src/test/compile-fail/issue-23729.rs b/src/test/compile-fail/issue-23729.rs deleted file mode 100644 index b1047ce18cc..00000000000 --- a/src/test/compile-fail/issue-23729.rs +++ /dev/null @@ -1,44 +0,0 @@ -// 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 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -// Regression test for #23729 - -fn main() { - let fib = { - struct Recurrence { - mem: [u64; 2], - pos: usize, - } - - impl Iterator for Recurrence { - //~^ ERROR E0046 - //~| NOTE missing `Item` in implementation - #[inline] - fn next(&mut self) -> Option { - if self.pos < 2 { - let next_val = self.mem[self.pos]; - self.pos += 1; - Some(next_val) - } else { - let next_val = self.mem[0] + self.mem[1]; - self.mem[0] = self.mem[1]; - self.mem[1] = next_val; - Some(next_val) - } - } - } - - Recurrence { mem: [0, 1], pos: 0 } - }; - - for e in fib.take(10) { - println!("{}", e) - } -} diff --git a/src/test/compile-fail/issue-23827.rs b/src/test/compile-fail/issue-23827.rs deleted file mode 100644 index 2062e237312..00000000000 --- a/src/test/compile-fail/issue-23827.rs +++ /dev/null @@ -1,44 +0,0 @@ -// 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 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -// Regression test for #23827 - -#![feature(core, unboxed_closures)] - -pub struct Prototype { - pub target: u32 -} - -trait Component { - fn apply(self, e: u32); -} - -impl Fn<(C,)> for Prototype { - extern "rust-call" fn call(&self, (comp,): (C,)) -> Prototype { - comp.apply(self.target); - *self - } -} - -impl FnMut<(C,)> for Prototype { - extern "rust-call" fn call_mut(&mut self, (comp,): (C,)) -> Prototype { - Fn::call(*&self, (comp,)) - } -} - -impl FnOnce<(C,)> for Prototype { - //~^ ERROR E0046 - //~| NOTE missing `Output` in implementation - extern "rust-call" fn call_once(self, (comp,): (C,)) -> Prototype { - Fn::call(&self, (comp,)) - } -} - -fn main() {} diff --git a/src/test/compile-fail/issue-24356.rs b/src/test/compile-fail/issue-24356.rs deleted file mode 100644 index d39fd539dce..00000000000 --- a/src/test/compile-fail/issue-24356.rs +++ /dev/null @@ -1,40 +0,0 @@ -// 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 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -// Regression test for #24356 - -// ignore-tidy-linelength - -fn main() { - { - use std::ops::Deref; - - struct Thing(i8); - - /* - // Correct impl - impl Deref for Thing { - type Target = i8; - fn deref(&self) -> &i8 { &self.0 } - } - */ - - // Causes ICE - impl Deref for Thing { - //~^ ERROR E0046 - //~| NOTE missing `Target` in implementation - fn deref(&self) -> i8 { self.0 } - } - - let thing = Thing(72); - - *thing - }; -} diff --git a/src/test/run-make/missing-items/Makefile b/src/test/run-make/missing-items/Makefile new file mode 100644 index 00000000000..bcc9cdf2d65 --- /dev/null +++ b/src/test/run-make/missing-items/Makefile @@ -0,0 +1,10 @@ +-include ../tools.mk + +all: + $(RUSTC) m1.rs -C prefer-dynamic + $(RUSTC) m2.rs 2>&1 | grep "error\[E0046\]: not all trait items implemented, missing: .*" + $(RUSTC) m2.rs 2>&1 | grep " --> m2.rs:18:1" + $(RUSTC) m2.rs 2>&1 | grep " | ^ missing .CONSTANT., .Type., .method. in implementation" + $(RUSTC) m2.rs 2>&1 | grep " = note: .CONSTANT. from trait: .const CONSTANT: u32;." + $(RUSTC) m2.rs 2>&1 | grep " = note: .Type. from trait: .type Type;." + $(RUSTC) m2.rs 2>&1 | grep " = note: .method. from trait: .fn(&Self, std::string::String) -> ::Type." diff --git a/src/test/run-make/missing-items/m1.rs b/src/test/run-make/missing-items/m1.rs new file mode 100644 index 00000000000..060c7a9571b --- /dev/null +++ b/src/test/run-make/missing-items/m1.rs @@ -0,0 +1,17 @@ +// 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. + +#![feature(associated_consts)] +#![crate_type = "dylib"] +pub trait X { + const CONSTANT: u32; + type Type; + fn method(&self, s: String) -> Self::Type; +} diff --git a/src/test/run-make/missing-items/m2.rs b/src/test/run-make/missing-items/m2.rs new file mode 100644 index 00000000000..7055673acc9 --- /dev/null +++ b/src/test/run-make/missing-items/m2.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. + +#![feature(associated_consts)] +#![crate_type = "dylib"] +extern crate m1; + +struct X { +} + +impl m1::X for X { +} diff --git a/src/test/ui/span/E0046.rs b/src/test/ui/span/E0046.rs new file mode 100644 index 00000000000..9e757860a85 --- /dev/null +++ b/src/test/ui/span/E0046.rs @@ -0,0 +1,23 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +trait Foo { + fn foo(); + //~^ NOTE `foo` from trait +} + +struct Bar; + +impl Foo for Bar {} +//~^ ERROR E0046 +//~| NOTE missing `foo` in implementation + +fn main() { +} diff --git a/src/test/ui/span/E0046.stderr b/src/test/ui/span/E0046.stderr new file mode 100644 index 00000000000..729a5156124 --- /dev/null +++ b/src/test/ui/span/E0046.stderr @@ -0,0 +1,11 @@ +error[E0046]: not all trait items implemented, missing: `foo` + --> $DIR/E0046.rs:18:1 + | +12 | fn foo(); + | --------- `foo` from trait +... +18 | impl Foo for Bar {} + | ^^^^^^^^^^^^^^^^^^^ missing `foo` in implementation + +error: aborting due to previous error + diff --git a/src/test/ui/span/impl-wrong-item-for-trait.rs b/src/test/ui/span/impl-wrong-item-for-trait.rs new file mode 100644 index 00000000000..54ed42af5d5 --- /dev/null +++ b/src/test/ui/span/impl-wrong-item-for-trait.rs @@ -0,0 +1,56 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![feature(associated_consts)] + +use std::fmt::Debug; + +trait Foo { + fn bar(&self); + const MY_CONST: u32; +} + +pub struct FooConstForMethod; + +impl Foo for FooConstForMethod { + //~^ ERROR E0046 + //~| NOTE missing `bar` in implementation + const bar: u64 = 1; + //~^ ERROR E0323 + //~| NOTE does not match trait + const MY_CONST: u32 = 1; +} + +pub struct FooMethodForConst; + +impl Foo for FooMethodForConst { + //~^ ERROR E0046 + //~| NOTE missing `MY_CONST` in implementation + fn bar(&self) {} + fn MY_CONST() {} + //~^ ERROR E0324 + //~| NOTE does not match trait +} + +pub struct FooTypeForMethod; + +impl Foo for FooTypeForMethod { + //~^ ERROR E0046 + //~| NOTE missing `bar` in implementation + type bar = u64; + //~^ ERROR E0325 + //~| NOTE does not match trait + const MY_CONST: u32 = 1; +} + +impl Debug for FooTypeForMethod { +} + +fn main () {} diff --git a/src/test/ui/span/impl-wrong-item-for-trait.stderr b/src/test/ui/span/impl-wrong-item-for-trait.stderr new file mode 100644 index 00000000000..244285e3584 --- /dev/null +++ b/src/test/ui/span/impl-wrong-item-for-trait.stderr @@ -0,0 +1,64 @@ +error[E0323]: item `bar` is an associated const, which doesn't match its trait `` + --> $DIR/impl-wrong-item-for-trait.rs:25:5 + | +16 | fn bar(&self); + | -------------- item in trait +... +25 | const bar: u64 = 1; + | ^^^^^^^^^^^^^^^^^^^ does not match trait + +error[E0046]: not all trait items implemented, missing: `bar` + --> $DIR/impl-wrong-item-for-trait.rs:22:1 + | +16 | fn bar(&self); + | -------------- `bar` from trait +... +22 | impl Foo for FooConstForMethod { + | ^ missing `bar` in implementation + +error[E0324]: item `MY_CONST` is an associated method, which doesn't match its trait `` + --> $DIR/impl-wrong-item-for-trait.rs:37:5 + | +17 | const MY_CONST: u32; + | -------------------- item in trait +... +37 | fn MY_CONST() {} + | ^^^^^^^^^^^^^^^^ does not match trait + +error[E0046]: not all trait items implemented, missing: `MY_CONST` + --> $DIR/impl-wrong-item-for-trait.rs:33:1 + | +17 | const MY_CONST: u32; + | -------------------- `MY_CONST` from trait +... +33 | impl Foo for FooMethodForConst { + | ^ missing `MY_CONST` in implementation + +error[E0325]: item `bar` is an associated type, which doesn't match its trait `` + --> $DIR/impl-wrong-item-for-trait.rs:47:5 + | +16 | fn bar(&self); + | -------------- item in trait +... +47 | type bar = u64; + | ^^^^^^^^^^^^^^^ does not match trait + +error[E0046]: not all trait items implemented, missing: `bar` + --> $DIR/impl-wrong-item-for-trait.rs:44:1 + | +16 | fn bar(&self); + | -------------- `bar` from trait +... +44 | impl Foo for FooTypeForMethod { + | ^ missing `bar` in implementation + +error[E0046]: not all trait items implemented, missing: `fmt` + --> $DIR/impl-wrong-item-for-trait.rs:53:1 + | +53 | impl Debug for FooTypeForMethod { + | ^ missing `fmt` in implementation + | + = note: `fmt` from trait: `fn(&Self, &mut std::fmt::Formatter<'_>) -> std::result::Result<(), std::fmt::Error>` + +error: aborting due to 7 previous errors + diff --git a/src/test/ui/span/issue-23729.rs b/src/test/ui/span/issue-23729.rs new file mode 100644 index 00000000000..66134a03baf --- /dev/null +++ b/src/test/ui/span/issue-23729.rs @@ -0,0 +1,45 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Regression test for #23729 + +fn main() { + let fib = { + struct Recurrence { + mem: [u64; 2], + pos: usize, + } + + impl Iterator for Recurrence { + //~^ ERROR E0046 + //~| NOTE missing `Item` in implementation + //~| NOTE `Item` from trait: `type Item;` + #[inline] + fn next(&mut self) -> Option { + if self.pos < 2 { + let next_val = self.mem[self.pos]; + self.pos += 1; + Some(next_val) + } else { + let next_val = self.mem[0] + self.mem[1]; + self.mem[0] = self.mem[1]; + self.mem[1] = next_val; + Some(next_val) + } + } + } + + Recurrence { mem: [0, 1], pos: 0 } + }; + + for e in fib.take(10) { + println!("{}", e) + } +} diff --git a/src/test/ui/span/issue-23729.stderr b/src/test/ui/span/issue-23729.stderr new file mode 100644 index 00000000000..493ca01778b --- /dev/null +++ b/src/test/ui/span/issue-23729.stderr @@ -0,0 +1,10 @@ +error[E0046]: not all trait items implemented, missing: `Item` + --> $DIR/issue-23729.rs:20:9 + | +20 | impl Iterator for Recurrence { + | ^ missing `Item` in implementation + | + = note: `Item` from trait: `type Item;` + +error: aborting due to previous error + diff --git a/src/test/ui/span/issue-23827.rs b/src/test/ui/span/issue-23827.rs new file mode 100644 index 00000000000..a5ab443597b --- /dev/null +++ b/src/test/ui/span/issue-23827.rs @@ -0,0 +1,45 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Regression test for #23827 + +#![feature(core, unboxed_closures)] + +pub struct Prototype { + pub target: u32 +} + +trait Component { + fn apply(self, e: u32); +} + +impl Fn<(C,)> for Prototype { + extern "rust-call" fn call(&self, (comp,): (C,)) -> Prototype { + comp.apply(self.target); + *self + } +} + +impl FnMut<(C,)> for Prototype { + extern "rust-call" fn call_mut(&mut self, (comp,): (C,)) -> Prototype { + Fn::call(*&self, (comp,)) + } +} + +impl FnOnce<(C,)> for Prototype { + //~^ ERROR E0046 + //~| NOTE missing `Output` in implementation + //~| NOTE `Output` from trait: `type Output;` + extern "rust-call" fn call_once(self, (comp,): (C,)) -> Prototype { + Fn::call(&self, (comp,)) + } +} + +fn main() {} diff --git a/src/test/ui/span/issue-23827.stderr b/src/test/ui/span/issue-23827.stderr new file mode 100644 index 00000000000..5130bb53a19 --- /dev/null +++ b/src/test/ui/span/issue-23827.stderr @@ -0,0 +1,10 @@ +error[E0046]: not all trait items implemented, missing: `Output` + --> $DIR/issue-23827.rs:36:1 + | +36 | impl FnOnce<(C,)> for Prototype { + | ^ missing `Output` in implementation + | + = note: `Output` from trait: `type Output;` + +error: aborting due to previous error + diff --git a/src/test/ui/span/issue-24356.rs b/src/test/ui/span/issue-24356.rs new file mode 100644 index 00000000000..0997dc802f8 --- /dev/null +++ b/src/test/ui/span/issue-24356.rs @@ -0,0 +1,41 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Regression test for #24356 + +// ignore-tidy-linelength + +fn main() { + { + use std::ops::Deref; + + struct Thing(i8); + + /* + // Correct impl + impl Deref for Thing { + type Target = i8; + fn deref(&self) -> &i8 { &self.0 } + } + */ + + // Causes ICE + impl Deref for Thing { + //~^ ERROR E0046 + //~| NOTE missing `Target` in implementation + //~| NOTE `Target` from trait: `type Target;` + fn deref(&self) -> i8 { self.0 } + } + + let thing = Thing(72); + + *thing + }; +} diff --git a/src/test/ui/span/issue-24356.stderr b/src/test/ui/span/issue-24356.stderr new file mode 100644 index 00000000000..906ef25ca0e --- /dev/null +++ b/src/test/ui/span/issue-24356.stderr @@ -0,0 +1,10 @@ +error[E0046]: not all trait items implemented, missing: `Target` + --> $DIR/issue-24356.rs:30:9 + | +30 | impl Deref for Thing { + | ^ missing `Target` in implementation + | + = note: `Target` from trait: `type Target;` + +error: aborting due to previous error + -- cgit 1.4.1-3-g733a5