1
1
use super :: { builder:: ClauseBuilder , generalize} ;
2
2
use crate :: { Interner , RustIrDatabase , TraitRef , WellKnownTrait } ;
3
- use chalk_ir:: { Substitution , Ty } ;
3
+ use chalk_ir:: { Floundered , Substitution , Ty } ;
4
4
5
5
mod clone;
6
6
mod copy;
@@ -14,7 +14,7 @@ pub fn add_builtin_program_clauses<I: Interner>(
14
14
builder : & mut ClauseBuilder < ' _ , I > ,
15
15
well_known : WellKnownTrait ,
16
16
trait_ref : & TraitRef < I > ,
17
- ) {
17
+ ) -> Result < ( ) , Floundered > {
18
18
// If `trait_ref` contains bound vars, we want to universally quantify them.
19
19
// `Generalize` collects them for us.
20
20
let generalized = generalize:: Generalize :: apply ( db. interner ( ) , trait_ref) ;
@@ -26,20 +26,21 @@ pub fn add_builtin_program_clauses<I: Interner>(
26
26
if force_impl {
27
27
builder. push_fact ( trait_ref. clone ( ) ) ;
28
28
}
29
- return ;
29
+ return Ok ( ( ) ) ;
30
30
}
31
31
32
32
match well_known {
33
33
WellKnownTrait :: Sized => sized:: add_sized_program_clauses ( db, builder, & trait_ref, ty) ,
34
34
WellKnownTrait :: Copy => copy:: add_copy_program_clauses ( db, builder, & trait_ref, ty) ,
35
35
WellKnownTrait :: Clone => clone:: add_clone_program_clauses ( db, builder, & trait_ref, ty) ,
36
36
WellKnownTrait :: FnOnce | WellKnownTrait :: FnMut | WellKnownTrait :: Fn => {
37
- fn_family:: add_fn_trait_program_clauses ( db, builder, trait_ref. trait_id , self_ty)
37
+ fn_family:: add_fn_trait_program_clauses ( db, builder, trait_ref. trait_id , self_ty) ?
38
38
}
39
39
// Drop impls are provided explicitly
40
40
WellKnownTrait :: Drop => ( ) ,
41
41
}
42
- } ) ;
42
+ Ok ( ( ) )
43
+ } )
43
44
}
44
45
45
46
/// Like `add_builtin_program_clauses`, but for `DomainGoal::Normalize` involving
@@ -49,14 +50,15 @@ pub fn add_builtin_assoc_program_clauses<I: Interner>(
49
50
builder : & mut ClauseBuilder < ' _ , I > ,
50
51
well_known : WellKnownTrait ,
51
52
self_ty : Ty < I > ,
52
- ) {
53
+ ) -> Result < ( ) , Floundered > {
53
54
match well_known {
54
55
WellKnownTrait :: FnOnce => {
55
56
let trait_id = db. well_known_trait_id ( well_known) . unwrap ( ) ;
56
- fn_family:: add_fn_trait_program_clauses ( db, builder, trait_id, self_ty) ;
57
+ fn_family:: add_fn_trait_program_clauses ( db, builder, trait_id, self_ty) ? ;
57
58
}
58
59
_ => { }
59
60
}
61
+ Ok ( ( ) )
60
62
}
61
63
62
64
/// Given a trait ref `T0: Trait` and a list of types `U0..Un`, pushes a clause of the form
0 commit comments