} else {
let path = self.parse_path(PathStyle::Type)?;
let parse_plus = allow_plus == AllowPlus::Yes && self.check_plus();
- self.parse_remaining_bounds(lifetime_defs, path, lo, parse_plus)?
+ self.parse_remaining_bounds_path(lifetime_defs, path, lo, parse_plus)?
}
} else if self.eat_keyword(kw::Impl) {
self.parse_impl_ty(&mut impl_dyn_multi)?
match ty.kind {
// `(TY_BOUND_NOPAREN) + BOUND + ...`.
TyKind::Path(None, path) if maybe_bounds => {
- self.parse_remaining_bounds(Vec::new(), path, lo, true)
+ self.parse_remaining_bounds_path(Vec::new(), path, lo, true)
}
- TyKind::TraitObject(mut bounds, TraitObjectSyntax::None)
+ TyKind::TraitObject(bounds, TraitObjectSyntax::None)
if maybe_bounds && bounds.len() == 1 && !trailing_plus =>
{
- let path = match bounds.remove(0) {
- GenericBound::Trait(pt, ..) => pt.trait_ref.path,
- GenericBound::Outlives(..) => {
- return Err(self.struct_span_err(
- ty.span,
- "expected trait bound, not lifetime bound",
- ));
- }
- };
- self.parse_remaining_bounds(Vec::new(), path, lo, true)
+ self.parse_remaining_bounds(bounds, true)
}
// `(TYPE)`
_ => Ok(TyKind::Paren(P(ty))),
}
}
- fn parse_remaining_bounds(
+ fn parse_remaining_bounds_path(
&mut self,
generic_params: Vec<GenericParam>,
path: ast::Path,
lo: Span,
parse_plus: bool,
) -> PResult<'a, TyKind> {
- assert_ne!(self.token, token::Question);
-
let poly_trait_ref = PolyTraitRef::new(generic_params, path, lo.to(self.prev_token.span));
- let mut bounds = vec![GenericBound::Trait(poly_trait_ref, TraitBoundModifier::None)];
- if parse_plus {
+ let bounds = vec![GenericBound::Trait(poly_trait_ref, TraitBoundModifier::None)];
+ self.parse_remaining_bounds(bounds, parse_plus)
+ }
+
+ /// Parse the remainder of a bare trait object type given an already parsed list.
+ fn parse_remaining_bounds(
+ &mut self,
+ mut bounds: GenericBounds,
+ plus: bool,
+ ) -> PResult<'a, TyKind> {
+ assert_ne!(self.token, token::Question);
+ if plus {
self.eat_plus(); // `+`, or `+=` gets split and `+` is discarded
bounds.append(&mut self.parse_generic_bounds(Some(self.prev_token.span))?);
}
}))
} else if allow_plus == AllowPlus::Yes && self.check_plus() {
// `Trait1 + Trait2 + 'a`
- self.parse_remaining_bounds(Vec::new(), path, lo, true)
+ self.parse_remaining_bounds_path(Vec::new(), path, lo, true)
} else {
// Just a type path.
Ok(TyKind::Path(None, path))
-type X = (?'a) +;
+fn main() {}
+
+type X<'a> = (?'a) +;
//~^ ERROR `?` may only modify trait bounds, not lifetime bounds
-//~| ERROR expected trait bound, not lifetime bound
+//~| ERROR at least one trait is required for an object type
+//~| WARN trait objects without an explicit `dyn` are deprecated
error: `?` may only modify trait bounds, not lifetime bounds
- --> $DIR/issue-68890-2.rs:1:11
+ --> $DIR/issue-68890-2.rs:3:15
|
-LL | type X = (?'a) +;
- | ^
+LL | type X<'a> = (?'a) +;
+ | ^
-error: expected trait bound, not lifetime bound
- --> $DIR/issue-68890-2.rs:1:11
+warning: trait objects without an explicit `dyn` are deprecated
+ --> $DIR/issue-68890-2.rs:3:14
|
-LL | type X = (?'a) +;
- | ^^^
+LL | type X<'a> = (?'a) +;
+ | ^^^^^^^ help: use `dyn`: `dyn (?'a) +`
+ |
+ = note: `#[warn(bare_trait_objects)]` on by default
+
+error[E0224]: at least one trait is required for an object type
+ --> $DIR/issue-68890-2.rs:3:14
+ |
+LL | type X<'a> = (?'a) +;
+ | ^^^^^^^
error: aborting due to 2 previous errors
enum e{A((?'a a+?+l))}
//~^ ERROR `?` may only modify trait bounds, not lifetime bounds
//~| ERROR expected one of `)`, `+`, or `,`
-//~| ERROR expected trait bound, not lifetime bound
+//~| ERROR expected item, found `)`
LL | enum e{A((?'a a+?+l))}
| ^ expected one of `)`, `+`, or `,`
-error: expected trait bound, not lifetime bound
- --> $DIR/issue-68890.rs:1:11
+error: expected item, found `)`
+ --> $DIR/issue-68890.rs:1:21
|
LL | enum e{A((?'a a+?+l))}
- | ^^^
+ | ^ expected item
error: aborting due to 3 previous errors
trait Trait<'a> {}
+trait Obj {}
+
fn f<T: (Copy) + (?Sized) + (for<'a> Trait<'a>)>() {}
fn main() {
- let _: Box<(Copy) + (?Sized) + (for<'a> Trait<'a>)>;
+ let _: Box<(Obj) + (?Sized) + (for<'a> Trait<'a>)>;
+ //~^ ERROR `?Trait` is not permitted in trait object types
+ //~| ERROR only auto traits can be used as additional traits
+ //~| WARN trait objects without an explicit `dyn` are deprecated
+ let _: Box<(?Sized) + (for<'a> Trait<'a>) + (Obj)>;
//~^ ERROR `?Trait` is not permitted in trait object types
+ //~| ERROR only auto traits can be used as additional traits
//~| WARN trait objects without an explicit `dyn` are deprecated
- let _: Box<(?Sized) + (for<'a> Trait<'a>) + (Copy)>;
- //~^ WARN trait objects without an explicit `dyn` are deprecated
- let _: Box<(for<'a> Trait<'a>) + (Copy) + (?Sized)>;
- //~^ ERROR use of undeclared lifetime name `'a`
- //~| ERROR `?Trait` is not permitted in trait object types
+ let _: Box<(for<'a> Trait<'a>) + (Obj) + (?Sized)>;
+ //~^ ERROR `?Trait` is not permitted in trait object types
+ //~| ERROR only auto traits can be used as additional traits
//~| WARN trait objects without an explicit `dyn` are deprecated
}
error: `?Trait` is not permitted in trait object types
- --> $DIR/trait-object-trait-parens.rs:6:25
+ --> $DIR/trait-object-trait-parens.rs:8:24
|
-LL | let _: Box<(Copy) + (?Sized) + (for<'a> Trait<'a>)>;
- | ^^^^^^^^
+LL | let _: Box<(Obj) + (?Sized) + (for<'a> Trait<'a>)>;
+ | ^^^^^^^^
error: `?Trait` is not permitted in trait object types
- --> $DIR/trait-object-trait-parens.rs:11:47
+ --> $DIR/trait-object-trait-parens.rs:12:17
|
-LL | let _: Box<(for<'a> Trait<'a>) + (Copy) + (?Sized)>;
- | ^^^^^^^^
+LL | let _: Box<(?Sized) + (for<'a> Trait<'a>) + (Obj)>;
+ | ^^^^^^
+
+error: `?Trait` is not permitted in trait object types
+ --> $DIR/trait-object-trait-parens.rs:16:46
+ |
+LL | let _: Box<(for<'a> Trait<'a>) + (Obj) + (?Sized)>;
+ | ^^^^^^^^
warning: trait objects without an explicit `dyn` are deprecated
- --> $DIR/trait-object-trait-parens.rs:6:16
+ --> $DIR/trait-object-trait-parens.rs:8:16
|
-LL | let _: Box<(Copy) + (?Sized) + (for<'a> Trait<'a>)>;
- | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `dyn`: `dyn (Copy) + (?Sized) + (for<'a> Trait<'a>)`
+LL | let _: Box<(Obj) + (?Sized) + (for<'a> Trait<'a>)>;
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `dyn`: `dyn (Obj) + (?Sized) + (for<'a> Trait<'a>)`
|
= note: `#[warn(bare_trait_objects)]` on by default
warning: trait objects without an explicit `dyn` are deprecated
- --> $DIR/trait-object-trait-parens.rs:9:16
+ --> $DIR/trait-object-trait-parens.rs:12:16
|
-LL | let _: Box<(?Sized) + (for<'a> Trait<'a>) + (Copy)>;
- | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `dyn`: `dyn (?Sized) + (for<'a> Trait<'a>) + (Copy)`
+LL | let _: Box<(?Sized) + (for<'a> Trait<'a>) + (Obj)>;
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `dyn`: `dyn (?Sized) + (for<'a> Trait<'a>) + (Obj)`
warning: trait objects without an explicit `dyn` are deprecated
- --> $DIR/trait-object-trait-parens.rs:11:16
+ --> $DIR/trait-object-trait-parens.rs:16:16
+ |
+LL | let _: Box<(for<'a> Trait<'a>) + (Obj) + (?Sized)>;
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `dyn`: `dyn (for<'a> Trait<'a>) + (Obj) + (?Sized)`
+
+error[E0225]: only auto traits can be used as additional traits in a trait object
+ --> $DIR/trait-object-trait-parens.rs:8:35
+ |
+LL | let _: Box<(Obj) + (?Sized) + (for<'a> Trait<'a>)>;
+ | ----- ^^^^^^^^^^^^^^^^^^^
+ | | |
+ | | additional non-auto trait
+ | | trait alias used in trait object type (additional use)
+ | first non-auto trait
+ | trait alias used in trait object type (first use)
+
+error[E0225]: only auto traits can be used as additional traits in a trait object
+ --> $DIR/trait-object-trait-parens.rs:12:49
|
-LL | let _: Box<(for<'a> Trait<'a>) + (Copy) + (?Sized)>;
- | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `dyn`: `dyn (for<'a> Trait<'a>) + (Copy) + (?Sized)`
+LL | let _: Box<(?Sized) + (for<'a> Trait<'a>) + (Obj)>;
+ | ------------------- ^^^^^
+ | | |
+ | | additional non-auto trait
+ | | trait alias used in trait object type (additional use)
+ | first non-auto trait
+ | trait alias used in trait object type (first use)
-error[E0261]: use of undeclared lifetime name `'a`
- --> $DIR/trait-object-trait-parens.rs:11:31
+error[E0225]: only auto traits can be used as additional traits in a trait object
+ --> $DIR/trait-object-trait-parens.rs:16:38
|
-LL | fn main() {
- | - help: consider introducing lifetime `'a` here: `<'a>`
-...
-LL | let _: Box<(for<'a> Trait<'a>) + (Copy) + (?Sized)>;
- | ^^ undeclared lifetime
+LL | let _: Box<(for<'a> Trait<'a>) + (Obj) + (?Sized)>;
+ | ----------------- ^^^^^
+ | | |
+ | | additional non-auto trait
+ | | trait alias used in trait object type (additional use)
+ | first non-auto trait
+ | trait alias used in trait object type (first use)
-error: aborting due to 3 previous errors
+error: aborting due to 6 previous errors
-For more information about this error, try `rustc --explain E0261`.
+For more information about this error, try `rustc --explain E0225`.