@@ -194,33 +194,37 @@ impl<'tcx> UnifyValue for ConstVariableValue<'tcx> {
194194/// values for the effect inference variable
195195#[ derive( Clone , Copy , Debug ) ]
196196pub 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 > ) ,
202199}
203200
204201impl < ' tcx > EffectVarValue < ' tcx > {
205- pub fn as_const ( self , tcx : TyCtxt < ' tcx > ) -> ty:: Const < ' tcx > {
202+ pub fn known ( self ) -> Option < ty:: Const < ' tcx > > {
206203 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 ,
210213 }
211214 }
212215}
213216
214217impl < ' tcx > UnifyValue for EffectVarValue < ' tcx > {
215- type Error = ( EffectVarValue < ' tcx > , EffectVarValue < ' tcx > ) ;
218+ type Error = NoError ;
216219 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:?}" )
224228 }
225229 }
226230 }
@@ -229,7 +233,7 @@ impl<'tcx> UnifyValue for EffectVarValue<'tcx> {
229233#[ derive( PartialEq , Copy , Clone , Debug ) ]
230234pub struct EffectVidKey < ' tcx > {
231235 pub vid : ty:: EffectVid ,
232- pub phantom : PhantomData < EffectVarValue < ' tcx > > ,
236+ pub phantom : PhantomData < ty :: Const < ' tcx > > ,
233237}
234238
235239impl < ' tcx > From < ty:: EffectVid > for EffectVidKey < ' tcx > {
@@ -239,7 +243,7 @@ impl<'tcx> From<ty::EffectVid> for EffectVidKey<'tcx> {
239243}
240244
241245impl < ' tcx > UnifyKey for EffectVidKey < ' tcx > {
242- type Value = Option < EffectVarValue < ' tcx > > ;
246+ type Value = EffectVarValue < ' tcx > ;
243247 #[ inline]
244248 fn index ( & self ) -> u32 {
245249 self . vid . as_u32 ( )
0 commit comments