@@ -412,26 +412,36 @@ trait LowerWhereClauseVec<T> {
412
412
413
413
impl LowerWhereClauseVec < ir:: DomainGoal > for [ WhereClause ] {
414
414
fn lower ( & self , env : & Env ) -> Result < Vec < ir:: DomainGoal > > {
415
- self . iter ( ) . map ( |wc| wc. lower ( env) ) . collect ( )
415
+ self . iter ( )
416
+ . flat_map ( |wc| match wc. lower ( env) {
417
+ Ok ( v) => v. into_iter ( ) . map ( Ok ) . collect ( ) ,
418
+ Err ( e) => vec ! [ Err ( e) ] ,
419
+ } )
420
+ . collect ( )
416
421
}
417
422
}
418
423
419
424
impl LowerWhereClauseVec < ir:: QuantifiedDomainGoal > for [ QuantifiedWhereClause ] {
420
425
fn lower ( & self , env : & Env ) -> Result < Vec < ir:: QuantifiedDomainGoal > > {
421
- self . iter ( ) . map ( |wc| wc. lower ( env) ) . collect ( )
426
+ self . iter ( )
427
+ . flat_map ( |wc| match wc. lower ( env) {
428
+ Ok ( v) => v. into_iter ( ) . map ( Ok ) . collect ( ) ,
429
+ Err ( e) => vec ! [ Err ( e) ] ,
430
+ } )
431
+ . collect ( )
422
432
}
423
433
}
424
434
425
435
trait LowerWhereClause < T > {
426
- fn lower ( & self , env : & Env ) -> Result < T > ;
436
+ fn lower ( & self , env : & Env ) -> Result < Vec < T > > ;
427
437
}
428
438
429
439
/// Lowers a where-clause in the context of a clause (i.e. in "negative"
430
440
/// position); this is limited to the kinds of where-clauses users can actually
431
441
/// type in Rust and well-formedness checks.
432
442
impl LowerWhereClause < ir:: DomainGoal > for WhereClause {
433
- fn lower ( & self , env : & Env ) -> Result < ir:: DomainGoal > {
434
- Ok ( match self {
443
+ fn lower ( & self , env : & Env ) -> Result < Vec < ir:: DomainGoal > > {
444
+ let goal = match self {
435
445
WhereClause :: Implemented { trait_ref } => {
436
446
ir:: DomainGoal :: Holds ( ir:: WhereClauseAtom :: Implemented ( trait_ref. lower ( env) ?) )
437
447
}
@@ -478,17 +488,18 @@ impl LowerWhereClause<ir::DomainGoal> for WhereClause {
478
488
target : target. lower ( env) ?
479
489
} )
480
490
}
481
- } )
491
+ } ;
492
+ Ok ( vec ! [ goal] )
482
493
}
483
494
}
484
495
485
496
impl LowerWhereClause < ir:: QuantifiedDomainGoal > for QuantifiedWhereClause {
486
- fn lower ( & self , env : & Env ) -> Result < ir:: QuantifiedDomainGoal > {
497
+ fn lower ( & self , env : & Env ) -> Result < Vec < ir:: QuantifiedDomainGoal > > {
487
498
let parameter_kinds = self . parameter_kinds . iter ( ) . map ( |pk| pk. lower ( ) ) ;
488
499
let binders = env. in_binders ( parameter_kinds, |env| {
489
500
Ok ( self . where_clause . lower ( env) ?)
490
501
} ) ?;
491
- Ok ( binders)
502
+ Ok ( binders. into_iter ( ) . collect ( ) )
492
503
}
493
504
}
494
505
@@ -497,7 +508,7 @@ impl LowerWhereClause<ir::QuantifiedDomainGoal> for QuantifiedWhereClause {
497
508
/// can appear, because it includes all the sorts of things that the compiler
498
509
/// must verify.
499
510
impl LowerWhereClause < ir:: LeafGoal > for WhereClause {
500
- fn lower ( & self , env : & Env ) -> Result < ir:: LeafGoal > {
511
+ fn lower ( & self , env : & Env ) -> Result < Vec < ir:: LeafGoal > > {
501
512
Ok ( match * self {
502
513
WhereClause :: Implemented { .. }
503
514
| WhereClause :: ProjectionEq { .. }
@@ -507,17 +518,17 @@ impl LowerWhereClause<ir::LeafGoal> for WhereClause {
507
518
| WhereClause :: TyFromEnv { .. }
508
519
| WhereClause :: TraitRefFromEnv { .. }
509
520
| WhereClause :: Derefs { .. } => {
510
- let g : ir:: DomainGoal = self . lower ( env) ?;
511
- g . cast ( )
521
+ let goals : Vec < ir:: DomainGoal > = self . lower ( env) ?;
522
+ goals . into_iter ( ) . map ( |g| g . cast ( ) ) . collect ( )
512
523
}
513
- WhereClause :: UnifyTys { ref a, ref b } => ir:: EqGoal {
524
+ WhereClause :: UnifyTys { ref a, ref b } => vec ! [ ir:: EqGoal {
514
525
a: ir:: ParameterKind :: Ty ( a. lower( env) ?) ,
515
526
b: ir:: ParameterKind :: Ty ( b. lower( env) ?) ,
516
- } . cast ( ) ,
517
- WhereClause :: UnifyLifetimes { ref a, ref b } => ir:: EqGoal {
527
+ } . cast( ) ] ,
528
+ WhereClause :: UnifyLifetimes { ref a, ref b } => vec ! [ ir:: EqGoal {
518
529
a: ir:: ParameterKind :: Lifetime ( a. lower( env) ?) ,
519
530
b: ir:: ParameterKind :: Lifetime ( b. lower( env) ?) ,
520
- } . cast ( ) ,
531
+ } . cast( ) ] ,
521
532
WhereClause :: TraitInScope { trait_name } => {
522
533
let id = match env. lookup ( trait_name) ? {
523
534
NameLookup :: Type ( id) => id,
@@ -528,7 +539,7 @@ impl LowerWhereClause<ir::LeafGoal> for WhereClause {
528
539
bail ! ( ErrorKind :: NotTrait ( trait_name) ) ;
529
540
}
530
541
531
- ir:: DomainGoal :: InScope ( id) . cast ( )
542
+ vec ! [ ir:: DomainGoal :: InScope ( id) . cast( ) ]
532
543
}
533
544
} )
534
545
}
@@ -837,7 +848,10 @@ trait LowerClause {
837
848
impl LowerClause for Clause {
838
849
fn lower_clause ( & self , env : & Env ) -> Result < ir:: ProgramClause > {
839
850
let implication = env. in_binders ( self . all_parameters ( ) , |env| {
840
- let consequence: ir:: DomainGoal = self . consequence . lower ( env) ?;
851
+ let consequences: Vec < ir:: DomainGoal > = self . consequence . lower ( env) ?;
852
+ assert_eq ! ( 1 , consequences. len( ) ) ;
853
+ let consequence = consequences. into_iter ( ) . next ( ) . unwrap ( ) ;
854
+
841
855
let mut conditions: Vec < ir:: Goal > = self . conditions
842
856
. iter ( )
843
857
. map ( |g| g. lower ( env) . map ( |g| * g) )
@@ -976,7 +990,12 @@ impl<'k> LowerGoal<Env<'k>> for Goal {
976
990
Ok ( Box :: new ( ir:: Goal :: And ( g1. lower ( env) ?, g2. lower ( env) ?) ) )
977
991
}
978
992
Goal :: Not ( g) => Ok ( Box :: new ( ir:: Goal :: Not ( g. lower ( env) ?) ) ) ,
979
- Goal :: Leaf ( wc) => Ok ( Box :: new ( ir:: Goal :: Leaf ( wc. lower ( env) ?) ) ) ,
993
+ Goal :: Leaf ( wc) => {
994
+ let leaf = wc. lower ( env) ?;
995
+ assert_eq ! ( 1 , leaf. len( ) ) ;
996
+ let leaf = leaf. into_iter ( ) . next ( ) . unwrap ( ) ;
997
+ Ok ( Box :: new ( ir:: Goal :: Leaf ( leaf) ) )
998
+ }
980
999
}
981
1000
}
982
1001
}
0 commit comments