@@ -192,20 +192,23 @@ impl<'cx, 'tcx> WritebackCx<'cx, 'tcx> {
192
192
// All valid indexing looks like this; might encounter non-valid indexes at this point.
193
193
let base_ty = tables. expr_ty_adjusted_opt ( & base) . map ( |t| & t. kind ) ;
194
194
if base_ty. is_none ( ) {
195
+ // When encountering `return [0][0]` outside of a `fn` body we can encounter a base
196
+ // that isn't in the type table. We assume more relevant errors have already been
197
+ // emitted, so we delay an ICE if none have. (#64638)
195
198
self . tcx ( ) . sess . delay_span_bug ( e. span , & format ! ( "bad base: `{:?}`" , base) ) ;
196
- return ;
197
199
}
198
200
if let Some ( ty:: Ref ( _, base_ty, _) ) = base_ty {
199
- let index_ty = match tables. expr_ty_adjusted_opt ( & index) {
200
- Some ( t) => t,
201
- None => {
202
- self . tcx ( ) . sess . delay_span_bug (
203
- e. span ,
204
- & format ! ( "bad index {:?} for base: `{:?}`" , index, base) ,
205
- ) ;
206
- self . fcx . tcx . types . err
207
- }
208
- } ;
201
+ let index_ty = tables. expr_ty_adjusted_opt ( & index) . unwrap_or_else ( || {
202
+ // When encountering `return [0][0]` outside of a `fn` body we would attempt
203
+ // to access an unexistend index. We assume that more relevant errors will
204
+ // already have been emitted, so we only gate on this with an ICE if no
205
+ // error has been emitted. (#64638)
206
+ self . tcx ( ) . sess . delay_span_bug (
207
+ e. span ,
208
+ & format ! ( "bad index {:?} for base: `{:?}`" , index, base) ,
209
+ ) ;
210
+ self . fcx . tcx . types . err
211
+ } ) ;
209
212
let index_ty = self . fcx . resolve_vars_if_possible ( & index_ty) ;
210
213
211
214
if base_ty. builtin_index ( ) . is_some ( ) && index_ty == self . fcx . tcx . types . usize {
0 commit comments