Skip to content

Commit

Permalink
Make clashing_extern_declarations considering generic args for ADT field
Browse files Browse the repository at this point in the history
fixes #130851
  • Loading branch information
surechen committed Sep 27, 2024
1 parent 1b5aa96 commit 0bf9289
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 3 deletions.
6 changes: 3 additions & 3 deletions compiler/rustc_lint/src/foreign_modules.rs
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,7 @@ fn structurally_same_type_impl<'tcx>(

ensure_sufficient_stack(|| {
match (a.kind(), b.kind()) {
(&Adt(a_def, _), &Adt(b_def, _)) => {
(&Adt(a_def, a_gen_args), &Adt(b_def, b_gen_args)) => {
// Only `repr(C)` types can be compared structurally.
if !(a_def.repr().c() && b_def.repr().c()) {
return false;
Expand All @@ -304,8 +304,8 @@ fn structurally_same_type_impl<'tcx>(
seen_types,
tcx,
param_env,
tcx.type_of(a_did).instantiate_identity(),
tcx.type_of(b_did).instantiate_identity(),
tcx.type_of(a_did).instantiate(tcx, a_gen_args),
tcx.type_of(b_did).instantiate(tcx, b_gen_args),
ckind,
)
},
Expand Down
42 changes: 42 additions & 0 deletions tests/ui/lint/clashing-extern-fn-issue-130851.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
//@ build-pass
#![warn(clashing_extern_declarations)]

#[repr(C)]
pub struct A {
a: [u16; 4],
}
#[repr(C)]
pub struct B {
b: [u32; 4],
}

pub mod a {
extern "C" {
pub fn foo(_: super::A);
}
}
pub mod b {
extern "C" {
pub fn foo(_: super::B);
//~^ WARN `foo` redeclared with a different signature
}
}

#[repr(C)]
pub struct G<T> {
g: [T; 4],
}

pub mod x {
extern "C" {
pub fn bar(_: super::G<u16>);
}
}
pub mod y {
extern "C" {
pub fn bar(_: super::G<u32>);
//~^ WARN `bar` redeclared with a different signature
}
}

fn main() {}
31 changes: 31 additions & 0 deletions tests/ui/lint/clashing-extern-fn-issue-130851.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
warning: `foo` redeclared with a different signature
--> $DIR/clashing-extern-fn-issue-130851.rs:20:9
|
LL | pub fn foo(_: super::A);
| ------------------------ `foo` previously declared here
...
LL | pub fn foo(_: super::B);
| ^^^^^^^^^^^^^^^^^^^^^^^^ this signature doesn't match the previous declaration
|
= note: expected `unsafe extern "C" fn(A)`
found `unsafe extern "C" fn(B)`
note: the lint level is defined here
--> $DIR/clashing-extern-fn-issue-130851.rs:2:9
|
LL | #![warn(clashing_extern_declarations)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^

warning: `bar` redeclared with a different signature
--> $DIR/clashing-extern-fn-issue-130851.rs:37:9
|
LL | pub fn bar(_: super::G<u16>);
| ----------------------------- `bar` previously declared here
...
LL | pub fn bar(_: super::G<u32>);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ this signature doesn't match the previous declaration
|
= note: expected `unsafe extern "C" fn(G<u16>)`
found `unsafe extern "C" fn(G<u32>)`

warning: 2 warnings emitted

0 comments on commit 0bf9289

Please sign in to comment.