diff options
| author | bors <bors@rust-lang.org> | 2018-06-26 01:42:14 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2018-06-26 01:42:14 +0000 |
| commit | fdd9cdc8792d8fa4a64956c7d3263fa5ce18e335 (patch) | |
| tree | 34deb6049374a320b66e7ded0ce3704334bfcd32 /src/test | |
| parent | 2a1c4eec40527de45b9d9b81672c8b9220d554fc (diff) | |
| parent | cc60e01581d3bb290a2299a6c2474aa29bf6a15f (diff) | |
| download | rust-fdd9cdc8792d8fa4a64956c7d3263fa5ce18e335.tar.gz rust-fdd9cdc8792d8fa4a64956c7d3263fa5ce18e335.zip | |
Auto merge of #50966 - leodasvacas:self-in-where-clauses-is-not-object-safe, r=nikomatsakis
`Self` in where clauses may not be object safe Needs crater, virtually certain to cause regressions. In #50781 it was discovered that our object safety rules are not sound because we allow `Self` in where clauses without restrain. This PR is a direct fix to the rules so that we disallow methods with unsound where clauses. This currently uses hard error to measure impact, but we will want to downgrade it to a future compat error. Part of #50781. r? @nikomatsakis
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/compile-fail/issue-43431.rs | 2 | ||||
| -rw-r--r-- | src/test/compile-fail/wf-trait-fn-where-clause.rs | 2 | ||||
| -rw-r--r-- | src/test/run-pass/issue-23435.rs | 37 | ||||
| -rw-r--r-- | src/test/ui/issue-50781.rs | 29 | ||||
| -rw-r--r-- | src/test/ui/issue-50781.stderr | 17 |
5 files changed, 48 insertions, 39 deletions
diff --git a/src/test/compile-fail/issue-43431.rs b/src/test/compile-fail/issue-43431.rs index e9f62152888..1e6366e068a 100644 --- a/src/test/compile-fail/issue-43431.rs +++ b/src/test/compile-fail/issue-43431.rs @@ -11,7 +11,7 @@ #![feature(fn_traits)] trait CallSingle<A, B> { - fn call(&self, a: A) -> B where Self: Fn(A) -> B; + fn call(&self, a: A) -> B where Self: Sized, Self: Fn(A) -> B; } impl<A, B, F: Fn(A) -> B> CallSingle<A, B> for F { diff --git a/src/test/compile-fail/wf-trait-fn-where-clause.rs b/src/test/compile-fail/wf-trait-fn-where-clause.rs index f59dca93bb9..f46a54504a0 100644 --- a/src/test/compile-fail/wf-trait-fn-where-clause.rs +++ b/src/test/compile-fail/wf-trait-fn-where-clause.rs @@ -17,7 +17,7 @@ struct Bar<T:Eq+?Sized> { value: Box<T> } trait Foo { - fn bar(&self) where Bar<Self>: Copy; + fn bar(&self) where Self: Sized, Bar<Self>: Copy; //~^ ERROR E0277 // // Here, Eq ought to be implemented. diff --git a/src/test/run-pass/issue-23435.rs b/src/test/run-pass/issue-23435.rs deleted file mode 100644 index 9b727826e6d..00000000000 --- a/src/test/run-pass/issue-23435.rs +++ /dev/null @@ -1,37 +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 <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. - -// Test that we do not ICE when a default method implementation has -// requirements (in this case, `Self : Baz`) that do not hold for some -// specific impl (in this case, `Foo : Bar`). This causes problems -// only when building a vtable, because that goes along and -// instantiates all the methods, even those that could not otherwise -// be called. - -// pretty-expanded FIXME #23616 - -struct Foo { - x: i32 -} - -trait Bar { - fn bar(&self) where Self : Baz { self.baz(); } -} - -trait Baz { - fn baz(&self); -} - -impl Bar for Foo { -} - -fn main() { - let x: &Bar = &Foo { x: 22 }; -} diff --git a/src/test/ui/issue-50781.rs b/src/test/ui/issue-50781.rs new file mode 100644 index 00000000000..43830869da7 --- /dev/null +++ b/src/test/ui/issue-50781.rs @@ -0,0 +1,29 @@ +// Copyright 2018 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. + +#![deny(where_clauses_object_safety)] + +trait Trait {} + +trait X { + fn foo(&self) where Self: Trait; //~ ERROR the trait `X` cannot be made into an object + //~^ WARN this was previously accepted by the compiler but is being phased out +} + +impl X for () { + fn foo(&self) {} +} + +impl Trait for dyn X {} + +pub fn main() { + // Check that this does not segfault. + <X as X>::foo(&()); +} diff --git a/src/test/ui/issue-50781.stderr b/src/test/ui/issue-50781.stderr new file mode 100644 index 00000000000..047b847e67e --- /dev/null +++ b/src/test/ui/issue-50781.stderr @@ -0,0 +1,17 @@ +error: the trait `X` cannot be made into an object + --> $DIR/issue-50781.rs:16:5 + | +LL | fn foo(&self) where Self: Trait; //~ ERROR the trait `X` cannot be made into an object + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +note: lint level defined here + --> $DIR/issue-50781.rs:11:9 + | +LL | #![deny(where_clauses_object_safety)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #51443 <https://github.com/rust-lang/rust/issues/51443> + = note: method `foo` references the `Self` type in where clauses + +error: aborting due to previous error + |
