about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorAlexander Regueiro <alexreg@me.com>2019-05-19 22:26:42 +0100
committerAlexander Regueiro <alexreg@me.com>2019-05-20 16:12:49 +0100
commitce75a23c0d56764cef7c633139f01b80f040cd25 (patch)
tree064497e152499141f8ddf3d245d0b92a932a1865 /src
parenta0a61904f4b38c76fe32c7cda57626be94b9c65a (diff)
downloadrust-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.rs1
-rw-r--r--src/test/ui/maybe-bounds.rs5
-rw-r--r--src/test/ui/maybe-bounds.stderr14
-rw-r--r--src/test/ui/parser/trait-object-trait-parens.rs2
-rw-r--r--src/test/ui/parser/trait-object-trait-parens.stderr16
-rw-r--r--src/test/ui/traits/wf-trait-object-maybe-bound.rs7
-rw-r--r--src/test/ui/traits/wf-trait-object-maybe-bound.stderr32
-rw-r--r--src/test/ui/traits/wf-trait-object-only-maybe-bound.rs1
-rw-r--r--src/test/ui/traits/wf-trait-object-only-maybe-bound.stderr8
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