Fix ICE in improper_ctypes_definitions
lint with all-ZST transparent types
This commit is contained in:
parent
7069a8c2b7
commit
4e76c3820f
3 changed files with 36 additions and 2 deletions
|
@ -851,12 +851,18 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> {
|
||||||
use FfiResult::*;
|
use FfiResult::*;
|
||||||
|
|
||||||
if def.repr.transparent() {
|
if def.repr.transparent() {
|
||||||
// Can assume that only one field is not a ZST, so only check
|
// Can assume that at most one field is not a ZST, so only check
|
||||||
// that field's type for FFI-safety.
|
// that field's type for FFI-safety.
|
||||||
if let Some(field) = transparent_newtype_field(self.cx.tcx, variant) {
|
if let Some(field) = transparent_newtype_field(self.cx.tcx, variant) {
|
||||||
self.check_field_type_for_ffi(cache, field, substs)
|
self.check_field_type_for_ffi(cache, field, substs)
|
||||||
} else {
|
} else {
|
||||||
bug!("malformed transparent type");
|
// All fields are ZSTs; this means that the type should behave
|
||||||
|
// like (), which is FFI-unsafe
|
||||||
|
FfiUnsafe {
|
||||||
|
ty,
|
||||||
|
reason: "this struct contains only zero-sized fields".into(),
|
||||||
|
help: None,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// We can't completely trust repr(C) markings; make sure the fields are
|
// We can't completely trust repr(C) markings; make sure the fields are
|
||||||
|
|
12
src/test/ui/repr/repr-transparent-issue-87496.rs
Normal file
12
src/test/ui/repr/repr-transparent-issue-87496.rs
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
// Regression test for the ICE described in #87496.
|
||||||
|
|
||||||
|
// check-pass
|
||||||
|
|
||||||
|
#[repr(transparent)]
|
||||||
|
struct TransparentCustomZst(());
|
||||||
|
extern "C" {
|
||||||
|
fn good17(p: TransparentCustomZst);
|
||||||
|
//~^ WARNING: `extern` block uses type `TransparentCustomZst`, which is not FFI-safe
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
16
src/test/ui/repr/repr-transparent-issue-87496.stderr
Normal file
16
src/test/ui/repr/repr-transparent-issue-87496.stderr
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
warning: `extern` block uses type `TransparentCustomZst`, which is not FFI-safe
|
||||||
|
--> $DIR/repr-transparent-issue-87496.rs:8:18
|
||||||
|
|
|
||||||
|
LL | fn good17(p: TransparentCustomZst);
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^ not FFI-safe
|
||||||
|
|
|
||||||
|
= note: `#[warn(improper_ctypes)]` on by default
|
||||||
|
= note: this struct contains only zero-sized fields
|
||||||
|
note: the type is defined here
|
||||||
|
--> $DIR/repr-transparent-issue-87496.rs:6:1
|
||||||
|
|
|
||||||
|
LL | struct TransparentCustomZst(());
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
warning: 1 warning emitted
|
||||||
|
|
Loading…
Add table
Reference in a new issue