@@ -14,6 +14,7 @@ use rustc_data_structures::sso::SsoHashSet;
14
14
use rustc_data_structures:: sync:: Lrc ;
15
15
#[ cfg( feature = "nightly" ) ]
16
16
use rustc_macros:: { Decodable , Encodable , HashStable_NoContext } ;
17
+ use rustc_span:: ErrorGuaranteed ;
17
18
#[ cfg( not( feature = "nightly" ) ) ]
18
19
use std:: collections:: HashSet as SsoHashSet ;
19
20
use std:: fmt;
@@ -200,10 +201,16 @@ pub fn debug_bound_var<T: std::fmt::Write>(
200
201
#[ cfg_attr( feature = "nightly" , derive( Decodable , Encodable , Hash , HashStable_NoContext ) ) ]
201
202
#[ cfg_attr( feature = "nightly" , rustc_pass_by_value) ]
202
203
pub enum Variance {
203
- Covariant , // T<A> <: T<B> iff A <: B -- e.g., function return type
204
- Invariant , // T<A> <: T<B> iff B == A -- e.g., type of mutable cell
205
- Contravariant , // T<A> <: T<B> iff B <: A -- e.g., function param type
206
- Bivariant , // T<A> <: T<B> -- e.g., unused type parameter
204
+ /// T<A> <: T<B> iff A <: B -- e.g., function return type
205
+ Covariant ,
206
+ /// T<A> <: T<B> iff B == A -- e.g., type of mutable cell
207
+ Invariant ,
208
+ /// T<A> <: T<B> iff B <: A -- e.g., function param type
209
+ Contravariant ,
210
+ /// T<A> <: T<B> -- e.g., unused type parameter
211
+ Bivariant ,
212
+ /// Oddly named since these are all glob exported in various places in the compiler
213
+ Errvariant ( ErrorGuaranteed ) ,
207
214
}
208
215
209
216
impl Variance {
@@ -245,6 +252,10 @@ impl Variance {
245
252
/// Combining Definition- and Use-Site Variance" published in PLDI'11.
246
253
pub fn xform ( self , v : Variance ) -> Variance {
247
254
match ( self , v) {
255
+ ( Variance :: Errvariant ( guar) , _) | ( _, Variance :: Errvariant ( guar) ) => {
256
+ Variance :: Errvariant ( guar)
257
+ }
258
+
248
259
// Figure 1, column 1.
249
260
( Variance :: Covariant , Variance :: Covariant ) => Variance :: Covariant ,
250
261
( Variance :: Covariant , Variance :: Contravariant ) => Variance :: Contravariant ,
@@ -273,6 +284,7 @@ impl fmt::Debug for Variance {
273
284
Variance :: Contravariant => "-" ,
274
285
Variance :: Invariant => "o" ,
275
286
Variance :: Bivariant => "*" ,
287
+ Variance :: Errvariant ( _) => "{error}" ,
276
288
} )
277
289
}
278
290
}
0 commit comments