Skip to content

Commit

Permalink
Erase regions before comparing signatures of foreign fns.
Browse files Browse the repository at this point in the history
  • Loading branch information
cjgillot committed Jul 19, 2022
1 parent 144227d commit 0065929
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 3 deletions.
7 changes: 4 additions & 3 deletions compiler/rustc_lint/src/builtin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2858,9 +2858,10 @@ impl ClashingExternDeclarations {
let a_poly_sig = a.fn_sig(tcx);
let b_poly_sig = b.fn_sig(tcx);

// As we don't compare regions, skip_binder is fine.
let a_sig = a_poly_sig.skip_binder();
let b_sig = b_poly_sig.skip_binder();
// We don't compare regions, but leaving bound regions around ICEs, so
// we erase them.
let a_sig = tcx.erase_late_bound_regions(a_poly_sig);
let b_sig = tcx.erase_late_bound_regions(b_poly_sig);

(a_sig.abi, a_sig.unsafety, a_sig.c_variadic)
== (b_sig.abi, b_sig.unsafety, b_sig.c_variadic)
Expand Down
24 changes: 24 additions & 0 deletions src/test/ui/foreign/issue-99276-same-type-lifetimes.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// Check that we do not ICE when structurally comparing types with lifetimes present.
// check-pass

pub struct Record<'a> {
pub args: &'a [(usize, &'a str)],
}

mod a {
extern "Rust" {
fn foo<'a, 'b>(record: &'a super::Record<'b>);

fn bar<'a, 'b>(record: &'a super::Record<'b>);
}
}

mod b {
extern "Rust" {
fn foo<'a, 'b>(record: &'a super::Record<'b>);

fn bar<'a, 'b>(record: &'a super::Record<'b>);
}
}

fn main() {}

0 comments on commit 0065929

Please sign in to comment.