Skip to content

Commit

Permalink
Rollup merge of #114758 - fmease:fix-nice-re-err-ice-gci, r=cjgillot
Browse files Browse the repository at this point in the history
Don't crash when reporting nice region errors for generic const items

Fixes #114714.
  • Loading branch information
matthiaskrgr authored Aug 12, 2023
2 parents 010709a + 1a18158 commit 97e975e
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,25 +29,15 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> {
// version new_ty of its type where the anonymous region is replaced
// with the named one.
let (named, anon, anon_param_info, region_info) = if sub.has_name()
&& self.tcx().is_suitable_region(sup).is_some()
&& self.find_param_with_region(sup, sub).is_some()
&& let Some(region_info) = self.tcx().is_suitable_region(sup)
&& let Some(anon_param_info) = self.find_param_with_region(sup, sub)
{
(
sub,
sup,
self.find_param_with_region(sup, sub).unwrap(),
self.tcx().is_suitable_region(sup).unwrap(),
)
(sub, sup, anon_param_info, region_info)
} else if sup.has_name()
&& self.tcx().is_suitable_region(sub).is_some()
&& self.find_param_with_region(sub, sup).is_some()
&& let Some(region_info) = self.tcx().is_suitable_region(sub)
&& let Some(anon_param_info) = self.find_param_with_region(sub, sup)
{
(
sup,
sub,
self.find_param_with_region(sub, sup).unwrap(),
self.tcx().is_suitable_region(sub).unwrap(),
)
(sup, sub, anon_param_info, region_info)
} else {
return None; // inapplicable
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ pub fn find_param_with_region<'tcx>(
let body_id = hir.maybe_body_owned_by(def_id)?;

let owner_id = hir.body_owner(body_id);
let fn_decl = hir.fn_decl_by_hir_id(owner_id).unwrap();
let fn_decl = hir.fn_decl_by_hir_id(owner_id)?;
let poly_fn_sig = tcx.fn_sig(id).instantiate_identity();

let fn_sig = tcx.liberate_late_bound_regions(id, poly_fn_sig);
Expand Down
9 changes: 9 additions & 0 deletions tests/ui/generic-const-items/reference-outlives-referent.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// Test that we catch that the reference outlives the referent and we
// successfully emit a diagnostic. Regression test for issue #114714.

#![feature(generic_const_items)]
#![allow(incomplete_features)]

const Q<'a, 'b>: &'a &'b () = &&(); //~ ERROR reference has a longer lifetime than the data it references

fn main() {}
20 changes: 20 additions & 0 deletions tests/ui/generic-const-items/reference-outlives-referent.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
error[E0491]: in type `&'a &'b ()`, reference has a longer lifetime than the data it references
--> $DIR/reference-outlives-referent.rs:7:18
|
LL | const Q<'a, 'b>: &'a &'b () = &&();
| ^^^^^^^^^^
|
note: the pointer is valid for the lifetime `'a` as defined here
--> $DIR/reference-outlives-referent.rs:7:9
|
LL | const Q<'a, 'b>: &'a &'b () = &&();
| ^^
note: but the referenced data is only valid for the lifetime `'b` as defined here
--> $DIR/reference-outlives-referent.rs:7:13
|
LL | const Q<'a, 'b>: &'a &'b () = &&();
| ^^

error: aborting due to previous error

For more information about this error, try `rustc --explain E0491`.

0 comments on commit 97e975e

Please sign in to comment.