@@ -1365,18 +1365,15 @@ impl<'a> Parser<'a> {
13651365 match ty. node {
13661366 // `(TY_BOUND_NOPAREN) + BOUND + ...`.
13671367 TyKind :: Path ( None , ref path) if maybe_bounds => {
1368- self . bump ( ) ; // `+`
1369- let pt = PolyTraitRef :: new ( Vec :: new ( ) , path. clone ( ) , lo. to ( self . prev_span ) ) ;
1370- let mut bounds = vec ! [ TraitTyParamBound ( pt, TraitBoundModifier :: None ) ] ;
1371- bounds. append ( & mut self . parse_ty_param_bounds ( ) ?) ;
1372- TyKind :: TraitObject ( bounds)
1368+ self . parse_remaining_bounds ( Vec :: new ( ) , path. clone ( ) , lo, true ) ?
13731369 }
13741370 TyKind :: TraitObject ( ref bounds)
13751371 if maybe_bounds && bounds. len ( ) == 1 && !trailing_plus => {
1376- self . bump ( ) ; // `+`
1377- let mut bounds = bounds. clone ( ) ;
1378- bounds. append ( & mut self . parse_ty_param_bounds ( ) ?) ;
1379- TyKind :: TraitObject ( bounds)
1372+ let path = match bounds[ 0 ] {
1373+ TraitTyParamBound ( ref pt, ..) => pt. trait_ref . path . clone ( ) ,
1374+ _ => self . bug ( "unexpected lifetime bound" ) ,
1375+ } ;
1376+ self . parse_remaining_bounds ( Vec :: new ( ) , path, lo, true ) ?
13801377 }
13811378 // `(TYPE)`
13821379 _ => TyKind :: Paren ( P ( ty) )
@@ -1429,11 +1426,8 @@ impl<'a> Parser<'a> {
14291426 // Just a type path or bound list (trait object type) starting with a trait.
14301427 // `Type`
14311428 // `Trait1 + Trait2 + 'a`
1432- if allow_plus && self . eat ( & token:: BinOp ( token:: Plus ) ) {
1433- let poly_trait = PolyTraitRef :: new ( Vec :: new ( ) , path, lo. to ( self . prev_span ) ) ;
1434- let mut bounds = vec ! [ TraitTyParamBound ( poly_trait, TraitBoundModifier :: None ) ] ;
1435- bounds. append ( & mut self . parse_ty_param_bounds ( ) ?) ;
1436- TyKind :: TraitObject ( bounds)
1429+ if allow_plus && self . check ( & token:: BinOp ( token:: Plus ) ) {
1430+ self . parse_remaining_bounds ( Vec :: new ( ) , path, lo, true ) ?
14371431 } else {
14381432 TyKind :: Path ( None , path)
14391433 }
@@ -1451,12 +1445,8 @@ impl<'a> Parser<'a> {
14511445 self . parse_ty_bare_fn ( lifetime_defs) ?
14521446 } else {
14531447 let path = self . parse_path ( PathStyle :: Type ) ?;
1454- let poly_trait = PolyTraitRef :: new ( lifetime_defs, path, lo. to ( self . prev_span ) ) ;
1455- let mut bounds = vec ! [ TraitTyParamBound ( poly_trait, TraitBoundModifier :: None ) ] ;
1456- if allow_plus && self . eat ( & token:: BinOp ( token:: Plus ) ) {
1457- bounds. append ( & mut self . parse_ty_param_bounds ( ) ?)
1458- }
1459- TyKind :: TraitObject ( bounds)
1448+ let parse_plus = allow_plus && self . check ( & token:: BinOp ( token:: Plus ) ) ;
1449+ self . parse_remaining_bounds ( lifetime_defs, path, lo, parse_plus) ?
14601450 }
14611451 } else if self . eat_keyword ( keywords:: Impl ) {
14621452 // FIXME: figure out priority of `+` in `impl Trait1 + Trait2` (#34511).
@@ -1479,6 +1469,17 @@ impl<'a> Parser<'a> {
14791469 Ok ( P ( ty) )
14801470 }
14811471
1472+ fn parse_remaining_bounds ( & mut self , lifetime_defs : Vec < LifetimeDef > , path : ast:: Path ,
1473+ lo : Span , parse_plus : bool ) -> PResult < ' a , TyKind > {
1474+ let poly_trait_ref = PolyTraitRef :: new ( lifetime_defs, path, lo. to ( self . prev_span ) ) ;
1475+ let mut bounds = vec ! [ TraitTyParamBound ( poly_trait_ref, TraitBoundModifier :: None ) ] ;
1476+ if parse_plus {
1477+ self . bump ( ) ; // `+`
1478+ bounds. append ( & mut self . parse_ty_param_bounds ( ) ?) ;
1479+ }
1480+ Ok ( TyKind :: TraitObject ( bounds) )
1481+ }
1482+
14821483 fn maybe_recover_from_bad_type_plus ( & mut self , allow_plus : bool , ty : & Ty ) -> PResult < ' a , ( ) > {
14831484 // Do not add `+` to expected tokens.
14841485 if !allow_plus || self . token != token:: BinOp ( token:: Plus ) {
0 commit comments