diff options
| author | Alexander Regueiro <alexreg@me.com> | 2019-05-19 22:26:42 +0100 |
|---|---|---|
| committer | Alexander Regueiro <alexreg@me.com> | 2019-05-20 16:12:49 +0100 |
| commit | ce75a23c0d56764cef7c633139f01b80f040cd25 (patch) | |
| tree | 064497e152499141f8ddf3d245d0b92a932a1865 /src | |
| parent | a0a61904f4b38c76fe32c7cda57626be94b9c65a (diff) | |
| download | rust-ce75a23c0d56764cef7c633139f01b80f040cd25.tar.gz rust-ce75a23c0d56764cef7c633139f01b80f040cd25.zip | |
Reinstated shallow disallowing of maybe bounds in trait objects.
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc_passes/ast_validation.rs | 1 | ||||
| -rw-r--r-- | src/test/ui/maybe-bounds.rs | 5 | ||||
| -rw-r--r-- | src/test/ui/maybe-bounds.stderr | 14 | ||||
| -rw-r--r-- | src/test/ui/parser/trait-object-trait-parens.rs | 2 | ||||
| -rw-r--r-- | src/test/ui/parser/trait-object-trait-parens.stderr | 16 | ||||
| -rw-r--r-- | src/test/ui/traits/wf-trait-object-maybe-bound.rs | 7 | ||||
| -rw-r--r-- | src/test/ui/traits/wf-trait-object-maybe-bound.stderr | 32 | ||||
| -rw-r--r-- | src/test/ui/traits/wf-trait-object-only-maybe-bound.rs | 1 | ||||
| -rw-r--r-- | src/test/ui/traits/wf-trait-object-only-maybe-bound.stderr | 8 |
9 files changed, 80 insertions, 6 deletions
diff --git a/src/librustc_passes/ast_validation.rs b/src/librustc_passes/ast_validation.rs index d70c8185495..2bea1db841a 100644 --- a/src/librustc_passes/ast_validation.rs +++ b/src/librustc_passes/ast_validation.rs @@ -504,6 +504,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> { any_lifetime_bounds = true; } } + self.no_questions_in_bounds(bounds, "trait object types", false); } TyKind::ImplTrait(_, ref bounds) => { if self.is_impl_trait_banned { diff --git a/src/test/ui/maybe-bounds.rs b/src/test/ui/maybe-bounds.rs index 95d14f6d1da..02ed45c656f 100644 --- a/src/test/ui/maybe-bounds.rs +++ b/src/test/ui/maybe-bounds.rs @@ -1,6 +1,9 @@ -trait Tr: ?Sized {} //~ ERROR `?Trait` is not permitted in supertraits +trait Tr: ?Sized {} +//~^ ERROR `?Trait` is not permitted in supertraits type A1 = dyn Tr + (?Sized); +//~^ ERROR `?Trait` is not permitted in trait object types type A2 = dyn for<'a> Tr + (?Sized); +//~^ ERROR `?Trait` is not permitted in trait object types fn main() {} diff --git a/src/test/ui/maybe-bounds.stderr b/src/test/ui/maybe-bounds.stderr index d8c2adfc61c..1d823b6acb2 100644 --- a/src/test/ui/maybe-bounds.stderr +++ b/src/test/ui/maybe-bounds.stderr @@ -6,5 +6,17 @@ LL | trait Tr: ?Sized {} | = note: traits are `?Sized` by default -error: aborting due to previous error +error: `?Trait` is not permitted in trait object types + --> $DIR/maybe-bounds.rs:4:20 + | +LL | type A1 = dyn Tr + (?Sized); + | ^^^^^^^^ + +error: `?Trait` is not permitted in trait object types + --> $DIR/maybe-bounds.rs:6:28 + | +LL | type A2 = dyn for<'a> Tr + (?Sized); + | ^^^^^^^^ + +error: aborting due to 3 previous errors diff --git a/src/test/ui/parser/trait-object-trait-parens.rs b/src/test/ui/parser/trait-object-trait-parens.rs index 49373564f67..9ac10cd1327 100644 --- a/src/test/ui/parser/trait-object-trait-parens.rs +++ b/src/test/ui/parser/trait-object-trait-parens.rs @@ -4,7 +4,9 @@ fn f<T: (Copy) + (?Sized) + (for<'a> Trait<'a>)>() {} fn main() { let _: Box<(Copy) + (?Sized) + (for<'a> Trait<'a>)>; + //~^ ERROR `?Trait` is not permitted in trait object types let _: Box<(?Sized) + (for<'a> Trait<'a>) + (Copy)>; let _: Box<(for<'a> Trait<'a>) + (Copy) + (?Sized)>; //~^ ERROR use of undeclared lifetime name `'a` + //~| ERROR `?Trait` is not permitted in trait object types } diff --git a/src/test/ui/parser/trait-object-trait-parens.stderr b/src/test/ui/parser/trait-object-trait-parens.stderr index 1cf40b30406..36494b76539 100644 --- a/src/test/ui/parser/trait-object-trait-parens.stderr +++ b/src/test/ui/parser/trait-object-trait-parens.stderr @@ -1,9 +1,21 @@ +error: `?Trait` is not permitted in trait object types + --> $DIR/trait-object-trait-parens.rs:6:25 + | +LL | let _: Box<(Copy) + (?Sized) + (for<'a> Trait<'a>)>; + | ^^^^^^^^ + +error: `?Trait` is not permitted in trait object types + --> $DIR/trait-object-trait-parens.rs:9:47 + | +LL | let _: Box<(for<'a> Trait<'a>) + (Copy) + (?Sized)>; + | ^^^^^^^^ + error[E0261]: use of undeclared lifetime name `'a` - --> $DIR/trait-object-trait-parens.rs:8:31 + --> $DIR/trait-object-trait-parens.rs:9:31 | LL | let _: Box<(for<'a> Trait<'a>) + (Copy) + (?Sized)>; | ^^ undeclared lifetime -error: aborting due to previous error +error: aborting due to 3 previous errors For more information about this error, try `rustc --explain E0261`. diff --git a/src/test/ui/traits/wf-trait-object-maybe-bound.rs b/src/test/ui/traits/wf-trait-object-maybe-bound.rs index 405104fe081..f24c1301c53 100644 --- a/src/test/ui/traits/wf-trait-object-maybe-bound.rs +++ b/src/test/ui/traits/wf-trait-object-maybe-bound.rs @@ -1,15 +1,20 @@ -// compile-pass +// compile-fail // Test that `dyn ... + ?Sized + ...` is okay (though `?Sized` has no effect in trait objects). trait Foo {} type _0 = dyn ?Sized + Foo; +//~^ ERROR `?Trait` is not permitted in trait object types type _1 = dyn Foo + ?Sized; +//~^ ERROR `?Trait` is not permitted in trait object types type _2 = dyn Foo + ?Sized + ?Sized; +//~^ ERROR `?Trait` is not permitted in trait object types +//~| ERROR `?Trait` is not permitted in trait object types type _3 = dyn ?Sized + Foo; +//~^ ERROR `?Trait` is not permitted in trait object types fn main() {} diff --git a/src/test/ui/traits/wf-trait-object-maybe-bound.stderr b/src/test/ui/traits/wf-trait-object-maybe-bound.stderr new file mode 100644 index 00000000000..11187342d59 --- /dev/null +++ b/src/test/ui/traits/wf-trait-object-maybe-bound.stderr @@ -0,0 +1,32 @@ +error: `?Trait` is not permitted in trait object types + --> $DIR/wf-trait-object-maybe-bound.rs:7:15 + | +LL | type _0 = dyn ?Sized + Foo; + | ^^^^^^ + +error: `?Trait` is not permitted in trait object types + --> $DIR/wf-trait-object-maybe-bound.rs:10:21 + | +LL | type _1 = dyn Foo + ?Sized; + | ^^^^^^ + +error: `?Trait` is not permitted in trait object types + --> $DIR/wf-trait-object-maybe-bound.rs:13:21 + | +LL | type _2 = dyn Foo + ?Sized + ?Sized; + | ^^^^^^ + +error: `?Trait` is not permitted in trait object types + --> $DIR/wf-trait-object-maybe-bound.rs:13:30 + | +LL | type _2 = dyn Foo + ?Sized + ?Sized; + | ^^^^^^ + +error: `?Trait` is not permitted in trait object types + --> $DIR/wf-trait-object-maybe-bound.rs:17:15 + | +LL | type _3 = dyn ?Sized + Foo; + | ^^^^^^ + +error: aborting due to 5 previous errors + diff --git a/src/test/ui/traits/wf-trait-object-only-maybe-bound.rs b/src/test/ui/traits/wf-trait-object-only-maybe-bound.rs index c8e6ac38b5a..1b83d2487f4 100644 --- a/src/test/ui/traits/wf-trait-object-only-maybe-bound.rs +++ b/src/test/ui/traits/wf-trait-object-only-maybe-bound.rs @@ -2,5 +2,6 @@ type _0 = dyn ?Sized; //~^ ERROR at least one non-builtin trait is required for an object type [E0224] +//~| ERROR ?Trait` is not permitted in trait object types fn main() {} diff --git a/src/test/ui/traits/wf-trait-object-only-maybe-bound.stderr b/src/test/ui/traits/wf-trait-object-only-maybe-bound.stderr index 7a5080bbd0c..0cfb389fd89 100644 --- a/src/test/ui/traits/wf-trait-object-only-maybe-bound.stderr +++ b/src/test/ui/traits/wf-trait-object-only-maybe-bound.stderr @@ -1,8 +1,14 @@ +error: `?Trait` is not permitted in trait object types + --> $DIR/wf-trait-object-only-maybe-bound.rs:3:15 + | +LL | type _0 = dyn ?Sized; + | ^^^^^^ + error[E0224]: at least one non-builtin trait is required for an object type --> $DIR/wf-trait-object-only-maybe-bound.rs:3:11 | LL | type _0 = dyn ?Sized; | ^^^^^^^^^^ -error: aborting due to previous error +error: aborting due to 2 previous errors |
