diff options
| author | leonardo.yvens <leoyvens@gmail.com> | 2018-05-22 12:09:35 -0300 |
|---|---|---|
| committer | Leonardo Yvens Schwarzstein <leoyvens@gmail.com> | 2018-06-25 06:56:06 -0300 |
| commit | 1453b3a67dfe73329e07c17cd07b55bd71d7350b (patch) | |
| tree | dce085a2168fd11868090576a044d9177a82a45d /src/test | |
| parent | 5f9c7f9e6d069e62027e168da557625d0b518f3e (diff) | |
| download | rust-1453b3a67dfe73329e07c17cd07b55bd71d7350b.tar.gz rust-1453b3a67dfe73329e07c17cd07b55bd71d7350b.zip | |
`Self` in where clauses may not be object safe
This is virtually certain to cause regressions, needs crater. 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. Fixes #50781. r? @nikomatsakis
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/run-pass/issue-23435.rs | 37 | ||||
| -rw-r--r-- | src/test/ui/issue-50781.rs | 27 | ||||
| -rw-r--r-- | src/test/ui/issue-50781.stderr | 11 |
3 files changed, 38 insertions, 37 deletions
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..3974fd54cf6 --- /dev/null +++ b/src/test/ui/issue-50781.rs @@ -0,0 +1,27 @@ +// 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. + +trait Trait {} + +trait X { + fn foo(&self) where Self: Trait; +} + +impl X for () { + fn foo(&self) {} +} + +impl Trait for dyn X {} +//~^ ERROR the trait `X` cannot be made into an object + +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..34d7303a9a5 --- /dev/null +++ b/src/test/ui/issue-50781.stderr @@ -0,0 +1,11 @@ +error[E0038]: the trait `X` cannot be made into an object + --> $DIR/issue-50781.rs:21:6 + | +LL | impl Trait for dyn X {} + | ^^^^^ the trait `X` cannot be made into an object + | + = note: method `foo` references the `Self` type in its arguments or return type + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0038`. |
