Skip to content

Commit 366c8eb

Browse files
kelldatgross35
authored andcommitted
Make sigval an union
1 parent 7fd1b1a commit 366c8eb

File tree

3 files changed

+44
-97
lines changed

3 files changed

+44
-97
lines changed

libc-test/build.rs

Lines changed: 4 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -331,9 +331,6 @@ fn test_apple(target: &str) {
331331
return true;
332332
}
333333
match ty {
334-
// FIXME(union): actually a union
335-
"sigval" => true,
336-
337334
// FIXME(macos): The size is changed in recent macOSes.
338335
"malloc_zone_t" => true,
339336
// it is a moving target, changing through versions
@@ -429,14 +426,6 @@ fn test_apple(target: &str) {
429426
}
430427
});
431428

432-
cfg.skip_field_type(move |struct_, field| {
433-
match (struct_, field) {
434-
// FIXME(union): actually a union
435-
("sigevent", "sigev_value") => true,
436-
_ => false,
437-
}
438-
});
439-
440429
cfg.volatile_item(|i| {
441430
use ctest::VolatileItemKind::*;
442431
match i {
@@ -576,23 +565,8 @@ fn test_openbsd(target: &str) {
576565
"sys/param.h",
577566
}
578567

579-
cfg.skip_struct(move |ty| {
580-
if ty.starts_with("__c_anonymous_") {
581-
return true;
582-
}
583-
match ty {
584-
// FIXME(union): actually a union
585-
"sigval" => true,
586-
587-
_ => false,
588-
}
589-
});
590-
591568
cfg.skip_const(move |name| {
592569
match name {
593-
// Removed in OpenBSD 7.7
594-
"ATF_COM" | "ATF_PERM" | "ATF_PUBL" | "ATF_USETRAILERS" => true,
595-
596570
// Removed in OpenBSD 7.8
597571
"CTL_FS" | "SO_NETPROC" => true,
598572

@@ -720,9 +694,6 @@ fn test_cygwin(target: &str) {
720694

721695
t if t.ends_with("_t") => t.to_string(),
722696

723-
// sigval is a struct in Rust, but a union in C:
724-
"sigval" => "union sigval".to_string(),
725-
726697
// put `struct` in front of all structs:.
727698
t if is_struct => format!("struct {t}"),
728699

@@ -1174,8 +1145,6 @@ fn test_solarish(target: &str) {
11741145
return true;
11751146
}
11761147
match ty {
1177-
// union, not a struct
1178-
"sigval" => true,
11791148
// a bunch of solaris-only fields
11801149
"utmpx" if is_illumos => true,
11811150
_ => false,
@@ -1195,8 +1164,6 @@ fn test_solarish(target: &str) {
11951164
"sigaction" if field == "sa_sigaction" => true,
11961165
// Missing in illumos
11971166
"sigevent" if field == "ss_sp" => true,
1198-
// Avoid sigval union issues
1199-
"sigevent" if field == "sigev_value" => true,
12001167
// const issues
12011168
"sigevent" if field == "sigev_notify_attributes" => true,
12021169

@@ -1423,8 +1390,6 @@ fn test_netbsd(target: &str) {
14231390

14241391
cfg.skip_struct(move |ty| {
14251392
match ty {
1426-
// This is actually a union, not a struct
1427-
"sigval" => true,
14281393
// These are tested as part of the linux_fcntl tests since there are
14291394
// header conflicts when including them with all the other structs.
14301395
"termios2" => true,
@@ -1476,8 +1441,6 @@ fn test_netbsd(target: &str) {
14761441
(struct_ == "ifaddrs" && field == "ifa_ifu") ||
14771442
// sighandler_t type is super weird
14781443
(struct_ == "sigaction" && field == "sa_sigaction") ||
1479-
// sigval is actually a union, but we pretend it's a struct
1480-
(struct_ == "sigevent" && field == "sigev_value") ||
14811444
// aio_buf is "volatile void*" and Rust doesn't understand volatile
14821445
(struct_ == "aiocb" && field == "aio_buf")
14831446
});
@@ -1606,9 +1569,6 @@ fn test_dragonflybsd(target: &str) {
16061569

16071570
t if t.ends_with("_t") => t.to_string(),
16081571

1609-
// sigval is a struct in Rust, but a union in C:
1610-
"sigval" => "union sigval".to_string(),
1611-
16121572
// put `struct` in front of all structs:.
16131573
t if is_struct => format!("struct {t}"),
16141574

@@ -1701,8 +1661,6 @@ fn test_dragonflybsd(target: &str) {
17011661
(struct_ == "ifaddrs" && field == "ifa_ifu") ||
17021662
// sighandler_t type is super weird
17031663
(struct_ == "sigaction" && field == "sa_sigaction") ||
1704-
// sigval is actually a union, but we pretend it's a struct
1705-
(struct_ == "sigevent" && field == "sigev_value") ||
17061664
// aio_buf is "volatile void*" and Rust doesn't understand volatile
17071665
(struct_ == "aiocb" && field == "aio_buf")
17081666
});
@@ -1993,9 +1951,6 @@ fn test_android(target: &str) {
19931951

19941952
t if t.ends_with("_t") => t.to_string(),
19951953

1996-
// sigval is a struct in Rust, but a union in C:
1997-
"sigval" => "union sigval".to_string(),
1998-
19991954
"Ioctl" => "int".to_string(),
20001955

20011956
// put `struct` in front of all structs:.
@@ -2300,8 +2255,6 @@ fn test_android(target: &str) {
23002255
cfg.skip_field_type(move |struct_, field| {
23012256
// This is a weird union, don't check the type.
23022257
(struct_ == "ifaddrs" && field == "ifa_ifu") ||
2303-
// sigval is actually a union, but we pretend it's a struct
2304-
(struct_ == "sigevent" && field == "sigev_value") ||
23052258
// this one is an anonymous union
23062259
(struct_ == "ff_effect" && field == "u") ||
23072260
// FIXME(android): `sa_sigaction` has type `sighandler_t` but that type is
@@ -2504,9 +2457,6 @@ fn test_freebsd(target: &str) {
25042457

25052458
t if t.ends_with("_t") => t.to_string(),
25062459

2507-
// sigval is a struct in Rust, but a union in C:
2508-
"sigval" => "union sigval".to_string(),
2509-
25102460
// put `struct` in front of all structs:.
25112461
t if is_struct => format!("struct {t}"),
25122462

@@ -3141,7 +3091,8 @@ fn test_emscripten(target: &str) {
31413091
return true;
31423092
}
31433093
match ty {
3144-
// This is actually a union, not a struct
3094+
// FIXME(emscripten): Investigate why the test fails.
3095+
// Skip for now to unblock CI.
31453096
"sigval" => true,
31463097

31473098
// FIXME(emscripten): Investigate why the test fails.
@@ -3222,9 +3173,7 @@ fn test_emscripten(target: &str) {
32223173
// This is a weird union, don't check the type.
32233174
(struct_ == "ifaddrs" && field == "ifa_ifu") ||
32243175
// sighandler_t type is super weird
3225-
(struct_ == "sigaction" && field == "sa_sigaction") ||
3226-
// sigval is actually a union, but we pretend it's a struct
3227-
(struct_ == "sigevent" && field == "sigev_value")
3176+
(struct_ == "sigaction" && field == "sa_sigaction")
32283177
});
32293178

32303179
cfg.skip_field(move |struct_, field| {
@@ -3437,9 +3386,6 @@ fn test_neutrino(target: &str) {
34373386
match ty {
34383387
"Elf64_Phdr" | "Elf32_Phdr" => true,
34393388

3440-
// FIXME(union): This is actually a union, not a struct
3441-
"sigval" => true,
3442-
34433389
// union
34443390
"_channel_connect_attr" => true,
34453391

@@ -3494,8 +3440,6 @@ fn test_neutrino(target: &str) {
34943440
});
34953441

34963442
cfg.skip_field_type(move |struct_, field| {
3497-
// sigval is actually a union, but we pretend it's a struct
3498-
struct_ == "sigevent" && field == "sigev_value" ||
34993443
// Anonymous structures
35003444
struct_ == "_idle_hook" && field == "time"
35013445
});
@@ -3506,8 +3450,6 @@ fn test_neutrino(target: &str) {
35063450
("__sched_param", "reserved")
35073451
| ("sched_param", "reserved")
35083452
| ("sigevent", "__padding1") // ensure alignment
3509-
| ("sigevent", "__padding2") // union
3510-
| ("sigevent", "__sigev_un2") // union
35113453
| ("sigaction", "sa_sigaction") // sighandler_t type is super weird
35123454
| ("syspage_entry", "__reserved") // does not exist
35133455
)
@@ -3612,10 +3554,8 @@ fn test_vxworks(target: &str) {
36123554

36133555
// FIXME(vxworks)
36143556
cfg.skip_fn(move |name| match name {
3615-
// sigval
3616-
"sigqueue" | "_sigqueue"
36173557
// sighandler_t
3618-
| "signal"
3558+
"signal"
36193559
// not used in static linking by default
36203560
| "dlerror" => true,
36213561
_ => false,
@@ -4053,9 +3993,6 @@ fn test_linux(target: &str) {
40533993
// which is absent in glibc, has to be defined.
40543994
"__timeval" => true,
40553995

4056-
// FIXME(union): This is actually a union, not a struct
4057-
"sigval" => true,
4058-
40593996
// This type is tested in the `linux_termios.rs` file since there
40603997
// are header conflicts when including them with all the other
40613998
// structs.
@@ -4752,12 +4689,6 @@ fn test_linux(target: &str) {
47524689
// Needs musl 1.2.3 or later.
47534690
"pthread_getname_np" if old_musl => true,
47544691

4755-
// pthread_sigqueue uses sigval, which was initially declared
4756-
// as a struct but should be defined as a union. However due
4757-
// to the issues described here: https://github.com/rust-lang/libc/issues/2816
4758-
// it can't be changed from struct.
4759-
"pthread_sigqueue" => true,
4760-
47614692
// There are two versions of basename(3) on Linux with glibc, see
47624693
//
47634694
// https://man7.org/linux/man-pages/man3/basename.3.html
@@ -4791,8 +4722,6 @@ fn test_linux(target: &str) {
47914722
(struct_ == "sigaction" && field == "sa_sigaction") ||
47924723
// __timeval type is a patch which doesn't exist in glibc
47934724
(struct_ == "utmpx" && field == "ut_tv") ||
4794-
// sigval is actually a union, but we pretend it's a struct
4795-
(struct_ == "sigevent" && field == "sigev_value") ||
47964725
// this one is an anonymous union
47974726
(struct_ == "ff_effect" && field == "u") ||
47984727
// `__exit_status` type is a patch which is absent in musl
@@ -5273,8 +5202,6 @@ fn test_haiku(target: &str) {
52735202
return true;
52745203
}
52755204
match ty {
5276-
// FIXME(union): actually a union
5277-
"sigval" => true,
52785205
// FIXME(haiku): locale_t does not exist on Haiku
52795206
"locale_t" => true,
52805207
// FIXME(haiku): rusage has a different layout on Haiku
@@ -5381,10 +5308,8 @@ fn test_haiku(target: &str) {
53815308
("stat", "st_crtime_nsec") => true,
53825309

53835310
// these are actually unions, but we cannot represent it well
5384-
("siginfo_t", "sigval") => true,
53855311
("sem_t", "named_sem_id") => true,
53865312
("sigaction", "sa_sigaction") => true,
5387-
("sigevent", "sigev_value") => true,
53885313
("fpu_state", "_fpreg") => true,
53895314
("cpu_topology_node_info", "data") => true,
53905315
// these fields have a simplified data definition in libc
@@ -5435,8 +5360,6 @@ fn test_haiku(target: &str) {
54355360
ty.to_string()
54365361
}
54375362

5438-
// is actually a union
5439-
"sigval" => "union sigval".to_string(),
54405363
t if is_union => format!("union {t}"),
54415364
t if t.ends_with("_t") => t.to_string(),
54425365
t if is_struct => format!("struct {t}"),
@@ -5575,9 +5498,6 @@ fn test_aix(target: &str) {
55755498
"FILE" => ty.to_string(),
55765499
"ACTION" => ty.to_string(),
55775500

5578-
// 'sigval' is a struct in Rust, but a union in C.
5579-
"sigval" => format!("union sigval"),
5580-
55815501
t if t.ends_with("_t") => t.to_string(),
55825502
t if is_struct => format!("struct {}", t),
55835503
t if is_union => format!("union {}", t),
@@ -5614,9 +5534,6 @@ fn test_aix(target: &str) {
56145534

56155535
cfg.skip_struct(move |ty| {
56165536
match ty {
5617-
// FIXME(union): actually a union.
5618-
"sigval" => true,
5619-
56205537
// '__poll_ctl_ext_u' and '__pollfd_ext_u' are for unnamed unions.
56215538
"__poll_ctl_ext_u" => true,
56225539
"__pollfd_ext_u" => true,

src/fuchsia/mod.rs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -240,11 +240,6 @@ s! {
240240
pub l_linger: c_int,
241241
}
242242

243-
pub struct sigval {
244-
// Actually a union of an int and a void*
245-
pub sival_ptr: *mut c_void,
246-
}
247-
248243
// <sys/time.h>
249244
pub struct itimerval {
250245
pub it_interval: crate::timeval,
@@ -1043,6 +1038,11 @@ s_no_extra_traits! {
10431038
pub struct pthread_cond_t {
10441039
size: [u8; crate::__SIZEOF_PTHREAD_COND_T],
10451040
}
1041+
1042+
pub union sigval {
1043+
pub sival_int: c_int,
1044+
pub sival_ptr: *mut c_void,
1045+
}
10461046
}
10471047

10481048
cfg_if! {
@@ -1305,6 +1305,18 @@ cfg_if! {
13051305
self.size.hash(state);
13061306
}
13071307
}
1308+
1309+
impl PartialEq for sigval {
1310+
fn eq(&self, other: &sigval) -> bool {
1311+
unimplemented!("traits")
1312+
}
1313+
}
1314+
impl Eq for sigval {}
1315+
impl hash::Hash for sigval {
1316+
fn hash<H: hash::Hasher>(&self, state: &mut H) {
1317+
unimplemented!("traits")
1318+
}
1319+
}
13081320
}
13091321
}
13101322

src/unix/mod.rs

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -173,11 +173,6 @@ s! {
173173
pub l_linger: c_int,
174174
}
175175

176-
pub struct sigval {
177-
// Actually a union of an int and a void*
178-
pub sival_ptr: *mut c_void,
179-
}
180-
181176
// <sys/time.h>
182177
pub struct itimerval {
183178
pub it_interval: crate::timeval,
@@ -217,6 +212,29 @@ s! {
217212
}
218213
}
219214

215+
s_no_extra_traits! {
216+
pub union sigval {
217+
pub sival_int: c_int,
218+
pub sival_ptr: *mut c_void,
219+
}
220+
}
221+
222+
cfg_if! {
223+
if #[cfg(feature = "extra_traits")] {
224+
impl PartialEq for sigval {
225+
fn eq(&self, _other: &sigval) -> bool {
226+
unimplemented!("traits")
227+
}
228+
}
229+
impl Eq for sigval {}
230+
impl hash::Hash for sigval {
231+
fn hash<H: hash::Hasher>(&self, _state: &mut H) {
232+
unimplemented!("traits")
233+
}
234+
}
235+
}
236+
}
237+
220238
pub const INT_MIN: c_int = -2147483648;
221239
pub const INT_MAX: c_int = 2147483647;
222240

0 commit comments

Comments
 (0)