@@ -2,6 +2,7 @@ use self::builder::ClauseBuilder;
2
2
use self :: env_elaborator:: elaborate_env_clauses;
3
3
use self :: program_clauses:: ToProgramClauses ;
4
4
use crate :: goal_builder:: GoalBuilder ;
5
+ use crate :: rust_ir:: { Movability , WellKnownTrait } ;
5
6
use crate :: split:: Split ;
6
7
use crate :: RustIrDatabase ;
7
8
use chalk_ir:: cast:: { Cast , Caster } ;
@@ -149,12 +150,7 @@ pub fn push_auto_trait_impls<I: Interner>(
149
150
match ty {
150
151
// function-types implement auto traits unconditionally
151
152
TyKind :: Function ( _) => {
152
- let auto_trait_ref = TraitRef {
153
- trait_id : auto_trait_id,
154
- substitution : Substitution :: from1 ( interner, ty. clone ( ) . intern ( interner) ) ,
155
- } ;
156
-
157
- builder. push_fact ( auto_trait_ref) ;
153
+ builder. push_fact ( consequence) ;
158
154
Ok ( ( ) )
159
155
}
160
156
TyKind :: InferenceVar ( _, _) | TyKind :: BoundVar ( _) => Err ( Floundered ) ,
@@ -173,6 +169,21 @@ pub fn push_auto_trait_impls<I: Interner>(
173
169
} ) ;
174
170
Ok ( ( ) )
175
171
}
172
+ TyKind :: Generator ( generator_id, _) => {
173
+ if Some ( auto_trait_id) == builder. db . well_known_trait_id ( WellKnownTrait :: Unpin ) {
174
+ match builder. db . generator_datum ( * generator_id) . movability {
175
+ // immovable generators are never `Unpin`
176
+ Movability :: Static => ( ) ,
177
+ // movable generators are always `Unpin`
178
+ Movability :: Movable => builder. push_fact ( consequence) ,
179
+ }
180
+ } else {
181
+ // if trait is not `Unpin`, use regular auto trait clause
182
+ let conditions = constituent_types ( builder. db , ty) . into_iter ( ) . map ( mk_ref) ;
183
+ builder. push_clause ( consequence, conditions) ;
184
+ }
185
+ Ok ( ( ) )
186
+ }
176
187
177
188
TyKind :: GeneratorWitness ( generator_id, _) => {
178
189
push_auto_trait_impls_generator_witness ( builder, auto_trait_id, * generator_id) ;
0 commit comments