From daac3ef4f5c8bbd453de85df17df5cac0f09fcd6 Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Mon, 17 Jun 2024 14:03:26 +1000 Subject: [PATCH] Convert a `span_bug` to a `span_delayed_bug`. PR #121208 converted this from a `span_delayed_bug` to a `span_bug` because nothing in the test suite caused execution to hit this path. But now fuzzing has found a test case that does hit it. So this commit converts it back to `span_delayed_bug` and adds the relevant test. Fixes #126385. --- .../src/diagnostics/region_name.rs | 4 +-- .../issue-126385-unmatched-arg-and-hir-arg.rs | 11 ++++++ ...ue-126385-unmatched-arg-and-hir-arg.stderr | 34 +++++++++++++++++++ 3 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 tests/ui/borrowck/issue-126385-unmatched-arg-and-hir-arg.rs create mode 100644 tests/ui/borrowck/issue-126385-unmatched-arg-and-hir-arg.stderr diff --git a/compiler/rustc_borrowck/src/diagnostics/region_name.rs b/compiler/rustc_borrowck/src/diagnostics/region_name.rs index 2cf548e28b18a..77fb9fb431518 100644 --- a/compiler/rustc_borrowck/src/diagnostics/region_name.rs +++ b/compiler/rustc_borrowck/src/diagnostics/region_name.rs @@ -628,9 +628,7 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> { | GenericArgKind::Const(_), _, ) => { - // This was previously a `span_delayed_bug` and could be - // reached by the test for #82126, but no longer. - self.dcx().span_bug( + self.dcx().span_delayed_bug( hir_arg.span(), format!("unmatched arg and hir arg: found {kind:?} vs {hir_arg:?}"), ); diff --git a/tests/ui/borrowck/issue-126385-unmatched-arg-and-hir-arg.rs b/tests/ui/borrowck/issue-126385-unmatched-arg-and-hir-arg.rs new file mode 100644 index 0000000000000..2c260e10c5afd --- /dev/null +++ b/tests/ui/borrowck/issue-126385-unmatched-arg-and-hir-arg.rs @@ -0,0 +1,11 @@ +pub struct MyStruct<'field> { + field: &'field [u32], +} + +impl MyStruct<'_> { + pub fn f(field: &[u32]) -> Self { //~ ERROR type arguments are not allowed on self type + Self { field } //~ ERROR lifetime may not live long enough + } +} + +fn main() {} diff --git a/tests/ui/borrowck/issue-126385-unmatched-arg-and-hir-arg.stderr b/tests/ui/borrowck/issue-126385-unmatched-arg-and-hir-arg.stderr new file mode 100644 index 0000000000000..60d7567f83779 --- /dev/null +++ b/tests/ui/borrowck/issue-126385-unmatched-arg-and-hir-arg.stderr @@ -0,0 +1,34 @@ +error[E0109]: type arguments are not allowed on self type + --> $DIR/issue-126385-unmatched-arg-and-hir-arg.rs:6:37 + | +LL | pub fn f(field: &[u32]) -> Self { + | ---- ^^^ type argument not allowed + | | + | not allowed on self type + | +note: `Self` is of type `MyStruct<'_>` + --> $DIR/issue-126385-unmatched-arg-and-hir-arg.rs:1:12 + | +LL | pub struct MyStruct<'field> { + | ^^^^^^^^ `Self` corresponds to this type +... +LL | impl MyStruct<'_> { + | ----------------- `Self` is on type `MyStruct` in this `impl` +help: the `Self` type doesn't accept type parameters, use the concrete type's name `MyStruct` instead if you want to specify its type parameters + | +LL | pub fn f(field: &[u32]) -> MyStruct { + | ~~~~~~~~ + +error: lifetime may not live long enough + --> $DIR/issue-126385-unmatched-arg-and-hir-arg.rs:7:9 + | +LL | pub fn f(field: &[u32]) -> Self { + | - --------- return type is MyStruct<'2> + | | + | let's call the lifetime of this reference `'1` +LL | Self { field } + | ^^^^^^^^^^^^^^ associated function was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1` + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0109`.