@@ -194,33 +194,37 @@ impl<'tcx> UnifyValue for ConstVariableValue<'tcx> {
194
194
/// values for the effect inference variable
195
195
#[ derive( Clone , Copy , Debug ) ]
196
196
pub enum EffectVarValue < ' tcx > {
197
- /// The host effect is on, enabling access to syscalls, filesystem access, etc.
198
- Host ,
199
- /// The host effect is off. Execution is restricted to const operations only.
200
- NoHost ,
201
- Const ( ty:: Const < ' tcx > ) ,
197
+ Unknown ,
198
+ Known ( ty:: Const < ' tcx > ) ,
202
199
}
203
200
204
201
impl < ' tcx > EffectVarValue < ' tcx > {
205
- pub fn as_const ( self , tcx : TyCtxt < ' tcx > ) -> ty:: Const < ' tcx > {
202
+ pub fn known ( self ) -> Option < ty:: Const < ' tcx > > {
206
203
match self {
207
- EffectVarValue :: Host => tcx. consts . true_ ,
208
- EffectVarValue :: NoHost => tcx. consts . false_ ,
209
- EffectVarValue :: Const ( c) => c,
204
+ EffectVarValue :: Unknown => None ,
205
+ EffectVarValue :: Known ( value) => Some ( value) ,
206
+ }
207
+ }
208
+
209
+ pub fn is_unknown ( self ) -> bool {
210
+ match self {
211
+ EffectVarValue :: Unknown => true ,
212
+ EffectVarValue :: Known ( _) => false ,
210
213
}
211
214
}
212
215
}
213
216
214
217
impl < ' tcx > UnifyValue for EffectVarValue < ' tcx > {
215
- type Error = ( EffectVarValue < ' tcx > , EffectVarValue < ' tcx > ) ;
218
+ type Error = NoError ;
216
219
fn unify_values ( value1 : & Self , value2 : & Self ) -> Result < Self , Self :: Error > {
217
- match ( value1, value2) {
218
- ( EffectVarValue :: Host , EffectVarValue :: Host ) => Ok ( EffectVarValue :: Host ) ,
219
- ( EffectVarValue :: NoHost , EffectVarValue :: NoHost ) => Ok ( EffectVarValue :: NoHost ) ,
220
- ( EffectVarValue :: NoHost | EffectVarValue :: Host , _)
221
- | ( _, EffectVarValue :: NoHost | EffectVarValue :: Host ) => Err ( ( * value1, * value2) ) ,
222
- ( EffectVarValue :: Const ( _) , EffectVarValue :: Const ( _) ) => {
223
- bug ! ( "equating two const variables, both of which have known values" )
220
+ match ( * value1, * value2) {
221
+ ( EffectVarValue :: Unknown , EffectVarValue :: Unknown ) => Ok ( EffectVarValue :: Unknown ) ,
222
+ ( EffectVarValue :: Unknown , EffectVarValue :: Known ( val) )
223
+ | ( EffectVarValue :: Known ( val) , EffectVarValue :: Unknown ) => {
224
+ Ok ( EffectVarValue :: Known ( val) )
225
+ }
226
+ ( EffectVarValue :: Known ( _) , EffectVarValue :: Known ( _) ) => {
227
+ bug ! ( "equating known inference variables: {value1:?} {value2:?}" )
224
228
}
225
229
}
226
230
}
@@ -229,7 +233,7 @@ impl<'tcx> UnifyValue for EffectVarValue<'tcx> {
229
233
#[ derive( PartialEq , Copy , Clone , Debug ) ]
230
234
pub struct EffectVidKey < ' tcx > {
231
235
pub vid : ty:: EffectVid ,
232
- pub phantom : PhantomData < EffectVarValue < ' tcx > > ,
236
+ pub phantom : PhantomData < ty :: Const < ' tcx > > ,
233
237
}
234
238
235
239
impl < ' tcx > From < ty:: EffectVid > for EffectVidKey < ' tcx > {
@@ -239,7 +243,7 @@ impl<'tcx> From<ty::EffectVid> for EffectVidKey<'tcx> {
239
243
}
240
244
241
245
impl < ' tcx > UnifyKey for EffectVidKey < ' tcx > {
242
- type Value = Option < EffectVarValue < ' tcx > > ;
246
+ type Value = EffectVarValue < ' tcx > ;
243
247
#[ inline]
244
248
fn index ( & self ) -> u32 {
245
249
self . vid . as_u32 ( )
0 commit comments