diff options
| author | Michael Goulet <michael@errs.io> | 2025-05-12 21:04:32 +0000 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2025-05-13 09:18:17 +0000 |
| commit | a508011b1f0ae84930e2bcd0f6261f7e8843db6d (patch) | |
| tree | 345ebffb58b3d4ac1018010d7f34480d47331bce | |
| parent | df1da673f75937a1a8ebd4ad09b5ffb244df6927 (diff) | |
| download | rust-a508011b1f0ae84930e2bcd0f6261f7e8843db6d.tar.gz rust-a508011b1f0ae84930e2bcd0f6261f7e8843db6d.zip | |
Expect deep norm to fail if query norm failed
| -rw-r--r-- | compiler/rustc_borrowck/src/type_check/liveness/trace.rs | 8 | ||||
| -rw-r--r-- | compiler/rustc_trait_selection/src/traits/query/dropck_outlives.rs | 22 |
2 files changed, 18 insertions, 12 deletions
diff --git a/compiler/rustc_borrowck/src/type_check/liveness/trace.rs b/compiler/rustc_borrowck/src/type_check/liveness/trace.rs index 7718644b9a9..512288a0f7d 100644 --- a/compiler/rustc_borrowck/src/type_check/liveness/trace.rs +++ b/compiler/rustc_borrowck/src/type_check/liveness/trace.rs @@ -621,13 +621,7 @@ impl<'tcx> LivenessContext<'_, '_, '_, 'tcx> { &ocx, op, span, ) { Ok(_) => ocx.select_all_or_error(), - Err(e) => { - if e.is_empty() { - ocx.select_all_or_error() - } else { - e - } - } + Err(e) => e, }; // Could have no errors if a type lowering error, say, caused the query diff --git a/compiler/rustc_trait_selection/src/traits/query/dropck_outlives.rs b/compiler/rustc_trait_selection/src/traits/query/dropck_outlives.rs index c82d5ca59ef..38cfdcdc22d 100644 --- a/compiler/rustc_trait_selection/src/traits/query/dropck_outlives.rs +++ b/compiler/rustc_trait_selection/src/traits/query/dropck_outlives.rs @@ -204,11 +204,23 @@ where return Err(errors); } - ocx.deeply_normalize(&cause, param_env, ty)?; - - let errors = ocx.select_where_possible(); - debug!("normalize errors: {ty} ~> {errors:#?}"); - return Err(errors); + // When query normalization fails, we don't get back an interesting + // reason that we could use to report an error in borrowck. In order to turn + // this into a reportable error, we deeply normalize again. We don't expect + // this to succeed, so delay a bug if it does. + match ocx.deeply_normalize(&cause, param_env, ty) { + Ok(_) => { + tcx.dcx().span_delayed_bug( + span, + format!( + "query normalize succeeded of {ty}, \ + but deep normalize failed", + ), + ); + ty + } + Err(errors) => return Err(errors), + } }; match ty.kind() { |
