@@ -167,7 +167,7 @@ impl<'tcx> InferCtxt<'tcx> {
167167 //
168168 // This probe is probably not strictly necessary but it seems better to be safe and not accidentally find
169169 // ourselves with a check to find bugs being required for code to compile because it made inference progress.
170- let compatible_types = self . probe ( |_| {
170+ self . probe ( |_| {
171171 if a. ty ( ) == b. ty ( ) {
172172 return Ok ( ( ) ) ;
173173 }
@@ -179,31 +179,18 @@ impl<'tcx> InferCtxt<'tcx> {
179179 relation. param_env ( ) . and ( ( a. ty ( ) , b. ty ( ) ) ) ,
180180 & mut OriginalQueryValues :: default ( ) ,
181181 ) ;
182- self . tcx . check_tys_might_be_eq ( canonical) . map_err ( |_| {
182+ self . tcx . check_tys_might_be_eq ( canonical) . unwrap_or_else ( |_| {
183+ // The error will only be reported later. If we emit an ErrorGuaranteed
184+ // here, then we will never get to the code that actually emits the error.
183185 self . tcx . dcx ( ) . delayed_bug ( format ! (
184186 "cannot relate consts of different types (a={a:?}, b={b:?})" ,
185- ) )
186- } )
187- } ) ;
188-
189- // If the consts have differing types, just bail with a const error with
190- // the expected const's type. Specifically, we don't want const infer vars
191- // to do any type shapeshifting before and after resolution.
192- if let Err ( guar) = compatible_types {
193- // HACK: equating both sides with `[const error]` eagerly prevents us
194- // from leaving unconstrained inference vars during things like impl
195- // matching in the solver.
196- let a_error = ty:: Const :: new_error ( self . tcx , guar, a. ty ( ) ) ;
197- if let ty:: ConstKind :: Infer ( InferConst :: Var ( vid) ) = a. kind ( ) {
198- return self . unify_const_variable ( vid, a_error, relation. param_env ( ) ) ;
199- }
200- let b_error = ty:: Const :: new_error ( self . tcx , guar, b. ty ( ) ) ;
201- if let ty:: ConstKind :: Infer ( InferConst :: Var ( vid) ) = b. kind ( ) {
202- return self . unify_const_variable ( vid, b_error, relation. param_env ( ) ) ;
203- }
204-
205- return Ok ( if relation. a_is_expected ( ) { a_error } else { b_error } ) ;
206- }
187+ ) ) ;
188+ // We treat these constants as if they were of the same type, so that any
189+ // such constants being used in impls make these impls match barring other mismatches.
190+ // This helps with diagnostics down the road.
191+ } ) ;
192+ Ok ( ( ) )
193+ } ) ?;
207194
208195 match ( a. kind ( ) , b. kind ( ) ) {
209196 (
0 commit comments